一、四元数基础:从数学定义到旋转本质

各位工程师朋友,大家好。我是你们这门课的主讲人。

做惯性导航这些年,我接触过不少姿态解算的方法。欧拉角、方向余弦矩阵、四元数……说实话,刚入行那会儿,我也觉得四元数这东西有点抽象。但后来在项目里吃过亏——用欧拉角做姿态插值,结果遇到了万向锁,飞机姿态直接飞了。从那以后,我就老老实实把四元数啃透了。

今天这一章,咱们就把四元数的底裤扒干净。你想想看,一个只有四个分量的超复数,凭什么能搞定三维空间的旋转?

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 本章知识体系总览

为了让大家对四元数基础有一个整体的把握,我画了一张图。这张图把四元数的定义、运算和旋转关系串在了一起,你一看就明白。

四元数基础 · 知识体系 四元数 q = w + xi + yj + zk 数学定义 基本运算 旋转关系 实部 + 三个虚部 i² = j² = k² = -1 加法:分量相加 乘法:点积+叉积 共轭:虚部取反 模:平方和开根号 旋转轴 + 旋转角 半角公式:cos(θ/2) 旋转公式:q * p * q* 核心:单位四元数 → 纯旋转(无缩放)

这张图把四元数的三个核心方面都串起来了。你从中心出发,往左看是数学定义,往中间看是基本运算,往右看是旋转关系。每个分支下面还有具体的知识点。我个人建议你把这张图存下来,后面学完整个课程再回来看,会有更深的理解。

1.5 工程中的实用建议

最后,我结合自己的项目经验,给大家几点实用建议:

  • 始终使用单位四元数:每次更新后做归一化,这是铁律。
  • 注意乘法顺序:左乘和右乘代表不同的旋转顺序,写代码前先想清楚。
  • 半角别搞错:构造旋转四元数时,角度要除以2。
  • 调试时打印四元数:我习惯在关键节点打印 w, x, y, z 的值,看模长是否为1,看数值是否在合理范围内。

一句话总结:四元数就是用四个数(一个实部+三个虚部)来描述三维空间中的旋转。它的核心优势是——没有万向锁,插值平滑,计算效率高。

好了,这一章的内容就到这里。四元数的基础打牢了,后面讲姿态解算算法的时候,你才能跟得上。咱们下一章见。


公众号:蓝海资料掘金营,微信deep3321