使用kalibr对相机和IMU标定

这篇具有很好参考价值的文章主要介绍了使用kalibr对相机和IMU标定。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、IMU标定

二、相机标定

三、联合标定


关于需要下载的环境和具体的包参考【1】

记录标定过程

一、IMU标定:

①录制imu的rosbag

rosbag record /JpImu -O imu.bag

②标定

roslaunch imu_utils myimu.launch

rosbag play -r 200 imu.bag
#myimu.launch中的内容
<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/JpImu"/>   #需要修改话题
        <param name="imu_name" type="string" value= "Jumper"/>
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
        <param name="max_time_min" type="int" value= "120"/>      #录制的rosbag需要大于120分钟
        <param name="max_cluster" type="int" value= "100"/>       #频率?
    </node>
</launch>

单位问题:  

①连续时间

使用kalibr对相机和IMU标定,slam,计算机视觉

 ②离散时间

parameter symbol units
gyr_n
acc_n
gyr_w
acc_w

对于离散时间的白噪声  = 连续时间的白噪声 * 频率的平方根

对于离散时间的随机游走 = 连续时间的随机游走 / 频率的平方根

结果分析

使用imu_utils得到的白噪声(white_noise)和随机游走(random_walk)单位有问题,这些参数实际上是离散时间的,但认为是连续时间的。 (参考【2】中matrin的回复)。这位大佬也在github开源了他修改后的代码。(imu_utils修改)

kalibr联合标定imu参数应该是连续时间的(根据下面结果得到的结论,对连续白噪声乘根号频率得到离散的白噪声) 

使用kalibr对相机和IMU标定,slam,计算机视觉

之后使用kalibr_allan又标定了一次imu的内参,根据单位得到是连续时间的结果。

使用kalibr对相机和IMU标定,slam,计算机视觉

 使用kalibr对相机和IMU标定,slam,计算机视觉

 对比两个方法结果:

acc_n acc_w gyr_n gyr_w
imu_utils 1.37e-3 2.86e-5 8.96e-5 9.36e-6
kalibr_allan 1.85e-3 5.95e-5 1.02e-5 1.57e-8

这两个结果后续都使用kalibr进行过联合标定,得到的相机到imu的外参矩阵中的旋转和平移估计的差不多。

参考kalibr中wiki的介绍,使用vins的时候需要对imu参数扩大10倍甚至更多。

使用kalibr对相机和IMU标定,slam,计算机视觉


 二、相机标定

①相机标定录制rosbag需要降低图像帧率

将<intopic>上的消息到指定的频率 
rosrun topic_tools throttle messages <intopic>   <msgs_per_sec> [outtopic]

# intopic: 订阅的话题
# msgs_per_sec: 频率,每秒允许通过的最大消息数
# outtopic: throttle节点发布的话题名,可以省略,默认为intopic_throttle


rosrun topic_tools throttle messages /JpImage 4.0 /jpimage

②录制相机的rosbag

rosbag record /jpimage -O camera.bag

标定板选用aprilgrid 

 ③相机标定

rosrun kalibr kalibr_calibrate_cameras --bag cam.bag  --topics /jpimage --models pinhole-radtan --target apriltag.yaml --show-extraction

###############
--bag后面是录制的数据包的路径;

--topics后面是待标定的话题数据(已经控制频率后的);

--models后面是相机/畸变模型,有几目相机就要写几个,这里是两个针孔模型相机,所以是两个pinhole-radtan;相应地,其他支持的模型可以查看https://github.com/ethz-asl/kalibr/wiki/supported-models。

--target后面是标定板参数文件的路径;

--show-extraction是在标定过程中的一个显示界面,可以看到图片提取的过程,可以不要;

--bag-from-to后面是想要使用数据时间段的起始时间和结束时间,单位:秒(s),这个参数可以剔除掉刚开始录制和结束时一些出入视野等画面。

 ④相机标定结果

  • cam-report-cam.pdf 包含绘制的图片和标定的参数。
  • cam-results-cam.txt 以文本文件储存的标定结果。
  • cam-camchain.yaml 以YAML格式储存的标定结果。它可以直接用来作为相机-IMU校正的输入。

相机标定也可以使用ROS自带的camera_calibration进行标定 

三、联合标定

相机-IMU联合标定总共需要准备好4个文件,分别是包含标定相机和IMU数据的rosbag,IMU内参yaml,相机内外参yaml,标定板yaml.

①录制相机和imu的rosbag

注意

  • 录制数据包时,充分激励IMU在三轴平移和三轴旋转上的运动;
  • 尽可能减少震动,尤其是在拿起和放下传感器时(使用参数--bag-from-to指定数据包使用的时间,但在过程中依然要减少传感器的震动)
  • 通过保持较低的快门时间和良好的照明等来尽量减少图片的运动模糊。
rosbag record /JpImage /JpImu -O cam-imu.bag

②IMU内参yaml、相机内外参yaml、标定板yaml

1)联合标定中imu内参yaml格式如下(imu.yaml)

