[手眼标定]二维平面的非旋转标定 - 2.眼在手上

二维平面的非旋转标定:眼在手上

相机装在机器人末端,机器人移动到产品附近拍照,再根据图像计算取料位置。这种结构在吸取、点胶、检测和精密对位工位中非常常见。

如果相机始终保持同一拍照高度和同一姿态,只随机器人做平面平移,系统可以使用一个非常实用的二维模型。它不必先恢复完整的三维相机外参,却必须正确处理一个问题:相机移动以后,图像坐标原点也跟着移动。

在上一篇《二维平面的非旋转标定:眼在手外》中,相机固定,一个像素点可以通过固定映射转换成机器人平面坐标。本篇相机随机器人移动,同一个像素点不再唯一对应某个机器人绝对位置;运行时必须把曝光时的机器人实际位置一起带入计算。

本文从一个具体取料工位出发,逐步讨论几何模型、九点采样、符号方向、仿射与单应性、绝对定位、反向示教、视觉对中、数值实现、精度验收和适用边界。文中的数值为自洽的教学合成数据,不代表设备实测精度。

1. 从“移动相机寻找产品”开始

1.1 一个典型的取料工位

机器人末端同时安装相机和吸嘴。相机朝向工作台,产品放在固定高度的平面上。机器人先到拍照位置,视觉识别产品圆心,随后吸嘴移动到圆心上方取料。

设机器人第一次拍照时的平面位置为:

q0=(400,200) mm.q_0=(400,200)\ \mathrm{mm}.

某个固定标记恰好出现在参考像素:

p0=(1280,1024) px.p_0=(1280,1024)\ \mathrm{px}.

现在让机器人向 X 正方向移动 10 mm,相机也向 X 正方向移动 10 mm,而标记没有移动。若图像横轴与机器人 X 轴近似同向,标记通常会在图像中向左移动。

这里已经出现了与固定相机不同的符号关系:

  • 固定相机、移动标记:标记的物理运动产生图像运动;
  • 移动相机、固定标记:相机运动产生反方向的相对运动。

“向左”只是这个安装例子的直观描述。实际设备可能有轴旋转、镜像和交叉耦合,最终应由矩阵和单轴实验确定方向。

相机随机器人平移,固定标记在图像中反向移动

图1:标记在工作台上保持固定,相机从位置 A 移到位置 B。变化的是标记相对于相机的位置,不能把图像位移直接当成产品的绝对位移。

1.2 为什么一个固定的像素到绝对坐标矩阵不够

设两次拍照都在图像中心检测到产品。第一次相机位于工作台左侧,第二次位于工作台右侧。两个中心像素相同,但它们对应的产品绝对位置显然可能不同。

因此,允许拍照位置改变时,运行输入至少包括:

目标平面位置=Φ(像素点,拍照时机器人位置).\text{目标平面位置}=\Phi(\text{像素点},\text{拍照时机器人位置}).

如果每次都回到完全相同的拍照位姿,相机在曝光瞬间相当于固定相机,可以使用针对该位姿建立的固定映射。这个特例不能直接推广到任意拍照位置。

2. 本篇“非旋转”的严格含义

2.1 固定的是整个拍照姿态

本文假设相机刚性安装在机器人末端,标定和生产拍照时满足:

项目 必须保持的条件 原因
相机安装 相机与末端之间的刚性关系固定 支架松动会改变映射
机器人姿态 完整方向保持不变,记为基准方向 R0 相机坐标轴和偏心方向不变
拍照高度 相机相对工作平面的距离固定 平面成像尺度和透视关系不变
工作平面 特征位于同一平面 二维模型只描述该平面
运动方向 平移方向与工作平面平行 保持相同的相机到平面几何关系
成像设置 分辨率、镜头、对焦、ROI 和图像处理一致 保持同一种像素坐标定义
机器人坐标 采用固定、统一的基座或用户坐标系 所有位移必须在同一坐标系表达

对 SCARA 或平面机构,通常可以用“R 固定、Z 固定”概括;对六轴机器人,仅保持一个 R 数值不够,俯仰和横滚也必须保持不变。

本文把工作平面取为固定机器人坐标系中的 XY 平面。如果实际台面倾斜,应先选择与台面平行的固定用户坐标系,并沿该坐标系的 XY 方向采样。沿基座 XY 移动却不断改变相机到斜面的距离,不能直接套用本篇模型。

2.2 产品可以变化,拍照姿态受到约束

“非旋转”约束的是本篇标定与定位所采用的机器人拍照姿态,不要求产品在图像中完全没有方向变化。

视觉可以测量产品方向,也可以计算产品局部工艺点。但如果机器人需要改变工具方向去抓取,就还需要明确 TCP、工具与法兰的关系,以及改变 R 后的执行补偿。本篇的平移标定不能独自完成这些工作。

2.3 本篇实际求什么

本篇优先求解:

像素点⟶在机器人平面轴方向上表达的相对位置.\text{像素点}\longrightarrow\text{在机器人平面轴方向上表达的相对位置}.

这种相对位置以毫米为单位,已经包含像素尺度、轴方向、安装角和必要的平面投影关系。它不是完整的相机到法兰六自由度刚体变换。

3. 先统一符号和坐标含义

