Inter Realsense D435i标定详细步骤


主要介绍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包

  1. 运行realsense相机
1
roslaunch realsense2_camera rs_camera.launch

在这里插入图片描述

  1. 将话题重命名为color,并利用throttle工具降低录制RGB图像的频率至4Hz
1
rosrun topic_tools throttle messages /camera/color/image_raw 4.0 /color

在这里插入图片描述

  1. 进入自己想要保存包的文件夹,然后用rosbag录制,ctrl+c结束录制
    -O为重命名包的名字,这里命名为camd435i
1
rosbag record -O camd435i /color

在这里插入图片描述

注意:录制的过程中调整相机的角度,各个方向都采集一下,但是拍到的棋盘格要完整(可以使用打开rviz便于查看相机捕获的图像),否则在标定的时候会提示Detection failed!

  1. 进行标定
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 ..

cmake结果
然后再make和install

1
2
make
sudo 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):
在这里插入图片描述
解决:

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。
呈上标定结果。

D435i的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相机的标定过程介绍完毕。