使用Kalibr标定相机和IMU(ZED+px4)外参

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文仅使用kalibr中cam-imu的联合标定,关于camera内参默认已经知道了。主要会总结一些标定上的小经验,有不对的地方,希望网友可以指出。文章最后将使用标定的cam-imu外参在VINS-Fusion中进行验证


一、Kalibr介绍

Kalibr是ZTH大佬们开源的一个标定工具箱,可以进行相机内参标定,cam-imu外参标定、多imu、多相机标定等。在很多数据集中,都使用Kalibr来标定cam-imu的外参矩阵,具有很高的可信度,写论文,做实验,都用得上。
本文不涉及Kalibr的安装,各位可以根据官网自己安装,下面开始介绍cam-imu的标定细节和经验。
本文使用的设备是ZED相机和px4里内置的imu,进行左目相机和imu的外参标定。

二、CAM-IMU外参标定

标定一共需要3个yaml文件,分别是:
相机内参的zed_left_raw.yaml,imu噪声参数的px4_imu.yaml,标定板对应的april_7x5.yaml文件
下面会在相机内参、imu噪声、target部分分别介绍yaml文件中的内容。
注意这里的文件名可以根据自己习惯命名,不是固定的。

1.相机内参

关于相机内参的标定,用的比较多的有matlab的标定工具箱,Kalibr本身也支持多相机的内参标定,有需要可以看看Multiple camera calibration 部分。
关于ZED相机的内参,使用出厂标定的数据就好了,如果安装ZED的SDK时使用的是默认的安装路径,可以在/usr/local/zed/settings下面找到一个SN****.conf文件,根据你设置的相机分辨率去找对应的相机内参畸变参数,我这里使用的是VGA模式,conf文件中
对应的内参和畸变参数如下:
使用Kalibr标定相机和IMU(ZED+px4)外参
根据我们获得的相机内参和畸变参数,创建一个zed_left_raw.yaml文件(文件名自己定),内容如下:

cam0:
  cam_overlaps: [] 
  camera_model: pinhole   #相机模型,kalibr也支持鱼眼模型
  distortion_coeffs: [-0.173778, 0.0266126, 0.0010566, -0.000836547] #相机畸参数
  distortion_model: radtan #畸变模型
  intrinsics: [349.46, 349.46, 346.59, 181.41225]
  resolution: [672, 376]
  rostopic: /zed/zed_node/left_raw/image_raw_gray

注意一下,distortion_modelcamera_model根据自己需要进行选择,Kalibr中Supported models中有介绍。
ZED相机是针孔模型,畸变参数是k1,k2,p1,p2,对应的distortion model是radial-tangential。

2.IMU噪声参数


注意:
我自己之前写过一篇关于IMU内参标定的文章,需要的小伙伴可以参看一下。
但是!!!!!我们其实用不上imu内参标定的数据,理由也在《IMU内参标定》这篇文章中介绍过了,想了解的同学,自己看看,欢迎评论区发表意见,如果想深入了解关于IMU噪声模型的同学,也可以看看我之前的文章。


虽然说imu内参标定的结果不重要,但是imu内参确实对cam-imu外参标定是有影响的,如何取值呢?是一个问题。
有多种选择的方法:

  1. 一种是参考公开数据集的做法,比如:EuRoC数据集(毕竟是他们自己家采的数据集),Kalibr在download中给了Euroc数据集在使用kalibr标定时用到的imu_adis16448.yaml文件,里面有标定时用的imu的噪声参数(连续噪声模型)。他们用的IMU型号是adls16448,在很多imu内参标定的工具里一般会用这款imu作为示例,比如mintar版本的imu_util中,下面可以对比一下Kalibr中用的imu噪声参数imu内参标定得到的噪声参数的差别:使用Kalibr标定相机和IMU(ZED+px4)外参
    可以看到,Kalibr中用的imu噪声参数imu内参标定得到的噪声参数要大10-15倍左右,理由看我之前的文章。所以我们的一种做法是使用静置imu标定的内参,然后放大10-15倍(倍数看效果,效果不行可以再放大一些)。
  2. 第二种做法,使用VINS种imu噪声的默认参数,他们给的这个默认参数还是蛮好用的,或者在他们默认参数的基础上做一个微调。本文用的就是在VINS给的默认参数基础上做了点微调,具体的px4_imu.yaml文件的内容如下:
rostopic: /mavros/imu/data
update_rate: 195 #Hz

