《3D视觉引导定位与抓取项目实战》

2、3D视觉基础:深度相机原理(结构光、ToF、双目)、点云数据表示与坐标系

在3D视觉引导定位与抓取项目中,深度相机是获取物体三维空间信息的核心传感器。与2D相机只能记录RGB颜色信息不同,深度相机能够直接输出场景中每个像素对应的距离(深度)值,从而生成包含三维坐标的点云数据。理解不同深度相机的工作原理、点云的数据组织方式以及坐标系之间的变换关系,是后续进行手眼标定、点云配准、目标识别与抓取规划的基础。本章将系统讲解结构光、ToF(飞行时间)和双目视觉三种主流深度相机方案的技术原理、优缺点及适用场景,并深入解析点云数据的表示方法与多坐标系转换逻辑。

深度相机原理与点云坐标系总览 结构光 • 投影红外散斑/条纹 • 三角测量原理 • 代表:Kinect v1、RealSense • 优势:近距离精度高 • 劣势:易受环境光干扰 ToF(飞行时间) • 发射调制光脉冲 • 测量相位差/飞行时间 • 代表:Kinect v2、L515 • 优势:帧率高、远距离 • 劣势:分辨率低、多机干扰 双目视觉 • 双相机同步采集 • 立体匹配计算视差 • 代表:ZED、D435i • 优势:无主动光源 • 劣势:弱纹理失效 点云数据表示 • 无序点集:{x, y, z, r, g, b} • 有序点云:按行列排列的深度图 • 体素栅格:降采样与结构化 • 常用格式:PCD / PLY / BIN 坐标系体系 • 相机坐标系(光心原点) • 图像坐标系(像素) • 世界坐标系(机器人基座) • 手眼标定:Eye-in-Hand/To-Hand 深度图 → 点云 → 坐标变换 → 抓取位姿

2.1 三种主流深度相机技术原理

2.1.1 结构光:主动投影与三角测量

结构光深度相机的核心思想是主动投射已知编码图案(如红外散斑、条纹或网格),然后通过相机观察图案在物体表面发生的形变,利用三角测量原理计算深度。其典型硬件包括红外投影仪、红外相机和RGB相机。当投影仪将特定光斑图案投射到物体表面时,由于物体表面凹凸不平,图案会产生位移和畸变。红外相机捕捉到变形后的图案,与存储在内存中的参考图案进行相关性匹配,计算出每个像素的视差,进而通过标定参数转换为深度值。

工程要点:结构光方案在近距离(0.2m-1.5m)具有较高的精度(可达毫米级),且不受物体纹理影响。但强环境光(尤其是太阳光中的红外成分)会严重干扰投影图案的识别,因此更适合室内受控光照环境。在抓取场景中,若工件表面反光强烈(如金属镜面),会导致光斑反射丢失,产生深度空洞。

2.1.2 ToF(飞行时间):直接测量光速往返

ToF相机通过向场景发射连续调制光(通常是红外光),并测量光线从发射到返回的相位差或时间差来计算距离。根据调制方式不同,分为连续波调制(CW-ToF)和脉冲调制(Pulsed-ToF)。CW-ToF通过检测发射信号与接收信号之间的相位偏移,间接计算飞行时间;脉冲ToF则直接计时。ToF相机的核心优势在于其实时性——每个像素独立测量深度,无需复杂的匹配算法,因此帧率较高(30-60fps),且测量距离较远(可达10m以上)。

然而,ToF相机存在多路径干扰问题:光线在物体边缘或凹面发生多次反射后,接收到的信号是多个路径的叠加,导致深度测量值偏大或产生“飞点”。此外,其分辨率通常较低(如QVGA或VGA),且多个ToF相机同时工作时会产生相互干扰。

2.1.3 双目视觉:被动立体匹配

双目视觉模拟人眼感知深度的方式,使用两个水平放置的相机同步拍摄同一场景,通过计算左右图像中对应像素点的视差(disparity),结合相机基线距离和焦距,利用相似三角形原理计算深度。其核心步骤包括:相机标定(获取内外参)、极线校正、立体匹配(SGM、BM等算法)、三角测量。双目方案最大的优势是无需主动光源,因此功耗低、不受环境光干扰,且成本相对较低。

