Orbslam V3使用Kalibr标定参数详解(D435i)
工具:电脑,D435i。
一、Kalibr标定过程
看了很多博客,这几个就够了,:
realsenseD435i imu+双目标定
Intel Realsense D435i各类标定教程
Kalibr教程很多不再赘述,推荐用虚拟机安装纯净的18.04系统,可以丝滑标定,没有任何报错的烦恼。反正我们也只是要标定文件而已。
注意:1,A4纸按照比例打印Apriltag的标定纸,我选的A0版本用25%打印刚好是22mm,棋盘格可能标定失败!
2、D435i的相机模型请采用 pinhole-radtan
二、Orbslam V3使用Kalibr标定参数
Orbslam V3的安装由于版本更迭很快,需要单独下载和更新大量的依赖,教程不好推荐,假定各位已经能跑通了。
我主要参考的这个博客,其他也搜索了很多,因为bug太多了……
Ubuntu20.04的ROS环境安装ORB-SLAM3详解_树莓派ubuntu20.04运行orbslam3与ros-CSDN博客
那么需要根据步骤1的标定结果对文件进行修改了。
可参考:
相机校准参数说明_camchain。yaml-CSDN博客
具体单孔相机模型不多解释。这里针对最复杂的双目+IMU进行标定参数对应,只说参数的关系。
Kalibr标定D435i双目+IMU的结果文件有两个(文件名字不要在意)为:imu1_camera1_calibration-camchain-imucam.yaml
cam0:
T_cam_imu:
- [0.9998667806894084, 0.006375288602338348, 0.015025863337462421, 0.005867223835500914]
- [-0.006608125275398803, 0.9998580722259534, 0.015497357353612325, -0.003560363660871571]
- [-0.014924930624422952, -0.015594585593654653, 0.9997670005286328, -0.019070029208681203]
- [0.0, 0.0, 0.0, 1.0]
camera_model: pinhole
distortion_coeffs: [-0.0030847663085048207, -0.021891755432892658, -0.004335513153985044, -0.0038385422584184072]
distortion_model: radtan
intrinsics: [378.387868419645, 378.2456368515959, 321.00438891481826, 233.0759309685256]
resolution: [640, 480]
rostopic: /infra_left
timeshift_cam_imu: 0.00212242145236857
cam1:
T_cam_imu:
- [0.9999484260543486, 0.007762230280121323, 0.006549275724011119, -0.04399664378742102]
- [-0.007852876542896054, 0.9998721304325096, 0.013930366626785743, -0.0034326123548541893]
- [-0.006440307557313285, -0.013981078836520477, 0.9998815189176836, -0.019274738544956243]
- [0.0, 0.0, 0.0, 1.0]
T_cn_cnm1:
- [0.9999631085946177, 0.0012548406020533656, -0.008497459905133446, -0.05002123029249974]
- [-0.0012680412059798696, 0.9999979974683489, -0.0015482670244089613, 0.00010565856048629058]
- [0.00849550006037604, 0.0015589850359684046, 0.9999626973264397, -0.000249715146128108]
- [0.0, 0.0, 0.0, 1.0]
camera_model: pinhole
distortion_coeffs: [-0.027086571102767586, 0.010513859321888032, -0.0037243680548281035, -0.004012747581847896]
distortion_model: radtan
intrinsics: [377.95400193748776, 378.4468964940852, 324.49266716139476, 233.5738570132219]
resolution: [640, 480]
rostopic: /infra_right
timeshift_cam_imu: 0.0019975113664620916
imu1_camera1_calibration-imu.yaml
imu0:
T_i_b:
- [1.0, 0.0, 0.0, 0.0]
- [0.0, 1.0, 0.0, 0.0]
- [0.0, 0.0, 1.0, 0.0]
- [0.0, 0.0, 0.0, 1.0]
accelerometer_noise_density: 0.013264991905988977
accelerometer_random_walk: 0.00032908731500860914
gyroscope_noise_density: 0.0016773713474849666
gyroscope_random_walk: 2.3216393346264973e-05
model: calibrated
rostopic: /imu
time_offset: 0.0
update_rate: 200.0
(1)单孔相机模型参数修改
根据官网对参数的解释:
https://github.com/ethz-asl/kalibr/wiki/supported-models
- Camera models
- pinhole camera model (pinhole)1
(intrinsics vector: [fu fv pu pv])- fu, fv: focal-length
- pu, pv: principal point
Distortion models
- radial-tangential (radtan)*
(distortion_coeffs: [k1 k2 r1 r2])
显然,这里的参数对应的就是上面标定文件中相机对应的生成参数。
而orbslam v3 的自带文档 Calibration_Tutorial.pdf 中说:
那么,即使符号不同,对应关系还是显然的,两个相机同理,我们发现默认参数其实与我们的标定结果差距不大,如果差距很大,那就是标定出了问题。
cam0:
intrinsics: [378.387868419645, 378.2456368515959, 321.00438891481826, 233.0759309685256]
对应
kalibr intrinsics vector: [fu fv pu pv]
对应
Orbslamv3 intrinsics vector: [fx fy cx cy]
distortion_coeffs: [-0.0030847663085048207, -0.021891755432892658, -0.004335513153985044, -0.0038385422584184072]
对应
kalibr distortion_coeffs: [k1 k2 r1 r2]
对应
Orbslamv3 intrinsics vector: [k1 k2 p1 p2]
(2)双目相机的模型参数修改
orbslam原始文件为:
Tlr: !!opencv-matrix
rows: 3
cols: 4
dt: f
data: [1.0, 0.0, 0.0, 0.0499585,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0]
这个李代数SE(3)矩阵最后一列的从上往下3个元素代表了cam和imu的相对位移xyz,左侧左上开始三行三列是相对旋转,这是李代数的基本知识,简单提一下,可以想象一下大概的位置。
顾名思义,这是两个相机之间的相对关系,理想间距5cm=0.05m,l就是left = cam0;
我们kalibr标定的结果是:
T_cn_cnm1 = T_c1_c0,将cam0转换为cam1坐标,cam0是left,cam1是right
T_cn_cnm1:
- [0.9999938453097464, -8.970815804688961e-05, -0.003507320212236771, -0.05008249486188303]
- [8.607618757156179e-05, 0.9999994599815999, -0.001035677264616788, 0.00010440579049538496]
- [0.0035074112269190645, 0.0010353689935915609, 0.9999933130164073, -0.0004170868473455056]
- [0.0, 0.0, 0.0, 1.0]
对应关系很明显,也说明Kalibr涉及到的旋转顺序与Orbslam的旋转顺序相反,参考Ubuntu 18.04 ———(Intel RealSense D435i)标定后结果用于VINS-Fusion
需要将我们的标定 T_cn_cnm1,matlab求个逆矩阵填进去就行了
Tlr: !!opencv-matrix
rows: 3
cols: 4
dt: f
data: [0.999963108594631, -0.001268041205980, 0.008495500060376, 0.050021640373463,
0.001254840602053, 0.999997997468362, 0.001558985035968, -0.000042500375990,
-0.008497459905134 , -0.001548267024409, 0.999962697326453, -0.000175183980065,
0.0, 0.0, 0.0, 1.0]
(3)相机与IMU相对关系的模型参数修改
orbslam的原始文件中为:
# Transformation from body-frame (imu) to left camera
Tbc: !!opencv-matrix
rows: 4
cols: 4
dt: f
data: [1,0,0,-0.005,
0,1,0,-0.005,
0,0,1,0.0117,
0.0, 0.0, 0.0, 1.0]
根据orbslam定义,b就是base=imu,c是left=cam0
而我的标定结果,用了两个d435i分别如下,由于IMU本身就漂移啊,个人建议这个标定就用默认的就好,一两个毫米的误差我觉得真的很难一次标出来:
第一个D435i,cam0就是orbslam中的左侧相机:
cam0:
T_cam_imu:
- [0.9998667806894084, 0.006375288602338348, 0.015025863337462421, 0.005867223835500914]
- [-0.006608125275398803, 0.9998580722259534, 0.015497357353612325, -0.003560363660871571]
- [-0.014924930624422952, -0.015594585593654653, 0.9997670005286328, -0.019070029208681203]
- [0.0, 0.0, 0.0, 1.0]
第二个D435i,cam0就是orbslam中的左侧相机:
cam0:
T_cam_imu:
- [0.9999963676343772, -0.0016489760336739641, 0.0021320403595009216, -0.00042897830044040606]
- [0.0016380255086217857, 0.9999855113884378, 0.0051277563943757844, -0.0019095959039686333]
- [-0.0021404650165971592, -0.0051242454319954545, 0.9999845801402479, -0.007927239727198445]
- [0.0, 0.0, 0.0, 1.0]
以上参数对应关系一目了然,想要用还是需要求个逆矩阵,不赘述了。
(4)其他相机参数:
由于标定文件中没有参考,建议默认,分辨率和fps按照实际情况改就行了。
# Camera resolution
Camera.width: 640
Camera.height: 480
# Camera frames per second
Camera.fps: 30.0
# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 1
# Image scale, it changes the image size to be processed (<1.0: reduce, >1.0: increase)
Camera.imageScale: 0.5 # 0.5 #0.7071 # 1/sqrt(2)
# Close/Far threshold. Baseline times.
ThDepth: 40.0
# stereo baseline times fx
Camera.bf: 19.114771561
(4)IMU参数:
orbslam中的文件为:
# IMU noise (Use those from VINS-mono)
IMU.NoiseGyro: 1e-3 # 2.44e-4 #1e-3 # rad/s^0.5
IMU.NoiseAcc: 1e-2 # 1.47e-3 #1e-2 # m/s^1.5
IMU.GyroWalk: 1e-6 # rad/s^1.5
IMU.AccWalk: 1e-4 # m/s^2.5
IMU.Frequency: 200
我标定的结果如下,imu=base,所以之间的SE(3)就是单位矩阵:
T_i_b:
- [1.0, 0.0, 0.0, 0.0]
- [0.0, 1.0, 0.0, 0.0]
- [0.0, 0.0, 1.0, 0.0]
- [0.0, 0.0, 0.0, 1.0]
accelerometer_noise_density: 0.013264991905988977
accelerometer_random_walk: 0.00032908731500860914
gyroscope_noise_density: 0.0016773713474849666
gyroscope_random_walk: 2.3216393346264973e-05
model: calibrated
rostopic: /imu
time_offset: 0.0
update_rate: 200.0
对应关系一目了然。
其余参数是orbslam的参数了,需要根据实际情况调整,目前我还用默认的。