符号 含义 单位与约定
B 固定的机器人基座或用户坐标系 全文平面向量在这个坐标系表达
q 曝光时机器人所报告控制原点的 XY mm;可以是法兰或已明确的活动 TCP
q0 参考拍照时的机器人 XY 与 q 使用相同工具和坐标定义
p=(u,v) 当前检测像素点 px;已执行约定的去畸变和坐标处理
p0 参考拍照中固定标记的像素点 不要求恰好等于图像中心
S 当前目标特征在 B 中的 XY mm
S0 参考标记在 B 中的 XY 绝对定位时需要;反向示教可以不显式知道
g(p) 从机器人报告原点到目标点的平面向量 mm;方向用 B 的轴表达
m(p) 相对参考像素 p0 的平面位移 mm,定义为 g(p)-g(p0)
qpick,0 参考产品对应的正确机器人取料 XY 通过 TCP 示教得到

这里的 q 不是相机光心坐标。相机与机器人报告原点之间即使存在很大的固定安装偏移,也可以包含在 g 中。只要拍照方向固定,这个偏移在 B 中就是固定向量。

后文相加的向量都沿固定机器人平面坐标轴表达。不能把工具坐标中的相对移动量,直接加到基座坐标的绝对位置上。

4. 核心几何:目标位置等于拍照位置加相对位置

4.1 最基本的关系

在上述条件下,存在一个固定平面函数 g,使得:

S=q+g(p).\boxed{S=q+g(p)}.

理由是:相机方向固定、到工作平面的距离固定,某个像素对应的空间射线与工作平面的交点,相对于机器人报告原点的位置保持不变。机器人平移多少,这一像素所对应的平面交点就整体平移多少。

g 可以是仿射映射,也可以由去畸变后的平面单应性表示。它不要求相机光轴完全垂直于台面,但要求相机与工作平面的相对方向和法向距离保持不变。

4.2 固定标记给出的标定约束

把一个标记固定在工作台的 S0,机器人带相机到多个位置拍照。第 i 个样本满足:

S0=qi+g(pi).S_0=q_i+g(p_i).

参考样本满足:

S0=q0+g(p0).S_0=q_0+g(p_0).

两式相减:

g(pi)−g(p0)=q0−qi.\boxed{g(p_i)-g(p_0)=q_0-q_i}.

这就是移动相机九点标定最重要的符号关系:像素相对位移对应的是“参考拍照位置减当前拍照位置”。

4.3 定义一个方便使用的相对映射

定义:

m(p)=g(p)−g(p0),m(p0)=0.m(p)=g(p)-g(p_0),\qquad m(p_0)=0.

那么标定数据应该满足:

m(pi)=q0−qi.\boxed{m(p_i)=q_0-q_i}.

运行时从参考式得到:

g(p)=S0−q0+m(p).g(p)=S_0-q_0+m(p).

因此:

S=S0+(qcapture−q0)+m(p).\boxed{S=S_0+(q_{\mathrm{capture}}-q_0)+m(p)}.

公式中的两项增量具有不同来源:

  • qcapture-q0:相机跟随机器人产生的拍照位置变化;
  • m(p):当前目标相对参考像素产生的平面位置变化。

两者相加,才是当前产品相对参考产品的真实平移。

移动相机标定中机器人采样位置与图像相对位移的关系

图2:固定标记不动,机器人移动到九个拍照位置。用于拟合相对映射的毫米标签为 q0-qi,不能漏掉这个符号关系。图中数值使用本文的教学模型。

5. 九点采样:移动相机,保持标记不动

5.1 推荐采样方式

把一个稳定的圆心、角点或其他定位特征固定在实际工作平面上,让机器人带着相机平移,使同一个标记依次出现在图像中心、四边和四角附近。

要覆盖的是特征在图像中的有效分布。机器人走了很大的距离,却始终把特征保持在图像中心,并不能提供足够的像素跨度。

标定时不需要标记的绝对机器人坐标,就能估计局部尺度与轴向关系。机器人已知的毫米位移提供了物理尺度。

单个圆心可以满足本篇固定姿态、仅求 XY 相对映射的需要。若还要测量产品方向,则应增加有序点或不对称特征;这与完整手眼标定中使用标定板姿态是不同的需求。

5.2 每个点保存哪些数据

每个样本至少保存:

  1. 原始图像、样本 ID、相机序列号和触发时间;
  2. 检测点的原始像素与处理后像素;
  3. 曝光对应的机器人实际 X、Y、Z 和完整方向;
  4. 活动工具、基座或用户坐标系名称;
  5. 分辨率、ROI、去畸变配置和检测质量。

静态采集建议采用“到位—稳定等待—锁存位姿与触发—保存图像”的握手流程,并确认稳定等待覆盖机械振动衰减。连续运动拍照则需要明确时间戳、触发延时和曝光期间运动,不能仅靠先后调用两个 API 保证同步。

5.3 一组可以手算的九点数据

为了把后续公式串起来,假设真实局部模型为:

m(p)=A(p−p0),A=[0.0500.0020.001−0.050] mm/px.m(p)=A(p-p_0),\qquad A=\begin{bmatrix} 0.050&0.002\\ 0.001&-0.050 \end{bmatrix}\ \mathrm{mm/px}.

取:

q0=(400,200),p0=(1280,1024).q_0=(400,200),\qquad p_0=(1280,1024).

根据 qi=q0-m(pi) 构造以下理想无噪声数据:

