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无序抓取标定知识体系。你可以把它当作整个课程的导航图。后面每一章都会对应图中的某个模块。

3D无序抓取标定知识体系 3D无序抓取标定知识体系 3D无序抓取系统 ① 3D视觉感知 ② 标定与校准 ③ 抓取规划 相机选型 点云采集 预处理 分割/匹配 相机内参 手眼标定 工具标定 误差补偿 位姿计算 碰撞检测 抓取策略 通信输出 稳定抓取位姿 → 机器人执行 说明: 本课程共30章,覆盖上述所有模块。每章包含原理讲解、Halcon算子详解、参数调优技巧和实际项目案例。 建议按顺序学习,但如果你只关心标定,可以直接跳到第8-12章。

1.5 我的一些心里话

做3D无序抓取,说实话,没有银弹。每个项目都有它的坑。有的坑在相机选型,有的坑在标定精度,有的坑在工件反光,还有的坑在机器人运动学参数。

但Halcon给了我们一套相对完整的工具链,让我们能把精力集中在「怎么调参数」而不是「怎么搭系统」上。这也是我做这个课程的初衷——把我这些年踩过的坑、调过的参数、优化过的流程,系统地整理出来。