3. 3D视觉基础
在机器人抓取系统中,3D视觉的核心任务是回答“目标物体在哪里、姿态如何”。深度相机作为获取三维信息的传感器,其成像原理直接决定了点云质量、测量精度与适用场景。本章将系统讲解三类主流深度相机(结构光、ToF、双目)的工作原理与工程选型要点,深入解析点云数据格式(PCD、PLY、XYZ)的存储结构,并重点解决机器人抓取中最关键的坐标系转换问题——从相机坐标系到机器人基坐标系的刚体变换。理解这些基础,是后续标定、手眼协同与抓取规划的前提。
上图展示了三类深度相机的核心原理、点云格式与坐标系转换的整体链路。下面我们将逐一深入剖析。
3.1 结构光深度相机:编码光斑与三角测量
核心原理
结构光相机通过投影仪向场景投射已知编码的红外光斑或条纹图案,同时用红外相机拍摄被物体表面调制后的图案。由于投影图案的编码信息已知,通过比对原始图案与拍摄图案中每个像素的位移量(视差),结合投影仪与相机之间的基线距离,利用三角测量原理即可计算出每个像素的深度值。其核心公式为:
Z = (f × B) / d
其中,Z为深度,f为相机焦距,B为投影仪与相机光心之间的距离(基线),d为对应特征点的视差。结构光方案的测量精度通常在0.1mm至1mm之间,取决于基线与分辨率。
工程判断与选型
- 适用场景:室内、中近距离(0.2m~3m)、静态或慢速物体抓取,如零件分拣、货架取物。
- 优势:点云密度高、边缘清晰、对弱纹理物体(如纸箱、塑料件)有较好表现。
- 劣势:强环境光(阳光直射)会淹没红外编码,导致深度空洞;多台结构光相机互相干扰。
案例拆解:纸箱抓取中的结构光应用
某电商分拣中心使用RealSense D435抓取随机堆叠的纸箱。初始现象是:在靠近窗户的工位,点云出现大面积黑色空洞,导致抓取失败率高达30%。分析发现,阳光中的红外成分干扰了编码光斑识别。操作步骤:① 在相机镜头前加装850nm窄带滤光片;② 调整相机曝光时间从8ms降至2ms;③ 在窗户加装遮光帘。结果:空洞率从30%降至2%以下,抓取成功率提升至98%。代价是滤光片成本约200元,且需定期清洁。复盘经验:结构光相机对环境光极其敏感,部署前必须评估光照条件。
常见误区
3.2 ToF深度相机:飞行时间测量与多路径干扰
核心原理
ToF相机通过发射连续调制光(通常是正弦波或方波),测量发射光与反射光之间的相位差,从而计算光的飞行时间,进而得到距离。其核心公式为:
d = (c × Δφ) / (4π × f_mod)
其中,c为光速,Δφ为相位差,f_mod为调制频率。ToF相机不依赖纹理特征,因此对弱纹理物体、纯色表面有天然优势。但受限于传感器分辨率(通常为QVGA或VGA),点云密度较低。
工程判断与选型
| 对比维度 | 结构光 | ToF | 双目 |
|---|---|---|---|
| 测量原理 | 三角测量 | 飞行时间 | 视差匹配 |
| 精度 | 0.1-1mm | 1-3mm | 1-5mm(随距离下降) |
| 帧率 | 30fps | 30-60fps | 30-90fps |
| 环境光鲁棒性 | 差 | 中 | 好 |
| 弱纹理物体 | 好 | 好 | 差 |
| 典型距离 | 0.2-3m | 0.3-6m | 0.5-10m |
| 成本 | 中 | 高 | 低 |
案例拆解:AGV避障中的ToF选型
某AGV厂商需要检测前方1.5m处的托盘叉孔位置。初始方案使用双目相机,但在夜间仓库光照不足时匹配失败。改用ToF相机(如PMD pico flexx)后,由于不依赖环境光,夜间也能稳定输出深度。关键参数:调制频率20MHz,测量距离0.3-4m,帧率45fps。实际测试中,ToF在0.5-2m范围内精度为±3mm,满足叉孔定位需求。但发现当托盘边缘有金属反光时,出现“飞点”噪声。解决方案:对点云进行时域中值滤波,并设置深度阈值剔除异常值。复盘:ToF适合动态场景,但必须处理多路径干扰和飞点。
常见误区
3.3 双目立体视觉:视差匹配与极线约束
核心原理
双目相机模拟人眼,通过两个水平放置的相机同时拍摄同一场景。经过立体校正后,左右图像行对齐,则同一空间点在左右图像中的像素坐标差(视差)与深度成反比:
Z = (f × B) / d
其中,d = x_left - x_right。双目方案的核心挑战在于视差匹配——在右图中找到与左图每个像素对应的同名点。常用算法包括块匹配(BM)、半全局匹配(SGBM)和基于深度学习的方法。
工程判断与选型
- 适用场景:室外、远距离(0.5-10m)、光照变化大的环境,如户外机器人导航、大型工件定位。
- 优势:成本低(仅需两个普通相机)、功耗低、无主动光源。
- 劣势:对弱纹理表面(白墙、纯色纸箱)匹配效果差;计算量大,需要GPU加速。
案例拆解:汽车零部件抓取中的双目应用
某汽车工厂需要抓取堆放在料架中的刹车盘。刹车盘表面有加工纹理,但部分区域反光。使用ZED 2双目相机,在距离1.2m处拍摄。初始点云在反光区域出现孔洞。分析发现,反光导致左右图像灰度差异过大,匹配失败。操作步骤:① 开启相机内置的HDR模式;② 将SGBM算法的惩罚参数P1从8调至4,P2从32调至16;③ 对深度图进行空洞填充(基于邻域插值)。结果:点云完整度从70%提升至95%,抓取成功率从85%提升至97%。代价是处理时间从15ms增至25ms,但仍满足节拍要求。复盘:双目相机的算法参数调优空间大,需根据实际材质反复测试。
常见误区
3.4 点云数据格式:PCD、PLY与XYZ
核心原理与结构
点云是三维空间中离散点的集合,每个点通常包含三维坐标(x,y,z),并可附加颜色(RGB)、法向量(nx,ny,nz)、强度值等属性。不同格式的存储结构差异直接影响读写效率与兼容性。
| 格式 | 文件头 | 数据组织 | 适用场景 |
|---|---|---|---|
| PCD | VERSION/FIELDS/SIZE/TYPE/COUNT/WIDTH/HEIGHT | 二进制或ASCII,支持多字段 | PCL库标准格式,处理高效 |
| PLY | magic number + element列表 | 可含网格面片,支持顶点颜色 | 3D重建、网格处理 |
| XYZ | 无头,直接每行x y z | 纯文本,简单 | 快速预览、简单交换 |
# PCD文件示例
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 100
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 100
DATA ascii
0.1 0.2 0.3 4294967295
...
工程操作流程
- 格式选择:若使用PCL库处理,优先PCD;若需与MeshLab等工具交互,选PLY;若仅需坐标信息,选XYZ。
- 数据压缩:PCD支持LZF压缩,可减少70%存储空间,但读取时需解压。
- 字段扩展:在PCD的FIELDS中可添加normal_x等字段,但需保持SIZE和TYPE一致。
3.5 坐标系转换:从相机到机器人基座
核心原理
机器人抓取要求将相机坐标系下的点云变换到机器人基坐标系。这是一个刚体变换,包含旋转矩阵R(3×3)和平移向量t(3×1):
P_base = R × P_cam + t
其中,P_cam是相机坐标系下的点,P_base是机器人基坐标系下的点。求解R和t的过程称为手眼标定。根据相机安装位置,分为两种模式:
- 眼在手上(Eye-in-Hand):相机安装在机械臂末端,随臂运动。标定方程:AX = XB,其中A为机械臂末端位姿变化,B为相机观测到的标定板位姿变化。
- 眼在手外(Eye-to-Hand):相机固定安装在支架上。标定方程:AX = YB,需要同时求解相机到机器人基座的变换X和标定板到机械臂末端的变换Y。
操作流程与案例
以眼在手外为例,某焊接机器人工作站使用固定安装的深度相机定位工件。标定步骤:① 将棋盘格标定板固定在机械臂末端;② 控制机械臂运动到15个不同位姿,每个位姿记录机械臂末端位姿(从控制器读取)和相机拍摄的标定板位姿(通过OpenCV的solvePnP求解);③ 使用Tsai-Lenz算法求解AX=YB;④ 验证:将标定板放在工作台上,相机识别其位姿,变换到机器人基坐标系,与机器人示教位置对比,误差应小于2mm。
# 伪代码示例
for i in range(15):
A_i = get_robot_pose(i) # 4x4齐次矩阵
B_i = get_camera_pose(i) # 4x4齐次矩阵
X, Y = solve_hand_eye(A_list, B_list, method='tsai')
# 验证
P_cam = detect_target()
P_base = X @ P_cam
print(f"误差: {np.linalg.norm(P_base - P_teach)} mm")