ID u / px v / px 拍照 X / mm 拍照 Y / mm
1 980 824 415.4 190.3
2 1280 824 400.4 190.0
3 1580 824 385.4 189.7
4 980 1024 415.0 200.3
5,参考 1280 1024 400.0 200.0
6 1580 1024 385.0 199.7
7 980 1224 414.6 210.3
8 1280 1224 399.6 210.0
9 1580 1224 384.6 209.7

例如从参考点移到第 6 点:机器人 X 减少 15 mm、Y 减少 0.3 mm,而标记像素向右增加 300 px。这个方向与固定相机观察移动标记时容易混淆。

表格只是说明原理。真实设备必须采集实际反馈与实际图像,不能用计划点位或这些教学数据代替。

6. 仿射模型怎样求解

6.1 相对映射的线性部分

一般仿射模型可写成:

g(p)=Ap+c.g(p)=Ap+c.

因此:

m(p)=A(p−p0).m(p)=A(p-p_0).

固定标记满足:

A(pi−p0)=q0−qi.A(p_i-p_0)=q_0-q_i.

把多个样本堆叠后,可以通过最小二乘估计 A。点集必须在二维中展开;共线点或非常狭窄的点集,会使另一方向参数无法稳定求解。

如果把 p0 视为准确参考,至少需要两条线性独立的像素位移;连同参考点,对应至少三个不共线的位置。实际推荐九点或更多覆盖点,并保留独立验证数据。

6.2 工程上可先拟合带截距的模型

真实参考点也有检测噪声。把它强行当成完全无误差的原点,会使所有差分共享这一次参考误差。

一种常见做法是用全部样本拟合:

F(p)=Ap+b≈q0−qi.F(p)=Ap+b\approx q_0-q_i.

拟合后定义:

m(p)=F(p)−F(p0).\boxed{m(p)=F(p)-F(p_0)}.

对于仿射模型,b 相消,仍得到 A(p-p0)。参考图可以重复采集取稳定统计值,或使用多个参考观测估计锚点,以降低单帧参考噪声。

应注意:把输出强制锚定在参考点以后,参考点的绝对误差依然存在。训练残差小,不能证明参考坐标或 TCP 示教准确。

6.3 求解时的数值细节

  • 对像素坐标做中心化和尺度归一化,改善数值条件;
  • 用 QR、SVD 或成熟的最小二乘函数求解,避免显式求正规方程逆矩阵;
  • 检查设计矩阵秩、点集覆盖范围和异常样本;
  • 低质量点先追溯图像、匹配与时序,再考虑加权或鲁棒估计;
  • 最终以独立验证误差选择模型,不用训练残差决定一切。

像素和机器人反馈都可能带噪声,普通最小二乘是实用近似。精度要求更高时,应考虑两侧测量不确定度、误差变量模型或联合优化。

7. 如果软件直接拟合“像素到机器人拍照位置”

7.1 这个矩阵可以使用,但输出含义不同

不少视觉软件把采样像素 pi 和机器人拍照坐标 qi 直接配对,输出:

f(pi)≈qi.f(p_i)\approx q_i.

在本篇固定标记采样方式中,理想关系为:

f(p)=S0−g(p).f(p)=S_0-g(p).

所以:

m(p)=−[f(p)−f(p0)].\boxed{m(p)=-[f(p)-f(p_0)]}.

绝对定位公式变为:

S=S0+(qcapture−q0)−[f(p)−f(p0)].\boxed{S=S_0+(q_{\mathrm{capture}}-q_0)-[f(p)-f(p_0)]}.

这并不是另一个物理模型,只是软件输出定义不同。

7.2 用一张表固定接口语义

标定输出 拟合标签或定义 运行时产品相对参考的平移
m(p) q0-qi;参考输出归零 qcapture-q0+m(p)
f(p) 机器人拍照位置 qi qcapture-q0-[f(p)-f(p0)]
g(p) S0-qi,需已知 S0 先求 S=qcapture+g(p),再减 S0
Href(p) 参考拍照位置 q0 下的目标绝对坐标 Href(p)+qcapture-q0-S0

不要只根据“九点矩阵”“手眼矩阵”等名称选择公式。必须知道:输入坐标是什么,输出坐标是什么,是否包含参考偏移,以及输出是拍照位置还是目标位置。

7.3 最有效的单轴确认实验

固定标记不动,让机器人在保持方向和高度的条件下沿 X 正方向移动一小段已知距离。

  • m 的变化应接近机器人位移的负值;
  • f 的变化应接近机器人位移本身;
  • 最终计算出的固定标记绝对坐标应保持不变。

再沿 Y 重复一次。这比根据图像 Y 轴朝下的直觉去修改正负号可靠得多。

8. 平面单应性:先转换两个点,再求差

8.1 何时需要单应性

在去除明显镜头畸变后,如果相机倾斜或透视较强,仿射模型可能无法满足全视野误差要求。可以将 F 或 f 替换为平面单应性。

设 F 的单应矩阵为 H,输入齐次像素:

p~=[uv1]T,[abw]=Hp~.\widetilde p=\begin{bmatrix}u&v&1\end{bmatrix}^{\mathsf T}, \qquad \begin{bmatrix}a\\b\\w\end{bmatrix}=H\widetilde p.

非齐次输出为:

F(p)=[a/wb/w].F(p)=\begin{bmatrix}a/w\\b/w\end{bmatrix}.