但双目视觉的致命弱点是依赖纹理特征。对于白色墙面、光滑塑料件等缺乏纹理的区域,立体匹配算法无法找到可靠的对应点,导致深度数据大面积缺失。此外,其计算量较大,对硬件算力要求高,且精度受基线长度限制。

对比维度 结构光 ToF 双目视觉
测距原理 三角测量(光斑形变) 光速飞行时间/相位差 立体视差匹配
主动光源 是(红外散斑) 是(调制红外光) 否(被动)
典型精度 0.1-1mm(近距离) 1-3cm(远距离) 0.5-5mm(取决于基线)
帧率 10-30fps 30-60fps 10-30fps(受算力限制)
环境光敏感度 高(易受红外干扰) 中(可加滤光片) 低(依赖可见光纹理)
弱纹理物体 良好 良好 失效
典型应用场景 近距离精密测量、人脸识别 中远距离避障、SLAM 室外场景、低成本方案

2.2 点云数据表示与存储格式

2.2.1 点云的基本属性

点云是空间中一组离散点的集合,每个点至少包含三维坐标信息(X, Y, Z),通常还携带额外的属性。在3D视觉抓取中,最常见的点云属性包括:

  • XYZ坐标:点在相机坐标系下的三维位置,单位通常为米(m)或毫米(mm)。
  • RGB颜色:由RGB相机同步采集并映射到每个点,用于后续的语义分割或纹理识别。
  • 法向量(Normal):表示该点所在局部表面的朝向,对点云配准、分割和位姿估计至关重要。
  • 强度(Intensity):激光雷达或部分ToF相机返回的反射强度值,可用于区分不同材质。

2.2.2 点云的组织形式

根据数据存储结构,点云可分为有序点云和无序点云。有序点云通常来源于深度图,其行列索引与图像像素位置一一对应,因此可以直接通过像素坐标快速访问邻域点,极大加速了法向量估计和滤波算法的执行。无序点云则没有固定的行列关系,需要通过KD-Tree或Octree建立空间索引才能进行邻域查询。

// PCL中点云数据结构示例(C++)
pcl::PointCloud<pcl::PointXYZRGB> cloud;
cloud.width = 640;   // 有序点云:宽度=640
cloud.height = 480;  // 高度=480,若为1则表示无序点云
cloud.is_dense = false; // 是否包含无效点(NaN)
cloud.points.resize(cloud.width * cloud.height);
for (size_t i = 0; i < cloud.points.size(); ++i) {
    cloud.points[i].x = x_val;
    cloud.points[i].y = y_val;
    cloud.points[i].z = z_val;
    cloud.points[i].r = r_val;
    cloud.points[i].g = g_val;
    cloud.points[i].b = b_val;
}

2.2.3 常用文件格式与处理流程

在工程实践中,点云数据通常以PCD(Point Cloud Data)、PLY(Polygon File Format)或BIN(二进制)格式存储。PCD格式是PCL库的原生格式,支持ASCII和二进制两种编码,头部信息包含点云维度、点数、数据类型等元数据。PLY格式则更通用,支持网格和点云,且能存储法向量和颜色。在抓取项目中,建议使用二进制格式以减少磁盘占用和加载时间。

实战建议:当从深度相机获取原始深度图后,应先进行预处理(如使用双边滤波去除噪声、用统计滤波剔除离群点),再转换为点云。转换时需注意深度图与RGB图的对齐(通过内参和外参进行映射),否则会出现颜色与位置错位。

2.3 坐标系体系与变换关系

2.3.1 四大核心坐标系

在3D视觉引导抓取中,涉及多个坐标系,理解它们之间的变换关系是手眼标定的前提。主要包括:

  1. 世界坐标系(World):固定在机器人基座或工作空间中的绝对参考系,所有抓取目标最终都要转换到此坐标系下。
  2. 相机坐标系(Camera):以相机光心为原点,Z轴指向场景前方,X轴向右,Y轴向下(遵循右手定则)。深度相机输出的点云坐标即在此坐标系下。
  3. 图像坐标系(Image):以图像左上角为原点,单位为像素,描述点在2D图像中的位置。
  4. 机器人工具坐标系(Tool):固定在机器人末端法兰盘或吸盘上的坐标系,用于描述抓取姿态。

