当前位置: 首页 > news >正文

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的参数了,需要根据实际情况调整,目前我还用默认的。

相关文章:

  • opencascade 源码学习 XmlDrivers-XmlDrivers
  • MyBatis面试常见问题
  • Post-Training Quantization, PTQ
  • 深入探索JVM字节码增强技术与调优实践
  • 基于Python+Django的二手房信息管理系统
  • 用于DiffTraj的行人轨迹数据预处理
  • 程序员学商务英语之Making Business Calls
  • 每日一题--内存池
  • 嵌入式软件开发--面试总结
  • VLLM专题(三十九)—自动前缀缓存(二)
  • 【资源损坏类故障】:详细了解坏块
  • Redis解决缓存击穿问题——两种方法
  • 【踩坑实录】-The function STRING takes only primitive types
  • Netty源码—1.服务端启动流程二
  • extern和static的作用(有例子)
  • 【AI绘图模型介绍】Checkpoint / LoRA / VAE / Embeddings 模型是什么?
  • Java:Apache HttpClient中HttpRoute用法的介绍
  • 如何让节卡机器人精准对点?
  • 基于基于eFish-SBC-RK3576工控板的智慧城市边缘网关
  • 3.3 二分查找专题: LeetCode 35. 搜索插入位置
  • 特朗普宣布提名迈克·沃尔兹为下一任美国驻联合国大使
  • 以色列消防部门:已控制住耶路撒冷山火
  • 解放日报:让算力像“水电煤”赋能千行百业
  • 人民日报评论员:焕发风雨无阻、奋勇前行的精气神
  • 印度宣布即日起对所有巴基斯坦航班关闭领空
  • 媒体:酒店、民宿临时毁约涨价,怎么管?