利用 kalibr 标定多个相机(>=1)和 IMU 组合系统

本文详细介绍了如何利用kalibr进行多相机(>=1)及IMU的标定过程,包括编译kalibr、制作标定板、相机单独标定以及相机与IMU联合标定的步骤,提供了关键指令和注意事项。

目录

1、准备工作

1.1 编译 kalibr

1.2 制作标定板

2、 相机标定

2.1 相机话题降频

2.2 录制rosbag

2.3 相机标定

3、相机-IMU标定

3.1 准备文件

3.2 录制相机+IMU的 rosbag

3.3 标定

附注:


官方链接:Kalibr

官方 wiki 中的讲解非常清楚,但是需要花些时间好好消化一下。我在这里做一下流程汇总:

1、准备工作

1.1 编译 kalibr

先安装 ROS ,根据自己 Ubuntu 系统的版本来选择;然后 git clone 源码到自己的工作空间,与此同时可以安装一些依赖项,一定要注意涉及到 ros package 的安装包必须修改 ros 的版本号与自己安装的相对应。

mkdir -p kalibr_ws/src
cd kalibr_ws/src
catkin_init_workspace
git clone https://github.com/ethz-asl/kalibr.git
cd ..
catkin_make -DCMAKE_BUILD_TYPE=Release
source devel/setup.bash

source 之后,在终端中输入 kalibr_  加 TAB 就会自动检索出所有可用的 kalibr 指令。

1.2 制作标定板

官网上的下载链接无法下载,但是可以直接利用 yaml 文件来生成标定板。

Calibration targets 页面中,找到 Aprilgrid 文件,将其中的内容粘贴出来写入本地文件 april_6x6.yaml 

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.088           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          #ratio of space between tags to tagSize
                         #example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]

利用 kalibr_create_target_pdf 指令就可以生成对应以上设定的 pdf 文件

kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.88 --tspace 0.3

打印出来就可以了,实际测量一下打印之后方格的尺寸,修改到以上 ymal 文件中。

2、 相机标定

同时发布多个相机的 ros 话题,在相机标定中需要将相机话题的频率降低到 4 Hz,而且应当保持多个相机具有相对固定的安装位置,整个相机系统保持不动,移动标定板来录制 rosbag,

2.1 相机话题降频

rosrun topic_tools throttle messages /YOUR_IAMGE_TOPIC0 4.0 /image0
rosrun topic_tools throttle messages /YOUR_IAMGE_TOPIC1 4.0 /image1
.
.
.

降频后的话题分别是 /image0  /image1  ... ,更改了话题名称以便区分。

2.2 录制rosbag

rosbag record /image0 /image1 ...

2.3 相机标定

kalibr_calibrate_cameras --target YOUR_PATH/apri_6x6.yaml --bag YOUR_BAG.bag --models pinhole-radtan pinhole-radtan ... --topics /image0 /image1 ...  

这里的相机模型选择 pinhole-radtan 是最常用的相机模型,包括了径向畸变和切向畸变;排列顺序中相机模型与相机话题对应,顺序和数量都必须一致,否则会报错。

输出结果中有一个 camchain_ 打头的 yaml 文件,里面包含了每一个相机的内参以及每个相机对 cam0 的转移矩阵也就是外参;同时这个文件会应用到下一步的相机-IMU标定中。

3、相机-IMU标定

发布多个相机话题,同时发布IMU话题,这次不需要降频;所谓相机-IMU标定,就是计算出每个相机相对于IMU的转移矩阵。这里必须保证标定板固定不动,让相机-IMU系统运动,6个自由度的运动都必须有。

3.1 准备文件

标定板文件:april_6x6.yaml

camchain文件:从第二步相机标定中得到,但是一定一定记得必须修改 rostopic 名称与 3.2 中实际 rosbag 录制的 topic 名称一致

IMU文件:查阅IMU资料,需要的信息包括加速度、加速度的噪声和随机游走方差,参考 Yaml format 中的 imu.yaml 

#Accelerometers
accelerometer_noise_density: 1.86e-03   #Noise density (continuous-time)
accelerometer_random_walk:   4.33e-04   #Bias random walk

#Gyroscopes
gyroscope_noise_density:     1.87e-04   #Noise density (continuous-time)
gyroscope_random_walk:       2.66e-05   #Bias random walk

rostopic:                    /imu0      #the IMU ROS topic
update_rate:                 200.0      #Hz (for discretization of the values above)

在这里也必须修改 rostopic 名称与 3.2 中实际 rosbag 录制的 topic 名称一致

3.2 录制相机+IMU的 rosbag

