关键问题定位: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 以内
- 深度图应该更稳定,跳变减少
如果问题仍然存在
请补充以下信息到原帖:
- 修改后的 stereo.yaml 完整内容
- mipi_cam 的 calib_params.yaml 内容
- 0.6m, 1.0m, 2.0m 三点的实测对比数据
这样可以让官方技术支持确认是否是 GDC 模块的 bug。
相关参考: