发表于《开源一块飞控SS0》
tmn_A作者
8个月27天前IP:广东
948827
13楼

接下来就是把存储了姿态信息的四元数转化为矩阵和欧拉角了。由于四元数直接转欧拉角较为麻烦,一般都是把四元数先转为姿态矩阵,再把它转为欧拉角。

四元数转姿态矩阵的公式为:

$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)来算出姿态矩阵矩阵,并存在一个数组里供后续调用。如果是自己写的话就可以按照这些算法来写,直接翻译成编程语言即可,

姿态矩阵继续参与后续的计算,欧拉角在这套算法下只是作为给人看的数据,传回后地面站利用欧拉角绘图。

推导见《捷联惯导算法与组合导航原理》


评论
1
文号 / 948827

百炼成钢
名片专栏发私信
学术分 0
总主题 15 帖总回复 172 楼拥有证书:进士 机友 笔友
注册于 2020/08/28 12:52:17最后登录 2026/10/30 21:53:39
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:广东

个人简介

辰星引力工作室成员,火箭爱好者,嵌入式爱好者,物理爱好者,还有亚雷斯塔克劳利是我老婆。

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的