学习Kalibr工具--Camera与IMU联合标定过程

2023-05-16

上一节介绍了,用kalibr工具对camera进行标定的操作流程,在camera标定之好之后,进行camera与IMU进行联合标定的操作的学习,即求取相机和IMU 之间的转换关系(坐标系之间的相对位姿矩阵);需要先知道相机的内外参数(单目的内外参数和双目的内外参数),用kalibr工具进行 单目标定或者双目标定上一节已介绍。
这里以双目+IMU为例进行介绍相机和IMU 的联合标定,也叫多传感器融合;

一、camera - IMU相机标定介绍

参考链接:https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration

  • (一)标定的输出文件包括:
    1.包含图像和IMU数据的 bag包; ( cam_imu.bag文件):采集数相机图片和IMU数据
    2.相机参数文件; ( camchain.yaml文件):包含相机的内参和畸变参数的YAML文件(该文件包含相机内在和外在参数的校准以及IMU相对于相机的空间和时间校准参数。)
    3.IMU参数文件; ( imu.yaml文件):包含IMU的基本参数,噪音等
    4.标定板参数; ( target.yaml文件):标定板标准
  • (二)当上述文件都准备好的时候,执行命令行:
kalibr_calibrate_imu_camera –target xx/target.yaml –cam xx/camchain.yaml –imu xx/IMU.yaml –bag xx/xx.bag –bag-from-to 5 45 

由于数据在采集过程中,在开始和结束处存在躁动和激励,所以仅使用 5到45秒之间的数据;

  • (三)输出结果:
    report-imucam-%BAGNAME%.pdf: Report in PDF format. Contains all plots for documentation.
    results-imucam-%BAGNAME%.txt: Result summary as a text file.
    camchain-imucam-%BAGNAME%.yaml: 这个文件是在输入文件camchain.yaml基础上增加了标定后的cam-imu信息的结果文件。我们想要的T_cam_imu矩阵就在这里。

二、标定数据制作过程

1.数据采集: 数据采集的过程是手持需要标定的设备,同时激活camera和imu器件分别采集图像和imu数据,对着预先制作好的标定板,在激励充分(从不同的角度,旋转和平移,对标定板拍照,并且使得IMU的accel和gyro两个器件的三个轴都被激活)的情况下,同时保存图像和IMU的数据。采集到的数据应该如下所示(双目+IMU):(假如是单目的话,只需要保留cam0和imu0.csv即可。)

+-- dataset-dir 
    +-- cam0 
    │   +-- 1385030208726607500.png 
    │   +--      ... 
    │   -- 1385030212176607500.png 
    +-- cam1 
    │   +-- 1385030208726607500.png 
    │   +--      ... 
    │   -- 1385030212176607500.png 
    -- imu0.csv

imu0.csv是一个文本文件,是IMU的数据,每一行就是一个gyro和accel在某一时刻的读数,如下所示: 19位时间戳(精确到ns),角速度,含重力的加速度

(timestamps=[ns], omega=[rad/s], alpha=[m/s^2])
timestamp,omega_x,omega_y,omega_z,alpha_x,alpha_y,alpha_z 
1385030208736607488,0.5,-0.2,-0.1,8.1,-1.9,-3.3 
 ... 
1386030208736607488,0.5,-0.1,-0.1,8.1,-1.9,-3.3

2.制作 .bag包: 将在连续时间内通过采集获得的拍摄标定板的图像和IMU 的数据文件(上述中的:cam0、cam1、imu0.csv),将三个数据利用kalibr工具转化为 .bag格式文件,因为kalibr的所有应用程序使用ROS包作为图像和IMU 的数据的源;bag文件制作参考: https://github.com/ethz-asl/kalibr/wiki/bag-format;命令行(创建ROS包):
kalibr_bagcreater --folder dataset-dir/. --output-bag awsome.bag
dataset-dir/. 是数据输入路径:
其内文件结构应是这样:
dataset-dir/cam0/image_raw
dataset-dir/cam1/image_raw
dataset-dir/imu0
awsome.bag 是制作好的bag文件。输出默认在kalibr_bagcreater同目录下。
注意:a.在包含图片的文件夹的同一目录下需要一个:output空白文件夹,否则 .bag 文件无法生成
b.生成的.bag文件使用:rosbag info XX.bag 判定是否生成成功,如果只有4kb,则生成失败,而一般情况都是路径问题
c.calib可以标定单目+imu,bag内只放单目图像,修改带参运行中的参数即可。

