本文记录使用 Kalibr 标定双目相机内外参数以及和IMU之间外参数的标定过程. 采用的硬件设备为小觅的双目VIO设备( MyntEYE), 并且默认你已经有了ROS的知识基础. 标定 stereo-imu 之前, 需要知道双目的内外参数, 所以先进行双目内外参数的标定.
材料准备
安装Kalibr (忽略)
准备标定板
标定板可以用 kalibr 提供的pdf, 里面有三种类型的标定板(Aprilgrid, Checkerboard, Circlegrid). 由于Aprilgrid能提供序号信息, 能够防止姿态计算时出现跳跃的情况, 所以建议采用Aprilgrid进行标定. 我直接下载这个pdf, 将电脑屏幕当成了标定板, 在标定前, 注意测量格子的尺寸信息填入yaml文件, 尺寸信息具体是哪些数据可以看看kalibr的说明.
双目内外参数的标定
数据采集
如果你已经有了通过 ROS 发布 image 消息的节点, 我们只需要使用 rosbag record 工具将拍摄到的标定板图像制作成 bag 文件就行了. 注意: 通常设备采集的频率为 20-60 hz, 这会使得标定的图像过多, 而导致计算量太大. 最好将ros topic的频率降低到4hz左右进行采集. (我采集里200多张照片, 计算了估计有一两个小时) ROS 提供了改变 topic 发布频率的节点throttle, 指令如下 :
rosrun topic_tools throttle messages /mynteye/left/image_raw 4.0 /left
rosrun topic_tools throttle messages /mynteye/right/image_raw 4.0 /right
对左右目的ros topic降低频率后就可以制作bag了
rosbag record -O stereo_calibra.bag /left /right
标定
采集好数据集以后, 就可以用已经安装好的 Kalibr 标定双目相机了, 指令如下:
source ros_ws/kalibr/devel/setup.bash
rosrun kalibr kalibr_calibrate_cameras --bag /home/heyijia/stereo_calibra.bag --topics /left /right --models pinhole-radtan pinhole-radtan --target /home/heyijia/april_6x6_80x80cm_A0.yaml
或者采用 pinhole-equi 模型,对畸变大的相机效果不错
rosrun kalibr kalibr_calibrate_cameras --bag /home/heyijia/stereo_calibra.bag --topics /left /right --models pinhole-equi pinhole-equi --target /home/heyijia/april_6x6_80x80cm_A0.yaml
Stereo-IMU 外参数标定
数据采集
在标定完双目内外参数以后, 可以接着标定和 IMU 之间的外参数了. 这次采用同样的标定板, 采集数据的最佳频率为图像20Hz, IMU 200 Hz (当然其他频率也没问题).
rosbag record -O stereo_imu_calibra.bag /mynteye/left/image_raw /mynteye/right/image_raw /mynteye/imu/data_raw
注意事项:
- 采集数据的起始和结束阶段注意别晃动太大,如从桌子上拿起或者放下。如果有这样的动作,在标定阶段应该跳过bag数据集的首尾的数据.
- 采集数据的时候应该给imu各个轴足够的激励,如先依次绕各个轴运动,运动完后来个在空中画8字之类的操作,当然也要注意别运动太剧烈,图像都模糊了。
标定
标定 stereo-imu 外参数时,需要利用前面标定好stereo内外参数文件camchain-homeheyijiastereo_calibra.yaml,标定指令如下:
kalibr_calibrate_imu_camera --target /home/heyijia/april_6x6_80x80cm_A0.yaml --cam /home/heyijia/camchain-homeheyijiastereo_calibra.yaml --imu /home/heyijia/imu_mynteye.yaml --bag /home/heyijia/stereo_imu_calibra.bag --bag-from-to 2 37
问题
标定过程中,如果提示不能得到初始焦距的时候,可以设置:export KALIBR_MANUAL_FOCAL_LENGTH_INIT=1。然后运行程序,当程序运行失败的时候,它会提示要你手动输入一个焦距,Initialization of focal length failed. Provide manual initialization: 这时你手动输入比如 400。给比较大的值,也能收敛。