科研过程中遇到了有关三维旋转的问题,狠狠补课了。
三维空间中,常用的旋转表示方法有旋转矩阵、欧拉角、四元数等。本文主要记录三者的基础逻辑以及相互转换关系,旋转坐标系、动力学方程等内容后续再写。
基础定义#
坐标系基础#
-
参考肖业伦与韩潮老师编撰的《航天器动力学》一书,使用GB/T 14410定义,右手坐标系;
-
坐标系矢阵:对坐标系Sa,其矢阵如Fa=(iajaka)T,其中单位矢量ia,ja,ka均为列向量。
- 注意转置符号
- 坐标系中的某个矢量u=uxaia+uyaja+uzaka=(iajaka)uxauyauza
-
分量:uxa,uya,uza三个标量被称为分量。
-
分量列阵:(u)a=uxauyauza表示矢量u在a系下的各分量,也被称为投影。
- u=FaT(u)a=uaTFa
- 注意区分u和ua:在不同坐标系下,同一个矢量u=FaT(u)a=FbT(u)b,(u)a=(u)b
-
世界坐标系&体坐标系
旋转矩阵基础#
- 转换矩阵定义:从坐标系a向坐标系b转换的三维旋转矩阵是3×3正交方阵,定义如Lba=a11a12a13a21a22a23a31a32a33=Fb⋅FaT
- 推导过程:u=FaT(u)a=FbT(u)b,两侧同乘Fb即可
- 运算规则与性质
- 分量变换:(u)b=Lba(u)a
- 坐标系变换:Fb=LbaFa
- 正交性质:Lab=Lba−1=LbaT
- 直观理解
- Lba可以看成((ia)b(ja)b(ka)b),也即三个a系中的单位向量在b系中的分量表示。
- 假设站在z轴正无穷处沿-z轴方向看,A系绕z轴逆时针转θ度,x、y轴不动:
- ⎩⎨⎧ia=cos(θ)ib−sin(θ)jb+0kbja=sin(θ)ib+cos(θ)jb+0kbka=0ib−0jb+1kb
- 则Lba=cos(θ)−sin(θ)0sin(θ)cos(θ)0001(注意按列的对应关系)
- 或者按行看,Lba=((ib)a(jb)a(kb)a)T,更直观。
欧拉角基础#
- 通过绕X轴、Y轴、Z轴的三次旋转定义从系A到系B的转换关系。
- 除了转角大小,还需要给定旋转次序与内旋/外旋定义,才能唯一确定转换后的坐标系。
- 旋转次序:最常用的是231与321旋转。
- 231:YZX(偏航-俯仰-滚转)次序,一般用于平飞飞行器;
- 321:ZYX(俯仰-偏航-滚转)次序,一般用于垂直发射飞行器。
- 内/外旋:详见”内旋,外旋与左右乘”一节
- 死锁:第二轴旋转量为90°/-90°时,旋转失去一个自由度的现象。
- 如231次序下的垂直飞行器,偏航角与滚转角的旋转方向是一致的。
四元数基础#
- 定义:形如q=a+bi+cj+dk(a,b,c,d∈R)的数,a,b,c,d分别代表实部和三个虚部分量。
- 特点:四个轴(实轴+三个虚轴)之间相互正交。
- 用途与优势:用于表示三维空间内的旋转运动,解决了欧拉角“死锁”的问题。
- 运算规则:以q=a+bi+cj+dk为例
- 简写成q=(a,b,c,d)
- a:实部(又称标量部分)
- (b,c,d)T:虚部(又称矢量部分)
- i,j,k:表示三个相互正交的虚轴,他们各自也与实部正交
- i2=j2=k2=−1
- ij=−ji=k,jk=−kj=i,ki=−ik=j
- ijk=−1
- 乘法过程中不满足交换律,满足结合律。
- q1⋅q2=(a1,b1,c1,d1)⋅(a2,b2,c2,d2)=a1a2−b1b2−c1c2−d1d2a1b2+b1a2+c1d2−d1c2a1c2−b1d2+c1a2+d1b2a1d2+b1c2−c1b2+d1a2T
- 纯四元数:up=(0,b,c,d),实部为0。
- 共轭四元数:q−1=(a,−b,−c,−d)
- 直观理解
- 来自互动视频。
- 对一个q=cos(θ)+sin(θ)(ai+bj+ck)(a2+b2+c2=1),可以认为定义了旋转轴ai+bj+ck。
- 左乘:对一个四元数a,qa表示向q旋转轴正方向+右手方向周向的空间变换;
- 右乘:aq表示向q旋转轴正方向+左手方向周向的空间变换。
- 旋转:qaq−1,其中q与q−1在旋转轴上的效应相互抵消,周向效应互相叠加,结果得到了a沿轴右手方向旋转2θ得到的四元数。
轴-角基础#
- 定义:绕某条单位轴旋转给定的夹角。
- 可以与四元数直接转化
- 对q=cos(2θ)+sin(2θ)(ai+bj+ck)(a2+b2+c2=1),表示了绕轴ai+bj+ck旋转θ度的情况。
- 计算时使用a′=qaq−1
转换关系#
记录各种表示方法间的转换关系,在这篇文章里也可见相关内容。
欧拉角->旋转矩阵#
- 按照旋转顺序,将各个转换矩阵依次连乘即可。
- 注意:旋转轴表示在世界坐标系/体坐标系下的结果不同
- 如果表示在体坐标系下,则后续旋转在前序基础上继续左乘(这是飞行器姿态计算中的常见现象)
- 如果表示在世界坐标系,则后续在前序基础上右乘。
- 具体原因可以查看”世界坐标系、体坐标系与左右乘”一节。
旋转矩阵->欧拉角#
- 本质上是求六元三次方程组的解。
- 解方程时,先确定绕第一轴旋转的角度,即可方便地确定绕剩余两轴的角度。
- 特判:死锁状态。
(单位)四元数->旋转矩阵#
-
本质上需要将待旋转的向量u转换为纯四元数u0=(0,uT),然后将qu0q−1计算结果与旋转矩阵的形式匹配起来。
-
对于单位四元数q=a+bi+cj+dk,对应的旋转矩阵为
R=1−2(c2+d2)2(bc+ad)2(bd−ac)2(bc−ad)1−2(b2+d2)2(cd+ab)2(bd+ac)2(cd−ab)1−2(b2+c2)
旋转矩阵->(单位)四元数#
- 要凑出四元数,本质上就是要获得旋转的轴-角。
- 思想:一次对齐一轴
- 令a->b系的旋转矩阵为Lba,考察A系中三个单位矢量的分量表示(ia)a=(1,0,0)T,(ja)a=(0,1,0)T,(ka)a=(0,0,1)T
- (ia)b=Lba(ia)a,(ja)b=Lba(ja)a,(ka)b=Lba(ka)a
- 转换1-对齐i轴:找到让(ia)a转到(ia)b的轴方向(与(ia)a以及(ia)b均正交) 与转动角度(通过叉乘计算,注意叉乘结果为0的特殊情况),表示为四元数q1
- 转换2-对齐j轴:以(ia)b为轴,在转换1的基础上,找到让j轴朝向对齐(ja)b的转动角度(同样通过叉乘计算,注意结果为0的情况),将结果表示为四元数q2
- 经过两次转换,i,j两轴都已对齐,k轴也自然对齐(因为左右手关系在变换中不变)。
(单位)四元数->欧拉角#
- 通过四元数->旋转矩阵->欧拉角实现,否则过于麻烦
- 同样需要特判死锁状态
欧拉角->(单位)四元数#
- 将每一步欧拉角操作写成对应四元数,并将各步骤依次相乘。
- 注意:同样需要注意轴在世界坐标系还是体坐标系。
内旋,外旋与左右乘#
NOTE注意旋转矩阵的定义。部分教材中的旋转矩阵与本文中的是转置关系,则结论也不同。
- 左乘旋转矩阵对应了哪种情况?
- 先说结论:对应内旋的情况。
- 假设从世界坐标系A旋转得到了一个体坐标系B,仅给出某矢量B系的分量(u)b与旋转矩阵Lcb,即可得到矢量在C系下的分量表示(u)c=Lcb(u)b=LcbLba(u)a;
- 如果左乘代表外旋,即(u)c=Lcb(u)b是按A系下的世界轴施行旋转,则意味着Lcb包含A系与B系的相对位置信息,明显不合理。
- 旋转轴定义在体坐标系的情况
- 旋转轴定义在世界坐标系的情况
- 简单理解:对外旋而言,旋转顺序对结果坐标系没有影响;需要趁体坐标系转轴还没离开世界坐标之前先转,所以最后的变换应该最先施行。
- 故后续旋转需要在前序基础上右乘。