1.简介
(1)roll(横滚角,绕x轴旋转的角度),pitch(俯仰角,绕y轴旋转的角度),yaw(航向角,绕Z轴旋转的角度)。
(2)加速度传感器(检查哪几个面受了多少力,然后计算角度),可以看作力传感器。
(3)陀螺仪(角速度检测仪),例如,板子以z轴为轴心一秒钟转动了90°,那么在z轴上的角速度就是90°/秒。
(4)3轴加速度和3轴陀螺仪分别采用了3个16位的ADC,也就是说,每个轴输出的数据是2^16,即-32768 -- +32768。-32768 ---- +32768代表的值与MPU6050设置的量程决定。例如,加速度传感器量程范围:±2g,±4g,±8g,±16g,设置为±2g,那么-32768 ---- +32768代表的值便为±2g。
2.DMP
DMP可以将MPU6050读出的角速度传感器和加速度传感器的原始数据转换为四元数。进而完成欧拉角的计算。但是DMP输出的四元数是q30格式(就是扩大了2的30次方),所以在换成欧拉角前,需要除以2的30次方之后),再计算。公式如下:
q0=quat[0] / q30; //q30 格式转换为浮点数
q1=quat[1] / q30;
q2=quat[2] / q30;
q3=quat[3] / q30;
计算欧拉角:俯仰角/横滚角/航向角(57,3是180/π,弧度转角度)
pitch=asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; //俯仰角
roll=atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; //横滚角
yaw=atan2(2(q1q2 + q0q3),q0q0+q1q1-q2q2-q3*q3) * 57.3; //航向角
为什么要引入四元数而不用欧拉角来表示旋转?
第一个原因便是计算量大,第二个原因是欧拉角只能用于水平姿态变换不大的情况,不适用于全姿态飞行器姿态确定(当俯仰角为90°时,会出GimbalLock”(万向锁))。
什么是GimbalLock(万向锁)?
3.姿态解算
通过DMP进行,可以降低运动处理对操作系统的负荷。
方向余弦矩阵:
首先从二维入手,如何用欧拉角表示一次旋转。设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。
这仅仅是一次旋转,而我们需要旋转3次才能得到方向余弦矩阵。
接下来我们需要用四元数来表示这个方向余弦矩阵。
定义的四元数:
而刚才用欧拉角描述的方向余弦矩阵用四元数描述为:
得到:
yaw = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2q2 - 2 * q3 q3 + 1)* 57.3;
pitch= asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;
roll= atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;