25903
- 收藏
- 点赞
- 分享
- 举报
mpu6050角度换算(原创:这个东西我在网上找了很久,都没有直接说明其原理的
如果觉得我是小白,勿喷,直接忽视即可,这其中也有我个人一些鄙薄的理解。如有错误欢迎指正,有交流才有进步。
其实原理很简单,但是对刚开始接触6050的人来说,了解其原理应该会比直接移植代码理解更深刻吧。
大家可以直接把6050的加速度计部分的检测元件想象成一个方盒子,方盒子里面放着个小球,小球因重力作用会在盒子的各个面上产生垂直于作用面的力,
各个力矢量合成就是和重力相平衡的力了(不考虑除重力加速度以外的加速度)
上图是一个手绘的,水平不咋样别见怪。上图是6050绕Y轴旋转一定角度产生的力的合成图,绕一个轴旋转哈理解一些。
gx = g重*cosΦ2;
gz = g重*cosΦ1;
同理gy = g重*cosΦ3;(该图上Φ3 = 90°)
gx就是X轴输出的数值除以最小分辨率。如±2g时,最小分辨率是2^16/4 =16384 LSB/g;(资料上是16384LSB/mg当时我怎么看都不能明白,这里就提醒下,如果都懂就当我没说)
很多人以为都以为角度是加速度读出来的值除以180°-0°的线性关系,其实用在飞思卡尔平衡车上的线性关系只是相对一个很小角度变换范围里的线性,在0-360的范围里肯定是不适用的,
只有根据反余切变换才能得到他的真是角度。
说明一下,如果是用在飞控上,如果某个方向上出现了除重力加速度分量以外的加速度时,单单加速度读出的值是比该角度对应的加速度值大的。
附上我根据飞思卡尔官方出的陀螺仪和加速度计融合而写的程序,自己写的,如有错误欢迎指正
void Offset_alignment(void)
{
static s32 A_Temp_X,A_Temp_Y,A_Temp_Z,G_Temp_X,G_Temp_Y,G_Temp_Z;
static u8 Cnt=0;
if(Calibration_Flag != 1)
{
A_Temp_X += (s32)X_Angle;
A_Temp_Y += (s32)Y_Angle;
A_Temp_Z += (s32)Z_Angle;
G_Temp_X += (s32)X_Angle_acceleration;
G_Temp_Y += (s32)Y_Angle_acceleration;
G_Temp_Z += (s32)Z_Angle_acceleration;
Cnt++;
}
if(Cnt == 200)
{
A_Offset_X = A_Temp_X/Cnt;
A_Offset_Y = A_Temp_Y/Cnt;
A_Offset_Z = A_Temp_Z/Cnt;
G_Offset_X = G_Temp_X/Cnt;
G_Offset_Y = G_Temp_Y/Cnt;
G_Offset_Z = G_Temp_Z/Cnt;
Cnt = 0;
Calibration_Flag = 1;
}
}
void Data_Fusion(float P_Component)
{
float X_Angle_Feedback,Y_Angle_Feedback,Z_Angle_Feedback;
X_Angle_Feedback = (X_Angle - A_Offset_X - X_Current_A)*P_Component;
X_Current_A += (Y_Angle_acceleration - G_Offset_Y+X_Angle_Feedback)*INTEGRAL_TIME;
Y_Angle_Feedback = (Y_Angle - A_Offset_Y - Y_Current_A)*P_Component;
Y_Current_A += (Y_Angle_acceleration - G_Offset_Y+Y_Angle_Feedback)*INTEGRAL_TIME;
Z_Angle_Feedback = (Z_Angle - A_Offset_Z - Z_Current_A)*P_Component;
Z_Current_A += (Z_Angle_acceleration - G_Offset_Z+Z_Angle_Feedback)*INTEGRAL_TIME;
}
其实原理很简单,但是对刚开始接触6050的人来说,了解其原理应该会比直接移植代码理解更深刻吧。
大家可以直接把6050的加速度计部分的检测元件想象成一个方盒子,方盒子里面放着个小球,小球因重力作用会在盒子的各个面上产生垂直于作用面的力,
各个力矢量合成就是和重力相平衡的力了(不考虑除重力加速度以外的加速度)
上图是一个手绘的,水平不咋样别见怪。上图是6050绕Y轴旋转一定角度产生的力的合成图,绕一个轴旋转哈理解一些。
gx = g重*cosΦ2;
gz = g重*cosΦ1;
同理gy = g重*cosΦ3;(该图上Φ3 = 90°)
gx就是X轴输出的数值除以最小分辨率。如±2g时,最小分辨率是2^16/4 =16384 LSB/g;(资料上是16384LSB/mg当时我怎么看都不能明白,这里就提醒下,如果都懂就当我没说)
很多人以为都以为角度是加速度读出来的值除以180°-0°的线性关系,其实用在飞思卡尔平衡车上的线性关系只是相对一个很小角度变换范围里的线性,在0-360的范围里肯定是不适用的,
只有根据反余切变换才能得到他的真是角度。
说明一下,如果是用在飞控上,如果某个方向上出现了除重力加速度分量以外的加速度时,单单加速度读出的值是比该角度对应的加速度值大的。
附上我根据飞思卡尔官方出的陀螺仪和加速度计融合而写的程序,自己写的,如有错误欢迎指正
void Offset_alignment(void)
{
static s32 A_Temp_X,A_Temp_Y,A_Temp_Z,G_Temp_X,G_Temp_Y,G_Temp_Z;
static u8 Cnt=0;
if(Calibration_Flag != 1)
{
A_Temp_X += (s32)X_Angle;
A_Temp_Y += (s32)Y_Angle;
A_Temp_Z += (s32)Z_Angle;
G_Temp_X += (s32)X_Angle_acceleration;
G_Temp_Y += (s32)Y_Angle_acceleration;
G_Temp_Z += (s32)Z_Angle_acceleration;
Cnt++;
}
if(Cnt == 200)
{
A_Offset_X = A_Temp_X/Cnt;
A_Offset_Y = A_Temp_Y/Cnt;
A_Offset_Z = A_Temp_Z/Cnt;
G_Offset_X = G_Temp_X/Cnt;
G_Offset_Y = G_Temp_Y/Cnt;
G_Offset_Z = G_Temp_Z/Cnt;
Cnt = 0;
Calibration_Flag = 1;
}
}
void Data_Fusion(float P_Component)
{
float X_Angle_Feedback,Y_Angle_Feedback,Z_Angle_Feedback;
X_Angle_Feedback = (X_Angle - A_Offset_X - X_Current_A)*P_Component;
X_Current_A += (Y_Angle_acceleration - G_Offset_Y+X_Angle_Feedback)*INTEGRAL_TIME;
Y_Angle_Feedback = (Y_Angle - A_Offset_Y - Y_Current_A)*P_Component;
Y_Current_A += (Y_Angle_acceleration - G_Offset_Y+Y_Angle_Feedback)*INTEGRAL_TIME;
Z_Angle_Feedback = (Z_Angle - A_Offset_Z - Z_Current_A)*P_Component;
Z_Current_A += (Z_Angle_acceleration - G_Offset_Z+Z_Angle_Feedback)*INTEGRAL_TIME;
}
我来回答
回答7个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2014-07-05 14:51:09
-
2018-10-25 13:32:46
-
2013-08-23 11:48:21
-
2018-10-19 16:01:51
-
2017-10-12 20:38:01
-
2013-09-10 16:46:26
-
2013-08-25 13:05:03
-
2013-08-24 22:41:25
-
2021-08-21 13:34:49
-
2014-04-24 14:52:24
-
2021-01-12 16:48:48
-
2015-02-05 09:23:28
-
2013-11-30 23:38:45
-
2018-03-29 15:00:56
-
2013-08-27 17:30:13
-
2018-11-17 11:18:05
-
2013-06-24 09:55:31
-
2019-01-14 14:22:10
-
2019-02-19 11:08:09
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认