rosbag record /YOUR_IMAGE_TOPIC0 /YOUR_IMAGE_TOPIC1 ... /YOUR_IMU_TOPIC

3.3 标定

kalibr_calibrate_imu_camera --bag YOUR_BAG.bag] --cam YOUR_camchain.yaml --imu YOUR_imu.yaml --target apri_6x6.yaml

需要比较长时间才能计算完成,请耐心等地。

附注:

看了很多帖子,先用 kalibr_bagextractor 指令拆解 rosbag, 再用 kalibr_bagcreater 生成新的 rosbag,这完全是浪费时间。只需要修改 camchain.yaml 中的 rostopic 名称与你录制的 rosbag 中相机的话题一致;修改 imu.ymal 中 rostopic 名称与你录制的 rosbag 中 IMU 的话题一致,即可。

进行相机IMU的联合标定是视觉惯性里程计(VIO)SLAM系统中的关键步骤,Kalibr 是一个功能强大的工具包,能够用于标定相机的内参、外参以及IMU相机之间的时空标定[^2]。以下是使用 Kalibr 工具进行相机IMU联合标定的流程指南。 ### 1. 环境准备与安装 Kalibr 是基于 ROS 的工具包,因此需要先配置好 ROS 环境(建议使用 ROS Noetic 或 Melodic)。可以通过以下命令安装 Kalibr: ```bash sudo apt-get install ros-<ros_distro>-kalibr ``` 如果需要从源码编译,可以使用以下命令: ```bash mkdir -p ~/kalibr_ws/src cd ~/kalibr_ws/src git clone https://github.com/ethz-asl/kalibr.git cd .. catkin_make source devel/setup.bash ``` ### 2. 数据采集 在进行标定之前,需要采集同步的图像IMU数据。使用 ROS 的 `rosbag` 工具录制数据包,确保相机IMU的数据是同步的。录制命令如下: ```bash rosbag record /camera/image_raw /imu/data ``` 在录制过程中,应移动标定板(如 AprilGrid 或 Chessboard),以提供足够的运动信息[^3]。 ### 3. 标定文件配置 Kalibr 需要一个 YAML 文件来描述标定目标传感器配置。一个典型的配置文件如下: ```yaml target: target_type: 'aprilgrid' # 标定板类型 tagCols: 6 # 列数 tagRows: 6 # 行数 tagSize: 0.08 # 单个标签的大小(米) tagSpacing: 0.3 # 标签间距比例 cam0: cam_overrides: cam0: resolution: [640, 480] intrinsics: [300.0, 300.0, 320.0, 240.0] # fx, fy, cx, cy distortion_model: "equidistant" D: [0.0, 0.0, 0.0, 0.0] # 畸变参数 rostopic: "/camera/image_raw" calibration_target: "aprilgrid" T_cam_imu: - [1, 0, 0, 0] - [0, 1, 0, 0] - [0, 0, 1, 0] - [0, 0, 0, 1] imu0: imu_overrides: imu0: rate: 200 # IMU采样率 noise_density: 0.0001 # 噪声密度 noise_density_imu_acc: 0.0001 noise_density_imu_gyr: 0.00001 bias_drift_density: 0.00001 T_imu_cam: [0, 0, 0, 0, 0, 0] # 初始IMU相机的变换 ``` ### 4. 执行标定 使用 `kalibr_calibrate_imu_camera` 命令进行标定,命令如下: ```bash kalibr_calibrate_imu_camera --bag your_data.bag --cam camchain.yaml --imu imu.yaml --target target.yaml ``` 其中: - `--bag` 指定录制的 ROS bag 文件。 - `--cam` 指定相机的配置文件。 - `--imu` 指定IMU的配置文件。 - `--target` 指定标定板的配置文件。 ### 5. 标定结果分析 标定完成后,Kalibr 会输出相机的内参、IMU相机之间的变换矩阵(`T_imu_cam`)以及IMU的噪声参数。这些参数可以用于后续的 VIO 或 SLAM 系统中[^2]。 ### 6. 常见问题与解决 - **优化失败**:可能是由于初始值设置不当或数据质量差。可以尝试调整初始变换矩阵或增加数据采集的运动范围[^4]。 - **标定板识别失败**:确保标定板清晰可见,且光照条件良好。 - **时间同步问题**:确保相机IMU的数据是严格同步的,否则会影响标定结果的准确性。 ### 7. 进一步优化 如果标定结果不够理想,可以尝试以下方法: - 增加更多的运动轨迹,尤其是在不同方向上的旋转平移。 - 使用更高精度的标定板。 - 调整IMU的噪声参数,使其更接近实际传感器的性能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值