坐标系基础:世界坐标系、机器人基坐标系、工具坐标系、相机坐标系、像素坐标系
做手眼标定,说白了就是搞清楚几个坐标系之间的“亲戚关系”。
我刚开始接触这个领域时,觉得坐标系不就是几个箭头嘛,有什么好讲的?直到第一次在现场调标定,相机拍出来的点和机器人实际抓的位置差了十几毫米,我才意识到——坐标系搞不清楚,后面全是白干。
这一章,咱们就把五个核心坐标系掰开揉碎讲清楚。
2.1 五个坐标系,一个都不能少
先给个全景图。你想想看,一个典型的机器人视觉引导系统里,数据是怎么流动的?
- 世界坐标系:整个场景的“参考”。通常选在车间地面某个固定点。
- 机器人基坐标系:固定在机器人底座上。机器人自己认这个坐标系。
- 工具坐标系:装在机器人末端,比如焊枪尖、夹爪中心。
- 相机坐标系:以相机光心为原点,Z轴沿光轴方向。
- 像素坐标系:图像上以像素为单位的二维坐标。
我习惯把它们分成两组:三维组(前四个)和二维组(最后一个)。标定的本质,就是打通这两组之间的变换通道。
核心认知:手眼标定要解决的,就是找到相机坐标系与机器人基坐标系(或工具坐标系)之间的固定变换关系。其他坐标系都是中间桥梁。
2.2 坐标系之间的变换关系
坐标系变换,说白了就是“把一个点从一个坐标系搬到另一个坐标系”。
数学上用一个 4×4 齐次变换矩阵 搞定。它长这样:
| R11 R12 R13 Tx |
T = | R21 R22 R23 Ty |
| R31 R32 R33 Tz |
| 0 0 0 1 |
左上角 3×3 是旋转矩阵,右上角 3×1 是平移向量。我当年第一次手写这个矩阵时,把旋转和平移的顺序搞反了,结果标定出来的误差大得离谱。嗯,这个坑你们别踩。
2.3 关键变换链
在实际系统中,数据是这样流动的:
- 像素 → 相机:通过相机内参(焦距、主点、畸变系数)把像素坐标反投影到相机坐标系下的三维射线。
- 相机 → 工具:这就是手眼标定要解的 手眼矩阵(Eye-in-Hand 或 Eye-to-Hand)。
- 工具 → 基座:通过机器人正运动学,从关节角度算出工具坐标系在基坐标系下的位姿。
- 基座 → 世界:如果系统有外部参考,还需要一个世界到基座的变换。
我的经验:在搭建标定流程时,我习惯先把所有变换关系写成一张表,明确每个变换的“源”和“目标”。这样写代码时不容易乱。我曾经在一个项目里因为搞混了变换方向,多花了三天排查问题。
2.4 坐标系变换的“避坑”清单
| 常见问题 | 后果 | 我的建议 |
|---|---|---|
| 旋转顺序搞错 | 标定结果完全错误 | 统一用 ZYX 欧拉角或四元数 |
| 平移方向反了 | 抓取位置偏移几十毫米 | 用已知点验证变换方向 |
| 忽略畸变校正 | 边缘区域误差大 | 标定前先做相机内参标定 |
| 工具TCP未校准 | 手眼矩阵永远不对 | 先做工具标定,再做手眼标定 |
我曾经踩过的坑:有一次在产线上,标定结果时好时坏。排查了两天,最后发现是机器人工具坐标系没更新——换了一个夹爪,但TCP参数还是旧的。从那以后,我每次做手眼标定之前,都会先确认工具坐标系参数是最新的。
2.5 从像素到三维:完整的变换链
假设我们要把一个像素点 p(u, v) 映射到机器人基坐标系下的三维点 P_base:
P_base = T_base_tool * T_tool_cam * T_cam_pixel * p(u, v)
其中:
- T_cam_pixel:相机内参矩阵的逆,把像素映射到相机坐标系下的归一化平面。
- T_tool_cam:手眼矩阵,相机坐标系到工具坐标系的变换。
- T_base_tool:机器人正运动学给出的工具到基座的变换。
你看,整个链条就是一连串矩阵乘法。我刚开始学的时候,觉得这公式挺吓人。后来发现,只要把每个矩阵的意义搞清楚,写代码就是几行的事。
关键提醒:矩阵乘法顺序不能乱!从右往左读,就是数据流动的方向。我见过有人把顺序写反了,结果标定出来的矩阵“看起来对”,但实际用起来全错。
2.6 小结
这一章我们讲了五个坐标系和它们之间的变换关系。说白了,手眼标定就是求解其中一个关键的变换矩阵——相机到工具(或相机到基座)的变换。
我个人觉得,坐标系这部分再怎么强调都不过分。你想想看,如果连坐标系都搞不清楚,后面那些优化算法、标定板设计,全都是空中楼阁。