从单目相机到IMUKalibr多传感器联合标定实战指南在机器人感知系统中相机和IMU的精确标定是视觉惯性里程计VIO和SLAM算法的基础。Kalibr作为ETH Zurich开发的标定工具箱能够高效完成从单传感器到多传感器的标定任务。本文将深入解析如何利用Kalibr完成Camera-IMU联合标定的全流程特别针对SBG IMU和Kinect V1深度相机提供具体配置方案。1. 环境准备与Kalibr安装1.1 系统依赖配置对于Ubuntu 18.04系统需要安装以下基础依赖项sudo apt-get install -y \ git wget autoconf automake nano \ libeigen3-dev libboost-all-dev libsuitesparse-dev \ doxygen libopencv-dev \ libpoco-dev libtbb-dev libblas-dev liblapack-dev libv4l-dev \ python3-dev python-pip python-scipy \ python-matplotlib ipython python-wxgtk4.0 python-tk python-igraph注意若通过pip安装python-igraph失败建议直接使用apt-get安装1.2 创建工作空间建立独立的Kalibr工作空间可避免与现有ROS环境冲突mkdir -p ~/kalibr_workspace/src cd ~/kalibr_workspace source /opt/ros/melodic/setup.bash catkin init catkin config --extend /opt/ros/melodic catkin config --merge-devel catkin config --cmake-args -DCMAKE_BUILD_TYPERelease1.3 源码编译与常见问题解决从GitHub获取适配Ubuntu 18.04的Kalibr版本后执行编译cd ~/kalibr_workspace/ catkin build -DCMAKE_BUILD_TYPERelease -j4常见编译错误及解决方案错误1aslam_cv_python相关模块缺失解决方法替换~/kalibr_workspace/src/aslam_cv下的对应文件夹错误2Schweizer-Messer模块问题解决方法更新python_module目录内容2. IMU单独标定实战SBG案例2.1 IMU标定工具链搭建SBG IMU标定需要额外安装imu_utils工具包# 安装Ceres Solver依赖 sudo apt-get install -y cmake libgoogle-glog-dev libgflags-dev \ libatlas-base-dev libsuitesparse-dev # 编译安装Ceres tar zxf ceres-solver-1.14.0.tar.gz mkdir ceres-bin cd ceres-bin cmake ../ceres-solver-1.14.0 make -j4 sudo make install # 安装code_utils和imu_utils mkdir -p ~/kalibr_imu/src cd kalibr_imu/src git clone https://github.com/gaowenliang/code_utils.git git clone https://github.com/gaowenliang/imu_utils.git关键修改将CMakeLists.txt中的-stdc11改为CMAKE_CXX_STANDARD 142.2 SBG IMU数据采集与处理SBG驱动输出的原始话题类型需要转换为标准IMU消息# 启动SBG驱动 roslaunch sbg_driver sbg_device.launch # 录制数据原始话题 rosbag record /sbg/imu_data -o sbg_raw.bag # 转换消息类型 rosrun topic_tools throttle messages /sbg/imu_data 100 /imu0 rosbag record /imu0 -o sbg_imu.bag标定配置文件示例sbg.launchlaunch node pkgimu_utils typeimu_an nameimu_an outputscreen param nameimu_topic typestring value/imu0/ param nameimu_name typestring valuesbg/ param namedata_save_path typestring value$(find imu_utils)/data// param namemax_time_min typeint value120/ /node /launch标定结果关键参数示例%YAML:1.0 --- type: IMU name: sbg Gyr: unit: rad/s avg-axis: gyr_n: 4.94e-04 gyr_w: 3.00e-05 Acc: unit: m/s^2 avg-axis: acc_n: 6.27e-03 acc_w: 2.88e-043. 相机单独标定Kinect V1案例3.1 数据采集最佳实践Kinect V1相机标定需注意以下要点标定板建议使用A0尺寸的AprilTag 6x6网格采集频率设置为4-20Hz至少采集3分钟数据约500帧标定板应出现在图像各个区域采集命令示例# 启动Kinect驱动 roslaunch freenect_launch freenect.launch # 调节发布频率 rosrun topic_tools throttle messages /camera/rgb/image_color 4.0 /my_image_color # 录制数据 rosbag record /my_image_color -o kinect_calib.bag3.2 标定板配置AprilGrid标定板配置文件关键参数target_type: aprilgrid tagCols: 6 tagRows: 6 tagSize: 0.021 # 实际测量值(m) tagSpacing: 0.2857 # 间距/边长比3.3 标定执行与问题排查标准标定命令kalibr_calibrate_cameras \ --target april_6x6.yaml \ --bag kinect_calib.bag \ --models pinhole-radtan \ --topics /my_image_color常见错误解决方案初始化失败手动指定焦距初值export KALIBR_MANUAL_FOCAL_LENGTH_INITTrue # 交互式输入预估焦距值单位像素模型不匹配确认相机光学模型选择正确Kinect V1通常使用pinhole-radtan模型其他可选模型omni-radtan、eucm等4. Camera-IMU联合标定全流程4.1 数据同步采集策略传感器话题名称消息类型推荐频率采集要求SBG IMU/imu0sensor_msgs/Imu100Hz静置2小时Kinect V1/cam0/image_rawsensor_msgs/Image4Hz多角度移动数据合并技巧# 合并两个独立录制的bag包 rosbag reindex imu.bag camera.bag rosbag play -r 200 merged.bag4.2 配置文件准备IMU参数文件示例imu_sbg.yamlrostopic: /imu0 update_rate: 100.0 accelerometer_noise_density: 6.27e-03 accelerometer_random_walk: 2.88e-04 gyroscope_noise_density: 4.94e-04 gyroscope_random_walk: 3.00e-05相机链文件示例camchain.yamlcam0: camera_model: pinhole distortion_coeffs: [0.119, -0.136, -0.0037, 0.0026] distortion_model: radtan intrinsics: [426.93, 427.00, 320.23, 266.11] resolution: [640, 480] rostopic: /cam0/image_raw4.3 联合标定执行完整标定命令kalibr_calibrate_imu_camera \ --target april_6x6.yaml \ --cam camchain.yaml \ --imu imu_sbg.yaml \ --bag calibration.bag \ --bag-from-to 30 150 \ --show-extraction关键输出参数解析T_cam_imu相机到IMU的变换矩阵timeshift_cam_imu时间偏移量相机领先为正重投影误差应小于2像素惯性误差加速度和角速度误差应小于传感器噪声水平5. 实战经验与性能优化在多次标定SBG IMU和Kinect V1组合后总结以下经验IMU静置时间虽然官方建议2小时实际测试发现质量好的IMU如SBG1小时数据已足够相机运动模式避免纯旋转运动包含各轴向平移和倾斜标定板在视野中保持50%以上可见时间时间同步技巧# 精确测量硬件触发延迟 rosrun kalibr kalibr_camera_focus_calibrator \ --target target.yaml \ --topics /cam0/image_raw \ --models pinhole-radtan标定验证方法import numpy as np # 检查变换矩阵合理性 T np.array([...]) # 从标定结果读取 det_R np.linalg.det(T[:3,:3]) assert abs(det_R - 1.0) 1e-6 # 旋转矩阵行列式应为1对于需要更高精度的场景建议进行多次独立标定取参数均值使用更高精度的标定板如激光切割金属板在恒温环境下进行标定