标定D435i(二) 相机

Kalibr可以解决以下的标定问题:

  • 多相机标定: 一个相机系统的内外参标定,这几个相机没有全局性重叠的视角
  • 视觉惯性标定(camera-IMU): IMU关于相机系统的时空间标定
  • Rolling Shutter Camera calibration: full intrinsic calibration (projection, distortion and shutter parameters) of rolling shutter cameras

可以下载Kalibr源码编译生成可执行文件,也可以下载其CDE精简版包。这中间有个坑就是CDE精简包是没有办法标定彩色图片的,而D435输出的是彩色图。所以还是按编译源码的方式

使用Kalibr标定相机的内参和多个相机相对位置关系即外参

安装Kalibr

  1. 安装依赖项

    1
    sudo apt-get install python-pyx python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen ros-kinetic-vision-opencv ros-kinetic-image-transport-plugins ros-kinetic-cmake-modules python-software-properties 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
  2. 源码放入工作空间进行编译,会花很长时间,所以编译命令要这样:

    1
    2
    # 视情况取j8
    catkin_make -DCMAKE_BUILD_TYPE=Release -j4

编译kalibr可能会出现 fatal error: numpy/arrayobject.h: No such file or directory ,解决方法: sudo apt-get install --reinstall python-numpy

可能出现catkin_make时,下载suitesparse过久甚至失败的问题。解决方法: 修改~/catkin_ws/src/kalibr/suitesparse中的CMakeLists.txt为新CMakeLists.txt, 然后重新catkin_make

标定板

下载标定板

我下载的是Aprilgrid 6x6 0.5x0.5m(unscaled), 打印在A3纸上

原版的参数是:6X6 tags,6乘6个格子,一个大格子size=5.5cm,一个小格子spacing=1.65cm

A3纸上的缩放:6X6 tags,一个大格子size=3.5cm,一个小格子spacing=1cm。记得打印出来用尺子量一下,以免出现差错。
标定板参数示意图

下载官网提供的yaml格式文件,需要按照设定的尺寸进行修改

1
2
3
4
5
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.035 #size of apriltag, edge to edge [m]
tagSpacing: 0.3 #ratio of space between tags to tagSize

找一个适合的能拍到棋盘格的距离,启动相机: roslaunch realsense2_camera rs_camera.launch

d453i是有红外发射器的,可以发射很多红外小斑点,如果打开你会在rviz看到很多光斑,可能不利于标定,所以标定时关闭这个发射器的。

降低图像话题的频率,录制图像数据包

kalibr在处理标定数据的时候要求图像的频率不可过高,一般为4hz(后面计算过程报错,改为20)。使用如下指令来限制图像频率:

1
2
3
rosrun topic_tools throttle messages /camera/color/image_raw 4 /color
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 4 /infra_left
rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 4 /infra_right

用topic_tools throttle限制频率后,一定要查看限制后的topic输出频率:rostopic hz /topic,你会发现实际的频率与设定的频率并不一致,比如:rosrun topic_tools throttle messages /topic_1 25 /topic_2,如果topic_1是40hz,/topic_2可能不是25hz,而是20hz,而且每次的实际频率可能不同,具体原因不明。

注意这里是采用了新的话题/color去发布,所以下面录制要写/color话题

将标定目标AprilGrid置于相机前方合理距离范围内,准备录制两分钟:

1
rosbag record -O multicameras_calibration /infra_left /infra_right /color

开始缓慢移动标定板,让所有摄像头看到标定板不要太远,不然无法检测到标定目标的特征,这个过程中看不到图案的识别结果,这是kalibr的原因。在标定算法中需要检测是否有足够数量图片检测到标定特征,否则直接无法标定。移动标定物时候不要过快导致运动模糊,我们只需要获取不同位置和角度的图像,确保图像清晰和特征完整即可。另外要尽可能多角度和多位置(上下左右等)甚至到摄像头捕捉图像的边缘,这样移动目标1min左右即可。

移动的方式可以参考TUM CALIBRATION SEQUENCES的标定方式,点play即可播放

kalibr算法计算各个摄像头的内参和外参

april_6x6_A3.yaml: 标定物的参数,具体是标定目标的尺寸之类,因为我是缩小打印在A3上,所以要对参数进行修改;pinhole-equi – 选择的相机模型,kalibr提供了很多相机模型,可以自己选择; —bag-from-to 可以选择时间段,毕竟录制的时候不能保证整体都录制的很好。标定会花很长时间,最后会输出一个pdf和txt文件,有内外参数据。

只标定主相机:

1
kalibr_calibrate_cameras --target ../yaml/april_6x6_A4.yaml --bag ./bag/0_multicameras_calibration.bag --model pinhole-equi  --topic  /color  --show-extraction --approx-sync 0.04

最后还是标定的多相机:

1
kalibr_calibrate_cameras --target april_6x6_A3.yaml --bag multicameras_calibration.bag --models pinhole-equi pinhole-equi pinhole-equi --topics /infra_left /infra_right /color  --show-extraction --approx-sync 0.04 --bag-from-to 10 100

  • pinhole-radtan指的是针孔相机模型和畸变模型,每个相机都要指定。还有Pinhole + FOV等等
  • --bag-from-to 10 100指的是录制的第26秒到100秒这段时间
  • --show-extraction, 在标定过程中可视化角点检测情况是否良好
  • --approx-sync 0.04

结果报错: ImportError: No module named igraph
解决方法: sudo apt-get install python2.7-igraph

需要在有界面的情况下标定,因为会弹出几个窗口,所以不能通过SSH进行,类似这样:

可以使用calibration validator进行标定的验证,原理是对重投影误差进行量化分析,同样需要有界面:
kalibr_camera_validator --cam camchain-multicameras_calibration.yaml --target april_6x6_A3.yaml
验证结果.png