主要介绍Inter D435i深度相机的IMU、相机和IMU与相机外参数标定的过程。其中,IMU使用的是realsense官方文档的教程,相机和外参数使用的是Kalibr的标定方法。本文所介绍过程的所有代码和生成文件资源放在Kalibr工具包,可自行下载。
1. 相机内参标定
使用的是Kalibr工具,官方github网址https://github.com/ethz-asl/Kalibr
也可以在下载我上传的Kalibr工具包,里面有我标定过程添加的所有文件
1.1 配置依赖项
sudo apt-get install python-setuptools
sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen
sudo apt-get install 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
1.2 新建工作空间并初始化
mkdir -p ~/kalibr_ws/src
cd ~/kalibr_ws/src
catkin_init_workspace
cd ..
catkin_make
1.3 下载Kalibr包,放在新建工作空间的src文件夹下,然后编译
catkin_make
编译的时候需要联网,这个注意。编译的时候时间比较长,需耐心等待。
1.4 安装成功后,使用Kalibr生成标定版
kalibr_create_target_pdf --type apriltag --nx [NUM_COLS] --ny [NUM_ROWS] --tsize [TAG_WIDTH_M] --tspace [TAG_SPACING_PERCENT]
[]括号中的参数自己设置,type的类型可以自己指定(checkerboard或apriltag,checkerboard用的人比较多,但apriltag的精度听说比较高),执行该语句之前如果没有source,需要source一下,否则会报错kalibr_create_target_pdf:未找到命令。
我的生成棋盘格标定版的语句如下:
kalibr_create_target_pdf --type checkerboard --nx 6 --ny 7 --csx 0.030 --csy 0.030
但是运行之后报如下错误:ImportError: No module named pyx
解决方法:安装pyx
sudo apt-get install python-pyx
也可以自己从官网下载Kalibr标定纸:
https://github.com/ethz-asl/kalibr/wiki/downloads
1.5 编写yaml文件
生成或下载标定板之后,需要自己编写target.yaml文件,如下代码(注意配置文件中targetCols和targetRows是内角点的数量,即使用语句生成标定板时候的nx和ny),由于A4纸大小限制,我打印出来的每个正方形大小是0.029m:
u@u-1:~/kalibr_ws/src/Kalibr/data$ gedit checkerboard.yaml #新建一个yaml文件
target_type: 'checkerboard' #gridtype
targetCols: 6 #number of internal chessboard corners
targetRows: 7 #number of internal chessboard corners
rowSpacingMeters: 0.029 #size of one chessboard square [m]
colSpacingMeters: 0.029 #size of one chessboard square [m]
1.6 录制bag包
- 运行realsense相机
roslaunch realsense2_camera rs_camera.launch
- 将话题重命名为color,并利用throttle工具降低录制RGB图像的频率至4Hz
rosrun topic_tools throttle messages /camera/color/image_raw 4.0 /color
- 进入自己想要保存包的文件夹,然后用rosbag录制,ctrl+c结束录制
-O为重命名包的名字,这里命名为camd435i
rosbag record -O camd435i /color
注意:录制的过程中调整相机的角度,各个方向都采集一下,但是拍到的棋盘格要完整(可以使用打开rviz便于查看相机捕获的图像),否则在标定的时候会提示Detection failed!
- 进行标定
kalibr_calibrate_cameras --target ~/kalibr_ws/src/Kalibr/data/checkerboard.yaml --bag ~/kalibr_ws/src/Kalibr/data/camd435i.bag --models pinhole-equi --topics /color --show-extractio
运行过程是这样的,能看到匹配的点
但是最后报如下错误:
Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance.
参考解决办法:
[相机标定] 用Kalibr标定diy的双目相机
视觉SLAM | RealsenseD435i相机标定
即在刚才那个语句最后加上 –approx-sync 0.04,结果还是不行。
在Kalibr官网的issue中找到了一个解决办法,试一下看行不行。
Comment this code on line 201 of src/Kalibr/aslam_offline_calibration/kalibr/python/kalibr_calibrate_cameras to solve your problem:
if not graph.isGraphConnected():
obsdb.printTable()
print "Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance."
graph.plotGraph()
sys.exit(-1)
把kalibr_calibrate_cameras文件中的以上几行注释掉 (python用#注释)
看样子是行了,得到的yaml文件就是相机的一些参数信息
还同时生成了一个pdf图,看着还挺高大上,我这次标定的相机的参数如下(即yaml文件中的内容),供大家参考:
cam0:
cam_overlaps: []
camera_model: pinhole
distortion_coeffs: [0.2675889001505311, 3.1038754507254023, -19.132664356292445,
38.37925505823969]
distortion_model: equidistant
intrinsics: [601.7786572309608, 600.5297586706303, 327.04631436312826, 254.05812142168955]
resolution: [640, 480]
rostopic: /color
关于标定的结果
Kalibr标定Intel D435i相机
重投影误差的值越小越好,我的是0.163和0.138,精度应该够了。
Realsense d435i 驱动安装以及kalibr和imu_utils标定[Ubuntu 16 LTS]这个帖子的最后也有一些出现的问题和解决办法,我没有遇到,大家有遇到的可以看看,避免踩坑。
2. IMU标定
2.1 下载librealsense包,然后编译安装
mkdir build
cd build
cmake ..
然后再make和install
make
sudo make install
2.2 执行python rs-imu-calibration.py
rs-imu-calibration.py这个文件在librealsense/tools/rs-imu-calibration文件夹下
需要按照官方文档教程将所有的依赖项都安装好:
(1) Python 2.7或3
(2) 安装librealsense
(3) 安装realsense的SDK
(4) Pip或numpy或Enum
(5) pyrealsense2安装包
我第一次就没安装pyrealsense2,出现了如下报错(意思是缺少pyrealsense2):
解决:
sudo pip install pyrealsense2
或
sudo pip3 install pyrealsense2
2.3 调整相机的位姿进行标定
按照官方文档上的6个姿态调整,这一步挺考验耐心的,必须调整到正确的位姿。
(我终于知道为什么看到网上有把盒子挖开一个孔用来插入USB3.0的线来标定IMU了,真的是用手拿着太累了,并且稍微一动达不到系统要求的坐标就不行,会一直显示States rotate,这句话的意思就是告诉你要调整姿态移达到要求的姿态。)
提示Status.rotate是告诉你当前的姿态并不是正确的,需要调整,调对了之后会出现Status.collect_dataWARNING:MOVING倒计时,然后Status.collect_data[…]后面的绿色的小点点表示IMU正在采集数据,等小点点到最后的时候表示在这个姿态采集完毕,进行下一个姿态的调整。
6个姿态都采集完之后,标定结束,这个时候会提示:
Would you like to save the raw data?
是否将原始的数据保存?输入yes
Would you like to write the results to the camera?
是否将标定的结果写入IMU?输入Y,表示将标定的结果是写入到IMU。
呈上标定结果。
图片中的Serial number即你的D435相机盒子上的S/N码,至此,已经将你自己的IMU标定好并且把标定参数写入了你的相机。
3. 相机和IMU外参标定
3.1 编写camchain.yaml和IMU.yaml文件
将intrinsics和distortion_coeffs替换成你刚才表定好的相机参数,我的camchain.yaml内容如下:
cam0:
camera_model: pinhole
intrinsics: [601.7786572309608, 600.5297586706303, 327.04631436312826, 254.0581214216895]
distortion_model: equidistant
distortion_coeffs: [0.2675889001505311, 3.1038754507254023, -19.132664356292445,
38.37925505823969]
T_cam_imu:
- [0.01779318, 0.99967549,-0.01822936, 0.07008565]
- [-0.9998017, 0.01795239, 0.00860714,-0.01771023]
- [0.00893160, 0.01807260, 0.99979678, 0.00399246]
- [0.0, 0.0, 0.0, 1.0]
timeshift_cam_imu: -8.121e-05
rostopic: /color
resolution: [640, 480]
编写imu.yaml文件
rostopic: /imu
update_rate: 200.0 #Hz
accelerometer_noise_density: 0.01 #continous
accelerometer_random_walk: 0.0002
gyroscope_noise_density: 0.005 #continous
gyroscope_random_walk: 4.0e-06
3.2 启动相机
3.3 发布新话题和修改频率
参考:Kalibr标定Intel D435i相机
步骤大致和相机标定的步骤一样,不过变成处理两个话题
用throttle将图像频率降低为20HZ,imu频率设置为200Hz,并发布新的话题
rosrun topic_tools throttle messages /camera/color/image_raw 20.0 /color
rosrun topic_tools throttle messages /camera/gyro/image_info 200.0 /imu
3.4 录制rosbag包
rosbag record -O camimu /color /imu
3.5 标定
kalibr_calibrate_imu_camera --target ~/kalibr_ws/src/Kalibr/data/checkerboard.yaml --cam ~/kalibr_ws/src/Kalibr/data/camchain.yaml --imu ~/kalibr_ws/src/Kalibr/data/imu.yaml --bag ~/kalibr_ws/src/Kalibr/data/camimu.bag --show-extraction
至此,D435i相机的标定过程介绍完毕。