保姆级ubuntu20.04使用kalibr对d435i相机标定(RGB相机,双目,双目联合imu标定)
观前提醒:
本文仅为作者日后学习温习方便故记录,如有错漏之处尽管指出,请谅解
首先明白:
/camera/color/image_raw为RGB相机的图像话题
其主要用于RGB图像的采集或彩色点云的生成,不参与双目深度计算或VIO(视觉惯性里程计)标定。(ai说的)
/camera/infra1/image_rect_raw
/camera/infra2/image_rect_raw分别为左右目红外相机图像
用于双目深度计算、SLAM算法(如VINS-Fusion)的标定和运行(ai说的)
注意自己是需要什么,本文将分别展示RGB相机标定,双目相机标定,imu标定,双目相机联合imu标定
前置操作
安装Kalibr
推荐在主目录下新建一个工作空间
mkdir kalibr_ws
cd kalibr_ws
mkdir src
cd src
git clone https://github.com/ethz-asl/Kalibr.git
cd ..
catkin build -DCMAKE_BUILD_TYPE=Release -j4
安装好D435i相机驱动
这个网上有很多教程了我就不做了,主要还是太久之前做的很多细节忘记了
关闭结构光
注意每一次相机标定的时候若出现的图像中有很多的白色点点,那么就都是没有关闭结构光
要先开驱动
开驱动:
roslaunch realsense2_camera rs_camera.launch
然后另开一个终端:
rosrun rqt_reconfigure rqt_reconfigure
进行如图所示操作改为off(0)
1.RGB相机标定
1.1准备标定板
1.网上购买
2.自己打印----作者使用
作者这里是使用的aprilgrid标定板,打开网址
https://github.com/ethz-asl/kalibr/wiki/downloads
下载
下载这两份文件,其中pdf拿去打印,正常a4纸打出来就刚好,打印完可以量一下看看一个小方块是不是正好2cm
yaml文件放入kalibr_ws文件中并修改为
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.02 #size of apriltag, edge to edge [m]
tagSpacing: 0.3 #ratio of space between tags to tagSize
codeOffset: 0 #code offset for the first tag in the aprilboard
这些参数的意义可以看这篇文章或者问问ai
Ubuntu20 Kalibr标定d435i_ubuntu kalibr-CSDN博客
1.2录制bag
开启相机驱动
roslaunch realsense2_camera rs_camera.launch color_width:=640 color_height:=480 color_fps:=30
运行如下,将相机帧率改为4帧(官方推荐帧数),并得到发布4帧图像的新话题cam0/color/image_raw
rosrun topic_tools throttle messages /camera/color/image_raw 4.0 /cam0/color/image_raw
运行如下,找到修改帧率后的话题,然后看着图像内容,防止录制bag的时候图像出现标定板丢失的情况
rqt_image_view
开始录制bag,可以参考官方的步骤
步骤如下:
(1)俯仰角摆动3次
(2)偏航角摆动3次
(3)翻滚角摆动3次
(4)上下移动3次
(5)左右移动3次
(6)前后移动3次
(7)自由移动,摆动幅度大一些,但要移动缓慢些,使得标定目标尽可能出现在相机的所有视野范围内
整体标定时间在90s以上
rosbag record /cam0/color/image_raw
录制完成后,放入kalibr_ws下
1.3标定
rosrun kalibr kalibr_calibrate_cameras --target april_6x6_80x80cm.yaml--bag RGB.bag --models pinhole-radtan pinhole-radtan --topics /cam0/color/image_raw /cam1/color/image_raw
标定结束后,会弹出图形界面,关闭后会生成pdf,txt以及yaml三个标定结果文件,可以通过yaml文件查看具体的标定结果。打开其中pdf文件,如图
为重投影误差,其为+-0.2以内就表示这次标定比较成功
2.双目标定
2.1录制bag
将建好的标定板的yaml放到kalibr_ws文件下,这个标定板用的是之前的
//开启驱动
roslaunch realsense2_camera rs_camera.launch color_width:=640 color_height:=480 color_fps:=30
//修改话题频率为4帧
rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 4.0 /infra_left
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 4.0 /infra_right
//开启修改后的话题图像,开两个,盯着左目右目,保证标定板能全程在相机范围内,且不要大幅度抖动或者有明显旋光,或许背景的特征点也有关(未求证)这些很重要的,你的bag录的越好,标定后重投影误差越小
rqt_image_view
rqt_image_view
//开始录bag
rosbag record -O camera_left_right.bag /infra_left /infra_right
录完后,放到yaml相同位置
2.2标定
rosrun kalibr kalibr_calibrate_cameras --target /home/good/kalibr_ws/april_6x6_80x80cm.yaml --bag /home/good/kalibr_ws/camera_left_right.bag --models pinhole-equi pinhole-equi --topics /infra_left /infra_right --bag-from-to 10 100 --show-extraction --approx-sync 0.1
--approx-sync 0.1是控制着相机帧的时间对齐容差,增加这个容差可以允许两个相机在略有不同的时间拍摄到相同的标定点
标定完成后,一样的会多出三个文件,去到pdf文件检查下重投影误差,这是我标定成功后出来的
+-0.35,应该勉强够用,,,,,其实从1点多到0.35也就多做了这几步:(友情提示,这些步骤到底有没有用建议各位读者可以自行查看更多资料求证,作者只是分享自身经历)
1.背景干净,不知道是不是因为减少了多余特征点的缘故,而且如果背景花的话,往往标定的时候有报错
2.原本我是手动相机来进行的,后来感觉手不够稳定,会有一些大的抖动可能不太好,改成相机静止,移动标定板,也是模拟相机xyz移动且旋转,注意旋转是绕xyz轴的旋转,即roll,pitch,yaw角的旋转
3.imu标定
3.1imu标定的前置部署
3.11部署code_utils
建立一个工作空间imu_ws,并下载code_utils
mkdir imu_ws
cd imu_ws
mkdir src
cd src
git clone https://github.com/gaowenliang/code_utils.git
打开下载的code_utils里面的一个文件sumpixel_test.cpp
将 #include "backward.hpp"
修改为:#include "code_utils/backward.hpp"
打开code_utils的cmake文件,添加红色括着的这两行
而后进入imu_ws,编译
catkin_make
3.12部署imu_utils
cd src
git clone https://github.com/gaowenliang/imu_utils.git
cd ..
catkin_make
3.2录制bag
启动驱动,看看有没有/camera/imu这个话题
注意,这里为什么启动驱动的代码和之前不一样,之前是roslaunch realsense2_camera rs_camera.launch color_width:=640 color_height:=480 color_fps:=30
因为我发现之前这个驱动没有/camera/imu话题,所以我换了一个,注意这个驱动应该是我自己改过的,我记得和原版roslaunch realsense2_camera rs_camera.launch没什么区别,所以应该是可以的
roslaunch realsense2_camera rs_camera_vins.launch gyro_fps:=200 accel_fps:=200
rosbag record /camera/imu --duration=2.5h
表示录制2.5小时后自动关闭,注意不要去动imu,且大概会录制有1g以上的包,注意预留内存
3.3标定imu
先在
/home/good/imu_ws/src/imu_utils/launch
路径下新建launch文件,输入如下
然后运行这个launch文件,这里roscore是因为后面播放刚刚录制的bag需要,我也不清楚为什么我已经roslaunch了还要roscore......
roscore
roslaunch imu_utils D435i_imu.launch
播放bag,去到录制的bag路径下
rosbag play -r 200 D435i_imu.bag
然后等待即可
突然出现如下图表示标定成功
然后去到你刚刚launch指定的路径下,找到yaml文件,内容如下
4.双目联合imu标定
4.1修改imu标定生成的文件
注意:开始双目联合imu标定之前要先完成对双目的标定和imu的标定
录制bag要有三个文件,分别是
标定板的yaml,用之前的就可以
左右目相机标定的yaml,之前相机标定的
imu标定后得到的yaml里的参数所计算出来的一个新格式的yaml文件,格式如下:
# Accelerometers
accelerometer_noise_density: 2.4647452745941725e-02 # Noise density (continuous-time) from Acc.avg-axis.acc_n
accelerometer_random_walk: 8.1896199375219283e-04 # Bias random walk from Acc.avg-axis.acc_w
# Gyroscopes
gyroscope_noise_density: 2.3039263794390340e-03 # Noise density (continuous-time) from Gyr.avg-axis.gyr_n
gyroscope_random_walk: 2.0864596667947952e-05 # Bias random walk from Gyr.avg-axis.gyr_w
rostopic: /imu # the IMU ROS topic
update_rate: 200.0 # Hz (for discretization of the values above)
建议把你imu标定后的文件的参数给ai让他帮你求这些参数
4.2修改驱动文件
使imu和双目数据时间对齐
进入驱动文件,修改如下:
4.3录制bag与标定
驱动启动:(注意启动有/camera/imu话题的)
//驱动启动:(注意启动有/camera/imu话题的)
roslaunch realsense2_camera rs_camera_vins.launch gyro_fps:=200 accel_fps:=200
//修改频率
rosrun topic_tools throttle messages /camera/imu 200.0 /imu
rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 4.0 /infra_left
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 4.0 /infra_right
//开两个盯着左目右目防止标定版丢失
rqt_image_view
//录制bag
rosbag record -O imu_stereo_20220223.bag /infra_left /infra_right /imu
//开始标定 参数自己替换与修改
rosrun kalibr kalibr_calibrate_imu_camera --bag imu_stereo_20220223.bag --cam camera_left_right-camchain.yaml --imu imu_biaodingd435i_imu_param.yaml --target april_6x6_80x80cm.yaml --bag-from-to 5 100
完成后即可,恭喜你完成了标定
参考文章
D435i kalibr标定环境部署及双目IMU标定文档_kalibr标定环境配置-CSDN博客
相机-IMU标定(以英特尔D435i为例)_d435i标定-CSDN博客
使用kalibr标定双目相机以及IMU--安装运行标定全过程以及踩坑记录-CSDN博客
Ubuntu20 Kalibr标定d435i_ubuntu kalibr-CSDN博客
D435i kalibr标定环境部署及双目IMU标定文档_kalibr标定环境配置-CSDN博客