第2章:刚体运动学基础:坐标系与变换

各位同学,欢迎来到第二章。说实话,刚体运动学是整个四足机器人运动学建模的基石。你想想看,机器人要走路,本质上就是它的各个刚体(大腿、小腿、躯干)在空间中不断变换位置和姿态。如果连怎么描述一个刚体在空间中的位姿都搞不清楚,后面的正逆运动学、步态规划根本无从谈起。

我个人习惯把这一章叫做“数学翻译器”——把物理世界的运动,翻译成计算机能理解的数字。咱们今天就把这个翻译器彻底搞明白。

本章核心目标:掌握如何用数学工具精确描述四足机器人任意刚体在三维空间中的位置和朝向。
刚体运动学基础 — 知识体系 刚体位姿描述 位置:坐标系 世界坐标系 vs 机体坐标系 姿态:旋转描述 旋转矩阵 欧拉角 四元数 齐次矩阵 位置 + 姿态 = 位姿 齐次变换矩阵统一描述两者

2.1 坐标系与变换:先定个“老家”

做机器人仿真,第一件事就是定坐标系。没有坐标系,你连“往前走”都说不清楚。我见过不少新手,上来就写代码,结果机器人跑起来完全乱套——一查,原来是坐标系搞反了。

咱们在四足机器人里,主要用两种坐标系:

  • 世界坐标系(World Frame):固定在大地上的“参考系”。机器人往哪走、走了多远,都是相对于世界坐标系说的。
  • 机体坐标系(Body Frame):固定在机器人躯干上的“相对参考系”。通常原点在躯干质心,x轴朝前,y轴朝左,z轴朝上。

为什么要区分?举个例子。你让机器人“抬左前腿”,这个指令是在机体坐标系下说的。但如果要计算足端是否碰到地面,就得转换到世界坐标系下去判断。

我的习惯:在仿真代码里,我会把所有传感器的原始数据先统一到机体坐标系,再通过变换矩阵转到世界坐标系。这样调试时思路清晰,不容易乱。

2.2 旋转矩阵:最直观,但别滥用

旋转矩阵,说白了就是一个3x3的矩阵,用来描述一个坐标系相对于另一个坐标系的朝向。它的每一列,就是被旋转坐标系的基向量在原坐标系下的投影。

数学上长这样:

R = [r11 r12 r13]
    [r21 r22 r23]
    [r31 r32 r33]

旋转矩阵有个重要性质:它是正交矩阵,逆等于转置。这意味着 R⁻¹ = Rᵀ,求逆运算瞬间变转置,计算量小很多。

但说实话,旋转矩阵在实际工程中并不常用——因为它有9个参数,却只描述3个自由度,冗余太大。而且你想想看,9个数里稍微带点误差,矩阵就不再正交了,数值稳定性很差。

我曾经踩过的坑:在早期一个仿真项目里,我直接用旋转矩阵做连续积分,结果跑了10秒后矩阵行列式变成了0.97,不再是单位正交矩阵。机器人开始“扭曲变形”。后来我改用四元数做内部运算,只在最后输出时转成旋转矩阵,问题才解决。

2.3 欧拉角:直观,但有“万向锁”

欧拉角用三个角度来描述旋转:横滚(Roll)、俯仰(Pitch)、偏航(Yaw)。对应到四足机器人:

角度 含义 绕哪个轴
横滚 Roll (φ) 机身左右倾斜 x轴
俯仰 Pitch (θ) 机身前后倾斜 y轴
偏航 Yaw (ψ) 机身水平转向 z轴

欧拉角的好处是直观——你一看“横滚10度”,脑子里就能想象出机器人往右歪了10度。但它的致命问题是万向锁(Gimbal Lock)。

为什么会这样?当俯仰角接近±90度时,横滚和偏航的旋转轴会重合,丢失一个自由度。这时候你无论怎么调横滚和偏航,机器人都只能在一个平面内转。

避坑指南:在四足机器人控制中,我建议只用欧拉角做人机交互显示(比如在GUI上显示当前姿态),内部运算一律用四元数。别问我怎么知道的——我在一次步态规划调试中,就因为欧拉角导致机器人原地“卡住”了整整两天。

2.4 四元数:工程师的“真香”选择

四元数,听起来很玄乎,其实就是一个四维向量 q = [w, x, y, z],其中w是实部,x、y、z是虚部。它用四个参数描述三维旋转,没有冗余,没有万向锁。

我刚开始学四元数时也觉得头大,但用顺手之后,真香。为什么?

  • 无奇点:随便你怎么转,不会卡死
  • 插值平滑:做姿态插值时,用四元数球面线性插值(Slerp)非常平滑
  • 计算高效:组合旋转只需要一次乘法,比矩阵快

四元数乘法表示旋转组合:

q_result = q2 * q1  // 先应用q1旋转,再应用q2旋转

注意顺序!四元数乘法不满足交换律,这和矩阵乘法一样。

我的建议:在仿真代码里,姿态全部用四元数存储和运算。IMU(惯性测量单元)输出的原始数据通常也是四元数格式,直接拿来用就行。只在需要可视化或打印日志时,才转成欧拉角。

2.5 齐次变换矩阵:位置+姿态,一网打尽

前面我们分别说了位置(3个坐标)和姿态(旋转矩阵/四元数)。但在实际工程中,我们经常需要同时描述一个刚体的位置和朝向——也就是位姿。

齐次变换矩阵就是干这个的。它是一个4x4矩阵:

T = [R    p]
    [0ᵀ   1]

其中:
R: 3x3 旋转矩阵
p: 3x1 位置向量
0ᵀ: 1x3 零向量

举个例子,从机体坐标系到世界坐标系的变换:

T_wb = [R_wb    p_wb]
       [0       1   ]

其中 p_wb 是机体在世界坐标系中的位置,R_wb 是机体的朝向。有了这个矩阵,机体坐标系下的任意点 p_b 都可以转换到世界坐标系:

p_w = T_wb * p_b

齐次变换矩阵的好处是:你可以把多个变换“串”起来。比如从世界到机体,再到大腿,再到小腿,最后到足端——一连串的矩阵乘法,一次搞定。

核心公式(记住它): T_we = T_wb * T_bh * T_hk * T_kf 其中:w=世界, b=机体, h=髋关节, k=膝关节, f=足端 这就是四足机器人单腿正运动学的本质。

2.6 四种表示方法对比

方法 参数数量 优点 缺点 工程用途
旋转矩阵 9 直观,易理解 冗余大,数值不稳定 理论推导、可视化
欧拉角 3 最直观,人类友好 万向锁,插值困难 GUI显示、遥控指令
四元数 4 无奇点,插值平滑 不够直观 内部运算、IMU数据
齐次矩阵 16 统一描述位姿,可串联 参数多,计算量大 运动学链计算
重要提醒:不管用哪种表示法,一定要在代码里统一约定旋转顺序和方向。我见过最惨的bug,就是一个人用ZYX顺序,另一个人用XYZ顺序,结果机器人走出来的轨迹完全对不上。建议团队内部统一用ZYX(偏航-俯仰-横滚)顺序,这是机器人领域的惯例。