Ubuntu 22.04 + ROS2 Humble 环境下对 RealSense D435 进行深度校准

一、前言

RealSense D435 深度相机在使用过程中发现深度图存在很多黑色区域或随机黑点,影响正常使用。此外,更换主板后,因为原有校准配置信息丢失也会导致以上情况。

黑色区域:

随机黑点:

因此,需要对深度相机进行校准,提升深度图像质量。

常用校准方法:

  • On-Chip Calibration (片上校准)

    • 适用场景 :深度图出现噪点、黑斑或边缘不规则,用于提升深度图像质量。

    • 选择依据 :此功能内置于固件,适合深度质量问题

    • 环境要求与操作重点 :分为快速改善 (Fast/Slow模式,环境不限但深度覆盖超50%)和优化精度 (White Wall模式,需对准纹理丰富的平整墙面)。

    • 结果判断与操作 :校准后会生成两个健康度指标:Health-Check (HC,应<0.25) 和 FL Health-Check (FL HC,应<0.15)。达标则保留,反之则点击 Apply New 应用新数据。

  • Tare Calibration (皮重校准)

    • 适用场景 :发现某个特定距离(如1米)的测量值与实际不符,用于修正深度测量精度偏差。

    • 选择依据 :专用于提升绝对深度精度,解决"测不准"问题。

    • 环境要求与操作重点 :将相机对准已知距离的平面,通过 More > Tare Calibration 界面操作,点击 Get 按钮即可调整。

  • Focal Length Calibration (焦距校准)

    • 适用场景 :深度图出现拉伸、扭曲或错位,用于校正因左右双目传感器不平衡导致的深度畸变。

    • 选择依据 :专用于校正立体匹配偏差,修复画面扭曲。

    • 环境要求与操作重点 :确保环境纹理丰富,通过 More > Focal Length Calibration 操作。

若上述方法效果不佳,或需同时校准深度和彩色传感器 ,可以考虑更专业的 Dynamic Calibration (动态校准) 。它能同时精确校正相机内参与外参。如果校准后依然不满意,可以随时通过 Viewer 工具将相机恢复至出厂设置,作为最后的保障手段。

二、环境准备与依赖安装

1. 确认已安装的组件

(1)确认是否安装librealsense

打开终端,运行以下命令验证是否安装 librealsense2 的 deb 包:

bash 复制代码
dpkg -l | grep librealsense2

预期看到类似 librealsense2-2.xx.x 的输出。

(2)安装librealsense

如果没有,请按官方指南安装:

bash 复制代码
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
bash 复制代码
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
bash 复制代码
sudo apt install librealsense2-utils librealsense2-dev

2. 安装 ROS2 的 realsense2_camera 包

(1)驱动安装

校准文件最终需要通过 ROS2 节点加载,因此必须安装该驱动:

bash 复制代码
sudo apt install ros-humble-realsense2-camera

(2)启动验证

安装后,确保相机在 ROS2 下可以正常启动:

bash 复制代码
ros2 launch realsense2_camera rs_launch.py

另开终端用:

bash 复制代码
 rviz2

bash 复制代码
ros2 topic echo /camera/depth/image_rect_raw

查看深度流。

3. 升级固件(可选)

新开封的 D435 固件可能较旧,需升级至 ≥5.12.8 以支持动态校准。运行:

bash 复制代码
realsense-viewer

在左侧设备面板查看固件版本。

若需升级:

bash 复制代码
sudo apt install librealsense2-firmware-updater
intel-realsense-firmware-updater -f /lib/firmware/intel/realSense/ Signed_Image_UVC_5_15_0_0.bin

版本号请以实际为准,下载最新固件从 Intel 官网 获取。

三、深度问题诊断

使用 realsense-viewer 或 rs-depth-quality 量化当前深度图质量。

1. 快速视觉检查

打开终端,输入:

bash 复制代码
realsense-viewer

选择 Stereo Module → 勾选 Depth, 对准平整白墙(距离 1~2 米),观察深度图是否有随机黑点边缘阶梯状跳变:

2. 量化指标测试(推荐)

打开终端,输入:

