第二章:坐标系与刚体运动基础

各位同学,欢迎来到《传感器融合与轨迹优化实战》的第二讲。

今天我们要聊的,是整个课程的基石——坐标系与刚体运动。说白了,就是搞清楚“我在哪”以及“我怎么动”这两个问题。你想想看,无论是无人机、机器人还是自动驾驶汽车,所有运动规划的前提,都是对自身姿态和位置的精确描述。如果这一步搞错了,后面再牛的算法也是白搭。

2.1 世界坐标系与机体坐标系

我们先从最直观的概念入手。

世界坐标系,也叫全局坐标系。它是一个固定不动的参考系。通常我们定义东北天(ENU)或者北东地(NED)作为世界坐标系。在室内场景,我习惯把机器人启动的位置设为原点,这样调试起来方便。

机体坐标系,是固定在运动物体上的坐标系。比如四旋翼无人机,原点在质心,X轴指向机头,Y轴指向右侧,Z轴垂直向下(或向上,取决于定义)。

为什么要区分这两个坐标系?

因为传感器测量的数据,都是在各自的机体坐标系下得到的。比如IMU测的加速度和角速度,就是机体坐标系下的值。而我们要做轨迹规划,最终是要在世界坐标系下描述路径。所以,坐标变换就成了绕不开的核心问题。

核心要点:所有传感器数据最终都要统一到世界坐标系下处理。这是传感器融合的第一步,也是最容易出错的一步。

2.2 旋转矩阵:最直观的旋转表示

旋转矩阵,是描述刚体旋转最直接的方式。它是一个3x3的正交矩阵,行列式为+1。

假设有一个向量 v 在机体坐标系下的坐标为 v_b,在世界坐标系下的坐标为 v_w,那么:

v_w = R * v_b

这里的 R 就是旋转矩阵。它把机体坐标系下的向量,映射到了世界坐标系下。

我在项目中遇到过一个问题:用旋转矩阵做连续旋转时,由于浮点数精度问题,矩阵会慢慢失去正交性。嗯,这里要注意,长时间迭代后必须对旋转矩阵做正交化处理,否则误差会累积。

个人小技巧:每次更新旋转矩阵后,用 R = (R * R^T)^(-1/2) * R 做一次修正。虽然计算量稍大,但能保证长期稳定性。

2.3 欧拉角:直观但小心万向锁

欧拉角用三个角度来描述旋转:横滚角(roll)、俯仰角(pitch)、偏航角(yaw)。

它的优点是直观。你一看 roll=10°,pitch=5°,yaw=30°,脑子里就能大概想象出姿态。

但欧拉角有个致命缺陷——万向锁。当 pitch 接近 ±90° 时,roll 和 yaw 的旋转轴会重合,丢失一个自由度。我曾经在调试一个机械臂时,就因为欧拉角插值导致末端执行器突然“抽搐”,后来查了半天才发现是万向锁在作怪。

表示方法 优点 缺点
旋转矩阵 无奇异性,可组合 9个参数,冗余,需正交化
欧拉角 直观,3个参数 万向锁,插值困难
四元数 无奇异性,可插值 不够直观,需归一化

2.4 四元数:工程中的首选

四元数,说白了就是一个超复数。形式是 q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部。

为什么工程中偏爱四元数?

  • 无奇异性:不会出现万向锁
  • 便于插值:球面线性插值(SLERP)可以生成平滑的旋转过渡
  • 计算高效:比旋转矩阵少一个维度

我个人习惯用四元数做姿态估计。在卡尔曼滤波中,状态量通常就是四元数加角速度偏置。

避坑指南:我曾经因为忘记归一化四元数,导致滤波器发散。记住,四元数必须保持单位模长,即 w² + x² + y² + z² = 1。每次更新后都要做归一化。

2.5 相互转换:你必须要会的公式

在实际工程中,这三种表示方法经常需要来回切换。下面给出最常用的转换公式。

2.5.1 欧拉角 → 旋转矩阵

假设旋转顺序为 Z-Y-X(偏航-俯仰-横滚):

R = Rz(yaw) * Ry(pitch) * Rx(roll)

其中:
Rx(roll)  = [[1, 0, 0],
             [0, cos(roll), -sin(roll)],
             [0, sin(roll), cos(roll)]]

Ry(pitch) = [[cos(pitch), 0, sin(pitch)],
             [0, 1, 0],
             [-sin(pitch), 0, cos(pitch)]]

Rz(yaw)   = [[cos(yaw), -sin(yaw), 0],
             [sin(yaw), cos(yaw), 0],
             [0, 0, 1]]

2.5.2 旋转矩阵 → 四元数

从旋转矩阵 R 的元素提取四元数:

w = sqrt(1 + R[0][0] + R[1][1] + R[2][2]) / 2
x = (R[2][1] - R[1][2]) / (4 * w)
y = (R[0][2] - R[2][0]) / (4 * w)
z = (R[1][0] - R[0][1]) / (4 * w)

注意:当 w 接近 0 时,需要用其他公式避免数值不稳定。

2.5.3 四元数 → 欧拉角

roll  = atan2(2*(w*x + y*z), 1 - 2*(x² + y²))
pitch = asin(2*(w*y - z*x))
yaw   = atan2(2*(w*z + x*y), 1 - 2*(y² + z²))

这里 atan2 是四象限反正切函数,能正确处理符号。

实战建议:在代码中,我建议统一使用四元数做内部运算,只在需要显示或人机交互时转成欧拉角。这样可以避免万向锁,也减少转换误差。

2.6 知识体系总览

下面这张图,是我自己总结的本章知识结构。你可以把它当作一个快速索引。

坐标系与刚体运动基础 - 知识体系 世界坐标系 机体坐标系 旋转表示方法 旋转矩阵 (3x3) 欧拉角 (roll, pitch, yaw) 四元数 (w, x, y, z) 相互转换:欧拉角 ↔ 旋转矩阵 ↔ 四元数

这张图把本章的核心逻辑串起来了。从世界坐标系和机体坐标系出发,引出三种旋转表示方法,最后强调它们之间的相互转换。你可以在后续学习中反复回来对照这张图。

2.7 本章小结

好了,这一章的内容就到这里。

我们讲了世界坐标系和机体坐标系的概念,深入分析了旋转矩阵、欧拉角、四元数这三种旋转表示方法,并给出了它们之间的转换公式。

记住,没有哪一种表示方法是万能的。旋转矩阵直观但冗余,欧拉角易懂但有万向锁,四元数高效但不够直观。工程中要根据场景灵活选择。

下一章,我们会把这些知识用到实际的传感器数据融合中。到时候你会发现,今天打下的基础有多重要。

课后练习:写一个小程序,输入欧拉角 (30°, 45°, 60°),分别计算对应的旋转矩阵和四元数,再转回欧拉角,看看是否一致。这个小练习能帮你巩固今天的知识。

可可精品资料库