在SLAM系统中,相机标定是获取准确的空间信息和三维重建的关键步骤。对于Intel RealSense D435i这类双目相机,正确的内参和外参不仅能提高位姿估计精度,还能显著改善重建效果。本文将详细介绍如何使用Kalibr对D435i进行双目标定,并涵盖常见的问题与调试技巧。

1. 环境准备
关于kalibr的工具安装网上有许多教程,这里我推荐一个个人认为较为完善的博客,大家可以参考进行下载,编译安装。链接:D435i标定摄像头和IMU笔记二-2(RGB+双目多摄像头标定篇)_d435i 双目+rgb标定-CSDN博客
2. 启动相机并准备话题
首先,启动RealSense D435i相机并配置左右红外摄像头(如何开启D435i相机的双目模式,可以参考我往期的博客,有详细的配置介绍):
bash
roslaunch realsense2_camera rs_stere_camera.launch
可以使用以下命令动态调整相机参数,例如曝光时间和增益(这一步可以省略,如果默认关闭状态):
bash
rosrun rqt_reconfigure rqt_reconfigure
为了减少数据量并提高标定效率,可以使用topic_tools
进行消息节流(分别打开窗口运行,也可以写成一行):
bash
rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 4.0 /infra_left
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 4.0 /infra_right
这会将红外相机的数据频率限制为4Hz,减少系统负载。
参考如下:
3. 数据录制
接下来,开始录制用于标定的数据包。确保已经在ROS工作空间的根目录下,且已经执行了source devel/setup.bash
。
使用以下命令录制包含左右相机图像的话题:
bash
rosbag record -o stere_calibr.bag /infra_left /infra_right
录制要点:
-
丰富视角:从多个角度和距离采集数据。
-
充分旋转和平移:确保相机有充分的运动轨迹。
-
避免运动模糊:尽量减少快速移动,确保图像清晰。
-
光照均匀:避免强光和阴影干扰。

4. Kalibr标定
准备好标定板(例如AprilGrid)并确保相机数据已经正确录制后,可以开始进行Kalibr标定。
首先,确保标定板参数文件aprilgrid.yaml
已正确配置,例如:
XML
target_type: 'aprilgrid'
tagCols: 6
tagRows: 6
tagSize: 0.08 # 标签的实际边长 (单位:米)
tagSpacing: 0.3 # 标签间的间隔比例 (tagSpacing / tagSize)
然后运行Kalibr标定命令:
XML
rosrun kalibr kalibr_calibrate_cameras \
--target aprilgrid.yaml \
--bag stere_calibr.bag \
--models pinhole-equi pinhole-equi \
--topics /infra_left /infra_right \
--show-extraction \后面回解读参数的作用
--approx-sync 0.04
关键参数解释:
-
--target:标定板参数文件。
-
--bag:Bag文件路径。
-
--models :相机模型类型,这里选择了
pinhole-equi
以适应D435i广角镜头。 -
--topics:左右相机的ROS话题。
-
--show-extraction:在标定过程中显示角点提取结果。
-
--approx-sync:时间戳近似同步窗口(40ms),避免严格对齐失败。
生成的标定文件:
标定txt文件:
html
Calibration results
====================
Camera-system parameters:
cam0 (/infra_left):
type: <class 'aslam_cv.libaslam_cv_python.EquidistantDistortedPinholeCameraGeometry'>
distortion: [ 0.3135947 0.32455235 -0.52654756 0.58506327] +- [0.02050455 0.19255653 0.70592142 0.873231 ]
projection: [661.4974262 662.56148611 635.82997386 361.51483888] +- [0.16035361 0.4681932 0.98190918 2.22391354]
reprojection error: [0.000001, -0.000008] +- [0.266003, 0.297355]
cam1 (/infra_right):
type: <class 'aslam_cv.libaslam_cv_python.EquidistantDistortedPinholeCameraGeometry'>
distortion: [ 0.34287689 0.19791578 -0.48234189 0.93543806] +- [0.01205634 0.07763847 0.16784572 0.21190066]
projection: [629.89882172 631.59908506 635.52002364 353.59436006] +- [0.12344688 0.36096015 0.83769264 1.90513144]
reprojection error: [-0.000000, 0.000003] +- [0.229563, 0.258023]
baseline T_1_0:
q: [0.00150385 0.00153018 0.00063099 0.9999975 ] +- [0.00267581 0.00270488 0.00063291]
t: [-0.05021712 0.0024024 -0.01461257] +- [0.00105519 0.00173179 0.00038129]
Target configuration
====================
Type: aprilgrid
Tags:
Rows: 6
Cols: 6
Size: 0.03 [m]
Spacing 0.009 [m]
标定的yaml文件:
java
cam0:
cam_overlaps: [1]
camera_model: pinhole
distortion_coeffs: [0.3135947033969634, 0.3245523536725653, -0.5265475626529273, 0.585063272337577]
distortion_model: equidistant
intrinsics: [661.4974261968929, 662.5614861133771, 635.8299738560407, 361.5148388773697]
resolution: [1280, 720]
rostopic: /infra_left
cam1:
T_cn_cnm1:
- [0.9999945208092658, 0.0012665781221903227, -0.003058452436623379, -0.05021711623497154]
- [-0.0012573734817375377, 0.999994680572997, 0.0030096241686901823, 0.0024023984784722146]
- [0.003062248091536979, -0.003005762061396358, 0.9999907939731525, -0.014612567870044153]
- [0.0, 0.0, 0.0, 1.0]
cam_overlaps: [0]
camera_model: pinhole
distortion_coeffs: [0.34287689294735485, 0.19791578378741437, -0.4823418924085219, 0.9354380622997973]
distortion_model: equidistant
intrinsics: [629.8988217210396, 631.5990850564253, 635.5200236409538, 353.59436006397107]
resolution: [1280, 720]
rostopic: /infra_right
标定的评估pdf文件:


5. 常见问题与调试
bash
Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance.
Traceback (most recent call last):
File "/home/nan/dev/kalibr_ws/devel/bin/kalibr_calibrate_cameras", line 15, in <module>
exec(compile(fh.read(), python_script, 'exec'), context)
File "/home/nan/dev/kalibr_ws/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 444, in <module>
main()
File "/home/nan/dev/kalibr_ws/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras", line 201, in main
graph.plotGraph()
File "/home/nan/dev/kalibr_ws/src/kalibr/aslam_offline_calibration/kalibr/python/kalibr_camera_calibration/MulticamGraph.py", line 308, in plotGraph
edge_label=self.G.es["weight"],
KeyError: 'Attribute does not exist'
-
原因:时间戳不同步导致图构建失败。
-
解决方法 :使用
--approx-sync 0.04
放宽时间对齐窗口。
6.总结
本文介绍了 Intel RealSense D435i 双目相机的标定流程,包括相机启动、数据录制和 Kalibr 工具的使用方法。重点涵盖了标定板配置、时间同步问题解决以及重投影误差优化等关键步骤,并提供了常见问题的调试技巧,如 时间戳不同步 和 角点检测失败 。通过合理的数据采集和参数设置,可以显著提高标定精度,为后续的 SLAM 任务打下坚实基础。