搜索
bottom↓
回复: 2

姿态解算的一点疑问

[复制链接]

出0入0汤圆

发表于 2014-7-2 15:43:00 | 显示全部楼层 |阅读模式
  1.         //Attitude estimation
  2.         AttitudeFilter(&gyro, &acc, &acc_filter, MixConstant);
  3.         AttitudeFilter(&gyro, &mag, &mag_filter, 0.950f);//那为什么数字罗盘测出来的数据也要这么干?
  4.        
  5.         RPY = CalculateRollPitchYaw(&acc_filter, &mag_filter); //acc_filter较为准确的重力加速度向量
复制代码

  1. //MPU6050->gyrox-->pitch
  2. //                   gyroy-->roll
  3. //         gyroz-->yaw
  4. inline void AttitudeFilter(vector_f *gyro, vector_i *acc, vector_i *acc_filter, float mixConstant)
  5. {//complementation filter
  6.         //calculate acc vector based on last value and gyroscope value
  7.         vector_f acc_gyro;
  8.         vector_f delta_theta;
  9.         int32_t acceleration;
  10.         float mixConstant1;
  11.         acc_gyro.x = acc_filter->x;
  12.         acc_gyro.y = acc_filter->y;
  13.         acc_gyro.z = acc_filter->z;
  14.         delta_theta.y = gyro->x * dt;
  15.         delta_theta.x = gyro->y * dt;
  16.         delta_theta.z = gyro->z * dt;//陀螺仪的值乘以dt,这个在方向余弦旋转变换矩阵中有出现过。
  17.         rotateV(&acc_gyro, &delta_theta);
  18.        
  19. //        acceleration = acc->x*acc->x + acc->y*acc->y + acc->z*acc->z;
  20.        
  21.         //if acceleration<8m/s2 or acceleration>12m/s2, don't use acceleration information
  22. //        if(acceleration<64000000 || acceleration>144000000)
  23. //                mixConstant = 1.0f;
  24.        
  25.         //Complementary filter
  26.         mixConstant1 = 1.0f - mixConstant;
  27.         acc_filter->x = acc_gyro.x * mixConstant + acc->x * mixConstant1;//acc_filter的值是陀螺仪和上一次姿态估算出的值。而acc就是此次加速度计的值,在这两个值作一个加权。只要时间足够上的话,最后的值还是等于加速度计的值,也就是准确的值。
  28.         acc_filter->y = acc_gyro.y * mixConstant + acc->y * mixConstant1;
  29.         acc_filter->z = acc_gyro.z * mixConstant + acc->z * mixConstant1;
  30.         //此时acc_gyro的值就是经过了旋转矩阵处理之后的值。是通过上次的估计出这次的数据,灵气来源是陀螺仪。而后和加速度计的值来一个加权平均。
  31. }


  32. //Calculate roll/pitch/yaw
  33. //Roll:ret.x        -180~180 deg
  34. //Pitch:ret.y        -90~90 deg
  35. //yaw:ret.z                -180~180 deg
  36. inline vector_f CalculateRollPitchYaw(vector_i *acc, vector_i *mag)
  37. {
  38.         vector_f temp;

  39.         temp.x = atan2f(acc->x, acc->z);
  40.         temp.y = asinf(acc->y/sqrtf(acc->x*acc->x + acc->y*acc->y + acc->z*acc->z));
  41.         temp.z = -atan2f(mag->y*cos(temp.y) - mag->z*sin(temp.y),
  42.                                         -mag->y*sin(temp.x)*sin(temp.y) + mag->x*cos(temp.x) - mag->z*sin(temp.x)*cos(temp.y)) * 57.30f;
  43.         temp.x *= 57.30f;
  44.         temp.y *= 57.30f;
  45.         return temp;
  46. }
复制代码



通过陀螺仪测量得到的数据作为旋转矩阵来估计重力矢量,再和加速度计测得的重力矢量进行一下加权,得到最后的重力加速度的矢量值。

这是我自己理解的,但是我不懂得为什么电子罗盘得到的数值要和陀螺仪的数据进行融合。而且最后求出姿态角(个人认为是欧拉角),那个解算的过程是怎样的,求解的过程是怎样的,我不是很理解啊。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-7-2 16:33:19 | 显示全部楼层
因为陀螺仪积分会发散,需要加速计校正,个人理解

出0入0汤圆

 楼主| 发表于 2014-7-2 19:09:26 | 显示全部楼层
但就是不知道具体的过程为什么是这样的,比如公式为什么是这样的。这好像是参考MWC的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表