2. 3D视觉基础

3D视觉基础 学习卡片

在进入Halcon的3D抓取位姿计算之前,必须先建立对3D视觉数据表示与空间坐标体系的清晰认知。抓取位姿的本质,是在三维空间中描述物体相对于机器人基座的六自由度(6DOF)位置与姿态。而这一描述,必须建立在统一的坐标系与可靠的数据源之上。本章将围绕四种核心概念展开:点云、深度图、视差图,以及相机坐标系与世界坐标系的变换逻辑。

2.1 三种3D数据表示:点云、深度图、视差图

3D视觉系统输出的原始数据,通常以三种形式呈现。它们描述同一场景的不同维度,但数据结构、精度特性与适用算法截然不同。

2.1.1 深度图(Depth Map)

深度图是一张单通道灰度图像,每个像素的灰度值代表该像素对应空间点到相机光心(或参考平面)的距离。深度图与RGB图像天然对齐(若使用RGB-D相机),因此可以直接利用2D图像处理经验进行ROI提取。但深度图存在两个显著问题:

  • 缺失值(空洞):反光表面、黑色吸光物体或遮挡边缘会产生无效像素(通常为0或NaN)。
  • 精度随距离衰减:基于结构光或ToF的深度相机,在远距离(>3m)时深度误差呈二次方增长。

2.1.2 视差图(Disparity Map)

视差图是双目立体视觉的中间产物。它记录左右相机图像中对应匹配点的水平像素偏移量。视差值与深度成反比关系,由三角测量原理决定:

Z = (f * B) / d

其中,Z为深度,f为焦距(像素单位),B为基线距离(米),d为视差值(像素)。视差图本身不是最终产品,但它是计算深度图的前置步骤。Halcon中通过binocular_disparity算子生成视差图,再通过disparity_to_point_3d转换为3D点云。

2.1.3 点云(Point Cloud)

点云是三维空间点的集合,每个点包含(X, Y, Z)坐标,可选包含RGB颜色或法向量信息。点云是抓取位姿计算中最常用的数据形式,因为它直接提供了物体的几何形状。Halcon中,点云以Object3D模型存储,支持通过xyz_to_object_model_3d从三通道图像(X、Y、Z图)创建。

数据形式 维度 精度特点 Halcon典型算子 适用场景
深度图 2D(单通道) 像素级,有空洞 read_depth_image 快速ROI提取、遮挡判断
视差图 2D(单通道) 与基线/焦距相关 binocular_disparity 双目系统中间产物
点云 3D(N×3) 空间精度高,数据量大 xyz_to_object_model_3d 位姿估计、表面匹配
工程建议:在Halcon中,不要直接对深度图做3D匹配。深度图是2.5D数据,丢失了物体背面信息。抓取位姿计算应优先使用点云,并通过sample_object_model_3d降采样以提升处理速度。

2.2 相机坐标系与世界坐标系

位姿计算的本质是坐标变换。在3D视觉抓取中,至少涉及四个坐标系:图像坐标系、相机坐标系、世界坐标系(标定板坐标系)、机器人基坐标系。本章重点阐述前两者与后两者的关系。

2.2.1 相机坐标系(Camera Coordinate System)

相机坐标系以光心为原点,Z轴指向相机前方(主光轴方向),X轴向右,Y轴向下(遵循右手定则,但Y轴方向与图像坐标系一致)。点云数据默认就在相机坐标系下。Halcon中,通过标定得到的相机内参(焦距、主点、畸变系数)可以将2D像素坐标反投影到相机坐标系下的3D坐标:

// 像素坐标 (row, col) 转相机坐标 (X, Y, Z)
// 假设已读取相机内参 CameraParam
image_points_to_world_plane (CameraParam, PoseCamera, Row, Col, 1, X, Y)
// 其中 PoseCamera 为相机在世界坐标系中的位姿,此处若为单位变换则得到相机坐标

2.2.2 世界坐标系(World Coordinate System)

世界坐标系是人为定义的绝对参考系,通常设置在标定板平面或机器人基座上。在Halcon中,世界坐标系通过Pose(位姿)来描述。一个Pose包含三个平移量(X, Y, Z)和三个旋转量(RX, RY, RZ),表示从世界坐标系到相机坐标系的变换关系。

相机坐标系与世界坐标系的转换关系为:

P_cam = Pose_to_HomMat3d(Pose) * P_world

其中,Pose_to_HomMat3d将位姿转换为4×4齐次变换矩阵。Halcon中常用vector_to_rigid或hand_eye_calibration来求解该变换。

