主要介绍Inter D435i深度相机的IMU、相机和IMU与相机外参数标定的过程。其中,IMU使用的是realsense官方文档的教程,相机和外参数使用的是Kalibr的标定方法。
目录
- 1. 相机内参标定
-
- 1.1 配置依赖项
- 1.2 新建工作空间并初始化
- 1.3 下载Kalibr包,放在新建工作空间的src文件夹下,然后编译
- 1.4 安装成功后,使用Kalibr生成标定版
- 1.5 编写yaml文件
- 1.6 录制bag包
- 关于标定的结果
- 2. IMU标定
-
- 2.1 下载[librealsense](https://github.com/IntelRealSense/librealsense)包,然后编译安装
- 2.2 执行python rs-imu-calibration.py
- 2.3 调整相机的位姿进行标定
- 3. 相机和IMU外参标定
-
- 3.1 编写camchain.yaml和IMU.yaml文件
- 3.2 启动相机
- 3.3 发布新话题和修改频率
- 3.4 录制rosbag包
- 3.5 标定
1. 相机内参标定
使用的是Kalibr工具,官方github网址https://github.com/ethz-asl/Kalibr
1.1 配置依赖项
1 2 3 | 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 新建工作空间并初始化
1 2 3 4 5 | mkdir -p ~/kalibr_ws/src cd ~/kalibr_ws/src catkin_init_workspace cd .. catkin_make |
1.3 下载Kalibr包,放在新建工作空间的src文件夹下,然后编译
1 | catkin_make |
编译的时候需要联网,这个注意。编译的时候时间比较长,需耐心等待。
1.4 安装成功后,使用Kalibr生成标定版
1 | 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:未找到命令。
我的生成棋盘格标定版的语句如下:
1 | kalibr_create_target_pdf --type checkerboard --nx 6 --ny 7 --csx 0.030 --csy 0.030 |
但是运行之后报如下错误:ImportError: No module named pyx
解决方法:安装pyx
1 | 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:
1 | u@u-1:~/kalibr_ws/src/Kalibr/data$ gedit checkerboard.yaml #新建一个yaml文件 |
1 2 3 4 5 | 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相机
1 | roslaunch realsense2_camera rs_camera.launch |
- 将话题重命名为color,并利用throttle工具降低录制RGB图像的频率至4Hz
1 | rosrun topic_tools throttle messages /camera/color/image_raw 4.0 /color |
- 进入自己想要保存包的文件夹,然后用rosbag录制,ctrl+c结束录制
-O为重命名包的名字,这里命名为camd435i
1 | rosbag record -O camd435i /color |
注意:录制的过程中调整相机的角度,各个方向都采集一下,但是拍到的棋盘格要完整(可以使用打开rviz便于查看相机捕获的图像),否则在标定的时候会提示Detection failed!
- 进行标定
1 | 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:
1 2 3 4 5 | 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文件中的内容),供大家参考:
1 2 3 4 5 6 7 8 9 | 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标定
官方文档https://www.intel.com/content/dam/support/us/en/documents/emerging-technologies/intel-realsense-technology/RealSense_Depth_D435i_IMU_Calib.pdf
还有的说使用imu_utils和kalibr(我没有试)
2.1 下载librealsense包,然后编译安装
1 2 3 | mkdir build cd build cmake .. |
然后再make和install
1 2 | 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):
解决:
1 2 3 | 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标定好并且把标定参数写入了你的相机。
参考:Intel 深度摄像D435i 的标定
3. 相机和IMU外参标定
3.1 编写camchain.yaml和IMU.yaml文件
将intrinsics和distortion_coeffs替换成你刚才表定好的相机参数,我的camchain.yaml内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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文件
1 2 3 4 5 6 7 | 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,并发布新的话题
1 2 | 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包
1 | rosbag record -O camimu /color /imu |
3.5 标定
1 | 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相机的标定过程介绍完毕。