3、坐标系与变换:关节空间与笛卡尔空间,齐次变换矩阵基础

各位同学,欢迎来到第三章。这一章,咱们聊聊机器人运动学里最基础、也最绕不开的东西——坐标系与变换。

说实话,我刚入行那会儿,觉得坐标系这东西太简单了,不就是X、Y、Z嘛。直到我第一次调试六轴机器人,发现末端执行器怎么都走不到目标点,才意识到——嗯,坐标系这事儿,真没那么简单。

3.1 关节空间 vs 笛卡尔空间

先问大家一个问题:你让机器人去抓一个杯子,你脑子里想的是「末端走到杯子位置」,还是「关节1转30度,关节2转45度...」?

显然是前者。你关心的是末端在三维空间里的位置和姿态,这就是笛卡尔空间(也叫操作空间、任务空间)。

但机器人自己呢?它只知道每个关节该转多少度。每个关节的角度值组合起来,就是关节空间

核心区别一句话:

  • 关节空间:用关节变量(角度/位移)描述机器人状态。维度 = 关节数。
  • 笛卡尔空间:用位置(x,y,z)和姿态(α,β,γ)描述末端状态。维度 = 6(3个位置 + 3个姿态)。

我在项目里遇到过一位同事,他直接在笛卡尔空间里规划轨迹,没做逆运动学转换,结果机器人报错「不可达」。说白了,你给机器人下笛卡尔指令,它得先算出来每个关节该转到哪,才能动。这个计算过程,就是逆运动学

我的习惯:调试阶段先用关节空间点动,确认机械没问题。做轨迹规划时,再用笛卡尔空间,直观、好调。

3.2 为什么要学齐次变换矩阵?

你想想看,机器人身上有好多坐标系:基座坐标系、每个关节的坐标系、末端坐标系、工具坐标系、工件坐标系...这些坐标系之间怎么转换?

答案就是——齐次变换矩阵

它用一个4×4的矩阵,同时描述了旋转平移。为什么是4×4?因为3×3的旋转矩阵只能描述旋转,描述不了平移。加上一个维度,把平移塞进去,就齐活了。

我曾经犯过一个低级错误:用3×3旋转矩阵加一个平移向量,分开计算。结果每次都要判断「先旋转还是先平移」,代码越写越乱。后来统一用齐次变换矩阵,一个矩阵搞定所有变换,清爽多了。

3.3 齐次变换矩阵的结构

一个标准的齐次变换矩阵长这样:

    | R11  R12  R13  Px |
T = | R21  R22  R23  Py |
    | R31  R32  R33  Pz |
    |  0    0    0    1  |

左上角3×3是旋转矩阵R,右上角3×1是平移向量P,最后一行是固定格式[0 0 0 1]。

为什么最后一行必须是[0 0 0 1]?

嗯,这里要注意:这是为了保持变换的封闭性。两个齐次变换矩阵相乘,结果还是齐次变换矩阵。如果最后一行变了,乘出来的结果就不「齐次」了。

3.4 基本变换:平移与旋转

咱们来看几个最基本的变换矩阵。

3.4.1 平移变换

沿X轴移动距离d:

    | 1  0  0  d |
T = | 0  1  0  0 |
    | 0  0  1  0 |
    | 0  0  0  1 |

沿Y轴、Z轴同理,把d放到对应位置就行。

3.4.2 旋转变换

绕X轴旋转角度θ:

    | 1   0      0     0 |
T = | 0  cosθ  -sinθ  0 |
    | 0  sinθ   cosθ  0 |
    | 0   0      0     1 |

绕Y轴旋转:

    |  cosθ  0  sinθ  0 |
T = |   0    1   0    0 |
    | -sinθ  0  cosθ  0 |
    |   0    0   0    1 |

绕Z轴旋转:

    | cosθ  -sinθ  0  0 |
T = | sinθ   cosθ  0  0 |
    |  0      0    1  0 |
    |  0      0    0  1 |

记法小技巧:绕哪个轴转,那个轴对应的行和列就不动。比如绕X轴转,第一行第一列是1,其他位置是三角函数。

3.5 复合变换:先转再移还是先移再转?

这个问题,我当年纠结了很久。

答案是:先旋转,再平移

为什么?

你想想看,旋转是绕着坐标系原点转的。如果你先平移,坐标系原点变了,再旋转,那旋转中心就不是原来的原点了,结果完全不一样。

举个例子:

// 先旋转再平移(正确)
T = Trans(px, py, pz) * Rot(θ)

// 先平移再旋转(错误)
T = Rot(θ) * Trans(px, py, pz)

我在调试一个焊接机器人时,焊枪总是偏一个角度。查了半天,发现就是「先移后转」和「先转后移」搞反了。改过来之后,焊点精准命中。

避坑指南:我曾经在代码里把乘法顺序写反了,结果末端位置差了十几厘米。记住:矩阵乘法不满足交换律!A*B ≠ B*A。写代码时一定要用注释标清楚「当前是哪个坐标系下的变换」。

3.6 逆变换:从末端回到基座

有了正向变换,自然就有逆变换。已知末端在基座坐标系下的位姿,想求基座在末端坐标系下的位姿,怎么办?

直接求逆矩阵?可以,但计算量大。

对于齐次变换矩阵,有个简单方法:

如果 T = | R  P |
         | 0  1 |

那么 T⁻¹ = | Rᵀ  -Rᵀ*P |
           | 0     1    |

注意:旋转矩阵的逆等于它的转置(因为旋转矩阵是正交矩阵)。平移部分取反,再乘上旋转矩阵的转置。

这个公式我建议你背下来。我在做手眼标定时,天天跟这个逆变换打交道,背熟了能省不少时间。

3.7 实际应用:从基座到末端的完整变换链

一个六轴机器人,从基座到末端,中间经过6个关节。每个关节都有一个变换矩阵。整条链路的变换就是:

T_0_6 = T_0_1 * T_1_2 * T_2_3 * T_3_4 * T_4_5 * T_5_6

其中T_i_(i+1)表示从关节i到关节i+1的变换。

这个连乘的结果,就是末端在基座坐标系下的位姿。这就是正向运动学

我刚开始做运动学标定时,手工推导了6个变换矩阵,乘在一起,整整写了两页纸。后来发现一个符号写错了,重新推导...嗯,那滋味,你们以后也会体会到的。

3.8 本章小结

这一章,咱们聊了:

  • 关节空间笛卡尔空间的区别——一个是机器人的「母语」,一个是人类的「母语」。
  • 齐次变换矩阵的结构——4×4,旋转+平移,最后一行固定[0 0 0 1]。
  • 基本变换——平移、绕轴旋转,记住「绕哪个轴,哪行哪列不动」。
  • 复合变换——先旋转再平移,乘法顺序不能乱。
  • 逆变换——旋转矩阵转置,平移取反再乘转置。

下一章,咱们会深入聊插补算法。到时候你会发现,坐标系变换是插补的基础。没有这个基础,插补出来的轨迹全是歪的。

好了,今天就到这儿。有问题随时问我。