第一次接触Realsense D435i相机和IMU联合标定的开发者,往往会遇到各种环境配置问题。我在实际项目中踩过不少坑,这里分享一套经过验证的Ubuntu环境搭建方案。
首先需要确认系统版本,推荐使用Ubuntu 20.04 LTS,这个版本对ROS和Realsense驱动的兼容性最好。安装ROS Noetic完整版时,记得选择包含rqt和rviz的选项:
bash复制sudo apt install ros-noetic-desktop-full
接下来安装Realsense SDK和ROS封装包。这里有个小技巧:先安装SDK再装ROS封装,可以避免常见的依赖冲突:
bash复制sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main"
sudo apt update
sudo apt install librealsense2-dkms librealsense2-utils
sudo apt install ros-noetic-realsense2-camera
安装完成后,建议先运行realsense-viewer验证设备连接。我遇到过USB3.0接口供电不足导致IMU数据异常的情况,如果发现类似问题,可以尝试更换USB接口或使用带电源的扩展坞。
IMU标定需要用到imu_utils工具包,但它的编译过程有些特殊要求。首先创建独立的工作空间是个好习惯:
bash复制mkdir -p ~/imu_calib_ws/src
cd ~/imu_calib_ws/src
这里有个关键细节:必须先编译code_utils再编译imu_utils,顺序错了会导致编译失败。克隆仓库时建议使用https协议:
bash复制git clone https://github.com/gaowenliang/code_utils.git
git clone https://github.com/gaowenliang/imu_utils.git
编译过程中最常见的错误是OpenCV版本兼容性问题。对于OpenCV4用户,需要执行以下替换命令:
bash复制cd code_utils
sed -i 's/CV_LOAD_IMAGE_UNCHANGED/cv::IMREAD_UNCHANGED/g' `grep CV_LOAD_IMAGE_UNCHANGED -rl ./`
sed -i 's/CV_LOAD_IMAGE_GRAYSCALE/cv::IMREAD_GRAYSCALE/g' `grep CV_LOAD_IMAGE_GRAYSCALE -rl ./`
IMU标定需要采集静止状态下的数据,这里有个经验值:至少采集2小时数据才能得到可靠结果。启动数据采集的命令如下:
bash复制roslaunch realsense2_camera rs_camera.launch
rosbag record /camera/imu -O imu_calib.bag
创建launch文件时要注意参数配置。我建议将采样率设为400Hz(与D435i的IMU实际采样率匹配),以下是我的配置模板:
xml复制<launch>
<node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
<param name="imu_topic" value="/camera/imu"/>
<param name="imu_name" value="d435i"/>
<param name="data_save_path" value="$(find imu_utils)/data/"/>
<param name="max_time_min" value="120"/>
<param name="max_cluster" value="400"/>
</node>
</launch>
标定完成后,检查生成的yaml文件中的噪声密度(noise density)和随机游走(random walk)参数。正常值范围应该是:
Kalibr是相机标定的黄金标准工具,但它的安装过程比较繁琐。我推荐使用catkin build系统而不是catkin_make:
bash复制mkdir -p ~/kalibr_ws/src
cd ~/kalibr_ws
catkin init
catkin config --extend /opt/ros/noetic
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
catkin config --merge-devel
git clone https://github.com/ethz-asl/kalibr.git ~/kalibr_ws/src/kalibr
catkin build -j4
编译时可能会遇到Python依赖问题,建议先安装以下包:
bash复制sudo apt install python3-dev python3-pip python3-scipy python3-matplotlib
pip install pyx pyyaml numpy scipy
AprilTag标定板的尺寸测量是很多新手容易出错的地方。我建议:
生成标定板配置时,tagSpacing参数容易被误解。它表示的是白色间隔与tagSize的比例,不是实际距离:
bash复制rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.022 --tspace 0.3
数据采集时要注意运动方式:缓慢移动相机,确保标定板始终在视野内。我总结的有效运动模式是:
标定命令中的关键参数是--approx-sync,它决定了左右图像的时间对齐阈值。对于D435i,0.04秒是个不错的初始值:
bash复制rosrun kalibr kalibr_calibrate_cameras \
--target april_6x6.yaml \
--bag stereo_calib.bag \
--models pinhole-radtan pinhole-radtan \
--topics /infra_left /infra_right \
--approx-sync 0.04
遇到"Initialization of focal length failed"错误时,可以设置环境变量手动初始化焦距:
bash复制export KALIBR_MANUAL_FOCAL_LENGTH_INIT=1
联合标定需要准备三个配置文件:
录制数据时要注意频率匹配:
bash复制rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 20 /infra_left
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 20 /infra_right
rosbag record /infra_left /infra_right /camera/imu -O stereo_imu.bag
遇到numpy版本冲突时(特别是AttributeError: module 'numpy' has no attribute 'typeDict'),需要降级numpy:
bash复制pip install numpy==1.21
标定结果验证要看几个关键指标:
如果时间同步参数(timeshift)绝对值大于0.1秒,可能需要检查硬件同步设置或重新采集数据。
在VINS或其他SLAM系统中使用标定结果时,要注意坐标系定义差异。D435i的IMU坐标系定义是:
标定得到的T_ic矩阵需要根据具体SLAM系统的要求进行转换。我在部署时发现,将标定结果转换为TUM格式通常兼容性更好。
运动捕捉场景下,建议每3个月重新标定一次IMU。环境温度变化超过15℃时,也应该重新标定。有个实用技巧:在设备外壳上贴温度传感器,记录标定时的环境温度作为参考。