匿名mahony互补滤波代码详解

下面是我对匿名源码修改整理后得到的代码,去掉了冗余便于讲解,此外给出了一些优化建议。
一、函数调用
在这里插入图片描述

二、Drv_Icm20602_Read()
在这里插入图片描述
读取16位ADC采样值

三、imu_origDataPrepare()
在这里插入图片描述
因为传感器安装角度和载体坐标系可能不一致,因此需要一个基础的坐标转换,最终得到x前、y右、z下的载体坐标系。

在这里插入图片描述
因为加速度计对高频抖动敏感,因此需要一个低通滤波器。陀螺仪加一个低通滤波无伤大雅。

在这里插入图片描述
当传感器不在载体中心时,载体旋转时传感器会有一个向心加速度,该加速度会被传感器测量出来,因此要去掉。

在这里插入图片描述
将16位ADC转换为物理单位值,对于该例程为±16g的加速度,单位是cm/s^2,就是说重力加速度测出来的值是980;角速度为±2000dps(degree per second)。

注:
之后使用时建议根据场景降低量程,提高精度
在这里插入图片描述
四、imu_postureSolution()
姿态解算的基本思路就是更新四元数,并且利用四元数到旋转矩阵的公式更新旋转矩阵。
在这里插入图片描述
下面是具体的实现:
在这里插入图片描述
初始时要求使模长为1,然后通过迭代得到正确的四元数。

在这里插入图片描述
这个是旋转矩阵的定义,最终求解欧拉角是利用该旋转矩阵。
在这里插入图片描述
读取载体坐标系下的加速度,并单位化。
在这里插入图片描述
利用四元数求旋转矩阵,同时也获得了世界坐标系下重力加速度(0,0,1)T在载体坐标系下的各轴分量。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
求PI积分值。这里使用测量的角速度加上误差。由于误差是叉积,无量纲,因此可以理解为与角速度同一量纲,然后乘上时间就是更新的角度量。
在这里插入图片描述
在这里插入图片描述
说明:
1.初始四元数随意给定,因此刚开始会有一个较长的迭代时间将四元数收敛到正确的值。解决办法是刚开始(或判断无人机停止飞行时),将PI参数调大,使之快速收敛;
2.为了得到更好的效果,应当在初始开机后对加速度计、角速度计求零偏,即使用较长的时间求测量值的平均值,对之后的数据减去这个零偏。这个的好处包括:增大PI响应速度,在没有磁力计的情况下减小yaw漂移。

注:向量积无法区分0-90度和90-180度:
在这里插入图片描述
因此使用向量积作为误差,姿态角roll和pitch取值范围为±90度。
yaw之所以是±180度,是因为还增加了点乘判断向量方向:
在这里插入图片描述
在这里插入图片描述
五、imu_getEuler()
在这里插入图片描述
通过旋转矩阵求解欧拉角:
atan2相关知识汇总_weixin_42142612的博客-CSDN博客
https://blog.csdn.net/weixin_42142612/article/details/80972768
欧拉角和旋转矩阵的相互转换 - summer91 - 博客园
https://www.cnblogs.com/larry-xia/p/11926121.html
在这里插入图片描述

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朽木白露

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值