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]。
- 基本变换——平移、绕轴旋转,记住「绕哪个轴,哪行哪列不动」。
- 复合变换——先旋转再平移,乘法顺序不能乱。
- 逆变换——旋转矩阵转置,平移取反再乘转置。
下一章,咱们会深入聊插补算法。到时候你会发现,坐标系变换是插补的基础。没有这个基础,插补出来的轨迹全是歪的。
好了,今天就到这儿。有问题随时问我。