3.相机参数文件: camchain.yaml
camchain.yaml 文件模板:

cam0:
  camera_model: pinhole
  intrinsics: [461.629, 460.152, 362.680, 246.049]
  distortion_model: radtan
  distortion_coeffs: [-0.27695497, 0.06712482, 0.00087538, 0.00011556]
  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: /cam0/image_raw
  resolution: [752, 480]
cam1:
  camera_model: omni
  intrinsics: [0.80065662, 833.006, 830.345, 373.850, 253.749]
  distortion_model: radtan
  distortion_coeffs: [-0.33518750, 0.13211436, 0.00055967, 0.00057686]
  T_cn_cnm1:
  - [ 0.99998854, 0.00216014, 0.00427195,-0.11003785]
  - [-0.00221074, 0.99992702, 0.01187697, 0.00045792]
  - [-0.00424598,-0.01188627, 0.99992034,-0.00064487]
  - [0.0, 0.0, 0.0, 1.0]
  T_cam_imu:
  - [ 0.01567142, 0.99978002,-0.01393948,-0.03997419]
  - [-0.99966203, 0.01595569, 0.02052137,-0.01735854]
  - [ 0.02073927, 0.01361317, 0.99969223, 0.00326019]
  - [0.0, 0.0, 0.0, 1.0]
  timeshift_cam_imu: -8.681e-05
  rostopic: /cam1/image_raw
  resolution: [752, 480]

camchain.yaml文件内容说明:

CAMERA_MODEL
camera_model(pinhole / omni)(针孔、全向)

intrinsics
包含给定投影类型的内部参数的向量。要素如下:
pinhole:[fu fv pu pv]
omn​​i:[xi fu fv pu pv]
ds:[xi alpha fu fv pu pv]
eucm:[alpha beta fu fv pu pv]

distortion_model
distortion_model(radtan /equidistant)

distortion_coeffs
失真模型的参数向量

T_cn_cnm1
相机外在转换,总是相对于链中的最后一个相机
(例如cam1:T_cn_cnm1 = T_c1_c0,将cam0转换为cam1坐标)

T_cam_imu
IMU extrinsics:从IMU到相机坐标的转换(T_c_i)

timeshift_cam_imu
相机和IMU时间戳之间的时间间隔,以秒为单位(t_imu = t_cam + shift)

rostopic
摄像机图像流的主题

resolution
相机分辨率[width,height]

4.IMU参数文件:imu.yaml
imu.yaml 文件模板:(编写这个文件需要imu的手册。)

#Accelerometers
accelerometer_noise_density: 1.86e-03   #Noise density (continuous-time)
accelerometer_random_walk:   4.33e-04   #Bias random walk

#Gyroscopes
gyroscope_noise_density:     1.87e-04   #Noise density (continuous-time)
gyroscope_random_walk:       2.66e-05   #Bias random walk

rostopic:                    /imu0      #the IMU ROS topic
update_rate:                 200.0      #Hz (for discretization of the values above)

5.标定板文件:target.yaml
Kalibr支持三种标定板,分别是Aprilgrid、Checkerboard和Circlegrid。
参数比较简单:见https://github.com/ethz-asl/kalibr/wiki/calibration-targets
target.yaml文件模板:
1)对于april板.yaml文件格式如:

  target_type: 'aprilgrid'   #gridtype
  tagCols: 6	  #number of apriltags
  tagRows: 6	   #number of apriltags
  tagSize: 0.088	 #size of apriltag, edge to edge [m]
  tagSpacing: 0.3	 #ratio of space between tags to tagSize,实际上就是小黑块与大黑块的边长之比 example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25

