求助一下RDK S600使用D435i深度摄像头识别物品的近距离测量边界问题

问题分析与结论

结论先行:这是 D435i 的固有物理限制,不是 S600 驱动或 USB 问题。你判断的"Min-Z 范围后视差失效+对齐穿透"是正确的。


原因解析

1. Min-Z 物理限制

D435i 基线约 70mm,根据立体视觉原理:

最小有效距离 ≈ (基线 × 焦距) / 最大视差
  • 848×480@30fps:Min-Z 约 170mm(与你观测一致)
  • 424×240@30fps:像素合并后有效基线降低,Min-Z 降至约 130mm

2. 深度突变机制

近距离 → 视差超出匹配范围 → 深度计算失效 → 深度空洞
       → 对齐彩色图时 → 空洞被背景深度填充 → 深度值跳变到 250-520mm

解决建议

方案 1:调整 RealSense 配置(推荐优先尝试)

# 通过 rs-ros2 启动参数配置
ros2 launch realsense2_camera rs_launch.py \
    depth_module.profile:=848x480@30 \
    depth_module.exposure:=1000 \
    depth_module.gain:=16 \
    align_depth.enable:=false \          # 关键:关闭对齐避免穿透
    filters:=hole_filling,temporal \     # 启用滤波
    hole_filling.filter_mode:=2 \        # 2=填充空洞
    temporal_filter.smooth_alpha:=0.5 \
    temporal_filter.smooth_delta:=20

方案 2:使用原始深度 + 后处理

# 订阅 /camera/depth/image_rect_raw 而非 aligned_depth
# 自行判断有效深度
import numpy as np

def filter_depth(depth_img, min_valid=100, max_valid=2000):
    # 1. 阈值过滤
    mask = (depth_img > min_valid) & (depth_img < max_valid)
    
    # 2. 空洞检测(深度值突变)
    gradient = np.abs(np.gradient(depth_img.astype(float)))
    edge_mask = gradient < 50  # 梯度阈值
    
    # 3. 组合掩码
    valid_mask = mask & edge_mask
    return depth_img * valid_mask

方案 3:切换视觉预设

# D435i 支持预设配置
rs-configure -p "Short Range"    # 短距离模式(牺牲远距离)
rs-configure -p "High Accuracy"  # 高精度模式

S600 参考资源

目前社区暂无 S600+D435i 的专用参考程序,建议:

  1. 参考 X3/X5 的 RealSense 配置

  2. 官方文档

  3. 调试工具

    # 查看当前深度配置
    rs-enumerate-devices -c
    
    # 实时深度可视化
    rs-depth-viewer
    

关键参数建议

分辨率 帧率 Min-Z 建议用途
848×480 30 ~170mm 中距离通用
640×480 60 ~200mm 动态场景
424×240 90 ~130mm 近距离高速
320×240 90 ~100mm 极近距离(精度低)

近距离场景建议

  • 分辨率:424×240 或 320×240
  • 关闭 align_depth
  • 启用 hole_filling + temporal 滤波
  • 设置 depth_units=0.001 确保单位正确

下一步行动

  1. 先关闭对齐深度,测试原始深度图在 170mm 内是否仍有突变
  2. 如果原始深度正常 → 确认是对齐穿透问题
  3. 如果原始深度也突变 → D435i 硬件限制,需换更短基线相机(如 D430/D415)

建议将测试结果反馈到本帖,方便后续开发者参考。