#Accelerometers
accelerometer_noise_density: 0.00184825   #Noise density (continuous-time)
accelerometer_random_walk:   0.00005951   #Bias random walk
 
#Gyroscopes
gyroscope_noise_density:     0.00001015   #Noise density (continuous-time)
gyroscope_random_walk:       0.00000002    #Bias random walk
 
rostopic:                    /JpImu      #the IMU ROS topic
update_rate:                 100.0      #Hz (for discretization of the values above)

2)相机内外参yaml用之前得到的cam-camchain.yaml

3)  标定板yaml apriltag.yaml

③联合标定

rosrun kalibr kalibr_calibrate_imu_camera --target apriltag.yaml --cam cam-camchain.yaml --imu imu.yaml --bag cam_imu.bag --bag-from-to 5 85 --show-extraction --max-iter 15  --timeoffset-padding 0.1

######
--target后面是标定板路径;

--cam后面相机内外参路径;

--imu后面是对应格式的imu内参路径;

--bag后面是录制的数据包路径;

--bag-from-to后面是想要使用数据时间段的起始时间和结束时间,单位:秒(s)

--show-extraction是在标定过程中的一个显示界面,可以看到图片提取的过程,可以不要。

--max-iter 15 设置优化迭代次数为15次,默认30.

④结果

Calibration results
===================
Normalized Residuals
----------------------------
Reprojection error (cam0):     mean 0.390286482254, median 0.317746394015, std: 0.300230148191
Gyroscope error (imu0):        mean 32.6522783268, median 23.0843301194, std: 31.6409904226
Accelerometer error (imu0):    mean 0.8012206628, median 0.710658698229, std: 0.476728405819

Residuals
----------------------------
Reprojection error (cam0) [px]:     mean 0.390286482254, median 0.317746394015, std: 0.300230148191
Gyroscope error (imu0) [rad/s]:     mean 0.00331420625017, median 0.00234305950712, std: 0.0032115605279
Accelerometer error (imu0) [m/s^2]: mean 0.0148085609002, median 0.01313474939, std: 0.00881113276055

Transformation (cam0):
-----------------------
T_ci:  (imu0 to cam0): 
[[-0.06307385 -0.99792457  0.01297083 -0.01153176]
 [-0.00327611 -0.0127896  -0.99991284 -0.10529782]
 [ 0.99800349 -0.06311084 -0.00246262 -0.0980539 ]
 [ 0.          0.          0.          1.        ]]

T_ic:  (cam0 to imu0): 
[[-0.06307385 -0.00327611  0.99800349  0.09678581]
 [-0.99792457 -0.0127896  -0.06311084 -0.0190428 ]
 [ 0.01297083 -0.99991284 -0.00246262 -0.10538053]
 [ 0.          0.          0.          1.        ]]

timeshift cam0 to imu0: [s] (t_imu = t_cam + shift)
-0.0425947143499


Gravity vector in target coords: [m/s^2]
[ 9.76501268 -0.08904055 -0.89723018]


Calibration configuration
=========================

cam0
-----
  Camera model: pinhole
  Focal length: [954.75292, 1072.76737]
  Principal point: [306.50129, 259.28774]
  Distortion model: radtan
  Distortion coefficients: [-0.081587, 0.118449, 0.002166, -0.003205]
  Type: aprilgrid
  Tags: 
    Rows: 6
    Cols: 6
    Size: 0.024 [m]
    Spacing 0.0072 [m]



IMU configuration
=================

IMU0:
 ----------------------------
  Model: calibrated
  Update rate: 100.0
  Accelerometer:
    Noise density: 0.00184825 
    Noise density (discrete): 0.0184825 
    Random walk: 5.951e-05
  Gyroscope:
    Noise density: 1.015e-05
    Noise density (discrete): 0.0001015 
    Random walk: 2e-08
  T_ib (imu0 to imu0)
    [[ 1.  0.  0.  0.]
     [ 0.  1.  0.  0.]
     [ 0.  0.  1.  0.]
     [ 0.  0.  0.  1.]]
  time offset with respect to IMU0: 0.0 [s]

踩坑记录:

 1.确定imu的坐标系

rostopic echo /话题 中观察imu加速度x、y、z轴值。如果imu静止的时候acc_z值为9.8,说明z轴向上,因为     a是实际的加速度值,a_m是imu的测量值,静止的时候a= 0, a_m = -g = 9.8。 同理,  哪个轴朝上观察加速度计哪个轴输出值是9.8,就可以确定这个轴。我使用的imu坐标系前左上分别为x、y和z。角速度按右手定则旋转后观察正负,imu角速度单位是rad/s,为了观察变化可以修改为°/s观察更直观。

2.确定了相机和imu坐标系可以估计相机到imu的旋转矩阵

相机的x轴旋转后变成了之前z轴的正方向,y轴旋转后变成了之前x轴的负方向,z轴旋转后变成了之前y轴的负方向。