仍然使用:

m(p)=F(p)−F(p0).m(p)=F(p)-F(p_0).

理论上需要至少四组处于一般位置的点对,四点方案应避免任意三点共线;工程上应使用更多分布充分的点,并检查几何退化和独立验证误差。

8.2 不能把单应矩阵直接乘像素差

仿射模型满足:

F(p)−F(p0)=A(p−p0).F(p)-F(p_0)=A(p-p_0).

一般单应性有随位置变化的分母,不能直接推广成“把 u-u0、v-v0 放进原 H”或“把 H 的左上 2×2 当成全局像素当量”。

正确计算顺序是:

  1. 用完整齐次像素计算 F(p),除以当前 w;
  2. 用参考齐次像素计算 F(p0),除以参考 w0;
  3. 两个毫米坐标相减;
  4. 按第 7 节确认是否需要取负号。

仿射和单应性在相对位移计算时的正确处理顺序

图3:机器人拍照位移和视觉平面位移分别计算,再合成产品位移。单应性必须对当前点与参考点分别进行齐次归一化。

8.3 另一种等价表达:更新参考拍照位的绝对矩阵

如果已经有一个把像素映射到参考拍照位 q0 下目标绝对坐标的 Href,则:

S=π(Hrefp~)+(qcapture−q0),S=\pi(H_{\mathrm{ref}}\widetilde p)+(q_{\mathrm{capture}}-q_0),

其中 π 表示除以齐次分量。

也可以在矩阵左侧复合一个输出平移:

Hcurrent=[10Δqx01Δqy001]Href,Δq=qcapture−q0.H_{\mathrm{current}}= \begin{bmatrix} 1&0&\Delta q_x\\ 0&1&\Delta q_y\\ 0&0&1 \end{bmatrix}H_{\mathrm{ref}}, \qquad \Delta q=q_{\mathrm{capture}}-q_0.

这里左乘,是因为补偿作用在输出的机器人平面坐标上。它依然依赖拍照位移,并不是一个不随机器人位置变化的全局绝对映射。

9. 一次完整的数值计算

9.1 参考数据

沿用第 5 节的 A、p0、q0。假设独立测得参考标记坐标为:

S0=(430,210) mm.S_0=(430,210)\ \mathrm{mm}.

因此参考像素所对应的固定相对向量为:

g(p0)=S0−q0=(30,10) mm.g(p_0)=S_0-q_0=(30,10)\ \mathrm{mm}.

这个向量包含机器人报告原点到该成像位置的全部平面偏移。它不是简单的相机机械安装尺寸。

9.2 当前拍照与检测

当前机器人拍照位置为:

qcapture=(460,220) mm.q_{\mathrm{capture}}=(460,220)\ \mathrm{mm}.

检测到产品点:

p=(1480,924) px.p=(1480,924)\ \mathrm{px}.

像素相对变化:

p−p0=(200,−100) px.p-p_0=(200,-100)\ \mathrm{px}.

映射为:

m(p)=[0.0500.0020.001−0.050][200−100]=[9.85.2] mm.m(p)= \begin{bmatrix} 0.050&0.002\\ 0.001&-0.050 \end{bmatrix} \begin{bmatrix}200\\-100\end{bmatrix} =\begin{bmatrix}9.8\\5.2\end{bmatrix}\ \mathrm{mm}.

拍照位置相对参考改变了:

qcapture−q0=(60,20) mm.q_{\mathrm{capture}}-q_0=(60,20)\ \mathrm{mm}.

所以目标绝对坐标:

S=(430,210)+(60,20)+(9.8,5.2)=(499.8,235.2) mm.S=(430,210)+(60,20)+(9.8,5.2) =\boxed{(499.8,235.2)\ \mathrm{mm}}.

若漏掉拍照位移,只得到 (439.8,215.2),就会恰好少算 (60,20) mm。这是把眼在手上当成固定相机时最直接的错误。

9.3 换一个拍照位置,结果应保持一致

产品不动,把相机移到:

qcapture,2=(480,230) mm.q_{\mathrm{capture},2}=(480,230)\ \mathrm{mm}.

同一教学模型下,产品会出现在约:

p2=(1072.326139,1115.846523) px.p_2=(1072.326139,1115.846523)\ \mathrm{px}.

对应:

m(p2)≈(−10.2,−4.8) mm.m(p_2)\approx(-10.2,-4.8)\ \mathrm{mm}.

再次计算:

S2=(430,210)+(80,30)+(−10.2,−4.8)=(499.8,235.2) mm.S_2=(430,210)+(80,30)+(-10.2,-4.8) =(499.8,235.2)\ \mathrm{mm}.

同一产品从不同拍照位置观察,应得到一致的机器人绝对坐标

图4:图像点和拍照位置都发生变化,但目标绝对坐标保持一致。这是移动相机定位必须通过的基本验证。数值为合成算例。

10. 不知道 S0 时:反向示教直接计算取料位置

10.1 很多现场不需要先测出产品绝对坐标

生产的目标通常是“机器人正确取到产品”,并不一定要求先给产品特征建立一个可溯源的绝对坐标 S0。

可以在参考产品不动时,建立两份参考数据:

  • 参考拍照:记录 q0 和 p0;
  • 正确取料:手动让已经定义好的 TCP 到达正确工艺点,记录 qpick,0。

