RDK-X5 双目深度算法hobot_stereonet精度差

关键问题定位:GDC 缩放后参数传递异常

既然你确认 baseline 物理测量正确,且分辨率设置为 640×352,那么问题出在:

GDC 模块在图像缩放时,标定参数没有正确按比例传递给 StereoNet


问题分析

参数缩放逻辑

SC132GS 原始标定(1280×1088 分辨率):

fx_original ≈ 688
baseline ≈ 0.079m (7.9cm)

缩放到 640×352 后,理论上:

fx_scaled = 688 × (640/1280) = 344
baseline 保持不变 = 0.079m (基线是物理距离,不随分辨率缩放)

但你实际收到的是:

fx = 304.31  (比理论值 344 小 12%)
baseline = 0.069816 (比测量值小)

这说明 GDC 的参数缩放逻辑有问题。


解决方案

方案 1:手动校正 stereo.yaml 参数(推荐)

# 1. 备份原文件
sudo cp /opt/tros/humble/share/hobot_stereonet/config/stereo.yaml \
        /opt/tros/humble/share/hobot_stereonet/config/stereo.yaml.bak

# 2. 编辑文件
sudo vim /opt/tros/humble/share/hobot_stereonet/config/stereo.yaml

根据你的误差比例 1.24 和分辨率缩放,修改为:

# 校正后的参数(基于 640x352 分辨率)
baseline: 0.079      # 使用你测量的实际基线值
fx: 344.0            # 688 * (640/1280)
fy: 344.0
cx: 320.0            # 640 / 2
cy: 176.0            # 352 / 2

或者,如果你的相机 baseline 实测确实是 6.98cm:

baseline: 0.0698     # 保持实测值
fx: 344.0            # 修正焦距
cx: 320.0
cy: 176.0

方案 2:检查 GDC 参数传递

查看 mipi_cam 的配置文件,确认 GDC 是否正确输出标定参数:

# 查看 mipi_cam 配置目录
ls /opt/tros/humble/lib/mipi_cam/config/

# 查看标定文件内容
cat /opt/tros/humble/lib/mipi_cam/config/calib_params.yaml

# 重点检查是否有针对 640x352 的缩放参数

方案 3:绕过 GDC 直接使用原始分辨率测试

临时关闭 GDC,用原始分辨率测试深度精度:

# 修改 launch 文件,设置 mipi_gdc_enable=false
# 然后使用 1280x1088 分辨率运行 StereoNet
# 注意:StereoNet 默认输入是 640x352,可能需要调整模型输入

快速验证步骤

# 1. 修改 stereo.yaml 后重启节点
ros2 node kill /stereonet_model_node
ros2 launch hobot_stereonet hobot_stereonet.launch.py

# 2. 观察日志中的参数
# 应该看到:
# [fx, fy, cx, cy, baseline(m), doffs] : [344.0, 344.0, 320.0, 176.0, 0.079, 0.000000]

# 3. 测试 62cm 处的深度值
# 使用 rqt_image_view 查看深度图中心点数值
rqt_image_view /depth/image_raw

为什么 fx 偏差会导致深度误差?

深度计算公式:

depth = (baseline × fx) / disparity

如果你的 fx=304 但实际应该是 fx=344:

深度误差比例 = 344 / 304 = 1.13

这会导致深度值偏大 13%,加上 baseline 的偏差,综合误差接近你测量的 24%。


预期结果

校正后,在 0.5m~2m 范围内:

  • 误差应控制在 ±5cm 以内
  • 深度图应该更稳定,跳变减少

如果问题仍然存在

请补充以下信息到原帖:

  1. 修改后的 stereo.yaml 完整内容
  2. mipi_cam 的 calib_params.yaml 内容
  3. 0.6m, 1.0m, 2.0m 三点的实测对比数据

这样可以让官方技术支持确认是否是 GDC 模块的 bug。

相关参考: