1. 3D视觉无序抓取概述
1.1 行业痛点:为什么无序抓取这么难?
先说说我这些年看到的真实场景。你去汽车零部件厂、家电装配线、或者物流分拣中心看看,料框里堆着的工件——螺丝、轴承、刹车盘、手机中框——没有一个是整整齐齐摆好的。它们互相叠压、倾斜、甚至卡在一起。这就是典型的「无序抓取」场景。
我2018年去过一个轮毂铸造厂。工人要从高温料框里把刚浇铸完的轮毂一个个捡出来,放到传送带上。环境温度40多度,粉尘大,工人干半小时就得换班。老板想上机器人,结果试了三家方案都失败了。为什么?
- 工件姿态随机——轮毂在框里可能是正面朝上、侧面躺着、甚至倒扣。2D相机根本分不清。
- 互相遮挡严重——一个轮毂压住另一个,边缘特征被挡住,传统视觉算法直接懵掉。
- 反光、油污、粉尘——金属表面反光,2D图像里一片白;油污让边缘模糊;粉尘让对比度下降。
- 料框本身干扰——框壁、隔板、甚至料框底部的纹理,都会被误识别为工件。
核心矛盾:机器人要抓取,就必须知道工件在三维空间中的精确位置和姿态(X, Y, Z, Rx, Ry, Rz)。而2D视觉只能提供X, Y和旋转角,缺少深度信息。说白了,2D视觉在无序抓取面前,就像「盲人摸象」。
1.2 技术路线对比:2D vs 3D,差距在哪?
我经常被客户问:「2D视觉便宜,能不能凑合用?」我的回答是:看工况。如果工件是平铺在传送带上、背景单一、光照稳定,2D完全够用。但一旦进入料框、堆叠、反光场景,2D的短板就暴露无遗。
| 对比维度 | 2D视觉 | 3D视觉 |
|---|---|---|
| 信息维度 | X, Y, 旋转角 (2.5D) | X, Y, Z, Rx, Ry, Rz (6D) |
| 堆叠处理 | 基本无效,遮挡即丢失 | 可分离前后层,点云分割 |
| 反光/暗光 | 极易饱和或欠曝 | 结构光/激光抗反光较好 |
| 精度 | 亚像素级 (0.01mm) | 点云级 (0.05-0.5mm) |
| 速度 | 毫秒级 | 百毫秒到秒级 |
| 硬件成本 | 低 (千元级) | 中高 (万元级) |
| 典型场景 | 平面定位、二维码读取 | 料框抓取、装配引导 |
我的经验:别被2D的「亚像素精度」忽悠了。精度再高,没有Z轴信息,机器人照样撞工件。我曾经见过一个项目,2D定位精度0.02mm,结果机器人下去抓,直接把工件推倒了——因为Z方向差了5mm。
1.3 Halcon在无序抓取中的优势
市面上能做3D视觉的软件不少——OpenCV、PCL、VisionPro、以及各家相机厂商自带的SDK。但为什么我这些年一直用Halcon做无序抓取?说几个真实感受。
1.3.1 点云处理管线完整
Halcon从3D相机采集、点云预处理、分割、匹配到抓取位姿输出,一条龙全包了。你不需要在OpenCV里调PCL、再转Eigen、再写ROS节点。Halcon里几个算子就搞定:
* 读取点云
read_object_model_3d (PointCloud, 'ply', [], [], ObjectModel3D)
* 下采样减少点数
sample_object_model_3d (ObjectModel3D, 'fast', 0.5, SampledModel)
* 移除离群点
connection_object_model_3d (SampledModel, 'distance', 3.0, ConnectedModels)
* 平面分割
segment_object_model_3d (ConnectedModels, 'ground', 'max_distance', 10.0, Segments)
* 表面匹配(核心)
find_surface_model (SurfaceModel, Segments, 0.0, 0.0, 0.0, 0.0, Pose, Score)
嗯,这里要注意——算子顺序和参数调优直接影响抓取成功率。我后面会专门用一章讲参数怎么调。
1.3.2 3D匹配算法成熟
Halcon提供了三种主流3D匹配方式:
- 基于表面 (Surface-Based):用工件的CAD模型生成表面特征,在点云中搜索匹配。适合形状复杂的工件。
- 基于形状 (Shape-Based):提取边缘轮廓的3D描述子。适合薄片类、轮廓特征明显的工件。
- 基于点对特征 (PPF):用点云局部特征做全局匹配。适合无纹理、对称性高的工件。
我记得2021年做一个刹车盘项目,工件表面全是加工纹路,反光严重。Surface-Based匹配死活不稳定。后来换成PPF,配合适当的采样率,一次通过。
1.3.3 标定工具链完整
无序抓取最头疼的一步是什么?手眼标定。相机装在机器人手上(眼在手上)还是固定安装(眼在手外),标定流程完全不同。Halcon提供了:
calibrate_hand_eye系列算子- 支持棋盘格、圆点阵、甚至自定义标定板
- 自动优化标定结果,输出重投影误差
避坑指南:我曾经在一个项目里用了非标定板——就是随便打印了一张棋盘格贴在纸板上。结果标定误差0.8mm,抓取时机器人直接撞坏了一个工件。后来换了陶瓷标定板,误差降到0.15mm。标定板别省钱,真的。
1.3.4 与机器人通信无缝
Halcon通过Socket、TCP/IP、或者直接调用机器人SDK,把抓取位姿发给机器人。我常用的方式是:
* 将位姿转换为机器人可识别的格式
pose_to_hom_mat3d (Pose, HomMat3D)
* 通过TCP发送
open_socket_accept (Socket, Port, 'tcp', AcceptSocket)
send_data (AcceptSocket, HomMat3D)
你想想看,如果换成OpenCV+PCL+ROS,你得写多少中间转换代码?Halcon一个算子搞定。
1.4 本章知识体系总览
下面这张图是我自己整理的3D无序抓取标定知识体系。你可以把它当作整个课程的导航图。后面每一章都会对应图中的某个模块。
1.5 我的一些心里话
做3D无序抓取,说实话,没有银弹。每个项目都有它的坑。有的坑在相机选型,有的坑在标定精度,有的坑在工件反光,还有的坑在机器人运动学参数。
但Halcon给了我们一套相对完整的工具链,让我们能把精力集中在「怎么调参数」而不是「怎么搭系统」上。这也是我做这个课程的初衷——把我这些年踩过的坑、调过的参数、优化过的流程,系统地整理出来。