bash 复制代码
rs-depth-quality

按界面提示放置相机,获取以下数据并与标准阈值对比:

指标 合格阈值 我的结果
填充率 (Fill Rate) >95% 64.8%
RMS 误差 <2% 3.06%
平面拟合误差 <5mm ?

明显不达标(例如填充率低于 90%,或平面误差 >10mm),需要继续执行校准。

三、执行动态校准

主要有三种方法供选择,个人推荐第三种。

方法一:使用 DynamicCalibrator GUI(推荐,精度最高)

(1)安装工具

打开终端,输入:

bash 复制代码
wget https://github.com/IntelRealSense/librealsense/files/14682659/DynamicCalibrator_2.13.0.zip

解压缩:

bash 复制代码
unzip DynamicCalibrator_2.13.0.zip -d ~/realsense_calib

给予权限:

bash 复制代码
cd ~/realsense_calib
chmod +x DynamicCalibrator

运行编译:

bash 复制代码
./DynamicCalibrator

若链接失效,请从 Intel 官方下载页面 获取最新版。

(2)校准环境要求

光照:暗室或夜间,关闭所有红外光源(如 Kinect、电视遥控器)。

目标 :使用平整哑光白色板(A3 纸箱板或瓷砖),表面无纹理、无反光。

相机预热:连接相机后连续运行 10 分钟,达到热稳定。

摆放:目标板占据视野 30%~50%,倾斜角 <10°。

(3)操作步骤

  1. 启动后选择 D435 设备。

  2. 进入 Calibration 标签页:

    XML 复制代码
    设置 Depth Mode = 848x480 @30Hz
    
    Laser Power = 150(若出现过曝可降至 100)
  3. 点击 Start Calibration,按提示采集 6 组姿态:

    XML 复制代码
    正对中心 (1m)
    
    上仰 30°
    
    下俯 30°
    
    左转 30°
    
    右转 30°
    
    最远距离 (约 4m)

    每组保持相机静止,轻微晃动标定板以增强特征。

  4. 采集完成后,点击 Optimize,在参数面板微调(可选):

    XML 复制代码
    "confidence_threshold": 85,
    "second_peak_threshold": 0.6,
    "texture_count_threshold": 8

    观察实时深度图,当黑点明显减少、边缘平滑时停止。

  5. 点击 Save to Device (将校准参数写入相机硬件)或 Save to File (保存为 .json 文件)。

推荐两种都做:写入硬件可使相机在任意主机上保持校准状态;保存文件便于 ROS2 加载。

方法二:使用 realsense-viewer 内置校准

打开终端,输入:

bash 复制代码
realsense-viewer
  • 点击左侧 MoreOn-Chip Calibration

  • 将相机对准屏幕上的棋盘格(工具会自动显示),等待进度条完成。

  • 最后点击 Apply 写入设备。

该方法适合快速修复轻微偏差,但对严重失真效果有限。

方法三:使用 rs-depth-quality 内置校准(推荐,最简单)

打开终端,输入:

bash 复制代码
​rs-depth-quality

先根据提示,进行操作,将相机对准纯白色墙面:

左上角选择 More -> On-Chip Calibration

需要使用棋盘格标定板放置在正对相机处,点击右上角的begin,开始校准。

棋盘格标定板:

校准后,深度图像会明显改善,随机黑点大幅减少:

左侧指标也明显改善:

指标 合格阈值 校准前 校准后
填充率 (Fill Rate) >95% 64.8% 100%
RMS 误差 <2% 3.06% 0.83%

左上角选择 More -> Calibration Data

选择 Save As... ,另存为 .json 文件:

四、在 ROS2 Humble 中应用校准参数

校准参数生效有两种途径:硬件存储 (已执行 Save to Device)或 ROS 节点加载 JSON 文件

1. 如果已将校准写入硬件

硬件存储的校准会被 realsense2_camera 自动读取,无需额外配置。启动相机即可:

bash 复制代码
ros2 launch realsense2_camera rs_launch.py depth_module.profile:=848x480x30

若仍看到旧有质量问题,说明硬件存储未成功(部分固件不支持用户写校准),请使用方法二。

