2337 字
12 分钟
飞行器动力学-P1_三维坐标系基础

科研过程中遇到了有关三维旋转的问题,狠狠补课了。

三维空间中,常用的旋转表示方法有旋转矩阵、欧拉角、四元数等。本文主要记录三者的基础逻辑以及相互转换关系,旋转坐标系、动力学方程等内容后续再写。

基础定义#

坐标系基础#

  • 参考肖业伦与韩潮老师编撰的《航天器动力学》一书,使用GB/T 14410定义,右手坐标系;

  • 坐标系矢阵:对坐标系SaS_{a},其矢阵如Fa=(iajaka)T\mathbf{F}_a=\begin{pmatrix} \mathbf{i_a} \quad \mathbf{j_a} \quad \mathbf{k_a} \end{pmatrix}^T,其中单位矢量ia,ja,ka\mathbf{i_a},\mathbf{j_a},\mathbf{k_a}均为列向量。

    • 注意转置符号
    • 坐标系中的某个矢量u=uxaia+uyaja+uzaka=(iajaka)(uxauyauza)\mathbf{u} = u_{xa} \mathbf{i}_a + u_{ya} \mathbf{j}_a + u_{za} \mathbf{k}_a = (\mathbf{i}_a \quad \mathbf{j}_a \quad \mathbf{k}_a) \begin{pmatrix} u_{xa} \\ u_{ya} \\ u_{za} \end{pmatrix}
  • 分量uxa,uya,uzau_{xa},u_{ya},u_{za}三个标量被称为分量。

  • 分量列阵(u)a=(uxauyauza)(\mathbf{u})_a=\begin{pmatrix} u_{xa} \\ u_{ya} \\ u_{za} \end{pmatrix}表示矢量u在a系下的各分量,也被称为投影。

    • u=FaT(u)a=uaTFa\mathbf{u}=\mathbf{F}_a^T(\mathbf{u})_a=\mathbf{u}_a^T\mathbf{F}_a
    • 注意区分u\mathbf{u}ua\mathbf{u}_a:在不同坐标系下,同一个矢量u=FaT(u)a=FbT(u)b\mathbf{u}=\mathbf{F}_a^T(\mathbf{u})_a=\mathbf{F}_b^T(\mathbf{u})_b(u)a(u)b(\mathbf{u})_a\neq(\mathbf{u})_b
  • 世界坐标系&体坐标系

    • 项目世界坐标系体坐标系
      原点固定于世界,不随物体运动一般位于物体质心&关键几何点
      不随物体转动而转动随物体转动
    • 对弹道学科,可以初步认为世界坐标系->发射惯性坐标系,体坐标系->弹体坐标系。

