4. 图像采集与标定
在视觉引导机器人定位项目中,图像采集与标定是决定系统绝对精度的两大基石。采集环节解决“如何稳定获取高质量图像”的问题,标定环节则解决“图像像素坐标如何映射到机器人世界坐标”的问题。本章将围绕相机接口配置、采集流程、畸变模型、标定板设计与标定流程展开,帮助读者建立从硬件触发到坐标输出的完整链路认知。
4.1 相机接口配置:从物理链路到数据流
Halcon 通过 HALCON 接口(如 hAcqGigE、hAcqUSB3、hAcqGenICam)与相机通信。接口配置的核心是确保数据包不丢失、帧率稳定、触发时序精确。以工业中最常见的 GigE Vision 接口为例,配置要点如下:
- 网卡巨型帧(Jumbo Frame):必须设置为 9000 字节,否则大分辨率图像会被拆分为多个 IP 包,增加丢包概率。
- 接收缓冲区(Socket Buffer):建议设置为 4~8 MB,避免瞬时数据洪峰导致丢帧。
- 流通道数(Stream Channel):多网卡或多相机时,需为每个相机分配独立的流通道。
- 触发源(Trigger Source):通常选择硬件触发(Line0/Line1)或软件触发,机器人项目中优先硬件触发以保证时序确定性。
在 Halcon 中,典型的 GigE 相机连接与配置代码如下:
// 打开相机
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1,
'default', -1, 'false', 'Camera1', 'Camera1', 0, AcqHandle)
// 设置触发模式为硬件触发
set_framegrabber_param (AcqHandle, 'trigger_mode', 'on')
set_framegrabber_param (AcqHandle, 'trigger_source', 'line0')
// 设置曝光时间(微秒)
set_framegrabber_param (AcqHandle, 'exposure_time_us', 3000)
// 设置增益
set_framegrabber_param (AcqHandle, 'gain', 1.5)
grab_image_start 启动异步采集,再通过 grab_image_async 获取图像。这能显著降低 I/O 等待时间,尤其在连续运动抓拍场景中,可减少 30% 以上的帧间隔抖动。
4.2 图像采集流程:从触发到内存
一个完整的图像采集流程可拆解为五个阶段:触发信号 → 相机曝光 → 数据传输 → 图像重建 → 内存管理。下图展示了该流程中关键环节的时序关系:
在 Halcon 中,采集循环的标准写法如下:
// 异步开始抓取
grab_image_start (AcqHandle, -1)
// 循环获取图像
for i := 1 to 100 by 1
grab_image_async (Image, AcqHandle, -1)
* 此处进行图像处理或保存
* 处理完成后立即开始下一帧抓取
grab_image_start (AcqHandle, -1)
endfor
grab_image_async 之后未及时调用 grab_image_start,相机内部缓冲区会因未及时重新武装而丢失后续触发信号。在高速运动场景(如传送带跟踪)中,这会导致周期性丢帧,且难以通过软件排查。
4.3 畸变模型:从针孔到真实镜头
理想相机遵循针孔模型,但真实镜头存在径向畸变和切向畸变。径向畸变使直线成像为曲线,切向畸变源于镜头与成像面不平行。Halcon 使用 Brown-Conrady 模型描述畸变:
x_distorted = x * (1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p1*x*y + p2*(r^2 + 2*x^2)
y_distorted = y * (1 + k1*r^2 + k2*r^4 + k3*r^6) + p1*(r^2 + 2*y^2) + 2*p2*x*y
其中 r^2 = x^2 + y^2,k1/k2/k3 为径向畸变系数,p1/p2 为切向畸变系数。对于机器人定位项目,畸变校正的精度直接影响手眼标定结果。下表列出了不同镜头类型的畸变典型值:
| 镜头类型 | 焦距范围 | k1 典型值 | 畸变影响(边缘) | 适用场景 |
|---|---|---|---|---|
| 标准工业镜头 | 8~50mm | -0.1 ~ -0.3 | 1~3 像素 | 一般定位 |
| 广角镜头 | < 6mm | -0.3 ~ -0.6 | 5~15 像素 | 大视野粗定位 |
| 远心镜头 | 物方远心 | ≈ 0 | < 0.5 像素 | 高精度测量 |
| 鱼眼镜头 | < 2mm | < -0.8 | > 30 像素 | 全景监控 |
在 Halcon 中,畸变校正通常通过 calibrate_cameras 算子获得相机内参和畸变系数,然后使用 change_radial_distortion_image 生成校正图像。对于机器人定位,更推荐使用 map_image 结合 gen_radial_distortion_map 进行实时校正,避免每次处理都重复计算。
4.4 标定板设计与标定流程
标定板是标定的基准物,其精度直接决定标定结果的上限。Halcon 支持多种标定板,最常用的是圆形标记点标定板(Caltab)。设计标定板时需遵循以下原则:
- 标记点数量:建议 7×7 或 9×9 阵列,过少会导致拟合不稳定,过多会超出视野。
- 标记点直径:在图像中应占据 8~15 像素,过小受噪声影响大,过大则中心提取精度下降。
- 背景对比度:标记点与背景灰度差应大于 100(8bit 图像),推荐黑色标记点配白色陶瓷基板。
- 平面度:标定板平面度误差应小于 0.01mm,否则会引入系统性标定误差。
Halcon 提供标定板描述文件生成工具,可通过 create_caltab 算子生成:
// 生成 7x7 标定板描述文件
create_caltab (7, 7, 0.0125, 0.005,
'caltab_7x7.descr', 'caltab_7x7.ps')
完整的标定流程分为四个阶段:
- 图像采集:在不同位姿(平移、旋转、倾斜)下采集 15~20 张标定板图像,确保标定板覆盖视野的各个区域。
- 标记点提取:使用
find_caltab定位标定板区域,再用find_marks_and_pose提取标记点中心及初始位姿。 - 相机标定:调用
calibrate_cameras计算内参(焦距、主点、畸变系数)和外参(每张图像的位姿)。 - 手眼标定:结合机器人末端位姿,使用
calibrate_hand_eye计算相机与机器人之间的变换矩阵。
以下是一个典型的相机标定代码片段:
// 创建标定数据模型
create_calib_data ('calibration_object', 'camera', 1, 1, CalibHandle)
set_calib_data_cam_param (CalibHandle, 0, 'area_scan_division',
[0, 0, 0.008, 0.008, 640, 480, 640, 480])
set_calib_data_calib_object (CalibHandle, 0, 'caltab_7x7.descr')
// 逐张图像提取标记点
for i := 1 to NumImages by 1
read_image (Image, 'caltab_' + i$'02d')
find_caltab (Image, CalibHandle, 0, 0, 0, CaltabRegion)
find_marks_and_pose (Image, CaltabRegion, CalibHandle, 0, 0, 0,
RCoord, CCoord, StartPose)
set_calib_data (CalibHandle, 'image', i-1, 'pose', StartPose)
endfor
// 执行标定
calibrate_cameras (CalibHandle, Errors)
// 获取标定结果
get_calib_data (CalibHandle, 'camera', 0, 'params', CameraParam)
4.5 案例:传送带抓取系统的标定实战
以某汽车零部件装配线的传送带抓取项目为例,系统要求定位精度 ±0.5mm,节拍 2 秒/件。项目采用 500 万像素 GigE 相机,配 16mm 镜头,工作距离 800mm。
实施步骤:
- 将标定板固定于传送带平面,采集 20 张不同位姿图像,覆盖视野中心及四角。
- 执行相机标定,得到内参:焦距
f = 16.2mm,主点(cx, cy) = (1234.5, 1023.8),径向畸变k1 = -0.152,k2 = 0.031。 - 进行手眼标定(Eye-to-Hand 模式),得到相机到机器人基座的变换矩阵
H_cam_to_base。 - 在传送带静止状态下,抓取 10 个已知位置的标准件,验证定位误差。
验证结果如下表:
| 验证点 | X 误差 (mm) | Y 误差 (mm) | 旋转误差 (°) |
|---|---|---|---|
| 1 | 0.12 | -0.08 | 0.02 |
| 2 | -0.15 | 0.10 | -0.03 |
| 3 | 0.08 | 0.12 | 0.01 |
| 4 | -0.10 | -0.05 | 0.02 |
| 5 | 0.05 | 0.09 | -0.02 |
所有验证点误差均小于 ±0.15mm,满足 ±0.5mm 的精度要求。项目上线后,抓取成功率从初期的 92% 提升至 99.5%,主要改进点在于将标定板图像采集数量从 10 张增加到 20 张,并增加了倾斜位姿,显著降低了标定结果对初始值的敏感性。
4.6 常见误区与复盘
图像采集与标定是视觉引导机器人项目中最基础也最关键的环节。采集环节的稳定性决定了数据的可靠性,标定环节的精度决定了系统的最终性能。通过本章的学习,读者应能够独立完成相机接口配置、图像采集流程设计、畸变模型理解、标定板选型与标定流程实施,并具备排查常见标定问题的能力。在实际项目中,建议将标定流程标准化、文档化,并建立定期复标机制,以保障系统长期稳定运行。