先说清楚一个矩阵把谁变到谁
视觉检测返回一个三维点,机械臂需要在基座坐标系中执行动作。两边都使用三个数字,并不代表它们描述的是同一个位置。排查抓取偏差时,先画出坐标系关系,再考虑调模型。把基座、末端、相机和标定板都标出来,并为每条变换注明方向。
本文约定 T_A_B 将 B 坐标系中的点变到 A 坐标系。对安装在末端的相机,有 p_base = T_base_gripper × T_gripper_camera × p_camera。这里的点使用齐次坐标。矩阵相乘的顺序来自输入与输出坐标系的衔接,不能按变量名字的排列习惯随意交换。
单位和光学坐标系要先核对
ROS REP 103 规定常用长度单位为米、角度为弧度,机器人本体坐标常用 x 向前、y 向左、z 向上;相机 optical 坐标约定则是 z 向前、x 向右、y 向下。相机驱动还可能同时发布多个坐标系,因此应读取实际 frame 定义,而不是看到 camera 字样就认定轴方向。来源:REP 103。
| 现象 | 优先检查 | 验证方式 |
|---|---|---|
| 位置差约千倍 | 毫米与米是否混用 | 用已知尺寸的物体核对距离 |
| 平移方向颠倒 | 变换方向或坐标轴定义 | 逐轴移动一个已知点 |
| 旋转后偏差突然变大 | 姿态表示、TCP 或外参方向 | 在多个末端朝向重复验证 |
手眼标定输入不能只看数组形状
OpenCV 的 calibrateHandEye 接口中,gripper2base 输入把末端坐标变到基座,target2cam 输入把标定板坐标变到相机,返回的 cam2gripper 把相机坐标变到末端。数组维度即使正确,方向传反也会得到无意义结果。eye-in-hand 与固定相机的 eye-to-hand 安装方式不同,不能未经推导直接复用同一组输入。来源:OpenCV 接口文档。
采样时应把每张标定板图像与对应机器人姿态成对保存。图像拍摄时刻和机器人状态读取时刻若不一致,机械臂运动越快,误差通常越难解释。先在稳定停留状态下验证采样流程,再讨论是否需要运动中采样与更严格的时间补偿。
姿态覆盖比重复拍同一位置更有用
本文建议让标定板在画面中覆盖不同位置、距离和朝向,同时保证角点清晰、目标完整。只沿一条直线平移、几乎不改变朝向,会让数据缺乏足够的几何约束。采样数量应结合检测质量与姿态覆盖判断,不能把某个固定张数当作普适保证。
每次采样记录图像质量、标定板尺寸、机器人末端定义和姿态表示。机器人控制器导出的欧拉角顺序、旋转向量与四元数不是同一种数据。应先把一条已知姿态转成旋转矩阵,检查旋转方向,再进行批量转换。
用没有参与拟合的数据验收
标定程序返回矩阵只是开始。保留一组独立的标定板姿态或已知空间点,把视觉测量变到基座后,与独立测量进行比较。分别记录平移偏差、姿态变化下的偏差和工作空间不同区域的偏差。图像重投影误差与机械臂末端定位误差不是同一个指标。
还可以把验证点分别沿三个坐标轴移动,检查变换后的变化方向。若一个方向始终存在固定偏置,优先检查工具中心点与安装位置;若偏差随距离放大,继续检查相机内参、深度尺度和外参。这样的分解比直接对最终抓取点加“经验偏移”更容易复用。
标定结果也需要版本管理
保存相机序列号、分辨率、镜头设置、末端工具、标定板规格和原始采样。更换镜头、移动相机或修改工具定义后,应重新验证相关变换。最后交付的应是一条可检查的坐标链,而不只是一个被复制到多处配置文件中的矩阵。
资料来源与延伸阅读
整理更新:2026-10-26。本文基于以上公开资料,经 AI 辅助整理与扩写;实践方案为编辑建议,未作为本站实测结果发布。工具接口请结合所用版本核对。