short MPU6050_Get_Angle(float x,float y,float z,u8 dir)
{
float temp;
float res=0;
switch(dir)
{
case 0://与自然Z轴的角度
temp=sqrt((x*x+y*y))/z;
res=atan(temp);
break;
case 1://与自然X轴的角度
temp=x/sqrt((y*y+z*z));
res=atan(temp);
break;
case 2://与自然Y轴的角度
temp=y/sqrt((x*x+z*z));
res=atan(temp);
break;
}
return res*1800/3.14;//把弧度转换成角度
}
(18.21 KB, 下载次数: 130)
有更简单的
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
angleAx=atan2(ax,az)*180/PI;
计算量更少,而且atan2返回值范围-PI~PI
角速度传感器输出的是某个轴的角速度,所以,如果想计算某个轴的角度(一般是相对于自
然坐标轴),那么只需要对角速度进行积分就可以了,举例来说,我们现在要测量X轴的角度,那么先假设起始状态x轴和自然坐标轴的角度为0,那么现在你可以将x轴想象成一辆只有速度仪表的汽车,汽车按照一定的速度行驶在一段时间后,如果你要计算汽车(x轴)到起始点的距离(x轴和自然周的角度),那么你只需要用车速(x轴的角速度)*时间就可以算出来了。
当然,传感器的角速度输出严格来说是一个瞬时值,实际中不太可能是一个匀速值,所以需要做一些处理。
希望对你有帮助。我也是刚接触这个东西,共同学习吧。
你好,请问mpu6050的传感器,既可以求加速度,也可以算出角度?如果我想消除重力加速度的影响,有木有什么办法?
具体的我也没做过,根据我了解的一些信息提供以下几个方法:第一通过滤波器,过滤掉重力角速度的影响;第二看你需要计算那个轴的加速度,想办法保持这个轴和重力成90度角;第三将两个陀螺仪安装到一个平面,其中一个作为测量平面的倾斜角度,另外一个作为测量加速度,通过角度来反推消除重力加速度对其他各轴的影响。第四如果你需要测量的加速度远大于重力加速度,那么这个基本就不是个问题了。
你可以查阅一下重力加速度计的手册,一般都推荐第一种方式。
以上摘自
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;
}
摘自
- - -
注意:本模块采用的是IIC通信方式,所以我们只需要连接四跟线就可以完成电路的连接,简单方便!
1.关于6050 陀螺仪和加速度计 的角速度和角度计算。
A.陀螺仪角度计算,很多帖子中都提到了用的是积分,但是我这里还是重新讲下。
angle_n = angle_n-1 + (Gyro-C_Gyro)*R_Gyro;
(1)angle_n 当前角度值,它的单位是度(°)
(2)angle_n-1 上一次计算出的角度值 (3)Gyro 陀螺仪敏感轴偏转值,也就是当前敏感轴读数
(4)C_Gyro 陀螺仪零点偏移值,这个值的测量方法是:将陀螺仪敏感轴水平放置静止时的读数,我的零点偏移值是水平、垂直、倒置,分别取1024次,作平均值得出的,读数是-177.8865041,但是最后在程序实践中,调整到-99.90。或许还有别的办法,自己看着办吧。
(5)R_Gyro 是陀螺仪比例。飞思卡尔的参考中提到这个值是可以计算出来的,下面我会提供下载,大家自己去看看怎么算的,但是在其论坛和调试手册中都提到,这个比例值还是实验法测量出来的比较准确。
B.加速度仪 角度计算。
加速度仪的角度计算有很多方法,论坛里就有2中。但是都用到了三角函数,数学没学好,照抄了也不行。参考了飞思卡尔的计算方法后大概是这样的。 Angle_Z = (az-C_Z)*R_Z;
(1)angle_z 加速度计敏感轴Z轴产生倾角计算出的角度,单位度(°)
(2)az 是加速度仪 Z轴读数
(3)C_Z Z轴零点偏移量 测量方法和陀螺仪的一样。
(4)R_Z 加速度计Z轴比例
C.反复试验,MPU6050加速度计Z轴对应的是陀螺仪的X轴。不知道是不是我的有问题,还是就这么设计的?
摘自:
http://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/09/11/2680211.html
short MPU6050_Get_Angle(float x,float y,float z,u8 dir)
{
float temp;
float res=0;
switch(dir)
{
case 0://与自然Z轴的角度
temp=sqrt((x*x+y*y))/z;
res=atan(temp);
break;
case 1://与自然X轴的角度
temp=x/sqrt((y*y+z*z));
res=atan(temp);
break;
case 2://与自然Y轴的角度
temp=y/sqrt((x*x+z*z));
res=atan(temp);
break;
}
return res*1800/3.14;//把弧度转换成角度
}
(18.21 KB, 下载次数: 130)
有更简单的
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
angleAx=atan2(ax,az)*180/PI;
计算量更少,而且atan2返回值范围-PI~PI
角速度传感器输出的是某个轴的角速度,所以,如果想计算某个轴的角度(一般是相对于自
然坐标轴),那么只需要对角速度进行积分就可以了,举例来说,我们现在要测量X轴的角度,那么先假设起始状态x轴和自然坐标轴的角度为0,那么现在你可以将x轴想象成一辆只有速度仪表的汽车,汽车按照一定的速度行驶在一段时间后,如果你要计算汽车(x轴)到起始点的距离(x轴和自然周的角度),那么你只需要用车速(x轴的角速度)*时间就可以算出来了。
当然,传感器的角速度输出严格来说是一个瞬时值,实际中不太可能是一个匀速值,所以需要做一些处理。
希望对你有帮助。我也是刚接触这个东西,共同学习吧。
你好,请问mpu6050的传感器,既可以求加速度,也可以算出角度?如果我想消除重力加速度的影响,有木有什么办法?
具体的我也没做过,根据我了解的一些信息提供以下几个方法:第一通过滤波器,过滤掉重力角速度的影响;第二看你需要计算那个轴的加速度,想办法保持这个轴和重力成90度角;第三将两个陀螺仪安装到一个平面,其中一个作为测量平面的倾斜角度,另外一个作为测量加速度,通过角度来反推消除重力加速度对其他各轴的影响。第四如果你需要测量的加速度远大于重力加速度,那么这个基本就不是个问题了。
你可以查阅一下重力加速度计的手册,一般都推荐第一种方式。
以上摘自
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;
}
摘自
- - -
注意:本模块采用的是IIC通信方式,所以我们只需要连接四跟线就可以完成电路的连接,简单方便!
1.关于6050 陀螺仪和加速度计 的角速度和角度计算。
A.陀螺仪角度计算,很多帖子中都提到了用的是积分,但是我这里还是重新讲下。
angle_n = angle_n-1 + (Gyro-C_Gyro)*R_Gyro;
(1)angle_n 当前角度值,它的单位是度(°)
(2)angle_n-1 上一次计算出的角度值 (3)Gyro 陀螺仪敏感轴偏转值,也就是当前敏感轴读数
(4)C_Gyro 陀螺仪零点偏移值,这个值的测量方法是:将陀螺仪敏感轴水平放置静止时的读数,我的零点偏移值是水平、垂直、倒置,分别取1024次,作平均值得出的,读数是-177.8865041,但是最后在程序实践中,调整到-99.90。或许还有别的办法,自己看着办吧。
(5)R_Gyro 是陀螺仪比例。飞思卡尔的参考中提到这个值是可以计算出来的,下面我会提供下载,大家自己去看看怎么算的,但是在其论坛和调试手册中都提到,这个比例值还是实验法测量出来的比较准确。
B.加速度仪 角度计算。
加速度仪的角度计算有很多方法,论坛里就有2中。但是都用到了三角函数,数学没学好,照抄了也不行。参考了飞思卡尔的计算方法后大概是这样的。 Angle_Z = (az-C_Z)*R_Z;
(1)angle_z 加速度计敏感轴Z轴产生倾角计算出的角度,单位度(°)
(2)az 是加速度仪 Z轴读数
(3)C_Z Z轴零点偏移量 测量方法和陀螺仪的一样。
(4)R_Z 加速度计Z轴比例
C.反复试验,MPU6050加速度计Z轴对应的是陀螺仪的X轴。不知道是不是我的有问题,还是就这么设计的?
摘自:
http://www.cnblogs.com/wangh0802PositiveANDupward/archive/2012/09/11/2680211.html