2. 坐标系基础

做机械臂视觉引导,说白了就是让机器人知道「东西在哪儿,我的手在哪儿」。

我刚开始带项目那会儿,总觉得坐标系这玩意儿太理论,直接调参数不就完了?结果第一次联调,机器人抓了个寂寞——爪子直接怼到了工件侧面。后来才明白,坐标系没对齐,后面全是白干。

这一章,咱们把四个核心坐标系和手眼标定彻底捋清楚。

1. 四个核心坐标系

机械臂系统里,坐标系就是「参考基准」。你想想看,没有基准,机器人怎么知道往哪儿走?

坐标系 定义 典型位置 我常用的记忆方式
基坐标系 固定在机器人底座,是整条臂的参考 底座安装面中心 「机器人的世界原点」
工具坐标系 定义在末端执行器(夹爪、吸盘)上 夹爪中心或吸盘中心 「手在哪儿,指尖在哪儿」
相机坐标系 以相机光心为原点,Z轴沿光轴方向 相机内部光心 「眼睛看到的坐标系」
工件坐标系 定义在目标工件上,随工件移动 工件特征点(如中心孔) 「目标在哪儿」

关键认知:所有运动指令最终都要换算到基坐标系下执行。相机看到的是像素坐标,机器人要的是基坐标系下的XYZ。中间的桥梁,就是手眼标定。

2. 坐标系变换:从像素到机器人

一个典型的变换链条长这样:

像素坐标 (u,v)
    ↓ 相机内参
相机坐标系 (Xc, Yc, Zc)
    ↓ 相机到工具(手眼标定)
工具坐标系 (Xt, Yt, Zt)
    ↓ 工具到基座(机器人正运动学)
基坐标系 (Xb, Yb, Zb)

每一步都是一个4x4的齐次变换矩阵。我记得第一次手写这个矩阵时,把旋转和平移顺序搞反了,结果机器人画了个大圆弧……嗯,从那以后我再也不敢手算旋转矩阵了,老老实实用库函数。

我的习惯:用 numpy 或 scipy.spatial.transform 处理旋转矩阵。别自己写三角函数,容易翻车。

3. 手眼标定:Eye-in-Hand vs Eye-to-Hand

手眼标定解决的是「相机坐标系」和「机器人坐标系」之间的变换关系。两种主流配置:

  • Eye-in-Hand(眼在手上):相机装在机器人末端,跟着爪子走。适合近距离、高精度抓取。
  • Eye-to-Hand(眼在手外):相机固定在工作台上方,看全局。适合大范围、多目标场景。

我个人的经验是:如果抓取精度要求<0.5mm,优先用Eye-in-Hand。因为相机离工件近,透视误差小。但要注意,标定板也得跟着换位置,操作起来麻烦一点。

3.1 标定方程

两种配置的标定方程不一样:

配置 标定方程 求解目标
Eye-in-Hand AX = XB 相机到工具(X)
Eye-to-Hand AX = XB 相机到基座(X)

你没看错,方程形式一样,都是AX=XB。但A和B的含义不同。Eye-in-Hand里,A是机器人末端位姿变化,B是相机看到的标定板位姿变化。Eye-to-Hand则反过来。

我曾经踩过的坑:标定过程中,机器人运动范围太小(比如只转了10度),导致方程病态,解出来的矩阵误差巨大。建议至少采集15-20组位姿,且覆盖不同角度(俯仰、偏航各±30°以上)。

4. 手眼标定实操流程

以Eye-in-Hand为例,标准步骤:

  1. 固定标定板:放在工作台上,确保相机视野内清晰可见。
  2. 记录机器人位姿:移动机械臂到N个不同位置,记录每个位置的末端位姿(从控制器读出)。
  3. 记录标定板位姿:在每个位置,用相机拍下标定板,解算出标定板在相机坐标系下的位姿。
  4. 构建方程:用AX=XB求解工具到相机的变换矩阵。
  5. 验证:用一组未参与标定的数据验证,重投影误差应<1像素。

验证方法:让机器人末端对准标定板上的某个特征点,用标定结果反算该点在基坐标系下的坐标,与机器人实际读数对比。偏差在1-2mm以内算合格。

5. 知识结构总览

下面这张图,把本章的核心逻辑串起来了:

坐标系与手眼标定知识结构图 坐标系与手眼标定知识结构 基坐标系 工具坐标系 相机坐标系 工件坐标系 正运动学 手眼标定 视觉测量 Eye-in-Hand 相机装在末端,随动 Eye-to-Hand 相机固定,看全局 标定方程:AX = XB 求解相机与机器人之间的变换矩阵 实操流程:固定标定板 → 记录位姿 → 求解矩阵 → 验证 至少15-20组位姿,覆盖±30°角度变化 验证:重投影误差 < 1 像素,位置偏差 < 2 mm

6. 避坑指南

  • 标定板别用反光材质:我试过亚克力板,反光导致角点检测飘移,标定结果直接废了。用磨砂陶瓷或氧化铝板。
  • 机器人精度影响标定:如果机器人本身重复定位精度差(比如±0.1mm以上),标定结果上限就被锁死了。先确认机器人精度。
  • 相机分辨率别太低:200万像素以下,远距离标定误差会放大。我一般用500万像素工业相机。
  • 标定后别动相机:哪怕松了一颗螺丝,标定就失效了。固定好后打螺纹胶。

一个小技巧:标定完成后,在机器人工作空间内随机取5个点,用视觉引导抓取一次。如果每次都准,那标定基本没问题。如果某个方向偏了,检查那个方向上的标定位姿覆盖是否足够。

坐标系和手眼标定,是视觉引导的「地基」。地基没打好,上层算法再漂亮也白搭。我见过太多项目死在标定这一步——不是精度不够,就是标定后松动。嗯,花半天时间把标定做扎实,后面能省一周的调试时间。