2. 通过 JSON 文件加载校准

(1)复制配置文件

将校准保存的 .json 文件(如 D435_calib_20250320.json)复制到 ROS2 工作空间,例如 ~/ros2_ws/config/。

(2)创建 launch 文件

创建自定义 launch 文件,加载该文件。新建 my_calibrated_camera.launch.py:

python 复制代码
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='realsense2_camera',
            executable='realsense2_camera_node',
            name='realsense2_camera',
            parameters=[{
                'enable_depth': True,
                'enable_color': True,
                'depth_module.profile': '848x480x30',
                'calibration_json_file_path': '/home/your_username/ros2_ws/config/D435_calib_20250320.json',
                'json_file_path': '/home/your_username/ros2_ws/config/D435_calib_20250320.json',  # 旧版参数名
            }]
        )
    ])

运行:

bash 复制代码
ros2 launch my_calibrated_camera.launch.py

检查深度话题质量,确认校准生效。

(3)自动化切换不同场景的校准预设

在实际项目中,可以维护多个 JSON 文件(如 dark_room.json, fast_motion.json),并通过 ROS2 参数动态加载:

python 复制代码
import rclpy
from rclpy.node import Node
from realsense2_camera import RealsenseNode

class CalibSwitcher(Node):
    def __init__(self):
        super().__init__('calib_switcher')
        self.rs_node = RealsenseNode()
        
    def switch_calib(self, json_path):
        self.rs_node.set_parameter('calibration_json_file_path', json_path)
        # 重启深度流
        self.rs_node.set_parameter('enable_depth', False)
        self.rs_node.set_parameter('enable_depth', True)

五、常见问题与解决方案

现象 可能原因 解决方法
DynamicCalibrator 报错error code -6 标定板特征点不足 更换高对比度标定板(如 Aruco 板),或增加环境漫反射光
校准后深度图出现横向条纹 环境红外干扰(如阳光、卤素灯) 加装 850nm 带通滤光片,或在暗室重新校准
ROS2 启动后仍使用旧参数 JSON 路径错误 / 参数名不匹配 检查 json_file_path 参数名;或先删除 ~/.ros/realsense2_camera/settings.json 缓存
校准后边缘畸变更严重 过度校正 执行 Factory Reset(在 realsense-viewer 的 More → Factory Reset),然后重新校准
填充率正常但距离系统性偏大 温度变化引起 预热相机 20 分钟,运行 On-Chip Calibration(热校准)

六、长期维护建议

  • 定期校准:每周一次快速校准(使用 realsense-viewer 的内置工具),尤其当相机经历剧烈温差或物理震动后。

  • 备份校准文件:将有效 JSON 文件加入版本控制(Git),并附带校准环境说明(距离、温度、光照)。

  • 监控深度质量 :在 ROS2 节点中订阅 /camera/depth/color/points,实时计算点云的平面拟合误差,若超过阈值则自动提醒重新校准。

相关推荐
勤自省1 天前
ROS2分布式通信与Launch文件实战:从踩坑到打通(第12-20讲总结)
分布式·ubuntu·ros2·gazebo·launch·rqt·rviz2
济6172 天前
ROS开发专栏---ROS2humble安装详细教程---适配Ubuntu 22.04
ubuntu·ros2·ros2 humble·机器人开发
kobesdu4 天前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
波特率1152004 天前
ROS2当中的几个关键的环境变量
机器人·ros·ros2
辰尘_星启4 天前
【ROS2】 Python 节点的开发流程
开发语言·python·机器人·系统·控制·ros2
辰尘_星启4 天前
【ROS2】含自定义消息的ROS2节点开发流程
机器人·系统·控制·ros2
kobesdu6 天前
【ROS2实战笔记-20】ROS2 bag 录播与时间模拟:从基础操作到高级调试技巧
笔记·机器人·ros·ros2
辰尘_星启7 天前
【ROS2】DDS 底层通信协议与数据流转全链路解析
机器人·ros2
kyle~7 天前
ROS2---消息过滤
开发语言·c++·机器人·ros2