accelerometer_noise_density: 0.1 #VINS默认 0.2
accelerometer_random_walk: 0.03 #0.05
gyroscope_noise_density: 0.02 #0.02
gyroscope_random_walk: 0.00004 #4e-5

3.target(标定板参数)

标定板的yaml文件没什么好说的,参考Kalibr的download:
我用的是花几百块买的标定板,是一个7x5的板子,yaml文件如下:

#example for aprilgrid
  target_type: 'aprilgrid' #gridtype
  tagCols: 7                  #number of apriltags
  tagRows: 5                  #number of apriltags
  tagSize: 0.03              #size of apriltag, edge to edge [m]
  tagSpacing: 0.2             #ratio of space between tags to tagSize a=3cm b=0.6cm

自己用A4纸打印也行,但是要把值量准了,我两种都试过,其实差别不是很大,但是用标定板得到的重投影误差更小

4.bag文件录制

这里用的是px4内置的imu,通过mavros发布imu的数据,但是默认的频率只有30hz,需要执行下面指令修改imu频率到200hz

rosrun mavros mavcmd long 511 31 5000 0 0 0 0 0

这里订阅的消息有两个,图像的topic和imu的topic:

rosbag record /mavros/data/raw zed/zed_node/left_raw/image_raw_gray

录制的时候注意要尽量运动的平滑一些,速度不要太快,如果相机得到的图像质量太差的话可能会提取不到特征点,也不可太慢,要充分激励imu,采集数据的方法在kalibr的github主页上有一个油管上的视频,B站也有人搬过来了,参考视频来录制。bag的时间长短到不是很有影响40-120s左右吧,主要影响一个计算时间,如果不赶时间到没关系。

5.kalibr: cam-imu联合标定

//source 一下kalibr的工作空间
rosrun kalibr kalibr_calibrate_imu_camera --imu /YOUR_FOLDER/px4_imu.yaml --cam /YOUR_FOLDER/zed-left-raw.yaml --target /YOUR_FOLDER/april_7x5.yaml --bag /YOUR_FOLDER/xxx.bag --show-extraction --bag-from-to 5 85

参数说明:
–show-extraction可以显示图像,可以看到提取的特征点。
–bag-from-to 5 85 是指从bag的第5s读到第85s,就是把一头一尾截掉一部分,因为在开始和结束可能有一些剧烈的抖动,会导致错误,你要是整个过程都很平稳,不截掉也行。

标定结果:

Calibration results
===================
Normalized Residuals
----------------------------
Reprojection error (cam0):     mean 0.615012956118, median 0.536132055556, std: 0.392602996383
Gyroscope error (imu0):        mean 0.253306360314, median 0.222449089297, std: 0.165059194168
Accelerometer error (imu0):    mean 0.461800885522, median 0.367774639131, std: 0.37771279501

Residuals
----------------------------
Reprojection error (cam0) [px]:     mean 0.615012956118, median 0.536132055556, std: 0.392602996383
Gyroscope error (imu0) [rad/s]:     mean 0.0176861541002, median 0.0155316624023, std: 0.011524631044
Accelerometer error (imu0) [m/s^2]: mean 0.128973968357, median 0.102713866857, std: 0.105489442742

Transformation (cam0):
-----------------------
T_ci:  (imu0 to cam0): 
[[-0.01744988 -0.99908438 -0.03906278  0.05493455]
 [ 0.01391445  0.03882229 -0.99914925 -0.0962123 ]
 [ 0.99975091 -0.01797857  0.01322427 -0.04775604]
 [ 0.          0.          0.          1.        ]]

T_ic:  (cam0 to imu0): 
[[-0.01744988  0.01391445  0.99975091  0.05004149]
 [-0.99908438  0.03882229 -0.01797857  0.05776085]
 [-0.03906278 -0.99914925  0.01322427 -0.09335301]
 [ 0.          0.          0.          1.        ]]

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


Gravity vector in target coords: [m/s^2]
[ 0.08307977 -9.67015417 -1.62777118]


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

cam0
-----
  Camera model: pinhole
  Focal length: [349.46, 349.46]
  Principal point: [346.59, 181.41225]
  Distortion model: radtan
  Distortion coefficients: [-0.173778, 0.0266126, 0.0010566, -0.000836547]
  Type: aprilgrid
  Tags: 
    Rows: 5
    Cols: 7
    Size: 0.03 [m]
    Spacing 0.006 [m]



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

