kalibr标定视觉惯导相机

建议先了解下相机模型知识:
https://zhuanlan.zhihu.com/p/71234078

https://blog.csdn.net/lqql2012/article/details/106127447
https://zhuanlan.zhihu.com/p/317673040

Kalibr 是一个工具箱(a toolbox)。
The camera-imu calibration tool (其中的一个工具)estimates the spatial and temporal parameters of a camera system with respect to an intrinsically calibrated IMU.
The calibration parameters (待标定参数被估计出来) are estimated in a full batch optimization using splines to model the pose of the system.

kalibr——github:
https://github.com/ethz-asl/kalibr

kalibr——wiki:
https://github.com/ethz-asl/kalibr/wiki

因此,Kalibr正是我们所需要的!
获得Kalibr工具箱有两种方式:1.从源码编译;2.CDE包。
1.源码编译:它依赖于ROS indigo和一个catkin工作空间。这种方式的标定有两个优势:比CDE包更快、提供所有(tools)工具。
2.CDE包:所有依赖都被打包在了包里,无需任何其他依赖。但Camera focus和Calibration validator工具无法使用(因为依赖ROS)。

从源码安装kalibr

安装环境:ubuntu18 + ros melodic
相机设备:mynteye-s2110

安装方法:

sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev ros-melodic-vision-opencv ros-melodic-image-transport-plugins ros-melodic-cmake-modules software-properties-common libpoco-dev python-matplotlib python-scipy python-git python-pip ipython libtbb-dev libblas-dev liblapack-dev python-catkin-tools libv4l-dev

其中ros-melodic-vision-opencv,ros-melodic-image-transport-plugins,ros-melodic-cmake-modules需要把melodic 改成系统需要的对应版本

3、安装igraph

sudo pip install python-igraph (sudo apt install python-pip (python2.7))

4、创立工作空间:

mkdir -p ~/kalibr_workspace/src

cd ~/kalibr_workspace

source /opt/ros/melodic/setup.bash

catkin init

catkin config --extend /opt/ros/melodic

catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release

5、下载kalibr源码:

 cd ~/kalibr_workspace/src

 git clone https://github.com/ethz-asl/kalibr.git

6、编译

 cd ~/kalibr_workspace

 catkin build -DCMAKE_BUILD_TYPE=Release -j4

7、设置环境

 source ~/kalibr_workspace/devel/setup.bash

8、测试安装是否成功

kalibr_calibrate_imu_camera --target april_6x6.yaml --cam camchain.yaml --imu imu_adis16448.yaml --bag dynamic.bag --bag-from-to 5 45

在使用kalibr_bagcreater 时出现了一个问题,no module “ImageFile”,解决办法是直接把kalibr_bagcreater中的import ImageFile直接注释掉就好了。

注意点:
升级pip,不然容易找不到安装包

sudo python -m pip install --upgrade --force-reinstall pip

标定双目

支持的相机模型:
https://github.com/ethz-asl/kalibr/wiki/supported-models
yaml文件格式:
https://github.com/ethz-asl/kalibr/wiki/calibration-targets
标定图片下载:
https://github.com/ethz-asl/kalibr/wiki
官方标定文档:
https://github.com/ethz-asl/kalibr/wiki/multiple-camera-calibration

小觅的相机参数:
相机内参Intrinsics: k表示等距畸变系数,mu,mv对应焦距,v,u对应主点坐标。 相机外参Extrinsics(从右目往左目): rotation表示旋转矩阵, translation表示平移矩阵。 D、K、R、P 分别为畸变参数,内参矩阵,矫正矩阵,投影矩阵。 参考链接: ros CameraInfo

(1)录制数据
数据集要求:固定小觅相机,在相机视野中移动 aprilgrid 标定板。
注意关掉IR光(我怕打的光可能影响匹配),进入MYNT-EYE-S-SDK文件夹,进入wrappers/ros/src/mynt_eye_ros_wrapper/config/device/standard.yaml,应该这样就可以了。

打开相机

source wrappers/ros/devel/setup.bash
roslaunch mynt_eye_ros_wrapper display.launch

调整频率
kalibr推荐使用 4Hz 图像帧率,这里使用topic_tools/throttle降低接收频率
使用方法:throttle messages <msgs_per_sec> [outtopic]

rosrun topic_tools throttle messages /mynteye/left/image_raw 4.0 /mynteye/left/image_raw
rosrun topic_tools throttle messages /mynteye/right/image_raw 4.0 /mynteye/right/image_raw

有的参考博客会直接改名为/left和/right,这个时候标定完生成的yaml中,也会记录topic的名字,那在标定双目-IMU间关系时,注意topic统一即可。

rosbag record -O stereo_calib.bag /mynteye/left/image_raw /mynteye/right/image_raw

假设保存在了~/路径下。
(2)标定
采集好数据集以后, 就可以用已经安装好的 Kalibr 标定双目相机了, 指令如下:
3)开始标定
使用如下命令执行(以后续例程中的命令为例):

kalibr_calibrate_cameras --bag /home/laoli/stereo_calib_1.bag  --topics /left /right --models pinhole-equi pinhole-equi --target /home/laoli/project_work/kalibr/kalibr_18_1/stereo_calib_1.yaml  --show-extraction --approx-sync 0.08

