3. 坐标系与变换:世界坐标系、关节坐标系、工具坐标系,齐次变换矩阵
做多轴协调控制,绕不开坐标系。说白了,你让机器人往东走,它得知道「东」是哪个方向。我见过不少新手,一上来就调PID参数,结果机器人乱跑,最后发现是坐标系定义错了。嗯,今天咱们就把这事彻底捋清楚。
3.1 三种核心坐标系
实际项目中,我们打交道最多的就三种坐标系。我习惯把它们比作「地图」、「身体」和「手」。
3.1.1 世界坐标系
世界坐标系是绝对参考系。它固定在地面或机架上,是所有运动的最终基准。你想想看,如果每个轴都按自己的「想法」动,那机器人肯定散架。世界坐标系就是那个「统一思想」的东西。
- 原点:通常设在机器人底座中心或工作台一角。
- 用途:规划全局路径、定义工件位置。
- 特点:一旦设定,一般不轻易改动。
3.1.2 关节坐标系
关节坐标系是每个电机自己的「小世界」。它只关心一件事:我这个关节转了多少度。
- 表示方式:通常用角度值(度或弧度)。
- 特点:每个轴独立,互不干扰。
- 坑点:关节坐标下做直线运动?不行。因为关节动一点,末端可能画个弧。
3.1.3 工具坐标系
工具坐标系是附着在末端执行器上的。比如焊枪尖、夹爪中心、摄像头焦点。它让控制指令变得直观——你说「往前移10mm」,是工具往前,不是机器人底座往前。
- 原点:工具末端(TCP,Tool Center Point)。
- 方向:通常Z轴指向工具工作方向。
- 标定:需要做TCP标定,否则精度全废。
3.2 齐次变换矩阵
坐标系之间怎么转换?靠矩阵。但普通的3x3旋转矩阵只能描述姿态,不能描述位置。所以我们需要齐次变换矩阵——4x4的矩阵,把旋转和平移打包在一起。
3.2.1 矩阵结构
一个齐次变换矩阵长这样:
| R11 R12 R13 Tx |
| R21 R22 R23 Ty |
| R31 R32 R33 Tz |
| 0 0 0 1 |
- 左上3x3:旋转矩阵R,描述姿态。
- 右上3x1:平移向量T,描述位置。
- 最后一行:固定为[0 0 0 1],保持齐次性。
3.2.2 为什么用4x4?
你想想看,如果只用3x3矩阵,旋转可以乘,但平移得单独加。连续变换时,又要乘又要加,代码写起来很啰嗦。齐次矩阵把两者统一成乘法,简洁又高效。
3.2.3 变换的链式法则
假设我们要从世界坐标系变换到工具坐标系:
T_world_to_tool = T_world_to_base * T_base_to_flange * T_flange_to_tool
每个T都是一个4x4齐次矩阵。乘法的顺序不能乱——先乘离得近的,再乘离得远的。我刚开始做时,顺序搞反过,结果机器人跑到了完全相反的方向。
3.3 坐标系变换实战
光讲理论不行,咱们看个实际例子。假设你有一个SCARA机器人,需要从传送带上抓取工件。
3.3.1 定义坐标系
| 坐标系 | 原点位置 | 说明 |
|---|---|---|
| 世界坐标系 | 机器人底座中心 | 绝对参考 |
| 关节坐标系 | 各关节轴心 | 电机控制用 |
| 工具坐标系 | 吸盘中心 | 抓取点 |
| 工件坐标系 | 工件中心 | 目标位置 |
3.3.2 变换流程
- 视觉系统检测到工件在世界坐标系下的位姿:T_world_to_part。
- 机器人当前工具位姿:T_world_to_tool。
- 计算工具需要移动到的目标位姿:T_tool_to_target = inv(T_world_to_tool) * T_world_to_part。
- 将目标位姿转换到关节空间,下发电机执行。
3.4 知识体系结构图
下面这张图总结了本章的核心逻辑。我画图时习惯把「变换」放在中间,因为它是连接所有坐标系的纽带。
3.5 避坑指南与经验总结
- 坐标系一定要先定义再编程。 我见过有人写到一半才想起来「哦,我忘了设原点」,结果全部重来。
- 齐次矩阵乘法顺序不能错。 左乘和右乘结果完全不同。建议统一用列向量左乘矩阵的约定。
- 工具坐标系标定要定期做。 尤其是更换夹具后,TCP位置变了,不标定的话精度直接崩。
- 调试时打印变换矩阵。 我习惯在每个关键变换后打印矩阵,肉眼检查数值是否合理。比如平移量是不是毫米级,旋转矩阵行列式是不是1。
好了,坐标系和变换就聊这么多。你想想看,其实核心就三件事:知道自己在哪(世界坐标系),知道关节怎么动(关节坐标系),知道工具怎么用(工具坐标系)。中间用齐次矩阵搭桥。搞懂了这些,后面的正逆解和轨迹规划就是水到渠成的事。