旋转矩阵基础#

  • 转换矩阵定义:从坐标系a向坐标系b转换的三维旋转矩阵是3×33\times3正交方阵,定义如Lba=(a11a12a13a21a22a23a31a32a33)=FbFaTL_{ba}=\begin{pmatrix} a_{11} \quad a_{12} \quad a_{13} \\ a_{21} \quad a_{22} \quad a_{23} \\ a_{31} \quad a_{32} \quad a_{33}\end{pmatrix}=\mathbf{F_b}\cdot\mathbf{F_a}^T
    • 推导过程u=FaT(u)a=FbT(u)b\mathbf{u}=\mathbf{F}_a^T(\mathbf{u})_a=\mathbf{F}_b^T(\mathbf{u})_b,两侧同乘Fb\mathbf{F}_b即可
  • 运算规则与性质
    • 分量变换(u)b=Lba(u)a(\mathbf{u})_b=L_{ba}(\mathbf{u})_a
    • 坐标系变换Fb=LbaFa\mathbf{F}_b=L_{ba}\mathbf{F}_a
    • 正交性质Lab=Lba1=LbaTL_{ab}=L_{ba}^{-1}=L_{ba}^T
  • 直观理解
    • LbaL_{ba}可以看成((ia)b(ja)b(ka)b)((\mathbf{i}_a)_b \quad (\mathbf{j}_a)_b \quad (\mathbf{k}_a)_b),也即三个a系中的单位向量在b系中的分量表示。
    • 假设站在z轴正无穷处沿-z轴方向看,A系绕z轴逆时针转θ\theta度,x、y轴不动:
      • {ia=cos(θ)ibsin(θ)jb+0kbja=sin(θ)ib+cos(θ)jb+0kbka=0ib0jb+1kb\begin{cases} \mathbf{i}_a=\cos(\theta)\mathbf{i}_b - \sin(\theta)\mathbf{j}_b + 0\mathbf{k}_b \\ \mathbf{j}_a=\sin(\theta)\mathbf{i}_b + \cos(\theta)\mathbf{j}_b + 0\mathbf{k}_b \\ \mathbf{k}_a=0\mathbf{i}_b - 0\mathbf{j}_b + 1\mathbf{k}_b \end{cases}
      • Lba=(cos(θ)sin(θ)0sin(θ)cos(θ)0001)L_{ba}=\begin{pmatrix} \cos(\theta) & sin(\theta) & 0 \\ -\sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1 \end{pmatrix}(注意按列的对应关系)
      • 或者按行看,Lba=((ib)a(jb)a(kb)a)TL_{ba}=((\mathbf{i}_b)_a \quad (\mathbf{j}_b)_a \quad (\mathbf{k}_b)_a)^T,更直观。

欧拉角基础#

  • 通过绕X轴、Y轴、Z轴的三次旋转定义从系A到系B的转换关系。
  • 除了转角大小,还需要给定旋转次序与内旋/外旋定义,才能唯一确定转换后的坐标系。
  • 旋转次序:最常用的是231与321旋转。
    • 231:YZX(偏航-俯仰-滚转)次序,一般用于平飞飞行器;
    • 321:ZYX(俯仰-偏航-滚转)次序,一般用于垂直发射飞行器。
  • 内/外旋:详见”内旋,外旋与左右乘”一节
  • 死锁:第二轴旋转量为90°/-90°时,旋转失去一个自由度的现象。
    • 如231次序下的垂直飞行器,偏航角与滚转角的旋转方向是一致的。

四元数基础#

  • 可参考以下视频建立对其的直观认识。
  • 定义:形如q=a+bi+cj+dk(a,b,c,dR)q=a+bi+cj+dk \quad (a,b,c,d\in{R})的数,a,b,c,da,b,c,d分别代表实部和三个虚部分量。
  • 特点:四个轴(实轴+三个虚轴)之间相互正交。
  • 用途与优势:用于表示三维空间内的旋转运动,解决了欧拉角“死锁”的问题。
  • 运算规则:以q=a+bi+cj+dkq=a+bi+cj+dk为例
    • 简写成q=(a,b,c,d)q=(a,b,c,d)
    • aa:实部(又称标量部分
    • (b,c,d)T(b,c,d)^T:虚部(又称矢量部分
    • i,j,ki,j,k:表示三个相互正交的虚轴,他们各自也与实部正交
    • i2=j2=k2=1i^2=j^2=k^2=-1
    • ij=ji=k,jk=kj=i,ki=ik=jij=-ji=k,jk=-kj=i,ki=-ik=j
    • ijk=1ijk=-1
    • 乘法过程中不满足交换律,满足结合律。
    • q1q2=(a1,b1,c1,d1)(a2,b2,c2,d2)=(a1a2b1b2c1c2d1d2a1b2+b1a2+c1d2d1c2a1c2b1d2+c1a2+d1b2a1d2+b1c2c1b2+d1a2)Tq_1\cdot{q_2}=(a_1,b_1,c_1,d_1)\cdot{(a_2,b_2,c_2,d_2)} \\ =\begin{pmatrix} a_1a_2-b_1b_2-c_1c_2-d_1d_2 \\ a_1b_2+b_1a_2+c_1d_2-d_1c_2 \\ a_1c_2-b_1d_2+c_1a_2+d_1b_2 \\ a_1d_2+b_1c_2-c_1b_2+d_1a_2 \end{pmatrix}^T
  • 纯四元数up=(0,b,c,d)\mathbf{u}_p=(0,b,c,d),实部为0。
  • 共轭四元数q1=(a,b,c,d)q^{-1}=(a,-b,-c,-d)
  • 直观理解
    • 来自互动视频
    • 对一个q=cos(θ)+sin(θ)(ai+bj+ck)(a2+b2+c2=1)q=\cos(\theta)+\sin(\theta)(ai+bj+ck) \quad (a^2+b^2+c^2=1),可以认为定义了旋转轴ai+bj+ckai+bj+ck
      • 左乘:对一个四元数a,qaqa表示向q旋转轴正方向+右手方向周向的空间变换;
      • 右乘aqaq表示向q旋转轴正方向+左手方向周向的空间变换。
      • 旋转qaq1qaq^{-1},其中qqq1q^{-1}在旋转轴上的效应相互抵消,周向效应互相叠加,结果得到了a沿轴右手方向旋转2θ2\theta得到的四元数。

轴-角基础#

  • 定义:绕某条单位轴旋转给定的夹角。
  • 可以与四元数直接转化
    • q=cos(θ2)+sin(θ2)(ai+bj+ck)(a2+b2+c2=1)q=\cos(\frac{\theta}{2})+\sin(\frac{\theta}{2})(ai+bj+ck) \quad (a^2+b^2+c^2=1),表示了绕轴ai+bj+ckai+bj+ck旋转θ\theta度的情况。
    • 计算时使用a=qaq1a'=qaq^{-1}

转换关系#

记录各种表示方法间的转换关系,在这篇文章里也可见相关内容。

欧拉角->旋转矩阵#

  • 按照旋转顺序,将各个转换矩阵依次连乘即可。
  • 注意:旋转轴表示在世界坐标系/体坐标系下的结果不同
    • 如果表示在体坐标系下,则后续旋转在前序基础上继续左乘(这是飞行器姿态计算中的常见现象)
    • 如果表示在世界坐标系,则后续在前序基础上右乘
    • 具体原因可以查看”世界坐标系、体坐标系与左右乘”一节。

旋转矩阵->欧拉角#

  • 本质上是求六元三次方程组的解。
  • 解方程时,先确定绕第一轴旋转的角度,即可方便地确定绕剩余两轴的角度。
  • 特判:死锁状态。

(单位)四元数->旋转矩阵#

  • 本质上需要将待旋转的向量u\mathbf{u}转换为纯四元数u0=(0,uT)\mathbf{u}_0=(0,\mathbf{u}^T),然后将qu0q1q\mathbf{u}_0q^{-1}计算结果与旋转矩阵的形式匹配起来。

  • 对于单位四元数q=a+bi+cj+dkq=a+bi+cj+dk,对应的旋转矩阵为

    R=[12(c2+d2)2(bcad)2(bd+ac)2(bc+ad)12(b2+d2)2(cdab)2(bdac)2(cd+ab)12(b2+c2)]R = \begin{bmatrix} 1 - 2(c^2 + d^2) & 2(bc - ad) & 2(bd + ac) \\ 2(bc + ad) & 1 - 2(b^2 + d^2) & 2(cd - ab) \\ 2(bd - ac) & 2(cd + ab) & 1 - 2(b^2 + c^2) \end{bmatrix}

旋转矩阵->(单位)四元数#

  • 要凑出四元数,本质上就是要获得旋转的轴-角。
  • 思想:一次对齐一轴
  • 令a->b系的旋转矩阵为LbaL_{ba},考察A系中三个单位矢量的分量表示(ia)a=(1,0,0)T,(ja)a=(0,1,0)T,(ka)a=(0,0,1)T(i_a)_a=(1,0,0)^T,(j_a)_a=(0,1,0)^T,(k_a)_a=(0,0,1)^T
  • (ia)b=Lba(ia)a,(ja)b=Lba(ja)a,(ka)b=Lba(ka)a(i_a)_b=L_{ba}(i_a)_a,(j_a)_b=L_{ba}(j_a)_a,(k_a)_b=L_{ba}(k_a)_a
  • 转换1-对齐i轴:找到让(ia)a(i_a)_a转到(ia)b(i_a)_b的轴方向(与(ia)a(i_a)_a以及(ia)b(i_a)_b均正交) 与转动角度(通过叉乘计算,注意叉乘结果为0的特殊情况),表示为四元数q1q_1
  • 转换2-对齐j轴:以(ia)b(i_a)_b为轴,在转换1的基础上,找到让j轴朝向对齐(ja)b(j_a)_b的转动角度(同样通过叉乘计算,注意结果为0的情况),将结果表示为四元数q2q_2
  • 经过两次转换,i,ji,j两轴都已对齐,kk轴也自然对齐(因为左右手关系在变换中不变)。

(单位)四元数->欧拉角#

  • 通过四元数->旋转矩阵->欧拉角实现,否则过于麻烦
  • 同样需要特判死锁状态

欧拉角->(单位)四元数#

  • 将每一步欧拉角操作写成对应四元数,并将各步骤依次相乘。
  • 注意:同样需要注意轴在世界坐标系还是体坐标系。

轴-角->旋转矩阵#

  • 使用轴-角—>四元数—>旋转矩阵的方法计算

旋转矩阵->轴-角#

  • 参考旋转矩阵->(单位)四元数

内旋,外旋与左右乘#

NOTE

注意旋转矩阵的定义。部分教材中的旋转矩阵与本文中的是转置关系,则结论也不同。

  • 本文对坐标系矢阵的定义为Fa=(iajaka)T\mathbf{F}_a=\begin{pmatrix} \mathbf{i_a} \quad \mathbf{j_a} \quad \mathbf{k_a} \end{pmatrix}^T

  • 欧拉角->旋转矩阵以及欧拉角->四元数的过程中,存在着连续运用变换的过程,即依次绕俯仰、偏航、横滚三个方向进行转动。

  • 旋转轴定义不同,旋转结果将不同

    • 内旋:转轴定义在体坐标系,旋转轴会随坐标系一同转动(例如飞行器的俯仰、偏航、横滚)。

    • 外旋:转轴定义在世界坐标系的情况,旋转轴不随坐标系一同转动(例如机械手控制中的部分情况)。

    • 参考下述动画

      • 左侧:内旋,旋转轴定义在世界坐标系
      • 右侧:外旋,旋转轴定义在体坐标系
      • 红、绿、蓝轴:旋转结果的X、Y、Z轴
      • 黑轴:当前旋转轴
  • 左乘旋转矩阵对应了哪种情况?
    • 先说结论:对应内旋的情况
    • 假设从世界坐标系A旋转得到了一个体坐标系B,仅给出某矢量B系的分量(u)b(\mathbf{u})_b与旋转矩阵LcbL_{cb},即可得到矢量在C系下的分量表示(u)c=Lcb(u)b=LcbLba(u)a(\mathbf{u})_c=L_{cb}(\mathbf{u})_b=L_{cb}L_{ba}(\mathbf{u})_a
    • 如果左乘代表外旋,即(u)c=Lcb(u)b(\mathbf{u})_c=L_{cb}(\mathbf{u})_b是按A系下的世界轴施行旋转,则意味着LcbL_{cb}包含A系与B系的相对位置信息,明显不合理。
  • 旋转轴定义在体坐标系的情况
    • 根据上述推理,只需连续左乘即可实现连续内旋。
  • 旋转轴定义在世界坐标系的情况
    • 简单理解:对外旋而言,旋转顺序对结果坐标系没有影响;需要趁体坐标系转轴还没离开世界坐标之前先转,所以最后的变换应该最先施行。
    • 故后续旋转需要在前序基础上右乘。
飞行器动力学-P1_三维坐标系基础
https://www.lithium-hydroxide.space/posts/250712_spacecraft_dynamics_coordinate_basic/
作者
LiH
发布于
2025-07-12
许可协议
CC BY-NC-SA 4.0