拍照和取料可以是两次不同的机器人动作,也可以处于不同 Z 高度。它们的 XY 必须使用同一固定坐标系和相同的控制原点定义;取料 Z 由工艺单独规定。

10.2 推导取料公式

当前产品相对参考产品的纯平移为:

ΔS=(qcapture−q0)+m(p).\Delta S=(q_{\mathrm{capture}}-q_0)+m(p).

若产品到工艺点的关系不变、工具取料方向固定,正确取料位置也应平移相同距离:

qpick=qpick,0+(qcapture−q0)+m(p).\boxed{q_{\mathrm{pick}}=q_{\mathrm{pick},0} +(q_{\mathrm{capture}}-q_0)+m(p)}.

如果使用直接拟合拍照位置的 f,则:

qpick=qpick,0+(qcapture−q0)−[f(p)−f(p0)].q_{\mathrm{pick}}=q_{\mathrm{pick},0} +(q_{\mathrm{capture}}-q_0)-[f(p)-f(p_0)].

这样,相机与吸嘴之间的固定偏移、可见特征到工艺点的固定偏移,可以在基准取料示教中体现。它们不需要被拆成若干凭经验填写的 XY 补偿。

参考拍照与正确取料示教共同建立固定方向的工艺关系

图5:先保存参考产品的拍照数据与正确取料位置。生产时把测得的产品平移量加到参考取料位置上。相机与吸嘴不必共轴,但安装、工具定义和使用方向必须保持一致。

10.3 接着前面的数值计算

若参考产品正确取料时,控制器应到达:

qpick,0=(432,207) mm,q_{\mathrm{pick},0}=(432,207)\ \mathrm{mm},

则当前产品的位移为 (69.8,25.2) mm,目标取料 XY 为:

qpick=(432,207)+(69.8,25.2)=(501.8,232.2) mm.q_{\mathrm{pick}}=(432,207)+(69.8,25.2) =\boxed{(501.8,232.2)\ \mathrm{mm}}.

这个结果与产品特征坐标 (499.8,235.2) 不同,是因为示教工艺点本来就相对特征存在 (2,-3) mm 的固定偏移。

10.4 哪些变化会使示教关系失效

更换吸嘴、重新定义 TCP、移动相机支架、改变产品特征定义或改变抓取方向,都可能改变示教关系。

产品发生转动时,产品局部偏移应随产品方向旋转,不能继续简单平移一个世界坐标中的固定偏移。若进一步改变机器人取料 R,还需要正确的工具几何与执行模型。

11. 视觉对中:把目标移到指定像素

另一个常见任务是:不立即求取料坐标,先移动相机,使目标落到期望像素 p*。

当前固定目标满足:

S=q+g(p).S=q+g(p).

对中后希望满足:

S=qnext+g(p∗).S=q_{\mathrm{next}}+g(p^*).

因此:

qnext=q+m(p)−m(p∗).\boxed{q_{\mathrm{next}}=q+m(p)-m(p^*)}.

如果期望像素就是参考像素 p0,则:

qnext=q+m(p).q_{\mathrm{next}}=q+m(p).

使用直接拍照位置映射 f 时,等价为:

qnext=q−[f(p)−f(p∗)].q_{\mathrm{next}}=q-[f(p)-f(p^*)].

现场可以采用比例系数 k 和多次拍照逐步修正:

qnext=q+k[m(p)−m(p∗)],0<k≤1.q_{\mathrm{next}}=q+k[m(p)-m(p^*)],\qquad 0<k\leq1.

k 的选择还需考虑测量噪声、通信延迟和运动响应,并设置步长限制、停止阈值与最大迭代次数。这是静态拍照迭代定位的简化表达,不等于已经设计完成一个连续视觉伺服控制器。

**相机对中不等于吸嘴对中。**只有期望像素已经对应正确的工具工艺位置,或另外应用了相机到工具的关系,对中才能直接服务于取料。

12. 产品方向怎样计算

12.1 先转换两个有序点

假设视觉通过两个有固定顺序的特征点 p1、p2 定义产品方向。先映射到机器人平面上的相对坐标:

d=m(p2)−m(p1).d=m(p_2)-m(p_1).

方向为:

αB=atan2⁡(dy,dx).\alpha_B=\operatorname{atan2}(d_y,d_x).

如果软件输出 f,应先使用:

d=−[f(p2)−f(p1)].d=-[f(p_2)-f(p_1)].

所有公共平移项都会相消。对单应性,仍应分别映射两个端点后相减。

12.2 为什么不直接加一个安装角

原始图像角度可能受到 Y 轴向下、轴尺度不同、剪切和透视影响。直接写“机器人角度等于图像角度加一个安装角”只在特定近似条件下成立。

先映射有序端点,再在物理平面计算方向,更容易与位置模型保持一致。还应处理圆或对称图案的方向不可辨识,以及点序交换造成的 180° 跳变。

12.3 测出方向与改变机器人方向是两件事

在固定拍照方向下,可以测出产品方向;也可以把产品坐标中的偏移 dP 旋转到 B 中,得到工艺点:

Sprocess=S+Rot⁡(αB)dP.S_{\mathrm{process}}=S+\operatorname{Rot}(\alpha_B)d_P.

但由这个工艺点生成改变 R 的机器人目标时,需要另外处理工具控制原点和实际 TCP。不能把本篇固定姿态公式直接扩展为任意角度的相机或吸嘴补偿。