2)对于checkboard板.yaml文件格式如:

  target_type: 'checkerboard'     #gridtype
  targetCols: 6	 #number of internal chessboard corners
  targetRows: 7	  #number of internal chessboard corners
  rowSpacingMeters: 0.06	    #size of one chessboard square [m]
  colSpacingMeters: 0.06	  #size of one chessboard square [m]

3)对于circle板.yaml文件格式如:

  target_type: 'circlegrid'     #gridtype
  targetCols: 6	      #number of circles (cols)
  targetRows: 7	     #number of circles (rows)
  spacingMeters: 0.02	  #distance between circles [m]
  asymmetricGrid: False	  #use asymmetric grid (opencv) [bool]

三、Camera-IMU 联合标定 DEMO:

从官网 Downloads 下载数据集 IMU-camera calibration。
下载下来内容:4个文件
april_6x6.yaml 标定板参数
camchain.yaml 相机标定参数
imu_adis16448.yaml IMU标定参数
dynamic.bag 拍摄内容
cd到bag所在目录下使用kalibr_bagextractor 解码 dynamic.bag
解压命令:

extractor --image-topics /cam0/image_raw /cam1/image_raw --imu-topics /imu0 --output-folder dataset-dir --bag dynamic.bag

得到结果:cam0, cam1, imu0.csv
使用上述三个文件建立 .bag文件:

source /home/wcd/app/kalibr/devel/setup.bash
kalibr_bagcreater --folder dataset-dir/. --output-bag awsome.bag

运行标定程序:

kalibr_calibrate_imu_camera --target april_6x6.yaml --cam camchain.yaml --imu imu_adis16448.yaml --bag dynamic.bag --bag-from-to 5 45

运行后得到 :
report-imucam-dynamic.pdf
results-imucam-dynamic.txt

包含:
1.相机的重投影误差,IMU的误差(加速度和陀螺仪)可以作为先验误差来影响数据融合的定权问题
2.相机和IMU各自的标定参数,2个.yaml文件给的
3.IMU与相机之间的相对位姿标定(正反旋转矩阵)cam1 to imu0也有

T_ci:  (imu0 to cam0): 
[[ 0.01680206  0.99985864 -0.00062288  0.06847911]
 [-0.99985871  0.01680236  0.00048881 -0.01472898]
 [ 0.00049921  0.00061458  0.99999969 -0.00376988]
 [ 0.          0.          0.          1.        ]]

T_ic:  (cam0 to imu0): 
[[ 0.01680206 -0.99985871  0.00049921 -0.0158756 ]
 [ 0.99985864  0.01680236  0.00061458 -0.06821963]
 [-0.00062288  0.00048881  0.99999969  0.00381973]
 [ 0.          0.          0.          1.        ]]

相机之间的位姿变换标定(基线baseline):
Baseline (cam0 to cam1): 
[[ 0.99999877  0.00118911 -0.00102243 -0.1101676 ]
 [-0.00118838  0.99999904  0.00071255 -0.00032166]
 [ 0.00102327 -0.00071134  0.99999922  0.00012079]
 [ 0.          0.          0.          1.        ]]
baseline norm:  0.110168134052 [m]

使用标定命令行完成标定演示:

kalibr_calibrate_imu_camera –target xx/target.yaml –cam xx/camchain.yaml –imu xx/IMU.yaml –bag xx/xx.bag –bag-from-to 5 45 

