一个上位机开发者对机器视觉标定的理解过程
一个上位机开发者对机器视觉标定的理解过程
写在前面
作为上位机开发者,我最初对机器视觉标定的理解非常模糊。视觉工程师说“标定”,电气工程师说“坐标”,我在中间传数据,但一直没搞明白这些坐标到底是怎么对应的。直到我把整条链路从头捋了一遍,才真正理解每一步在干什么。
这篇文章记录的是我自己的理解过程,不是教科书式的概念罗列。我会按照我当时的困惑和逐步理解的顺序来写,希望对同样在上位机位置上的开发者有帮助。
一、起点:像素比标定到底是什么
最开始,视觉工程师跟我说“像素比标定”,我的理解是:照片里像素和现实世界的一个换算关系。
后来我才明白,更准确的说法是:像素比标定建立的是“图像像素坐标”和“现实世界物理尺寸”之间的转换关系。
为什么需要这个转换
相机拍出来的图像,单位是像素。视觉算法告诉我:“目标在图像上的位置是 (320, 240)”。但电气工程师要驱动电机移动,他需要的是毫米:“目标偏离了 5.2mm”。
像素和毫米之间没有固定关系,取决于相机分辨率、镜头焦距、工作距离等。所以必须通过标定,算出一个像素代表多少毫米,这个值叫像素当量。
最简单的线性关系是:
text
物理距离(mm) = 像素距离(px) × 像素当量(mm/px)
标定怎么做
拿一个已知尺寸的标定物(棋盘格、量块等),放在相机视野里拍照。视觉算法测出它在图像里占了多少像素,用已知真实尺寸除以像素数,就得到了像素当量。
比如一个 10mm 的棋盘格,在图像里是 200 像素,那 10 / 200 = 0.05 mm/px。
二、我当时的困惑:像素不是单位吗,怎么又像坐标系
我一开始觉得像素就是一个单位,就像“米”一样。但后来发现,像素同时构成了一个坐标系。
- 像素是单位:图像上的长度用像素计量
- 像素坐标是参考系:图像上每个点用
(u, v)表示,构成图像坐标系
所以像素比标定本质上是:
text
图像坐标系(像素) → 现实世界坐标系(毫米)
这个转换关系可能只是一个缩放系数,也可能包含旋转、平移、畸变校正。简单场合只有一个比例,看起来就是“1像素=多少毫米”。但严格来说,它是一个二维坐标变换。
三、一个让我绕进去的问题:壁纸和照片
我曾经想过一个矛盾的问题:
手机壁纸说“1440×960”,这是像素数。但同样 1440×960 的两张壁纸,拍摄地点可能完全不同。那像素到底能不能对应现实?
后来我想通了:壁纸的“1440×960”只是图像本身的尺寸,不包含任何现实世界的位置信息。
- 壁纸:只需要在屏幕上按像素显示,像素就是最终单位,不需要换算
- 工业视觉:要让电机移动到现实中的某个位置,必须知道像素和毫米的对应关系
关键区别不在于图像本身,而在于图像之外有没有额外的映射信息。
- 标定 → 额外给出“像素↔毫米”的映射
- GPS → 额外给出“这张照片拍在哪”的映射
- 壁纸 → 什么额外信息都没有,所以它什么现实意义都没有
照片永远是壁纸。它能不能对应现实,取决于你在照片之外额外知道了什么。
四、进一步:工业相机拍的照片不也是壁纸吗
这个问题我追问过自己。答案是:对,工业相机拍出来的照片,本身也是一堆像素,和壁纸没有本质区别。
那为什么工业上能换算成毫米?
因为工业场景里,人多做了一件事:放了一个已知尺寸的标定板进去拍。
标定板提供了额外的现实尺寸信息,人通过它算出了像素当量。然后假设相机没动、焦距没变、工作距离没变,这个换算关系对后续拍摄都成立。
像素本身没有现实意义,现实意义是标定这个外部动作赋予的。
五、标定的本质:两个坐标系的转换
理解了上面这些之后,我把标定的本质总结为:
标定就是计算两个坐标系之间的转换关系。
设备和相机各自有一个坐标系,各自有一个 0 点。标定算出的转换关系,既包括比例(1px 对应多少 mm),也包括原点偏移(两个 0 点差多少)。
这里有一个容易忽略的点:只算比例,能算出“距离”,但算不出“位置”。比例 + 原点对齐,才能算出“位置”。
工业场景里,视觉要告诉电气“目标在哪”,电气要的是位置,不是距离。所以原点对齐是必须的。
更准确的类比不是等比数列,而是温度换算:
text
摄氏度 = (华氏度 - 32) × 5/9
这里有比例(5/9),也有偏移(-32),因为两个 0 点不一样。标定也一样:
text
现实坐标 = (图像坐标 - 图像原点) × 比例 + 现实偏移
六、运动系标定:解决相机和运动机构的关系
像素比标定解决的是相机内部的问题:图像里 1 像素对应多少毫米。
但还有一个问题没解决:相机看到的位置,怎么变成电机需要移动的位置?
这就是运动系标定要解决的问题。
| 像素比标定 | 运动系标定 | |
|---|---|---|
| 解决什么 | 图像坐标 → 现实物理尺寸 | 相机坐标 → 运动机构坐标 |
| 涉及谁 | 相机自己 | 相机 + 运动轴 |
| 得到什么 | 1px = 多少 mm | 像素坐标 ↔ 运动坐标 的变换矩阵 |
为什么像素比标定算出的位置不能直接驱动电机
这里我曾经卡了很久。电气工程师规定了 0 点,电气知道实际位置,为什么还说像素比标定算出的位置不能直接驱动?
关键在于区分两个概念:
| 偏移量 | 绝对位置 | |
|---|---|---|
| 含义 | 相对某个参考点差了多少 | 在某个坐标系里具体坐标是多少 |
| 例子 | “向右 5mm” | “电机坐标 X=105.0mm” |
| 电气能不能直接执行 | 不能 | 能 |
像素比标定算出来的是偏移量(相对量),电气需要的是绝对位置(在电气自己坐标系里的坐标)。
电气知道自己坐标系内的一切,但它不知道相机坐标系和它自己坐标系的关系。这个关系只能靠运动系标定来建立。
完整链路是:
text
图像像素坐标
↓ 像素比标定
现实物理偏移量(相对于图像某个参考点,单位 mm)
↓ 运动系标定 ← 补上“图像参考点 ↔ 电机坐标”的对应
电机坐标系下的绝对位置
↓
电气执行
七、九点标定:运动系标定最常用的实现
九点标定的核心思路很直接:让机器人或运动轴带着一个特征物,在相机视野里走 9 个位置,记录下“机器人坐标”和“图像像素坐标”的 9 组对应关系,然后用数学方法求出两者之间的转换矩阵。
具体操作有两种常见形式:
- 动标定物:机器人末端夹持一个 MARK 点,在相机下方走一个 3×3 的网格
- 动相机:相机装在机器人末端,机器人带着相机去拍固定不动的标定板
这 9 组数据解算出来的,是一个 2D 仿射变换矩阵,包含平移、缩放、旋转、剪切,能校正相机装歪、比例不一致等问题。
一个容易产生的误解
我曾经以为“9 点标定就是 9 个像素比标定”,后来发现不对。
九点标定本身就是一种运动系标定的方法,它一次性建立“像素坐标 → 运动坐标”的完整变换。结果里包含了像素当量,但还额外包含了旋转和原点偏移。
像素比标定不需要运动轴参与,放个标定板拍一张就够了。九点标定必须有运动轴参与,因为它的目的就是建立相机和运动轴之间的关系。
八、其他标定方法
九点标定是基础,但实际项目里会根据需求升级:
十二点标定(9点 + 3点旋转):如果设备末端有旋转轴,九点标定就不够了。因为九点标定假设旋转中心就在末端工具的中心点上,但现实中这个旋转中心往往有偏移。十二点标定在九点基础上额外增加 3 个旋转点位,专门把这个旋转中心的偏移量也算出来。
十六点标定:操作步骤和九点标定完全一样,只是取样的点更多(比如 4×4 网格)。点越多,拟合变换矩阵的数据越多,结果更稳、精度更高,但耗时更长。
3D 手眼标定:九点标定解决的是平面问题。如果场景是 3D 的,或者相机是斜着装的,就需要 3D 手眼标定。它求解的是一个 3D 空间里的位姿变换矩阵,数学上复杂得多。
九、振镜融合标定
振镜是一套由两个高速摆动反射镜组成的激光扫描装置,控制激光束的偏转方向。
振镜系统有个固有缺陷:理论上下发一个坐标指令,激光就应该打在对应位置。但实际上,由于透镜畸变、机械安装误差、焦平面弯曲等原因,激光实际打出的位置和指令位置会有偏差。
更麻烦的是,振镜和相机通常是分开的:
- 相机负责“看”,有自己的像素坐标系
- 振镜负责“打”,有自己的指令坐标系
- 两者之间没有天然的对应关系
振镜融合标定要做的,就是建立“振镜指令坐标”和“相机像素坐标”之间的转换关系。
常见做法是:让振镜在工作平面上打出一系列标记点,相机拍下这些点,提取像素坐标。同时振镜系统里记录了每个标记点对应的指令坐标。有了多组对应数据,就能解出两者之间的变换关系。
标定完成后,系统就知道了:相机看到目标在图像中的某个位置,通过标定关系,能算出振镜应该发出什么指令,才能让激光精确地打到那个目标上。
十、载台标定
载台就是放置产品的工作平台。它可能固定不动,也可能是一个可以移动的 XY 平台。
载台标定解决的是:载台坐标系和相机/振镜坐标系之间的对齐问题。
产品放在载台上,但载台本身有一个自己的坐标系。相机看到产品上的特征点在图像里的位置,振镜要把激光打在这个特征点上,需要知道这个特征点在载台坐标系里的位置。
常见做法是:在载台上放一个标定物,让载台运动到多个已知位置,或者相机拍摄载台上多个已知位置的特征点,记录下它们在图像里的像素坐标和在载台坐标系里的坐标,解算出变换关系。
标定完成后,系统就知道了:载台坐标系的原点在图像里的哪个位置,载台坐标系的 X 轴方向对应图像里的哪个方向,1 个载台坐标单位对应多少像素。
和振镜融合标定的区别
- 振镜融合标定:解决“相机看到的目标 → 振镜该打到哪”
- 载台标定:解决“相机看到的目标 → 在载台坐标系里是哪个位置”
实际系统里两者往往配合使用:
text
相机像素
↓ 载台标定
载台坐标系下的位置
↓ 与预设图形对比,算出偏差
振镜需要补偿的偏移量
↓ 振镜融合标定
振镜指令坐标
十一、几种标定的关系总结
| 标定 | 解决什么 |
|---|---|
| 像素比标定 | 图像像素 → 现实毫米 |
| 运动系标定(九点) | 图像像素 → 电机/机械臂坐标 |
| 振镜融合标定 | 图像像素 → 振镜指令坐标 |
| 载台标定 | 图像像素/振镜坐标 → 载台坐标系 |
像素比标定的使用场景,是那些“只关心尺寸/距离/偏移,不关心电机绝对坐标”的场合。一旦你要把视觉结果变成电机能执行的目标位置,像素比标定就不够了。
而运动系标定、振镜融合标定、载台标定,各自解决的是不同坐标系之间的对齐问题。实际项目里,往往需要多种标定配合使用,才能把“相机看到的”变成“设备能执行的”。
十二、对上位机开发者的意义
理解这些标定之后,我在数据传递中就能分清:
- 视觉给的是像素坐标,还是已经换算好的物理坐标?
- 如果是像素坐标,换算这一步放在哪做?视觉端、上位机、还是电气端?
- 电气收到的坐标,是电气自己坐标系下的值,还是相机坐标系下的值?
- 标定系数不是固定不变的,换镜头、调焦距、动相机位置后都要重新标定,这个值需要能配置或由视觉端下发
关键约定:每种标定分别由谁做、结果放在哪、怎么传给下一环,这是上位机、视觉、电气三方要提前对齐的事情。
写在最后
我从“像素比标定是什么”开始,一路理解到运动系标定、九点标定、振镜融合标定、载台标定,最大的收获是:
像素本身没有现实意义,现实意义是标定这个外部动作赋予的。每个标定解决的,都是两个坐标系之间的对齐问题。
作为上位机开发者,我不需要自己去推导变换矩阵,但需要理解每一步在干什么、数据在哪个坐标系里、谁负责哪一段转换。这样才能在对接时少踩坑。

浙公网安备 33010602011771号