IMU0:
 ----------------------------
  Model: calibrated
  Update rate: 195
  Accelerometer:
    Noise density: 0.02 
    Noise density (discrete): 0.279284800875 
    Random walk: 0.0001
  Gyroscope:
    Noise density: 0.005
    Noise density (discrete): 0.0698212002188 
    Random walk: 1e-06
  T_i_b
    [[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]

使用Kalibr标定相机和IMU(ZED+px4)外参
结果分析:
指标的话主要看重投影误差,在1个pixle(具体也没有硬指标,别太大了,1个pixle以上误差还挺大的应该)以下应该就还可以吧,这个我们可以参考EuRoC数据集的标定结果(原始数据在download里有),下面是在我自己电脑上用kalibr标定的结果:

Calibration results
===================
Normalized Residuals
----------------------------
Reprojection error (cam0):     mean 0.418843991251, median 0.356960966203, std: 0.283661622772
Gyroscope error (imu0):        mean 0.112183412747, median 0.0980577964024, std: 0.0659293249494
Accelerometer error (imu0):    mean 0.348599885514, median 0.313983260978, std: 0.202874498275

Residuals
----------------------------
Reprojection error (cam0) [px]:     mean 0.418843991251, median 0.356960966203, std: 0.283661622772
Gyroscope error (imu0) [rad/s]:     mean 0.00793256518902, median 0.00693373327843, std: 0.00466190727508
Accelerometer error (imu0) [m/s^2]: mean 0.0492994685936, median 0.0444039386034, std: 0.028690786692

使用Kalibr标定相机和IMU(ZED+px4)外参
EuRoC数据集里面标定用的是一个比较大的专业标定板,IMU也是比较好的,效果应该要好一些。可以看到他们的重投影误差在0.4左右,我标定的在0.6左右,这个效果还是算不错的,在VINS中也可以直接作为外参使用。

三、运行单目+imu的VINS-Fusion

VINS的安装参考官网的介绍。
这里主要介绍下config里的yaml文件应该怎么修改,下面是我用的yaml文件:

%YAML:1.0

#common parameters
#support: 1 imu 1 cam; 1 imu 2 cam: 2 cam; 
imu: 1         
num_of_cam: 1  

imu_topic: "/mavros/imu/data"
image0_topic: "/zed/zed_node/left_raw/image_raw_gray"
output_path: "~/output/"

cam0_calib: "left.yaml"
image_width: 672
image_height: 376
   

# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 1   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.

body_T_cam0: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [-0.01711133, 0.01180156, 0.99978394, 0.03898149,
           -0.99917567, 0.03661386, -0.01753311,  0.05820492,
           -0.03681287, -0.9992598, 0.01116532, -0.0870125,
           0, 0, 0, 1]

#Multiple thread support
multiple_thread: 1

#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 30            # min distance between two features 
freq: 15                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image 
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 1           # publish tracking image as topic
flow_back: 1            # perform forward and backward optical flow to improve feature tracking accuracy

#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)

#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 0.2          # accelerometer measurement noise standard deviation. #0.2   0.04
gyr_n: 0.05         # gyroscope measurement noise standard deviation.     #0.05  0.004
acc_w: 0.02        # accelerometer bias random work noise standard deviation.  #0.02
gyr_w: 4.0e-5       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.805       # gravity magnitude

#unsynchronization parameters
estimate_td: 1                      # online estimate time offset between camera and imu
td: 0.0                             # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)

#loop closure parameters
load_previous_pose_graph: 0        # load and reuse previous pose graph; load from 'pose_graph_save_path'
pose_graph_save_path: "~/output/pose_graph/" # save and load path
save_image: 1                   # save image in pose graph for visualization prupose; you can close this function by setting 0 

需要该的点:
1.外参矩阵,对应Kalibr标定结果中的T_ic
2.imu parameters这块,推荐一开始使用vins的默认参数,如果可行,可以做微调,让精度提高些,要是有条件,可以用Vicon采个数据集进行调整。不能直接用imu标定的参数。
3. estimate_td: 1 :这个参数是开启时延迟估计的,开启后精度会提升一些,这个成果是发在了2018 IROS上,Online Temporal Calibration for Monocular Visual-Inertial Systems
4. estimate_extrinsic: 1 :Kalibr标定的外参是可以直接作为真值使用的,设为0是作为真值,设为1是作为初值,在后端中会把外参也作为一个优化变量去优化,最好设为1吧,我设成0,只有在初始化阶段比较好的时候才能运行,设为1鲁棒性好点。
5.在运行mono+imu的模式的时候,初始化阶段不能运动的太快,但是要充分激励IMU,另外初始化阶段尽量在特征点丰富的场景中运行,不然 容易导致初始化的一些变量不准,影响后续的优化结果。
6.相机的参数文件没什么好说的,可以参考vins里的euroc数据集的config文件写。

下面放一个rviz上可视化的轨迹,场景是在走廊和教室,走廊算是场景中特征点比较少的,所以我一开始是在教室里进行初始化的(教室里很多书,特征点比较丰富),我也尝试果在走廊初始化,但是最后飘了。使用Kalibr标定相机和IMU(ZED+px4)外参
先是在特征点丰富的教室启动,完成初始化后走到走廊上,然后从3楼走到2楼,最后回到3楼的教室。从终点的位置估计来看(回到原点,理论上位置估计应该是0,0,0),最后VIO是有一定成程度的drift的,这是不可避免的,属于正常现象。
总体来说,Kalibr标定的参数是可信的。

没有允许不许转载!!文章来源地址https://www.toymoban.com/news/detail-418588.html

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

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

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

相关文章

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

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

    2024年02月08日
    浏览(52)
  • 使用lidar_align进行激光雷达与IMU的外参标定(超详细教程)

    1、下载lidar_align源码 ethz-asl/lidar_align: A simple method for finding the extrinsic calibration between a 3D lidar and a 6-dof pose sensor (github.com) https://github.com/ethz-asl/lidar_align 2、解压到ros工作空间目录下的src文件中 不知道如何创建ros工作空间的可以参考我另一篇博客: ubuntu下如何创建ros工作空间

    2024年02月08日
    浏览(49)
  • 使用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日
    浏览(43)
  • 用lidar_imu_init对livox_avia进行lidar和imu的外参标定

    ubuntu 20.04 ros noetic PCL1.8 Eigen=3.3.4 livox_ros_driver ceres-solver 1.修改相关参数: 编辑以设置以下参数:config/xxx.yaml lid_topic:激光雷达点云的主题名称。 imu_topic:IMU 测量的主题名称。 cut_frame_num:将一帧分割成子帧,提高频率。必须是正整数。 orig_odom_freq(Hz):原始激光雷达输入

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

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

    2024年02月09日
    浏览(44)
  • 经典文献阅读之--Calib Anything(使用SAM的无训练标定雷达相机外参)

    Camera与LiDAR之间的外部标定研究正朝着更精确、更自动、更通用的方向发展,由于很多方法在标定中采用了深度学习,因此大大减少了对场景的限制。然而,数据驱动方法具有传输能力低的缺点。除非进行额外的训练,否则它无法适应数据集的变化。随着基础模型的出现,这

    2024年02月02日
    浏览(39)
  • 使用ROS功能包camera_calibration进行单目相机和双目相机的内参和外参标定

    本文总结使用ROS标定单目和双目相机的过程,同时提供生成棋盘格文件的方法。 参考链接: [1]使用ros标定相机的内参和外参 [2]ROS下采用camera_calibration进行双目相机标定 棋盘格可以自己买一个,或者打印一个粘在板子上,棋盘格电子版生成可以参考博客《使用kalibr标定工具进

    2024年02月11日
    浏览(48)
  • zed2i相机内参标定

    参考: https://blog.csdn.net/yanpeng_love/article/details/107166922 https://blog.csdn.net/weixin_41954990/article/details/127928852 参考以上连接先安装 kalibr 。 注意: python包装不上,换成:pip install 出现pyx找不到的错误:sudo apt-get install python3-pyx 1. 生成标定板 可以自己定制特定尺寸的标定板: 其中,

    2024年02月04日
    浏览(93)
  • 相机标定 >> 坐标系转换@内参、外参

    为了更好的理解标定,首先应熟悉各个坐标系。(坐标系图均取自百度百科) 该坐标系是以图像左上角为原点建立以像素为单位的二维坐标系u-v。(相对坐标系) 图像坐标系是以 O1 (是图像的主点,也即光轴与像平面的交点,一般就是像素坐标系的中点)为原点的二维坐标

    2024年02月12日
    浏览(53)
  • 相机和雷达外参联合标定

    内容: 关于雷达和相机外参联合标定的踩坑纪录。 Date: 2023/03/19 硬件: 上位机: Jetson ORIN (Ubuntu 20.04, ROS noetic) 雷达: Ouster 32线 相机: Intel D435 一、 标定方案 目前流行的 雷达+相机 标定方案有五种:Autoware, apollo, lidar_camera_calibration, but_velodyne。 Ubuntu20.04安装autoware我看bug比较多,因

    2024年02月11日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包