识别框不是抓取坐标
YOLO 能够在彩色图里框出一个 bottle,并不代表机械臂已经知道这个 bottle 在哪里。检测框给出的是图像上的像素范围,D1 需要的是机械臂基座坐标系下的三维位置。
中间还隔着深度图、相机内参和坐标变换。
彩色图像
↓
YOLO 检测框
↓
对齐深度图读取距离
↓
相机内参反投影
↓
相机坐标系下的三维点
先让 D435i 正常输出数据
D435i 安装在机器狗前方,彩色图像和对齐后的深度图通过 ROS 话题提供。我们使用彩色图中的检测框,在中心区域取深度值,再根据相机内参计算三维坐标。
真机相机内参为 fx=606.4、fy=606.0、cx=316.2、cy=242.3。对于像素位置 (u, v) 和深度 Z,反投影的基本关系可以写成下面这样。
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
Z = depth(u, v)
公式并不复杂,麻烦在于深度值是否真的对应目标。深度图和彩色图没有对齐时,检测框中心可能读到背景。目标表面存在反光、空洞或遮挡时,单个像素也不值得完全相信。
0.3 m 处的测试结果不错
我们把物体放在约 0.3 m 处,用卷尺测量实际距离,再和深度图输出比较。中心区域的深度均值约为 308 mm,误差约 8 mm。YOLO 检测和深度联动以后,bottle 的输出约为 295 mm,误差约 5 mm。
在这个测试条件下,D435i 的结果满足了抓取实验对距离误差的预期。YOLO、深度读取和三维坐标计算也完成了联动。

换一个角度,误差会突然变大
后续用 ArUco 标签做真机验证时,我们发现斜视地面会带来明显误差。同一个标签,solvePnP 计算出的深度约为 0.34 m,深度反投影得到的结果约为 0.26 m,两者相差约 82 mm。
这说明测试距离准确,不代表所有姿态下都准确。相机面对平面目标时,深度值还会受到视角、表面纹理和对齐方式影响。抓取场景里如果目标放在地面上,不能只看一个近距离正对测试的结果。
坐标转换才是下一道门
视觉模块输出的是相机坐标。机械臂规划使用的是 D1 基座坐标。相机固定在机器狗上,理论上只需要标定一次相机到机械臂基座的固定变换,就可以把目标点转换过去。
但这要求机器狗停靠位置、机械臂零位和相机安装关系保持稳定。任何一个环节发生变化,转换结果就会偏移。
因此我们把视觉定位拆成两个结论。第一,YOLO 和 D435i 能够输出目标的三维位置。第二,这个位置能不能让机械臂抓到,还要经过手眼标定和真机末端验证。
当前结论
YOLOv8n、D435i 深度图、深度反投影和 Dashboard 展示已经跑通。0.3 m 距离下的测试误差也比较稳定。
视觉模块目前最大的限制,是斜视地面等真实抓取姿态下的深度误差。后续需要结合多帧滤波、目标区域深度统计和更合适的相机安装位置继续验证。