接下来就是把存储了姿态信息的四元数转化为矩阵和欧拉角了。由于四元数直接转欧拉角较为麻烦,一般都是把四元数先转为姿态矩阵,再把它转为欧拉角。
四元数转姿态矩阵的公式为:
$C^n_b = \begin{pmatrix}1-2(q_2^2+q_3^2)&2(q_1q_2-q_0q_3)&2(q_1q_3+q_0q_2)\\2(q_1q_2+q_0q_3)&1-2(q_1^2+q_3^2)&2(q_2q_3+q_0q_2)\\2(q_1q_3-q_0q_2)&2(q_2q_3+q_0q_1)&1-2(q_1^2+q_2^2)\end{pmatrix}$(C1)
记:
$C^n_b = \begin{pmatrix}C_{11}&C_{12}&C_{13}\\C_{21}&C_{22}&C_{23}\\C_{31}&C_{32}&C_{33}\end{pmatrix}$(C2)
为了书写简便,接下来使用的不是数学上的反三角函数,而是c语言<math.h>库中的函数,主要使用asin()和atan2(),前者即反正弦,后者有两个参数,直接能给出以这两个参数为直角坐标系的xy坐标的点对应的极坐标下极角(-180°-180°)。这省去了讨论。还有注意直接给出的是弧度制。
对于工程上最常用的欧拉角,有以下转化:
$\begin{cases}\psi = \begin{cases} -atan2(C_{12},C_{22}),|C_{32}|\leq0.999999\\ 0,|C_{32}|>0.999999\end{cases}\\ \theta = asin(C_{32})\\ \gamma = \begin{cases}-atan2(C_{31},C_{33}),|C_{32}|\leq0.999999\\ atan2(C_{13},C_{11}),|C_{32}|>0.999999 \end{cases} \end{cases}$(C3)
这里的0.999999只是一个随便设定的接近1的值,用于判断是否接近奇点,是的话直接换一套计算方式。
对于运载火箭特化的欧拉角,有以下转化:
此时只要求C31不趋于±1,由于在这种情况下几乎不可能发生,所以可以不用判断,直接这样转化:
$\begin{cases}\theta = atan2(C_{21},C_{11})\\ \psi = -asin(C_{31})\\ \gamma = atan2(C_{32},C_{33})\end{cases}$(C4)
如果使用自带算法的imu,基本都是内置了(C2)(C3)的算法,比如JY901b能同时传回四元数和欧拉角,这块就不用操心了,但是主控里还需要用(C2)来算出姿态矩阵矩阵,并存在一个数组里供后续调用。如果是自己写的话就可以按照这些算法来写,直接翻译成编程语言即可,
姿态矩阵继续参与后续的计算,欧拉角在这套算法下只是作为给人看的数据,传回后地面站利用欧拉角绘图。
推导见《捷联惯导算法与组合导航原理》