13. 一段可复现的 NumPy 示例

下面代码只做数学计算,不连接机器人。输入像素默认已经经过与标定一致的去畸变和坐标处理;机器人 XY 默认使用统一的固定坐标系。

示例先拟合 F(p)≈q0-qi,再用 F(p)-F(p0) 计算相对位移。像素做了中心化和尺度归一化,最小二乘同时检查秩。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np


def fit_relative_affine(pixels, robot_xy, q0):
p = np.asarray(pixels, dtype=float)
q = np.asarray(robot_xy, dtype=float)
if p.ndim != 2 or p.shape[1] != 2 or q.shape != p.shape:
raise ValueError("Expected matching N x 2 arrays")
if len(p) < 3 or not np.isfinite(p).all() or not np.isfinite(q).all():
raise ValueError("Need at least 3 finite, non-collinear samples")
center = p.mean(axis=0)
scale = np.sqrt(np.mean(np.sum((p - center) ** 2, axis=1)))
if scale <= 0:
raise ValueError("Pixel samples have no spatial extent")
design = np.column_stack(((p - center) / scale, np.ones(len(p))))
labels = np.asarray(q0, dtype=float) - q
coef, _, rank, _ = np.linalg.lstsq(design, labels, rcond=None)
if rank < 3:
raise ValueError("Degenerate pixel layout")
A = coef[:2].T / scale
b = coef[2] - A @ center
return A, b


def relative_delta(A, b, pixel, reference_pixel):
F = lambda p: A @ np.asarray(p, dtype=float) + b
return F(pixel) - F(reference_pixel)


# Synthetic calibration data: fixed marker, moving camera.
p0 = np.array([1280.0, 1024.0])
q0 = np.array([400.0, 200.0])
A_true = np.array([[0.050, 0.002], [0.001, -0.050]])
offsets = np.array([(u, v) for v in (-200, 0, 200)
for u in (-300, 0, 300)], dtype=float)
pixels = p0 + offsets
robot_xy = q0 - offsets @ A_true.T
A, b = fit_relative_affine(pixels, robot_xy, q0)

q_capture = np.array([460.0, 220.0])
pixel = np.array([1480.0, 924.0])
delta_S = q_capture - q0 + relative_delta(A, b, pixel, p0)

# Option 1: absolute feature coordinates, with a known anchor.
S0 = np.array([430.0, 210.0])
print("Product XY:", S0 + delta_S)

# Option 2: directly use the correctly taught reference pick position.
pick0 = np.array([432.0, 207.0])
print("Pick XY:", pick0 + delta_S)

输出应接近:

1
2
Product XY: [499.8 235.2]
Pick XY: [501.8 232.2]

真实部署还需保存并校验:标定版本、输入范围、拍照 Z 和方向、机器人坐标定义、参考图、检测质量,以及结果是否处于经过验收的工作区域。求解函数成功返回参数,并不代表这些条件自动成立。

14. 畸变、ROI 和高度:最常见的隐含变量

14.1 去畸变后的坐标必须有明确单位

标定和运行必须使用同一种坐标:原始畸变像素、去畸变像素,或归一化相机坐标。

例如 OpenCV 的 undistortPoints 在没有指定相应输出投影矩阵时,通常输出归一化坐标;设置 P=K 等合适投影矩阵后,才能得到对应的新像素坐标。不能把两者都当成同一套“去畸变像素”混用。

镜头畸变明显时,应先处理畸变,再拟合仿射或单应性。一个 3×3 单应矩阵不能完整替代径向、切向畸变模型。

14.2 ROI 改变不一定必须重标,但必须转换坐标

若仅在同一幅全分辨率图像中裁剪 ROI,检测输出是 ROI 局部坐标,则需要恢复全图坐标:

ufull=uROI+uoffset,vfull=vROI+voffset.u_{\mathrm{full}}=u_{\mathrm{ROI}}+u_{\mathrm{offset}}, \qquad v_{\mathrm{full}}=v_{\mathrm{ROI}}+v_{\mathrm{offset}}.

若还进行了缩放、旋转、镜像或硬件 binning,必须使用对应的完整坐标变换,并保证相机内参或输出投影矩阵同步适配。

经过明确换算、恢复到原标定坐标定义的 ROI 可以继续使用原映射;无法确认转换链时,应重新建立并验证模型。

14.3 固定拍照 Z 与固定产品平面缺一不可

机器人 Z 没有变化,不代表相机到产品表面的距离不变。更厚的产品、翘曲、托盘高度变化,都会改变真实成像平面。

正视针孔模型下,若标定平面距离相机 h,实际平面沿光轴朝相机靠近 Δz,目标相对光轴的真实横向距离为 r,则继续按旧平面换算的径向误差大小为:

∣Δr∣=r∣Δz∣∣h−Δz∣≈r∣Δz∣h,∣Δz∣≪h.|\Delta r|=r\frac{|\Delta z|}{|h-\Delta z|} \approx r\frac{|\Delta z|}{h},\qquad |\Delta z|\ll h.

例如 h=300 mm、r=60 mm、Δz=2 mm,误差约为 0.403 mm。视野中心附近可能看起来很准,边缘已经明显超差。

高度变化造成的平面映射误差,以及固定点一致性验证的不同层次