参考博客:
https://blog.csdn.net/wwchen61/article/details/78013962
https://blog.csdn.net/heyijia0327/article/details/83583360
https://blog.csdn.net/zhubaohua_bupt/article/details/80222321
https://blog.csdn.net/w492751512/article/details/81218618
https://blog.csdn.net/xinmei4275/article/details/84998506
http://www.mamicode.com/info-detail-1719627.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习Kalibr工具--Camera与IMU联合标定过程 的相关文章

  • 相机标定opencv

    你好 我正在做一个项目来进行图像 3D 重建 我正在校准相机的阶段 这需要很长时间才能完成 但是当我编译代码并在相机前显示棋盘时 它会直接进入未处理的异常错误 当图片不在框架中时 一旦进入框架就没有错误 出现未处理的错误我不知道为什么 我问
  • 在 Canvas 上绘制两个 3D 字符串?

    我必须在画布上绘制 2 个字符串 字符串必须使用相同坐标第二根弦必须是第一根弦绕 Y 轴旋转 45 度的结果 结果必须如下所示 这是我的代码 Matrix matrix new Matrix matrix canvas getMatrix
  • 如何将图像保存到相机胶卷?

    我是 Xcode 新手 使用 4 3 不确定如何将图像保存到设备的相机胶卷中 到目前为止我所做的就是为按钮设置一个 IBAction 来保存图像 我可以使用什么库方法或函数将图像保存到用户的相机胶卷中 您使用UIImageWriteToSa
  • 在 iOS 中测量/计算距离

    我需要计算 iOS 中两点之间的距离 我可以保证至少有一部iPhone 4 所以相机的图像质量应该很好 这个想法是使用图片计算到某个点的距离 有一个名为 easyMeasure 的应用程序 它完全可以满足我的需要 我对毕达哥拉斯很满意 但这
  • 使用 ccTouchesMoved 方法移动 CCCamera? (cocos2d、iPhone)

    所以我得到了这个工作 void ccTouchesMoved NSSet touches withEvent UIEvent event UITouch myTouch touches anyObject CGPoint location
  • THREE.js 正交相机缩放到鼠标点

    我正在为我们的 THREE js 应用程序开发正交相机 本质上 该相机将以 2D 方式向用户呈现场景 用户可以选择在 2D 和 3D 相机之间切换 该相机将允许平移和缩放到鼠标点 我可以进行平移 也可以进行缩放 但不能缩放到鼠标点 这是我的
  • 如何使用flex4使用前置摄像头

    我使用 Flex 4 为 Android 移动设备开发了简单的相机应用程序 问题是 当我运行该应用程序时 它使用后置摄像头 它没有使用前置摄像头 怎么换相机啊 我需要使用前置摄像头来实现此应用程序 请帮助我 var camera Camer
  • 来自相机的原始图像数据,如“645 PRO”

    不久前我已经问过这个问题并且我也得到了很好的答案 我一直在这个论坛上上下搜索 但找不到我想要的东西 真的需要 我想从相机获取原始图像数据 至目前为止 我试图从中获取 imageDataSampleBuffer 中的数据 方法 capture
  • 不确定如何使用 CICrop 裁剪图像

    我正在尝试使用 CICrop 裁剪图像 但是当我尝试裁剪时 它崩溃并显示以下错误消息 由于未捕获的异常 NSUnknownKeyException 而终止应用程序 原因 setValue forUndefinedKey 这个类 不符合键的键
  • 检测所有摄像头android

    我有一个使用 Camera2 API 来获取相机预览的应用程序 我想在手机的镜头之间进行选择 在我的代码中 我使用以下代码 CameraManager manager CameraManager activity getSystemServ
  • 在网络应用程序中从网络摄像头或移动摄像头拍照

    我正在开发一个网络应用程序 可以从本地浏览和拍照 而且我想通过相机捕获图像 我使用以下代码 我可以捕获设备相机
  • Android:访问硬件相机预览帧数据而不绘制它们

    根据 Java SDK 端的 android 相机文档 必须为相机预览帧提供一个要绘制的 可见且活动的 表面 以便访问帧数据 我已经链接了我在这里遇到的一些内容 我是新人 所以最多有 2 个超链接 但是在最终在这里发布我自己的问题之前 我查
  • 关闭 Android 中的自动对焦

    这是在我的应用程序代码中关闭相机自动对焦的任何方法 我想检查如果手机没有自动对焦功能 我的扫描仪如何工作 但我的手机有该功 能 Use FOCUS MODE INFINITY http developer android com refer
  • OpenCV 中的相机标定和鸟瞰投影

    我已经完成了相机校准 现在我想获得棋盘图片的鸟瞰图 如下所示 但结果很奇怪 看起来不是一个正方形 你可以看到图3 每个正方形都是7 95x7 95 有人知道为什么吗 gpsPoints 0 Point2f gpsPoints 1 Point
  • 如何更改Vuforia AR相机对焦模式?

    我在用Vuforia 6 2 AR SDK对于在Unity中 但是当我在 Android 手机中测试该应用程序时 相机看起来像blurry 我在 Vuforia 的开发者网站中搜索并找到了一些相机对焦模式 但我无法实现 因为该指南适用于较旧
  • 以编程方式截取屏幕截图不会捕获 surfaceVIew 的内容

    我有一个应用程序 我希望能够捕获屏幕截图 布局的背景是一个 SurfaceView 显示来自后置摄像头的视频 下面的代码可以截图 但是surfaceView的内容保存为黑色 这是代码 btn setOnClickListener new O
  • 如何在SceneKit中实现逼真的景深效果?

    我正在尝试渲染具有真实景深效果的帧 我已经尝试过景深属性camera节点 但它不会产生可用的结果 是否可以切换到景深效果的最大渲染质量 性能不是一个因素 我只需要渲染一帧 用户可以等待它 SceneKit 中逼真的景深效果 在SceneKi
  • Android:想要在相机预览上放置剪影叠加

    我想知道如何在相机预览上添加剪影 到目前为止 我已经完成了以下示例 它只是预览相机 http developer android com reference android view TextureView html http develo
  • 如何使用 UIImagePickerController CropRect

    我刚刚找到了一种方法来更改裁剪框的矩形 该裁剪框在捕获图像后出现UIImagePickerViewController 这可以在以下帮助下完成UIImagePickerControllerCropRect 但我不知道如何使用它 最初的裁剪框
  • 浏览器显示“已阻止摄像头以保护您的隐私”

    浏览器说 阻止摄像头以保护您的隐私 我的项目包括使用用户摄像头 当我从本地主机访问应用程序时 摄像头工作正常 但是当通过 IP 地址访问时 浏览器默认阻止摄像头和其他资源 我如何允许它们用于我的应用程序 我的应用程序适用于将使用 IP 地址

