视觉算法与成像

手眼标定:Eye-to-Hand 与 Eye-in-Hand

手眼标定的数学不复杂,OpenCV 有现成函数。真正决定精度的是标定姿态怎么取、机械上有没有松动、以及标定完了用什么方法验证——这三件事做不好,算出来的矩阵看着收敛,实际抓不准。

手眼标定是什么,用在哪些工况

相机算出的是工件在图像坐标系里的位置, 机器人却按自己的基坐标系去抓, 两者之间的刚体变换矩阵就是手眼标定要求解的东西。

按相机安装位置分两种:Eye-to-Hand(眼在手外)相机固定在机架上, 求解「相机 → 机器人基坐标系」; Eye-in-Hand(眼在手上)相机装在法兰上随臂运动, 求解「相机 → 法兰坐标系」。 典型工况:机床上下料、传送带抓取、拆码垛、引导装配、涂胶纠偏。 敏洽 机器视觉检测软件 内置手眼标定,两种方式都支持,底层用 OpenCV 的 calibrateHandEye。

实际会遇到的几个坑

1. 标定姿态取得太保守

最主要的误差来源。很多人把机器人在一个水平面上平移几个位置就完事, 旋转几乎没变化,这会让方程条件数很差, 旋转分量缺少约束,误差大且在残差里体现不明显。 正确做法:不少于 10 组、更稳妥是 15 到 20 组;平移覆盖整个作业范围; 三个旋转轴上都要有明显变化。

2. 先做内参与畸变,再做手眼

手眼标定用的是标定板在相机坐标系下的位姿,靠内参从图像反算, 内参不准或畸变没校正,输入本身就是错的。 畸变影响在视野边缘最大,表现为「中间抓得准、边缘抓偏」,容易误判成机器人精度问题。 顺序必须是:内参与畸变标定 → 验证重投影误差 → 再做手眼标定。 标定板要注意平整度,精密场合用玻璃基板。

3. 机械松动让标定结果失效

Eye-to-Hand 的相机支架刚性不足时,振动、温变、有人碰一下, 相机相对机器人基座的位置就变了,标出的矩阵直接失效。 Eye-in-Hand 更敏感:安装板与法兰的松动、末端工具更换与磨损都会引入误差。 对策:支架用刚性结构并加定位销,再做快速复检—— 拍固定基准件比对标定时的差异,超差报警重标。

4. 平面假设不成立

单相机 Eye-to-Hand 抓取隐含假设: 工件都在同一个已知高度的平面上——单目图像没有深度信息, 只有假定平面已知才能把像素反算成三维坐标。 来料厚度差、料堆高低、传送带起伏、工件斜放都会破坏它, 表现是抓取位置沿视野径向偏移,越靠边缘偏得越多。 办法:按实际工作面高度重新标定、对不同厚度的料做分层配方、 或引入第二视角或高度传感器提供 Z 值。

5. 机器人位姿的读取时机

每组标定数据都要求「拍照那一刻」的图像和机器人位姿严格对应, 如果拍照与读位姿之间机器人还在运动或振动,两组数据就不匹配。 规范做法是:运动到位、延时稳定、再触发拍照。 敏洽软件支持硬件 IO、编码器、通讯软触发、连续采集四种, 引导抓取一般用通讯软触发或硬件 IO。

6. 用残差自证,不做实抓验证

标定算完给出的残差只说明「这组数据内部自洽」, 不说明系统在实际作业条件下抓得准—— 标定平面与工作面不一致、机器人自身绝对精度、 工具坐标系(TCP)标定误差都不体现在里面。 真正的验证要做实抓:在作业区四角与中心各放工件, 定位后引导机器人去抓或用尖端工具去点,记录偏差。 验收条款应写成「指定作业范围内多点定位偏差不超过 X」并写明测量方法。

两种方式的对比与硬件条件