图6:左图由正视针孔模型公式计算,展示高度误差随离轴距离增大而放大;右图说明重复拍照、换拍照位置和独立绝对基准分别验证不同问题。曲线不是设备实测结果。

远心镜头可以降低工作范围内的高度敏感性,但不能自动取消工作距离、景深、倾斜和系统精度的约束。高度变化超出误差预算时,应采用高度配方、测高结合射线与平面求交,或升级三维定位。

15. 精度验收:先验证固定点,再验证真实任务

15.1 第一层:拟合残差

对于固定标记,使用中心化相对模型后的残差为:

ri=(qi−q0)+m(pi).r_i=(q_i-q_0)+m(p_i).

理想情况下 ri=0。可统计:

ei=∥ri∥2,RMSE⁡=1N∑i=1Nei2.e_i=\|r_i\|_2,\qquad \operatorname{RMSE}=\sqrt{\frac{1}{N}\sum_{i=1}^{N}e_i^2}.

同时报告最大误差、X/Y 有符号偏差和残差在图像中的分布。若使用多个重复帧,建议另报 P95,并说明样本数量;少量点上的 P95 不能代替充分的覆盖与重复采样。

15.2 第二层:同一固定点、多拍照位置

保持标记不动,选择没有参与拟合的多个 XY 拍照位置,方向和高度仍保持基准值。每次计算目标绝对位置或相对参考位移。

若没有 S0,直接检查:

(qi−q0)+m(pi)≈0.(q_i-q_0)+m(p_i)\approx0.

该实验可以发现拍照位移符号错误、漏补偿、视野边缘畸变和模型不足。

但有一个限制:**所有结果一致,只证明相互一致,不证明绝对坐标正确。**参考锚点或 TCP 存在固定偏差时,各次结果仍然可以一致。

15.3 第三层:独立的物理基准与工艺验证

用不参与标定的物理基准检查目标绝对坐标,或让机器人实际到达产品工艺点,通过量具、测量系统或任务结果验收。

验证至少覆盖:

  • 图像中心、四角和实际生产区域边缘;
  • 多个机器人拍照位置与实际负载状态;
  • 真实产品、真实照明、实际拍照高度;
  • 重复取放、冷机与热机条件下的稳定性。

分别记录“同位拍照重复性”“换拍照位的一致性”“绝对定位误差”和“实际工艺误差”,避免用某一项代替全部精度指标。

15.4 误差量级怎样估计

在局部近似下,忽略相关项时可写成:

ΣS≈Σq+JpΣpJpT+Σanchor/model.\Sigma_S\approx\Sigma_q+J_p\Sigma_pJ_p^{\mathsf T} +\Sigma_{\mathrm{anchor/model}}.

其中 Jp 是平面映射对像素的局部雅可比;仿射时为 A,单应性时随像素位置改变。参考观测与其他量相关时,应另外处理相关项。

几个实用估算是:

来源 近似量级 例子
像素检测波动 局部 mm/px × 像素波动 0.05 mm/px × 0.2 px,约 0.01 mm
时序错位 速度 × 时间差 100 mm/s × 5 ms,约 0.5 mm
未补偿的小角度变化 有效杠杆臂 × 弧度误差 100 mm × 0.1°,约 0.175 mm
高度偏差 离轴距离 × 高度差 / 工作距离 具体见第 14 节

这些只是相应假设下的量级估算,不能直接相加当成完整系统精度。机器人位置误差、机械挠曲、特征定义变化和参考示教误差也需要单独评估。

16. 为什么“只平移”也能用,却不能声称求出了完整外参

16.1 仅做相对引导时,不需要拆开所有偏移

固定标记观测方程为:

S0=qi+g(pi).S_0=q_i+g(p_i).

若 S0 未知,把 S0 和 g(p) 同时加上同一个常向量 k,所有观测方程仍然成立。因此仅凭这些数据,不能唯一确定这个共同的绝对平移。

但相对差:

g(p)−g(p0)g(p)-g(p_0)

不会受 k 影响。所以像素相对位移、换拍照位补偿,以及固定方向的反向示教取料仍然可以确定并使用。

这正是“非旋转二维引导可用”和“完整手眼外参可观测”之间的区别。

16.2 已知基准可以提供额外约束

如果 S0 通过独立测量已知,就可以用 S0-qi 作为标签,直接拟合 g。其他已知的几何、相机内参和工作平面信息,也可以增加约束。

因此不能笼统地说“只平移一定什么偏移都标不出来”。应明确未知量是什么、有哪些已知基准、最终要用参数完成什么任务。

即使得到了固定工作平面的 g,也不能仅凭它声称已经恢复了相机相对法兰的完整三维位置和姿态。

16.3 当机器人拍照方向要改变时

允许姿态变化后,通用眼在手上链应写为:

BTP=BTE ETC CTP.{}^{B}T_P={}^{B}T_E\,{}^{E}T_C\,{}^{C}T_P.

其中每张图需要曝光时的机器人变换,固定安装变换把相机坐标系 C 中的点转换到末端坐标系 E;视觉测量也必须是具有正确物理含义的空间量。

若在平面模型中只考虑一个角度 θ,相机安装偏移为 tEC,则它在 B 中的分量包含:

Rot⁡(θ)tEC.\operatorname{Rot}(\theta)t_{EC}.

