从零到一:ZED 2i双目相机与IMU的联合标定实战指南

张开发
2026/4/19 13:07:22 15 分钟阅读

分享文章

从零到一:ZED 2i双目相机与IMU的联合标定实战指南
1. 为什么需要ZED 2i相机与IMU联合标定刚拿到ZED 2i双目相机时我第一反应是直接调用官方SDK提供的参数。但在实际做SLAM项目时发现直接使用出厂参数会导致点云拼接出现明显错位。后来才明白每台设备的镜头装配、IMU安装位置都存在微小差异这些都会影响实际测量精度。联合标定的核心价值在于建立相机和IMU之间的精确空间关系。想象一下当相机看到前方3米处的物体时IMU如果误判了自身姿态就会导致定位误差。这种误差在长时间运行中会不断累积最终让整个SLAM系统崩溃。ZED 2i作为一款集成IMU的双目相机其IMU与相机之间的外参即两者的相对位置和姿态对以下场景尤为关键视觉惯性里程计(VIO)需要精确知道IMU坐标系到相机坐标系的变换关系多传感器融合当接入激光雷达等其他传感器时所有传感器必须统一到同一坐标系动态物体追踪快速运动时IMU的高频数据需要与视觉数据精确对齐2. 硬件准备与环境配置2.1 设备检查清单在开始前请确保准备好以下硬件ZED 2i相机建议固件升级到最新版本高性能计算设备推荐Ubuntu 20.04ROS Noetic标定板建议使用AprilTag棋盘尺寸不小于A3三脚架用于IMU静态标定时固定设备我的血泪教训曾经用A4纸打印标定板结果在3米外就检测不到标记点了。后来改用专业印刷的A0尺寸AprilTag板检测距离直接提升到8米。2.2 软件依赖安装# 基础依赖 sudo apt install -y libeigen3-dev libboost-all-dev libopencv-dev sudo apt install -y ros-noetic-vision-opencv ros-noetic-image-transport-plugins # Python工具链 pip install numpy scipy matplotlib pyyaml特别注意如果遇到Python包冲突建议使用conda创建虚拟环境。我曾在系统Python环境下安装时遭遇过rosdep与pip的版本冲突最后不得不重装系统。2.3 ROS工作区创建mkdir -p ~/kalibr_ws/src cd ~/kalibr_ws catkin init catkin config --extend /opt/ros/noetic catkin config --cmake-args -DCMAKE_BUILD_TYPERelease3. IMU标定全流程3.1 Allan方差工具编译IMU标定需要计算其噪声特性我们使用imu_utils工具cd ~/kalibr_ws/src git clone https://github.com/gaowenliang/code_utils.git git clone https://github.com/gaowenliang/imu_utils.git编译时常见两个坑头文件缺失错误修改code_utils/src/sumpixel_test.cpp中的#include backward.hpp为#include code_utils/backward.hpplibdw缺失运行sudo apt install libdw-dev3.2 数据采集技巧录制IMU数据时要注意保持设备绝对静止放在大理石台面上效果最佳持续时间至少2小时我试过1小时的数据结果Allan曲线尾部震荡严重使用以下命令录制rosbag record -O imu_calib.bag /zed2i/zed_node/imu/data_raw3.3 标定文件配置创建launch文件imu_calib.launchlaunch node pkgimu_utils typeimu_an nameimu_an outputscreen param nameimu_topic value/zed2i/zed_node/imu/data_raw/ param nameimu_name valuezed_imu/ param namedata_save_path value$(find imu_utils)/data// param namemax_time_min value120/ param namemax_cluster value100/ /node /launch运行后会生成zed_imu_imu_param.yaml其中关键参数gyroscope_noise_density陀螺仪白噪声gyroscope_random_walk陀螺仪随机游走accelerometer_noise_density加速度计白噪声4. 双目相机标定实战4.1 标定板选择与制作经过多次对比测试AprilTag比传统棋盘格有三大优势每个标签有唯一ID避免误匹配对部分遮挡更鲁棒支持姿态估计唯一解生成命令rosrun kalibr kalibr_create_target_pdf \ --type apriltag \ --nx 6 --ny 6 \ --tsize 0.08 \ --tspace 0.34.2 数据采集要诀采集数据时我总结出三要三不要原则要多角度覆盖俯仰±60°偏航±90°要不同距离0.5m-3m要适度运动模糊模拟实际使用场景不要纯旋转运动会导致尺度不确定不要高速运动图像模糊超过5像素不要光照剧烈变化录制命令rosrun topic_tools throttle messages /zed2i/zed_node/left_raw/image_raw_color 4.0 /left/image_raw rosrun topic_tools throttle messages /zed2i/zed_node/right_raw/image_raw_color 4.0 /right/image_raw rosbag record -O stereo_calib.bag /left/image_raw /right/image_raw4.3 标定执行与问题排查运行标定rosrun kalibr kalibr_calibrate_cameras \ --bag stereo_calib.bag \ --topics /left/image_raw /right/image_raw \ --models pinhole-radtan pinhole-radtan \ --target aprilgrid.yaml常见错误处理初始化失败设置export KALIBR_MANUAL_FOCAL_LENGTH_INIT1手动输入初始焦距相机未连接检查topic名称是否匹配时间戳是否同步内存不足减少图像数量或降低分辨率5. 相机-IMU联合标定5.1 动态数据采集联合标定需要充分激励所有自由度三维平移运动前后、左右、上下三维旋转运动横滚、俯仰、偏航复合运动8字形、螺旋运动录制命令rosrun topic_tools throttle messages /zed2i/zed_node/imu/data_raw 200.0 /imu/data_raw rosbag record -O dynamic.bag /left/image_raw /right/image_raw /imu/data_raw5.2 标定文件准备需要三个配置文件标定板参数target.yaml相机参数camchain.yaml来自上一步标定结果IMU参数imu.yaml来自Allan方差分析5.3 联合标定执行rosrun kalibr kalibr_calibrate_imu_camera \ --bag dynamic.bag \ --cam camchain.yaml \ --imu imu.yaml \ --target target.yaml \ --show-extraction关键结果解读时间偏移time offset理想值应小于1ms重投影误差应小于1.5像素IMU-相机外参检查旋转矩阵是否正交6. 标定结果验证与应用完成标定后建议进行以下验证测试静态重投影测试固定相机位置检查标定板角点重投影误差动态轨迹测试手持设备做规定路径运动对比纯视觉和VIO轨迹闭环检测测试让设备回到起点检查位姿漂移量在ORB-SLAM3上的应用示例# ZED 2i配置片段 Camera.type: PinHole Camera.fx: 456.23 Camera.fy: 456.85 Camera.cx: 325.12 Camera.cy: 245.23 IMU.NoiseGyro: 1.17e-03 IMU.NoiseAcc: 1.46e-02 IMU.Tbc: [0.01, 0.02, -0.03, 0.999, 0.002, -0.001, 0.001]最后提醒标定不是一劳永逸的建议每3个月或发现定位异常时重新标定。特别是在设备经历剧烈撞击或温度变化超过30℃时必须重新标定。

更多文章