维度Eye-to-Hand(眼在手外)Eye-in-Hand(眼在手上)
相机位置固定在机架 / 龙门上装在机器人法兰或末端工具上
求解对象相机 → 机器人基坐标系相机 → 法兰坐标系
适用场景固定平面上的来料浮动:上下料、传送带抓取、拆码垛需凑近看细节:插装对位、料箱内取件
节拍快,一次成像覆盖作业区慢,每次定位需移动机器人
视野与精度大视野,像素当量较粗小视野高分辨,局部精度好
布线固定走线随臂运动,需拖链与耐弯折线缆
主要风险支架刚性与平面高度假设安装重复性、线缆疲劳、节拍
项目要求与说明
标定实现内置手眼标定,支持两种方式,底层用 OpenCV calibrateHandEye
前置标定先完成相机内参与畸变标定;精密场合用玻璃基板标定板
姿态数不少于 10 组,建议 15~20 组;平移铺满作业范围,三轴旋转均有明显变化
定位输出模板匹配 / 特征点 / 几何基准 / Mark 点统一输出 Offset_X Offset_Y Angle_θ
触发引导抓取建议用通讯软触发或硬件 IO,确保图像与位姿时刻对应
相机USB/UVC、大华、海康、度申已适配;Mock 虚拟相机可离线复现标定数据
运行环境Qt 6.9.2 + C++17 + OpenCV 4.x;Windows 10/11 x64 与 Ubuntu 22.04 x64
客户准备刚性相机支架、机器人位姿读取与坐标下发接口、标定板工装、工件高度变化范围

通讯接口要在开发前定好:机器人侧怎么读位姿、视觉侧以什么格式下发目标坐标。 角度定义与旋转顺序最容易出错, 不同机器人品牌的欧拉角约定不一样,接口文档里必须写死。

相关交付情况

引导抓取项目的交付除了检测与定位软件,还包括 标定流程本身的界面化——现场维护人员要能自己重做标定。 敏洽把标定做成向导式流程:提示移动机器人到下一姿态、自动采图并记录位姿、 显示姿态分布、算完给出残差与建议,并支持保存多套标定结果按工作面切换。

架构上 C++ 侧只输出原始定位数据(偏移与角度), 是否在允许范围内、要不要补偿,由 C# 侧或客户上位机决定。 需要嵌进客户已有机器人上位机时,可用跨语言 SDK (mqvision.dll / libmqvision.so,支持 C、C++、C#、Java JNI、Python,另有 Qt-free 版本), 算法按模块授权。

更多算法说明见 内置算法库, 合作与验收标准的写法见 上位机软件外包怎么切分。

常见问题

看相机装在哪、要解决什么问题。相机固定在机架上不随机器人动,是 Eye-to-Hand,适合来料位置在固定平面上浮动的场景——上下料、传送带抓取、托盘拆码垛,一次成像可以看全整个作业区,节拍快。相机装在机器人法兰上随臂运动,是 Eye-in-Hand,适合需要凑近看细节的场合——插装对位、多层料箱内取件、大工件上多个特征点分别定位,代价是每次定位都要移动机器人,节拍变长。
经验上不少于 10 组,15 到 20 组更稳。关键不是数量而是姿态的多样性:平移要覆盖整个作业范围,旋转要在三个轴向上都有明显变化,不能只是把机器人在一个平面上平移几下。姿态过于集中或者旋转量太小时,方程的条件数很差,解出来的旋转部分误差很大——现象是标定过程没报错、残差看起来也不大,但换到作业区边缘就抓偏。
两个常见原因。一是标定姿态集中在作业区中央,边缘属于外推区域,误差被放大;二是镜头畸变没标好或者没做畸变校正,畸变在视野边缘最明显。对策是标定时把姿态铺满整个实际作业范围,先做好相机内参与畸变标定再做手眼标定。另外如果工件所在平面与标定平面不在同一高度,Eye-to-Hand 的平面假设就不成立,需要按实际工作面重新标或者引入高度补偿。
不要只看标定残差,那是自证。可行的验证是让机器人去实际抓:在作业区取若干个位置(含四个角与中心)各放一次工件,视觉定位后引导机器人去抓或者去点,记录实际偏差。也可以用尖端工具去点固定的基准点,从多个姿态接近,看落点是否重合。验收标准应该写成「在指定作业范围内,多点重复定位偏差不超过某个值」,并且明确测量方法,而不是笼统写「标定精度达标」。

有具体设备清单或工件样品,可以直接给判断

提供设备型号、PLC 品牌与需要采集的数据项,或提供被检工件照片与精度要求,敏洽可先给出可行性判断与硬件前置条件,再谈软件工作量与报价。