随机推荐

  • PID控制算法的C语言实现

    PID控制算法的C语言实现一 PID算法原理 最近两天在考虑一般控制算法的C语言实现问题 xff0c 发现网络上尚没有一套完整的比较体系的讲解 于是总结了几天 xff0c 整理一套思路分享给大家 在工业应用中PID及其衍生算法是应用最广泛的
  • pageCache

    写在前面 在开始正式的讨论前 xff0c 我先抛出几个问题 xff1a 谈到磁盘时 xff0c 常说的HDD磁盘和SSD磁盘最大的区别是什么 xff1f 这些差异会影响我们的系统设计吗 xff1f 单线程写文件有点慢 xff0c 那多开几个
  • 基于Python高光谱遥感影像处理实例

    前言 在写波段配准相关代码时经常需要用到tif影像的波段合成和分解 xff0c 虽然可以用ENVI才处理 xff0c 但是每次都要打开再设置一些参数有些麻烦 xff0c 所以本着 独立自主 自力更生 的原则就写了些脚本来处理这个需求 又写了
  • 基于SIFT的图像Matlab拼接教程

    前言 图像拼接技术 xff0c 将普通图像或视频图像进行无缝拼接 xff0c 得到超宽视角甚至360度的全景图 xff0c 这样就可以用普通数码相机实现场面宏大的景物拍摄 利用计算机进行匹配 xff0c 将多幅具有重叠关系的图像拼合成为一幅
  • PERSIANN 降雨数据使用教程

    一 前言 PERSIANN xff0c 使用人工神经网络从遥感信息中估算降水 xff0c 是一种基于卫星的降水检索算法 xff0c 可提供近乎实时的降雨信息 该算法使用来自全球地球同步卫星的红外 IR 卫星数据作为降水信息的主要来源 红外图
  • 基于Pyqt5快速构建应用程序详细教程

    一 介绍 图形用户界面 xff0c 更广为人知的名称是 GUI xff0c 是当今大多数个人计算机的一个特征 它为不同计算技能水平的用户提供了直观的体验 尽管 GUI 应用程序可能会使用更多资源 xff0c 但由于其点击式特性 xff0c
  • 基于Python的PROSAIL模型介绍以及使用

    1 介绍 PROSAIL是两种模型耦合得到的 SAIL是冠层尺度的辐射传输模型 xff0c 把冠层假设成是连续的且具有给定几何形状和密度的水平均匀分布的介质层 xff0c 从而模拟入射辐射与均匀介质之间的相互作用 xff0c 具体还是挺复杂
  • 可能是最全的FreeRTOS源码分析及应用开发系列

    可能是最全的FreeRTOS源码分析及应用开发系列 FreeRTOS 是一个可裁剪的小型且免费的 RTOS 系统 xff0c 尺寸非常小 xff0c 可运行于微控制器上 其特点包括 xff1a 内核支持抢占式 xff0c 合作式和时间片调度
  • 关于VS中LNK1120与errorLNK2019问题

    最近遇到了该问题 xff0c 再查找了一些资料后 xff0c 发现了针对自己问题的解决方法 xff0c 贴出来让大家一起学习一下 其实如果这两个问题同时出现 xff0c 很可能不是链接库缺了lib xff0c 而是编译中添加的源没有被实例化
  • PCL—低层次视觉—点云分割(基于凹凸性)

    转自 xff1a http www cnblogs com ironstark p 5027269 html PCL 低层次视觉 点云分割 xff08 基于凹凸性 xff09 1 图像分割的两条思路 场景分割时机器视觉中的重要任务 xff0
  • 【ENVI入门系列】13.分类后处理

    原文地址 xff1a ENVI入门系列 13 分类后处理 作者 xff1a ENVI IDL中国 版权声明 xff1a 本教程涉及到的数据提供仅练习使用 xff0c 禁止用于商业用途 目录 分类后处理 1 概述 2 分类后处理 2 1 小斑
  • ENVI神经网络工具参数和使用方法

    原文地址 xff1a ENVI神经网络工具参数和使用方法 作者 xff1a pengheligis xff08 1 xff09 Activation xff1a 选择活化函数 对数 xff08 Logistic xff09 和双曲线 xff
  • 详解使用pscp命令Linux文件上传与下载

    一 上传 2 开始 运行 cmd进入到 dos模式输入以下命令 以下是代码片段 xff1a pscp D java apache tomcat 5 5 27 webapps szfdc rardev 64 192 168 68 249 ho
  • java学习总结及心得体会

    前言 xff1a 哈哈 xff0c 今天是2015年 xff18 月 xff12 号 xff0c 星期日 xff0c 今天是收货的一天 xff0c 很开心 xff0c 很快乐 到底发生了什么呢 xff0c 容我慢慢来 世界很大 xff0c
  • 二进制的表白

    没能提起勇气对她进行表白 xff0c 只能寄托于0 1代码记录下对你的喜欢 01000101 01110110 01100101 01101110 00100001 01001001 00100000 01101100 01101111 0
  • C语言strcat()函数:连接字符串

    头文件 xff1a include lt string h gt strcat 函数用来连接字符串 xff0c 其原型为 xff1a char strcat char dest const char src 参数 dest 为目的字符串指针
  • linux 下TCP通信例程

    TCP server span class token macro property span class token directive hash span span class token directive keyword inclu
  • FreeRTOS系列|消息队列一

    消息队列一 1 消息队列简介 消息队列可以在任务与任务 任务与中断之间传递消息 xff0c 队列可以保存有限个具有确定长度的数据单元 队列可保存的最大单元数目被称为队列的长度 xff0c 在队列创建时需要指定其长度和每个单元 xff08 队
  • 【达内课程】网络通信之HTTP协议和Get请求实例(1)

    文章目录 HTTP协议发送HTTP GET请求增加参数 HTTP协议 HTTP协议 HTTP 协议是超文本传输控制协议 HTTP 协议中定义了客户端与服务端的通信流程与数据交互格式 网络通信中的长连接与短链接 长连接 xff1a 当客户端与
  • 学习Kalibr工具--Camera与IMU联合标定过程

    上一节介绍了 xff0c 用kalibr工具对camera进行标定的操作流程 xff0c 在camera标定之好之后 xff0c 进行camera与IMU进行联合标定的操作的学习 xff0c 即求取相机和IMU 之间的转换关系 坐标系之间的