3、刚体运动与旋转表示法:欧拉角、旋转向量、四元数基础

各位同学,欢迎来到第三章。

上一章我们聊了坐标系和位姿描述。说白了,那就是给机器人一个“身份证”,告诉它你在哪、脸朝哪。但机器人要动起来,光有身份证可不够。它得知道怎么从A点扭到B点,怎么转个身,怎么把螺丝拧进去。

这一章,我们就来啃下机器人运动学里最核心、也最容易让人头晕的部分——旋转表示法。

我个人习惯把旋转比作“拧瓶盖”。你想想看,拧瓶盖这个动作,本质上就是刚体绕着一个轴在转。但问题来了:怎么用数学语言精确描述这个“拧”的过程?

嗯,这里就有三种主流方案:欧拉角、旋转向量、四元数。它们各有各的脾气,也各有各的坑。我在项目里踩过不少雷,今天一并分享给你。

核心观点:没有完美的旋转表示法,只有最适合当前场景的。理解它们的本质,比死记硬背公式重要一百倍。

3.1 欧拉角:最直观,但也是最危险的

欧拉角,说白了就是三个角度:绕X轴转多少(滚转Roll)、绕Y轴转多少(俯仰Pitch)、绕Z轴转多少(偏航Yaw)。

为什么说它直观?因为人类天生就习惯用角度思考。“把摄像头往上仰30度”、“把机械臂向左转45度”——这些话我们天天说。

但我在项目中遇到过一个大坑:万向锁。

避坑指南:我曾经在一个无人机姿态解算项目里,用了欧拉角做插值。结果飞机飞到某个特定姿态时,突然开始剧烈抖动。查了两天,最后发现是万向锁导致自由度丢失,控制指令全乱套了。

万向锁的本质是什么?当俯仰角达到±90度时,滚转和偏航的旋转轴会重合。你想想看,本来三个自由度,突然变成两个了。这就好比你想往左走,但方向盘和油门变成了同一个控制杆,怎么调都不对。

欧拉角的优缺点总结:

  • 优点:直观,容易理解,适合人机交互
  • 缺点:存在万向锁问题,不适合插值,不同旋转顺序(ZYX、XYZ等)结果不同

所以我的建议是:欧拉角只适合做“显示”和“人工输入”。一旦涉及到内部计算、插值、控制,赶紧换别的表示法。

3.2 旋转向量:绕一个轴转一个角

欧拉角是绕三个轴依次转。那能不能绕一个轴一次转到位?

当然可以。这就是旋转向量。

旋转向量的思路很简单:用一个三维向量表示旋转轴,向量的长度表示旋转角度。比如向量 (0, 0, 1.57) 就表示绕Z轴转90度。

这个表示法在机器人运动学里非常实用。我记得有一次做机械臂的轨迹规划,需要让末端执行器从姿态A平滑过渡到姿态B。用欧拉角插值会出万向锁,用四元数又太抽象不好调试。最后我选了旋转向量,配合罗德里格斯公式,轻松搞定。

罗德里格斯公式长这样:

R = I + sin(θ) * [k]× + (1 - cos(θ)) * [k]ײ

其中k是单位旋转轴,θ是旋转角度,[k]×是k的反对称矩阵。

看着复杂?其实你只需要记住:旋转向量是连接“轴角”和“旋转矩阵”的桥梁。它比欧拉角更数学化,比四元数更直观。

个人经验:在做视觉SLAM或者IMU融合时,旋转向量经常被用作优化变量。因为它在李代数(so3)上的表达非常简洁,求导也方便。如果你以后接触李群李代数,会发现旋转向量就是so3的“真身”。

3.3 四元数:工业界的“标准答案”

终于聊到四元数了。

很多初学者一看到四元数就头大:四个数?虚部实部?还要满足模长为1?这什么鬼?

别急,我换个角度给你讲。

四元数本质上就是“旋转向量”的升级版。它用四个数 (w, x, y, z) 来表示旋转,其中w是实部, (x, y, z) 是虚部。而且它必须满足 w² + x² + y² + z² = 1。

为什么工业界都爱用四元数?三个原因:

  1. 无万向锁——这是最核心的优势
  2. 插值平滑——球面线性插值(SLERP)可以生成非常平滑的旋转过渡
  3. 计算高效——组合旋转只需要一次乘法,比矩阵乘法快

我在做机器人控制器的时候,内部所有的姿态计算全部用四元数。只有在最后一步显示给用户看时,才转成欧拉角。

四元数的乘法规则有点绕,但你必须掌握:

q1 * q2 = (w1*w2 - x1*x2 - y1*y2 - z1*z2,
           w1*x2 + x1*w2 + y1*z2 - z1*y2,
           w1*y2 - x1*z2 + y1*w2 + z1*x2,
           w1*z2 + x1*y2 - y1*x2 + z1*w2)

看着复杂?嗯,确实复杂。但实际写代码时,你只需要调用现成的库函数就行。比如Eigen、ROS的tf库,都封装好了。

重要提醒:四元数必须归一化!我见过太多新手因为忘记归一化,导致旋转结果完全错误。每次做四元数运算后,记得检查模长是否为1,如果不是,手动归一化一下。

3.4 三种表示法的对比与选择

说了这么多,到底该用哪个?

我整理了一张表,你直接收藏就行:

特性 欧拉角 旋转向量 四元数
直观性 ★★★★★ ★★★☆☆ ★★☆☆☆
无万向锁 ✗ ✓ ✓
插值平滑 ✗ ★★★☆☆ ★★★★★
计算效率 ★★★☆☆ ★★★★☆ ★★★★★
适合场景 人机交互、显示 优化、李代数 内部计算、控制

我的个人建议是:

  • 做界面、做调试:用欧拉角,方便看
  • 做优化、做SLAM:用旋转向量,方便求导
  • 做控制、做插值:用四元数,稳定可靠

3.5 知识体系总览

为了让你更直观地理解这三种表示法的关系,我画了一张图:

刚体旋转表示法知识体系 欧拉角 Roll / Pitch / Yaw 直观但存在万向锁 适合人机交互 旋转向量 轴角表示法 罗德里格斯公式 适合优化与求导 四元数 w + xi + yj + zk 无万向锁,插值平滑 工业界标准方案 转换 转换 应用场景 机器人运动学 无人机姿态控制 视觉SLAM 计算机图形学 核心原则:显示用欧拉角,计算用四元数,优化用旋转向量

3.6 实战中的避坑指南

最后,分享几个我这些年总结出来的实战经验:

技巧1:做四元数插值时,如果两个四元数的点积为负,记得取反其中一个。否则插值路径会绕大圈。这个坑我踩过,当时调试了一整天。

技巧2:从旋转矩阵转欧拉角时,注意奇异值处理。当俯仰角接近±90度时,滚转和偏航的解不唯一。我的做法是:检测到奇异时,强制将滚转设为0。

技巧3:千万不要在控制循环里频繁做欧拉角和四元数的互转。每次转换都有精度损失,累积起来误差会越来越大。我见过一个项目,就是因为每帧都转,最后姿态漂移了十几度。

好了,这一章的内容就到这里。三种旋转表示法,各有各的脾气。你不需要一开始就全部精通,但一定要知道它们各自适合干什么、不适合干什么。

下一章我们会把这些知识串起来,开始真正搭建机器人运动学模型。到时候你会发现,今天学的这些,全是基本功。

可可精品资料库