2.3 核心原理:从像素到空间点的完整链路

理解3D视觉抓取,必须掌握从2D像素到3D空间点的完整映射链路。该链路分为三步:

  1. 内参标定:确定焦距、主点、畸变系数,消除镜头畸变。
  2. 外参标定:确定相机在世界坐标系中的位姿(即Pose)。
  3. 反投影:利用内参和外参,将像素坐标映射为世界坐标。

在Halcon中,这一链路被封装为以下流程:

// 1. 读取标定好的内参
read_cam_par (CameraParam, 'camera_param.dat')

// 2. 读取外参(相机在世界坐标系中的位姿)
read_pose (PoseWorld, 'pose_world.dat')

// 3. 将深度图转换为3D点云(相机坐标系)
xyz_to_object_model_3d (X, Y, Z, ObjectModel3D)

// 4. 将点云变换到世界坐标系
rigid_trans_object_model_3d (ObjectModel3D, PoseWorld, ObjectModel3DWorld)
关键点:Halcon中的xyz_to_object_model_3d算子需要三张单通道图像(X图、Y图、Z图),而不是一张深度图。X图和Y图分别存储每个像素对应的X和Y坐标值。通常由depth_to_xyz或disparity_to_point_3d生成。

2.4 案例场景:双目视觉抓取中的坐标统一

假设一个典型的抓取场景:双目相机安装在机器人手臂上方,抓取传送带上的随机摆放的工件。系统流程如下:

1. 双目相机采集左右图像
   grab_image (LeftImage, LeftAcqHandle)
   grab_image (RightImage, RightAcqHandle)

2. 计算视差图
   binocular_disparity (LeftImage, RightImage, Disparity, Score)

3. 视差图转深度图(Z图),并生成X、Y图
   disparity_to_point_3d (Disparity, CameraParamLeft, CameraParamRight, PoseLeft, X, Y, Z)

4. 生成点云
   xyz_to_object_model_3d (X, Y, Z, ObjectModel3D)

5. 点云滤波(去除离群点)
   remove_outliers_object_model_3d (ObjectModel3D, ObjectModelFiltered, 'distance_3d', 2.0, 0.5)

6. 在点云中搜索工件模型(3D形状匹配)
   find_surface_model (SurfaceModel, ObjectModelFiltered, PoseHypotheses, Score)

7. 将匹配到的位姿从相机坐标系变换到机器人基坐标系
   pose_to_hom_mat3d (PoseHypotheses, HomMat3D)
   hom_mat3d_compose (HomMat3D, PoseRobot, PoseFinal)

其中,第7步的PoseRobot是机器人基坐标系相对于世界坐标系的变换,通常通过手眼标定获得。最终PoseFinal即为机器人抓取所需的六自由度位姿。

2.5 常见误区与复盘

误区一:混淆深度图与点云。深度图是2D矩阵,点云是3D点集。对深度图直接做surface_matching会失败,因为深度图丢失了物体背面和侧面的几何信息。正确做法是先将深度图转换为点云,再进行3D匹配。
误区二:忽略坐标系变换顺序。Halcon中pose_to_hom_mat3d得到的矩阵是P_cam = H * P_world。若需要将相机坐标下的点变换到世界坐标,必须使用hom_mat3d_invert求逆矩阵。初学者常犯的错误是直接使用标定得到的Pose,导致抓取位置偏移。
误区三:视差图直接当深度图用。视差值与深度成反比,且受基线长度影响。若直接对视差图做阈值分割,无法得到物理尺寸。必须通过disparity_to_point_3d转换为实际距离。
复盘建议:在项目调试中,建议先输出X、Y、Z三张图,用visualize_object_model_3d检查点云是否畸变。若点云出现扭曲,优先检查相机标定精度,而非算法参数。另外,务必在抓取前用标准块(如陶瓷方块)验证坐标变换的重复精度,确保Pose的旋转分量(RX, RY, RZ)符合右手定则,避免因旋转方向定义不一致导致抓取姿态翻转。

本章所建立的概念是后续所有3D抓取算法的基础。点云提供了几何数据,深度图与视差图是获取点云的手段,而坐标系变换则是将视觉结果转化为机器人动作的桥梁。在Halcon中,熟练掌握xyz_to_object_model_3d、pose_to_hom_mat3d与rigid_trans_object_model_3d这三个算子,即可打通从像素到机器人位姿的完整链路。