θ 改变,这个分量不再是常量。视野方向也会变化,本篇仅加拍照 XY 位移的模型因而失效。此时需要具有足够角度激励的二维旋转模型,或完整三维手眼标定与平面求交;具体可辨识性取决于采样运动和已知约束。

17. 常见现象与排查顺序

现象 优先检查 有效的确认方法
只在参考拍照位准确,换位置就偏 漏掉 qcapture-q0 固定标记,换两个拍照位置
相机移 10 mm,结果变化接近 20 mm m 与 f 的符号或补偿方向相反 记录单轴运动前后每一项增量
所有位置误差几乎相同 S0、参考取料点、TCP 或坐标系 用独立物理基准检查固定偏差
中心准、边缘差 畸变、透视、点集覆盖和高度 看有符号残差分布,比较独立验证误差
机器人同位拍照就波动 检测噪声、照明、振动和图像模糊 锁定机器人,重复采集原始图像
换机器人位置才出现规律偏差 机器人几何误差、支架挠曲、模型不足 扩大独立拍照位验证并记录负载
速度越快越差 曝光与位姿不同步、运动模糊 对比静态拍照,检查触发与时间戳
换 ROI 或缩放后失效 局部像素、全图像素和内参混用 输出完整坐标转换链
换产品高度后失效 实际工作平面变化 按实际表面高度复测
仅改变 R 就发生位置漂移 超出了固定姿态模型 恢复 R0 验证,再建立旋转模型
产品点位置正确,但吸嘴偏 工艺点关系或活动 TCP 定义错误 对比特征位置与正确工艺点
方向跳变 180° 特征点序或对称歧义 使用有语义顺序的不对称特征

排查时保留原始图像、曝光位姿、映射前后坐标、拍照补偿、产品位移和最终工艺目标。只保存最终机器人 XY,通常无法判断错误发生在哪一层。

18. 工程实施与参数交付

18.1 推荐实施流程

  1. 定义工作平面、固定拍照方向、拍照高度和目标精度;
  2. 确认机器人报告原点、工具、基座或用户坐标系;
  3. 固定标记,采集覆盖有效视野的九点或更多平移样本;
  4. 明确输出采用 m、f、g 还是参考拍照位绝对映射;
  5. 比较仿射与单应性在独立数据上的误差,确定模型;
  6. 建立 S0 绝对锚点,或完成参考拍照与正确取料的反向示教;
  7. 用固定点多拍照位验证补偿,再做真实任务验收;
  8. 保存参数版本,建立相机、TCP、工作高度变化后的复验条件。

18.2 至少保存这些参数

类型 应保存的内容
映射定义 模型类型、矩阵、输入输出方向、单位、m/f/g 语义
参考观测 p0、q0、参考图像、参考检测质量与采集时间
工艺锚点 已知 S0,或正确取料 qpick,0;注明获取方式
几何约束 拍照 Z0、完整拍照方向、工作平面、有效图像和机器人范围
相机模型 内参、畸变、分辨率、ROI、缩放与像素转换约定
机器人定义 固定坐标系、活动工具、TCP、位姿单位与反馈来源
数据与验收 原始采样、留出数据、残差统计、任务验收结果
版本维护 相机镜头标识、机械安装版本、产品配方、求解程序版本

参数文件应让维护人员能直接回答:这个矩阵输出的是机器人拍照位置,还是目标相对位置?当前像素是否已经去畸变?当前机器人位置对应哪个曝光事件?参考取料点使用哪个 TCP?

19. 把整套方法连起来

二维非旋转眼在手上标定的核心关系是:

S=qcapture+g(p).S=q_{\mathrm{capture}}+g(p).

固定标记、移动相机的多点采样给出:

m(pi)=g(pi)−g(p0)=q0−qi.m(p_i)=g(p_i)-g(p_0)=q_0-q_i.

于是产品相对参考的真实平移为:

ΔS=(qcapture−q0)+m(p).\boxed{\Delta S=(q_{\mathrm{capture}}-q_0)+m(p)}.

有绝对锚点时,使用 S=S0+ΔS;采用固定方向的反向示教时,使用 qpick=qpick,0+ΔS。

这套方法能够把相机与工具之间的固定偏移包含进参考关系,同时明确保留拍照位置变化。它的可靠性来自固定姿态与工作平面假设、明确的矩阵输出语义、曝光对应的机器人位置,以及独立的全流程验收。

参考与延伸阅读

  1. 本站:《什么是手眼标定》,坐标变换、完整手眼链与可观测性背景。
  2. 本站:《二维平面的非旋转标定:眼在手外》,固定相机平面模型、畸变与采样基础。
  3. OpenCV:Camera Calibration and 3D Reconstruction,相机标定、undistortPoints、findHomography 与 estimateAffine2D 的坐标约定。
  4. Z. Zhang, “A Flexible New Technique for Camera Calibration”, IEEE TPAMI, 2000:DOI: 10.1109/34.888718。该文讨论相机内参标定,与本文的二维移动相机位移补偿属于不同环节。
  5. 工程接入时,以实际机器人控制器、相机 SDK 和视觉软件版本的官方手册确认:反馈坐标、工具原点、触发时序、ROI 坐标和矩阵输出定义。

[手眼标定]二维平面的非旋转标定 - 2.眼在手上
https://ka5fxt.cn/2026/04/13/手眼标定-二维平面的非旋转标定_2-眼在手上/
发布于
2026年4月13日
许可协议