2.3.2 坐标变换的数学表达

从相机坐标系到世界坐标系的变换是一个刚体变换,包含旋转矩阵R(3x3)和平移向量t(3x1)。齐次变换矩阵T(4x4)将旋转和平移统一表示:

T = | R  t |
    | 0  1 |

假设点P在相机坐标系下的坐标为Pc,在世界坐标系下的坐标为Pw,则Pw = R * Pc + t。手眼标定的核心任务就是求解这个变换矩阵T(即相机到机器人基座的位姿关系)。根据相机安装方式不同,分为Eye-in-Hand(相机装在机器人末端)和Eye-to-Hand(相机固定在工作区上方)两种标定模式。

2.3.3 深度图到点云的转换公式

对于深度相机,每个像素(u, v)对应的深度值d,可以通过相机内参(fx, fy, cx, cy)转换为相机坐标系下的三维点:

Z = d / scale_factor  // 深度值单位转换(如1mm或0.001m)
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
常见误区:很多初学者直接使用深度图作为Z值,而忽略了深度图可能存储的是16位整数(单位mm)或归一化浮点数。必须确认深度数据的scale_factor(通常为1000或100),否则点云尺度会严重错误,导致抓取位置偏差数厘米。

2.4 实战场景:结构光相机在金属工件抓取中的深度空洞处理

在某汽车零部件装配线上,使用结构光深度相机(型号:RealSense D435)引导机器人抓取铝合金支架。初始调试时发现,当工件表面存在机加工刀纹且呈镜面反射时,深度图出现大量黑色空洞(深度值为0),导致点云不完整,无法准确计算抓取点。

问题分析:结构光依赖红外散斑的反射,金属表面镜面反射使大部分红外光被反射到其他方向,红外相机接收不到足够的散射光,导致匹配失败。通过观察不同角度下的深度图,发现当相机与工件表面夹角小于30度时,空洞尤为严重。

解决步骤:

  • 调整相机安装角度,使光轴与工件表面法线夹角控制在30-60度之间,减少镜面反射影响。
  • 在工件表面喷涂一层薄薄的显像剂(或防锈油),增加漫反射,但需注意后续清洁工艺。
  • 采用多帧融合策略:让机器人带动相机在多个微小角度下采集深度图,通过点云配准(ICP)融合成完整点云。
  • 对仍存在的空洞区域,使用周边有效点的插值算法(如最近邻或双线性插值)进行填充,但需设置置信度阈值,避免过度平滑。

结果对比:处理后点云完整度从72%提升至98%,抓取成功率从85%提升至99.5%。但代价是节拍时间增加了约0.8秒(多帧采集与配准耗时)。

复盘经验:在选型阶段,若工件表面反光严重,应优先考虑ToF相机(对镜面反射相对不敏感)或双目视觉(无主动光源)。若必须使用结构光,需在光源、角度和后期处理三个层面同时优化,而非单一依赖算法修复。

2.5 常见误区与总结

在深度相机选型与点云处理中,工程师常犯以下错误:

  • 误区一:认为深度相机输出的点云直接就是世界坐标。实际上,点云默认在相机坐标系下,必须经过手眼标定矩阵变换才能用于机器人引导。
  • 误区二:忽略深度图与RGB图的对齐。未对齐时,点云颜色信息错位,导致基于颜色的分割算法失效。
  • 误区三:对所有场景都使用同一种深度相机。应结合工作距离、精度要求、环境光照、物体材质等因素综合选型。
  • 误区四:点云滤波过度。例如使用体素栅格降采样时,若体素尺寸过大,会丢失细小特征(如销钉、凹槽),影响后续位姿估计精度。

总结而言,深度相机是3D视觉系统的“眼睛”,而点云与坐标系变换则是“神经”。只有深入理解三种主流方案的物理原理与工程边界,掌握点云的数据组织与坐标变换方法,才能在实际抓取项目中快速定位问题、优化系统性能。下一阶段,我们将基于这些基础,进一步探讨手眼标定的具体实施与点云预处理算法。