一、前言
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)操作步骤
-
启动后选择 D435 设备。
-
进入 Calibration 标签页:
XML设置 Depth Mode = 848x480 @30Hz Laser Power = 150(若出现过曝可降至 100) -
点击 Start Calibration,按提示采集 6 组姿态:
XML正对中心 (1m) 上仰 30° 下俯 30° 左转 30° 右转 30° 最远距离 (约 4m)每组保持相机静止,轻微晃动标定板以增强特征。
-
采集完成后,点击 Optimize,在参数面板微调(可选):
XML"confidence_threshold": 85, "second_peak_threshold": 0.6, "texture_count_threshold": 8观察实时深度图,当黑点明显减少、边缘平滑时停止。
-
点击 Save to Device (将校准参数写入相机硬件)或 Save to File (保存为 .json 文件)。
推荐两种都做:写入硬件可使相机在任意主机上保持校准状态;保存文件便于 ROS2 加载。
方法二:使用 realsense-viewer 内置校准
打开终端,输入:
bash
realsense-viewer
-
点击左侧 More → On-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,实时计算点云的平面拟合误差,若超过阈值则自动提醒重新校准。
