关于姿态融合算法的问题,算出的欧拉角为什么不对

2019-07-14 22:32发布

来来回回折腾了很久,一直没搞定姿态融合算法,算出来的欧拉角怎么都不对。

说明:我用的传感器是mpu9150,定义的板子的坐标是:x轴指向北,y轴指向东,z轴指向地。陀螺仪、加速度计和磁力计的轴向经过旋转都保持这个朝向。

问题:我用的是AHRSupdate这个程序,但是算出来的欧拉角只有Roll是对的,Yaw和Pitch都不对,其中,当我把Roll旋转+90度时,Yaw的数据是对的,但是Pitch的怎么都不对,举个栗子:板子水平放置的时候Pitch保持为0,板子x轴倾斜+60度左右并保持此姿态的时候,Pitch只是在正负20之间来回震荡几次就又回到0。

我程序如下:
先初始化四元数,其中init_ax/init_ay/init_az的单位是g,比如z轴和重力方向重合时的读数是1;init_mx/init_my/init_mz的单位就是磁力计输出的单位,未经过任何改变:
  1.   
  2. init_Roll  = atan2(init_ay, init_az);
  3. init_Pitch = -asin(init_ax);              //init_Pitch = asin(ay / 1);      
  4. init_Yaw   = -atan2(init_my*cos(init_Roll) + init_mx*sin(init_Roll)*sin(init_Pitch) - init_mz*sin(init_Roll)*cos(init_Pitch),
  5.                      init_mx*cos(init_Pitch) + init_mz*sin(init_Pitch));                       //atan2(my, mx);
  6. q0 = cos(0.5*init_Roll)*cos(0.5*init_Pitch)*cos(0.5*init_Yaw) + sin(0.5*init_Roll)*sin(0.5*init_Pitch)*sin(0.5*init_Yaw);  //w
  7. q1 = sin(0.5*init_Roll)*cos(0.5*init_Pitch)*cos(0.5*init_Yaw) - cos(0.5*init_Roll)*sin(0.5*init_Pitch)*sin(0.5*init_Yaw);  //x   
  8. q2 = cos(0.5*init_Roll)*sin(0.5*init_Pitch)*cos(0.5*init_Yaw) + sin(0.5*init_Roll)*cos(0.5*init_Pitch)*sin(0.5*init_Yaw);  //y   
  9. q3 = cos(0.5*init_Roll)*cos(0.5*init_Pitch)*sin(0.5*init_Yaw) - sin(0.5*init_Roll)*sin(0.5*init_Pitch)*cos(0.5*init_Yaw);  //z
复制代码然后循环调用AHRSupdate()更新四元数,并用下面的公式结算欧拉角:
  1. Pitch = asin(-2*q1*q3 + 2*q0*q2) * 57.3; //俯仰角,绕y轴转动         
  2. Roll  = atan2(2*q2*q3 + 2*q0*q1,-2*q1*q1 - 2*q2*q2 + 1) * 57.3; //滚动角,绕x轴转动
  3. Yaw   = atan2(2*q1*q2 + 2*q0*q3,-2*q2*q2 - 2*q3*q3 + 1) * 57.3;  //偏航角,绕z轴转动
复制代码一直都找不到问题到底出在哪,感觉可能是我定义的坐标轴方向不能套用上面的公式来计算?可是为什么Roll的数据是对的呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。