使用kalibr对相机和IMU标定,slam,计算机视觉

 3.估计的旋转矩阵和标定结果差不多,但是平移非常小。这个问题困扰了很久,之后换了另一个imu后解决了。(两个imu同一个型号,但很玄学有一个就是不能使用...)文章来源地址https://www.toymoban.com/news/detail-554792.html

到了这里,关于使用kalibr对相机和IMU标定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉(相机标定;内参;外参;畸变系数)

    目录 一、预备知识 1、坐标系变换过程(相机成像过程) (1)相机坐标系转换为图像坐标系(透视投影变换遵循的是针孔成像原理) (2)齐次坐标的引入原因:(为什么引入齐次坐标???) 2、内参与外参矩阵的构成 3、畸变参数 二、相机标定 1、张正友标定法(光学标

    2024年02月07日
    浏览(51)
  • 【Matlab】相机标定(计算机视觉工具箱)

    图像处理和计算机视觉是Matlab的一个主要应用领域,这部分包括4个工具箱——图像处理、计算机视觉、雷达、医学图像。由于视觉的东西容易呈现,所以先从计算机视觉工具箱学起。 官方文档对计算机视觉工具箱的介绍如下:设计和测试计算机视觉、3D 视觉和视频处理系统

    2024年02月05日
    浏览(104)
  • 【计算机视觉】OpenCV实现单目相机标定

    文章目录 单目相机标定(基于Python OpenCV) 1.上期填坑 2.单目相机标定 2.1 数据采集 2.2 角点提取 2.3 参数求解 2.4 参数评估(重投影误差) 2.5 相机位姿(棋盘位姿)可视化 2.6 同Matlab标定结果比较 在开始本篇博客之前,先填一下上一篇博客【计算机视觉】基于ORB角点+RANSAC算法实现图像

    2023年04月18日
    浏览(62)
  • 学习Kalibr工具---Camera与IMU联合标定过程

    以双目+IMU为例进行介绍相机和IMU 的联合标定,也叫多传感器融合; 录制含有标定板图像的bag包,注意需要不断移动标定板。 运行Kalibr工具箱中 多相机标定 节点程序。 我们使用的最终命令 参考链接:https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration (一) 标定的输入文件包括

    2024年02月08日
    浏览(51)
  • 使用kaliber与imu_utils进行IMU、相机+IMU联合标定

    目录 1 标定工具编译 1.1 IMU标定工具 imu_utils 1.2 相机标定工具 kaliber 2 标定数据录制 3 开始标定 3.1 IMU标定 3.2 相机标定 3.3 相机+IMU联合标定 4 将参数填入ORBSLAM的文件中         标定IMU我们使用imu_utils软件进行标定:         首先我们安装标定软件的依赖项:Eigen、Ceres

    2024年02月07日
    浏览(42)
  • kalibr 进行相机单目、双目标定全流程

    参考链接: Installation · ethz-asl/kalibr Wiki · GitHub Docker 操作知识: Docker攻略:从安装到入门到进阶 | Dockerfile调优 | 镜像分层 | 容器生命周期/5种网络模式 |跨宿主机通信_血煞长虹的博客-CSDN博客 部署kalibr步骤如下: 1.拉取镜像 2.创建container 3.进入container 运行以后即可进入con

    2024年02月09日
    浏览(43)
  • 相机与IMU标定教程

    标定教程 way 1、 imu_utils标定IMU的内参,可以校准IMU的噪声密度和随机游走噪声 2、kalibr包标定相机的内外参数,相机与IMU之间的外参 1.1安装环境 这里使用的包是 imu_utils ,使用这个包可以校准IMU的噪声密度和随机游走噪声 step1: 安装ceres库 下载编译 ceres-solver step2: 安装 cod

    2023年04月18日
    浏览(35)
  • d435i 相机和imu标定

    使用 imu_utils 功能包标定 IMU,由于imu_utils功能包的编译依赖于code_utils,需要先编译code_utils,主要参考 相机与IMU联合标定_熊猫飞天的博客-CSDN博客 Ubuntu20.04编译并运行imu_utils,并且标定IMU_学无止境的小龟的博客-CSDN博客 1.1 编译 code_utils 创建工作空间 1.1.1 修改 CMakeLists.txt 文件

    2024年02月09日
    浏览(59)
  • SLAM学习入门--计算机视觉一

    IoU(Intersection over Union),又称重叠度/交并比。 1 NMS :当在图像中预测多个proposals、pred bboxes时,由于预测的结果间可能存在高冗余(即同一个目标可能被预测多个矩形框),因此可以过滤掉一些彼此间高重合度的结果;具体操作就是根据各个bbox的score降序排序,剔除与高

    2024年02月02日
    浏览(41)
  • Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

    是否有一种方法可以仅从一个场景多张不同视角的照片中捕获整个3D场景? 有。 NeRF:将场景表示为用于视图合成的神经辐射场中(NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis),Mildenhall等人(2020)的论文解答了这个问题。NeRF的更简单实现赢得了 TensorFlow社区聚光

    2024年02月07日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包