1.感慨
这个模块是我参考学习的野火电子的,它们的文档也很详细,但是我做一个属于自己的总结,算是分享一下经验和遇到的问题。
2.模块硬件
5v电源,iic通讯(建议软件iic),可以再接一个iic传感器。一个dmp数据更新通知引脚。总共7个引脚,stm32驱动接个iic就行。模块自带Dmp计算,想用模块自带的DMP功能,必须接pin7也就是dmp数据更新引脚。这是一个6轴,三个加速度,三个角速度。
3.原理
一个真空室有一悬浮小球,你一动他就会因为惯性对室壁产生压力,将压力量化细分就是每个方向的力,通过牛三算出加速度。然后利用一个陀螺的定轴性和进动性,你只要动,陀螺就会转,陀螺转过的角度与时间的关系就是角速度。
获得加速度和角速度后,你需要一个方法去实现姿势的计算。就是四元数到欧拉角的计算。
四元数,任何旋转都有一个定轴,绕定轴转过的角度,绕xyz三轴转过的角度,就是这4个角度。然后根据四元数计算出欧拉角,也就是pitch,yaw,roll。
如何确定定轴,这个你都获得xyz旋转过的角度了,定轴在xyz上的投影就是你获得的角度计算出来的。倒推一下公式就行。公式查一下,比较繁琐,去官网查看会更详细,我说的可能会有问题。
4.移植DMP库,找一个项目例程看看,把文件移过来就行。
此处只是基于stm32裸机标准库的移植:
如何获得这些文件,直接百度搜或者去官网下载就行。
1.移植所有的源文件和头文件路径,
2.移植I2C,就是选择一下你要用软件iic还是硬件iic,然后设定你想要的引脚:
在iic头文件中定义一下:
3.移植初始化程序和数据处理函数
1. iic初始化:
配置引脚时钟资源,基础操作。
2.dmp初始化
初始化硬件,也就是mpu6050,先复位,再唤醒,配置一些跳过,回调的函数。
初始化mpl数据处理模块。
涉及的东西比较多,可以参考一下官方的示例。
3.数据处理
直接调用dmp提供的api接口。
4.注意事项
1.记得初始化一下时间戳。
get_tick_count(×tamp);就是定义一下这个函数,程序中很多地方会调用这个函数。
TimingDelay_Decrement();
TimeStamp_Increment();
将这两个函数放到毫秒定时器中。
5.数值变化
mpu6050平放:x,y的值一般小于1.z的数值会有规律的增长。
6.算法
如果不加dmp库,直接iic读取数值的话,读取的值为加速度和角速度一共6个数值。
角速度转化为角度:
陀螺仪角速度=读取值/灵敏度 度/秒 x=陀螺仪读取的值/16.4 16.4对应2000 度/秒的量程。
Rx=Rx0+x*dt //积分一下就得到 绕x轴旋转的角度,y,z依次。
然后再将角度转换成四元数:
此处只是3轴角速度转换成加速度。
float X, Y, Z = Rx/180 * PI,Ry/180 * PI,Rz/180 * PI
Qx = math.cos(Y/2)*math.cos(Z/2)*math.sin(X/2)-math.sin(Y/2)*math.sin(Z/2)*math.cos(X/2)
Qy = math.sin(Y/2)*math.cos(Z/2)*math.cos(X/2)+math.cos(Y/2)*math.sin(Z/2)*math.sin(X/2)
Qz = math.cos(Y/2)*math.sin(Z/2)*math.cos(X/2)-math.sin(Y/2)*math.cos(Z/2)*math.sin(X/2)
QW = math.cos(Y/2)*math.cos(Z/2)*math.cos(X/2)+math.sin(Y/2)*math.sin(Z/2)*math.sin(X/2)
这是最简单的转换,比较厉害的还会加入加速度,磁场计,通过九轴转换的肯定比三轴角速度更好,DMP库支持6轴和9轴转换,需要在头文件选择使能9轴计算。
四元数定义:
w:空间旋转轴 :绕w旋转的角度 为什么引入w,为了归一化。
x:w在x轴的投影 x轴上的分量
y:w 在y轴对策投影 。。。。。。
z与上面一样。
公式抄的:数学很差,自己推导。想办法消掉含有的变量的公式。角速度是角度的变化量,也就是陀螺仪的测量对象,但是旋转的度数和速度的变化量之间的转换就是dmp这个库所做的事(也就是你知道速度,但是路程是多少是要计算的。
角速度无法直接转换成四元数,只能通过推导,推导过程比较复杂,不是搞飞控算法的了解一下直接调用dmp库是最好的,毕竟造汽车的不一定会造发动机。
5.z轴会漂移是没有进行滤波,但是是有规律的增长,所以取相对数值进行调整也是完全没有问题的。
6.两个坐标系
惯性坐标系:就是东西一根x轴,南北一根y轴,天地一根z轴。
刚体固定坐标系:以运动物体质心为原点,初始状态平行与东西为Bx轴,平行与南北By轴,平行与天地Bz轴,运动物体姿态发生变化,既Bx,By,Bz不再与惯性坐标系各轴平行。通过变化的角度求出刚体的新的坐标轴相对于惯性坐标系的位置。
姿势:就是物体坐标系相对于惯性坐标系的变化,比如飞机刚开始(0,0,0),抬一下头(0,1,0)就是它的俯仰角发生了变化。也就是欧拉角中的Roll变大。(pitch,roll,yaw)对应(横滚角,俯仰角,偏航角),这些的依据是运动物体自身的坐标相对于惯性坐标系的变化。