4)输出
标定会产生如下输出文件:
– report-imucam-%BAGNAME%.pdf
– results-imucam-%BAGNAME%.txt
– camchain-imucam-%BAGNAME%.yaml
在这里插入图片描述

(3)标定结果
标定结果的评定标准
因为可能存在的人为的安装问题,真实的IMU到相机的的转移矩阵可能不确定.由于没有准确的判定准则,故当前标定的结果,主要基于以下两个方面:

  • 真实的IMU坐标系和相机坐标系的转换,即相机和IMU的物理距离
  • 标定结果的稳定性上

标定的验证没有成功

验证方法:可以使用calibration validator进行标定的验证,原理是对重投影误差进行量化分析。使用上一步骤的camera标定结果以及标定板的yaml文件,具体命令如下:(参考链接)

kalibr_camera_validator --cam camchain.yaml --target target.yaml

标定stereo-imu的关系

采集数据
数据集要求:在相机视野中固定 aprilgrid 标定板,移动相机,绕三轴(yaw-pitch-roll)旋转,且有上下、左右、推进推远、画8字的运动,运动不要过快。
最好是image 20hz, IMU 200hz,其他的也可以。
这里我是进入MYNT-EYE-S-SDK文件夹,进入wrappers/ros/src/mynt_eye_ros_wrapper/config/device/standard.yaml,修改的频率: 应该这就样可以了。

rosbag record -O stereo_imu_calib.bag /mynteye/left/image_raw /mynteye/right/image_raw /mynteye/imu/data_raw
标定
标定会使用到imu.yaml,主要包括频率、噪声、随机游走的值,应该是给定一个大概的初值。
我直接使用了kalibr里提供的imu_adis16448.yaml文件,现在想来应该有问题。我发现在MYNT-EYE-VINS-FUSION-Samples的MYNT-EYE-VINS-FUSION-Samples/config/mynteye/mynteye_stereo_imu_config.yaml中有关于imu parameters的设置。

使用这个参数应该可以。

kalibr_calibrate_imu_camera --target /home/jmliu/mynt_calib/april_6x6_80x80cm.yaml --cam /home/jmliu/camchain-homejmliustereo_calib.yaml --imu /home/jmliu/imu.yaml --bag /home/jmliu/stereo_imu_calib.bag --bag-from-to 2 45
其中需注意的点:

imu.yaml 中注意修改imu的topic。(这是imu_adis16448.yaml,按格式修改数值即可)

–bag-from-to 参数,如果数据集开始和最后有抬起相机的动作,请加上这个参数,去除这部分的数据。抬起放下的动作会对标定有一定影响。没有可不加。
会使用到上面标定双目间关系的yaml
注意修改路径。标定时可加上下面指令,来去除起始和快结束时的抖动
–bag-from-to 5 45
【注】:CDE版和源码编译版命令略有不同。
其中,参数的含义:

–bag包含相机图像数据和IMU数据的ROS包;
–cam保存相机系统的内参和外参校准参数的文件(intrinsic and extrinsic calibration parameters)。可以在这里使用multiple-camera-calibration tool标定的结果,因此文件名那么长!(详见第二大节);
–imu保存IMU的统计特性和话题名称(the IMU statistics and the IMU’s topic)的文件;
–target保存目标图案尺寸信息的文件。
结果

最后的–bag_from_to是选取地5-45s的bag数据,去除了拾取防止设备产生的抖动部分影响。我们建议进行多组标定之后将标定结果进行最佳无偏估计,不建议对R部分直接取平均值,可以将多组数据的R部分转换成四元数。之后进行处理。

else:

IMU和Cam标定数据采集的过程中,通常建议是camera采用20hz,imu采用200hz的频率。避免震动,避免照片模糊等,尤其是在标定开始和标定结束时。
图像和IMU的数据都采集好以后,就可以通过以下命令来生成ROS的bag包格式。
kalibr_bagcreater --folder dataset-dir --output-bag awsome.bag

可以通过rosbag info awsome.bag来检查生成的bag包是不是合格的。

除了bag包,命令还需要的三个参数分别是–target,–cam和–imu,分别是指的采集数据过程中用到的标定板的标准,camera的内参,imu的噪声数据。这里用到的标定板,都是需要安装1比1的比例打印出来,比如从kalibr上下载的pdf是个0.8m*0.8m的标定板。当然你也可以自己制作一个标定板,比如制作一个A4大小的标定板,然后在打印的时候选择不要做缩放,通过kalibr_create_target_pdf –h查看制作的方法。camera的内参标定是比较成熟的技术,这里不做介绍。而IMU的噪声参数一般可以通过IMU器件的datasheet来获得。

假如都没有问题的话,通过运行kalibr_calibrate_imu_camera,我们就能得到pdf,txt,和yaml3个结果文件。
我们主要关注results-imucam-%BAGNAME%.txt文件,根据这个结果来简单看看我们的标定是否有效。
其中reprojection误差最好不要超过5个像素,T_ic/T_ci矩阵中的位移应该根据设备IMU和Camera的实际位置来,一般应该是厘米或者毫米这样的尺度的数值。

猜你喜欢

转载自blog.csdn.net/qq_21830903/article/details/111319119