学习三维姿态表示时,我把旋转矩阵和单位四元数放在一起比较。下面先明确坐标系约定,再整理角速度、姿态微分方程以及数值积分后的约束检查。
**先修知识:**线性代数、叉乘、刚体动力学与常微分方程数值积分。
阅读路线:
- 从世界坐标系与机体坐标系之间的变换理解旋转矩阵。
- 用四元数乘法、共轭与单位长度约束表示旋转。
- 对照两种姿态动力学实现,检查积分后的正交性和四元数模长。
Lecture 14 旋转#
欧拉角直观,但在特定姿态存在参数化奇异性。旋转矩阵和单位四元数可以避免欧拉角的这类奇异性,代价是使用冗余参数并满足相应约束;此外,q 与 −q 表示同一旋转,四元数表示也不是唯一的。
本文约定 Q 将机体系向量变换到世界系,四元数按“实部在前”排列,姿态运动学中的角速度用机体系表示。换用其他约定时,乘法顺序和符号都要重新核对。
旋转矩阵#
三维空间坐标点在以[e1,e2,e3]单位正交基组成的世界坐标系N中的描述和在体坐标系B(基底[e1′,e2′,e3′])是一致的,即有
[e1,e2,e3]Nx1Nx2Nx3=[e1′,e2′,e3′]Bx1Bx2Bx3由于基底的正交性,可以得出在世界坐标系N和体坐标系下坐标旋转变换关系
Nx1Nx2Nx3=QBx1Bx2Bx3Q是旋转矩阵,是一个行列式为1的正交矩阵,它的逆就是它的转置,并且旋转矩阵构成一个SO(3)李群(特殊正交群)
- QTQ=I
- det(Q)=1
- Q∈SO(3) special orthogonal in 3D
拓展:特殊欧式群(special Euclidean Group)SE(3)
SE(3)={T=[R01×3t1]∈R4×4∣R∈SO(3),t∈R3}描述陀螺仪的旋转#
以陀螺仪举例,考虑固定在本身的体坐标系B和地面坐标系的坐标描述
Nx=Q(t)Bx对时间t求导
Nx˙=Q˙(t)Bx+Q(t)Bx˙=Q˙(t)Bx当物体以ω的角速度旋转,那么Nx的导数
Nx˙=Nω×Nx=Q(Bω×Bx)那么
Q˙(t)Bx=Q(Bω×Bx)⟹Q˙=QBωQk+1=Qk+Q˙kΔt四元数:一个实部与三个虚部#
q=w+xi+yj+zk本文讨论的都是单位四元数
∣∣q∣∣=w2+x2+y2+z2=1也可以通过轴角描述(给定一个旋转轴u和旋转角θ)
q=[cos2θ,usin2θ]四元数的乘法
q1⊗q2=[w1v1]⊗[w2v2]=[w1w2−v1⋅v2w1v2+w2v1+v1×v2]=[w1v1−v1Tw1I+v^1][w2v2]=L(q1)[w2v2]=[w2v2−v2Tw2I−v^2][w1v1]=R(q2)[w1v1]旋转一个向量(使用纯虚四元数表示姿态向量Hv=[0v])
Hv′=q⊗[0v]⊗q−1=L(q)R(q)THv=R(q)TL(q)Hv其中R(q)和L(q)四元数的左乘和右乘矩阵,从这里可以得到四元数和旋转矩阵的关系
Q(q)=HTR(q)TL(q)H四元数的逆与共轭四元数的关系
q−1=∣∣q∣∣2q∗单位四元数有q−1=q∗
用四元数表示刚体的姿态运动学quaternion Kinematics
q˙=21L(q)Hω那么完整的位置和姿态运动学方程和速度和角速度动力学方程如下
x˙=r˙q˙v˙ω˙=v21L(q)Hωm1WF(x,u)J−1(Bτ(x,u)−ω×Jω)其中 Hω=[0;ω] 为纯虚四元数,不能与 3×3 叉乘矩阵 ω^ 混用。WF 为世界系的总外力(有重力时应包含它),Bτ 为机体系的总外力矩,J 为机体系中恒定的惯性矩阵。
刚体姿态动力学分析#
使用旋转矩阵表示法(9参数)和四元数表示法(4参数)实现一个刚体姿态动力学仿真系统
-
核心库
using LinearAlgebra # 线性代数运算
-
关键函数定义
点击展开代码
-
初始条件
q0 = [1; 0; 0; 0] # 单位四元数(无旋转)
-
动力学模型
ω̇ = -J\(hat(ω)*J*ω) # 欧拉动力学方程
q̇ = 0.5*L(q)*H*ω # 四元数微分方程
ω̇ = -J\(hat(ω)*J*ω) # 欧拉动力学方程
-
数值积分方法RK4
f2 = dynamics(x + 0.5*h*f1)
f3 = dynamics(x + 0.5*h*f2)
xn = x + (h/6.0)*(f1 + 2*f2 + 2*f3 + f4)
#xn[1:4] .= xn[1:4]./norm(xn[1:4]) # 保持单位四元数
-
仿真结果验证
-
旋转矩阵验证
0.962748 -0.00123354 -0.00149965
-0.00123354 0.977413 0.0178415
-0.00149965 0.0178415 0.984187
-
四元数验证
Q(qk)'*Q(qk) # 转换矩阵应正交≈ I(3)
1.0 1.73472e-17 2.77556e-17
复现与数值误差#
这里的 Julia 片段仍依赖未在本文完整列出的惯性矩阵 J、四元数嵌入矩阵 H、步长 h 和仿真循环;当前不应视为可以独立运行的完整程序。rkstep 默认调用旋转矩阵模型,切换到四元数时必须同时更换动力学函数与状态布局,不能只取消归一化注释。
原日志中的 Q⊤Q 已明显偏离单位矩阵,说明直接积分没有严格保持正交性。这是需要检查的误差,而不是正交性验证通过。对四元数归一化有助于维持单位长度,但不能代替积分精度和动力学结果的验证。
整理与核查说明#
本笔记原有许可为 CC BY 4.0。引用的课程材料、代码和图片仍须遵守其各自的许可。
核查状态:待复现(2026-10-04)。 已核对四元数顺序与坐标系说明;原旋转积分实验未重新运行。
2026-10-04 整理时修正了已定位的公式和实现问题。文中的图片、动画和输出保留自学习时的实验记录,不代表修订后的代码已经完整重跑。作业片段依赖原项目环境,不能直接作为完整可运行教程;具体核查范围与尚未复现事项见正文。