写这篇帖子主要是想记录下自己做这个项目的过程,想把思考的过程,实践的过程记录下来。
我想做的是一个可以准确的测量物体姿态的板子,和四轴要获取姿态是一样的,四轴最核心的技术也就是姿态计算。大学的时候接触过这个。现在VR挺火的,越来越觉得有必要做一个这样的姿态获取板,至少和技术大牛谈起来不会没有谈资。
做姿态测量,如果不只是移植代码,实际上背后的知识还是挺复杂的。买了一本书——《机器人学、机器视觉与控制——MATLAB算法基础》,这本书非常详细的介绍了基础知识,也就是位姿的描述,位姿变化的过程——旋转矩阵,四元数等等。而且都附上了MATLAB的代码,这样你知道具体用代码是怎样实现的。基础知识掌握非常重要,因为现在很多代码是四元数表示位姿,但是我觉得没有旋转矩阵标识位姿的基础,理解四元数也是比较困难的。
基础知识要掌握,当然一定要有一个实验平台,为此我花了大概一个多月做了一个十轴电路板:
这个就是我实验的基础,它包含了三轴加速度计,三轴陀螺仪,三轴电磁罗盘,气压计。并且有两个加速度计,一个量程范围大噪声也大±200g ,另一个量程可以到±16g 噪声比较低。
主控是STM32L011K4,是一款低功耗单片机,CM0+的内核。 不过完全满足我的要求,我只希望它是一块传感器数据获取板,不做任何算法,算法我有多种选择,STM32L432,CM4内核,主频可以到80M,另外一块板子是STM32F767,号称性能怪兽,主频216Mhz CM7内核。这两个选择一个是考虑低功耗,因为姿态板多数是绑定在设备上,电池供电的,功耗是肯定要考虑的事情。而STM32F767可以进行前期验证算法,达到理想的效果。另外我还搭建了一个被控板,这是从我买的遥控车上扒拉下来的,赛车太大了不方便调试:
赛车上的无刷电机不方便扒拉下来,用了个四旋翼上的无刷电机,KV1400。
后面会补充速度反馈和角度反馈。重点还是在姿态的实验平台上,考虑是加上一个实际的度数盘,平台旋转多少度直接可以读出来,旋转的座子最好是一个旋转编码器or增量编码器,反馈实际的旋转角度。
目前获取传感器原始数据已经做好了:ODR可以到数据手册的一半,已经完全满足我的需求了。UART可以达到2Mbps。
做获取原始数据的时候,遇到很多问题,为了获得最大的ODR,我必须使用传感器内部的FIFO,一般来说都是直接读三轴的寄存器值,但是发现这样根本没办法达到高的ODR,而读取FIFO,过程中遇到了各种问题,没有参考代码,实在别扭。STM32的帧间隔在轮询和DMA方式是不同的,就这个小小的问题搞了一周。最终得到了比较好的ODR,摆平这个,为后面做好了很好的铺垫;虽然实际我并不需要这么高的ODR。ACC是3.2K,GYRO是6.4K。 如果你了解过其他算法中传感器ODR,你就知道这已经是飞速了,因为一般只有几十,几百hz。不过大多数是直接读取寄存器值,ODR是根据算法的快慢决定的。
原始数据的部分不想在帖子上贴出来,后面等完善了在贴出代码。
通过看书,现在基本上理解了位姿描述的基本知识,下一个帖子谈谈这个。如果你真的深入进去了,就发现不了解这个最基本的知识,除了复制粘贴代码,最后调试的时候凭感觉,你没有其他办法。
了解基本知识的下一步是考虑如何实现姿态测量在单片机上编程。分为两个部分,1、传感器校准、数字滤波;2、用四元数法描述姿态。我认为会遇到的困难就是滤波算法的选择,然后调试过程能不能达到预期的效果。
能够用姿态测量板描述姿态,下一步就是位姿坐标系变化——轨迹描述。这个东西就已经是机器人的基础了,不过我觉得姿态的准确测量会是一个坎,温飘,积分飘移应该会把我逼疯。
轨迹部分牵涉的概念更多,我看了那本书一会就受不了了,什么5次多项式方程,求齐次解。心想大学的课都上哪去了,该用的时候一点也想不起来。
先记录到这,下一步位姿描述搞起来!~