一、四元数基础:从数学定义到旋转本质
各位工程师朋友,大家好。我是你们这门课的主讲人。
做惯性导航这些年,我接触过不少姿态解算的方法。欧拉角、方向余弦矩阵、四元数……说实话,刚入行那会儿,我也觉得四元数这东西有点抽象。但后来在项目里吃过亏——用欧拉角做姿态插值,结果遇到了万向锁,飞机姿态直接飞了。从那以后,我就老老实实把四元数啃透了。
今天这一章,咱们就把四元数的底裤扒干净。你想想看,一个只有四个分量的超复数,凭什么能搞定三维空间的旋转?
1.1 四元数的数学定义
四元数,说白了就是一个扩展版的复数。
普通复数有一个实部和一个虚部:a + bi。四元数呢?它有一个实部和三个虚部:
q = w + xi + yj + zk
其中 w 是实部,x、y、z 是虚部。而 i、j、k 是三个虚数单位,它们满足一个很有意思的乘法规则:
i² = j² = k² = ijk = -1
ij = k, ji = -k
jk = i, kj = -i
ki = j, ik = -j
嗯,这里要注意:四元数的乘法不满足交换律。也就是说,q1 * q2 一般不等于 q2 * q1。这一点和矩阵乘法很像,也是四元数能表示旋转的关键。
我个人习惯把四元数写成向量形式:
q = [w, x, y, z]ᵀ
或者拆成标量部分和向量部分:
q = [w, v] 其中 v = (x, y, z)
这样写,后面的运算会清晰很多。
1.2 四元数的基本运算
咱们一个一个来。这些运算在代码里天天用,必须烂熟于心。
1.2.1 加法
两个四元数相加,就是对应分量相加:
q1 + q2 = [w1+w2, x1+x2, y1+y2, z1+z2]
这个没什么好说的,和向量加法一样。
1.2.2 乘法
四元数乘法就有点讲究了。假设:
q1 = [w1, v1] = [w1, (x1, y1, z1)]
q2 = [w2, v2] = [w2, (x2, y2, z2)]
它们的乘积是:
q1 * q2 = [w1*w2 - v1·v2, w1*v2 + w2*v1 + v1×v2]
这里 · 是点积,× 是叉积。你看,叉积的出现就解释了为什么乘法不交换——因为叉积本身是反交换的。
我在项目中遇到过一个问题:两个四元数相乘,顺序搞反了,结果姿态解算出来的角度完全不对。排查了半天,最后发现是乘法顺序写错了。所以,写代码的时候一定要确认好旋转顺序。
核心要点:四元数乘法不满足交换律。左乘和右乘代表不同的旋转顺序。
1.2.3 共轭
四元数的共轭,就是把虚部取反:
q* = [w, -x, -y, -z]
或者写成:
q* = [w, -v]
共轭有什么用?后面你会看到,它和四元数的逆有直接关系。
1.2.4 模
四元数的模(也叫范数),就是各分量的平方和开根号:
||q|| = sqrt(w² + x² + y² + z²)
如果 ||q|| = 1,我们称它为单位四元数。单位四元数在姿态解算中特别重要,因为只有单位四元数才能表示纯旋转(不包含缩放)。
小技巧:在实际工程中,每次更新完四元数后,最好做一次归一化:q = q / ||q||。我曾经因为忘记归一化,导致姿态漂移越来越严重,最后整个系统都崩了。
1.3 四元数与旋转的关系
好了,前面铺垫了这么多,现在进入正题:四元数到底怎么表示旋转?
你想想看,三维空间中的一个旋转,可以用一个旋转轴和一个旋转角度来描述。比如,绕单位向量 n = (nx, ny, nz) 旋转 θ 角度。这个旋转对应的四元数是:
q = [cos(θ/2), nx*sin(θ/2), ny*sin(θ/2), nz*sin(θ/2)]
注意,这里用的是半角!这是初学者最容易搞混的地方。为什么是半角?因为四元数旋转的本质是「两次反射」的复合,这个数学推导比较复杂,咱们先记住结论。
那么,如何用四元数旋转一个三维向量 p = (px, py, pz)?
先把 p 写成纯四元数(实部为0):
p_quat = [0, px, py, pz]
然后做这个运算:
p_rotated = q * p_quat * q*
结果 p_rotated 的虚部就是旋转后的向量坐标。
这个公式是四元数旋转的核心,没有之一。我在做无人机飞控的时候,每次姿态更新都要跑一遍这个运算。代码写多了,闭着眼睛都能默写出来。
避坑指南:我曾经在STM32上实现这个公式时,把 q * p_quat * q* 写成了 q * q* * p_quat。结果旋转后的向量长度变了,整个姿态解算都乱了。记住:四元数乘法不交换,顺序不能乱!
1.4 本章知识体系总览
为了让大家对四元数基础有一个整体的把握,我画了一张图。这张图把四元数的定义、运算和旋转关系串在了一起,你一看就明白。
这张图把四元数的三个核心方面都串起来了。你从中心出发,往左看是数学定义,往中间看是基本运算,往右看是旋转关系。每个分支下面还有具体的知识点。我个人建议你把这张图存下来,后面学完整个课程再回来看,会有更深的理解。
1.5 工程中的实用建议
最后,我结合自己的项目经验,给大家几点实用建议:
- 始终使用单位四元数:每次更新后做归一化,这是铁律。
- 注意乘法顺序:左乘和右乘代表不同的旋转顺序,写代码前先想清楚。
- 半角别搞错:构造旋转四元数时,角度要除以2。
- 调试时打印四元数:我习惯在关键节点打印
w, x, y, z的值,看模长是否为1,看数值是否在合理范围内。
一句话总结:四元数就是用四个数(一个实部+三个虚部)来描述三维空间中的旋转。它的核心优势是——没有万向锁,插值平滑,计算效率高。
好了,这一章的内容就到这里。四元数的基础打牢了,后面讲姿态解算算法的时候,你才能跟得上。咱们下一章见。
公众号:蓝海资料掘金营,微信deep3321