使用 imu_utils 、Kalibr 工具进行IMU和相机内外参外参标定

一、问题描述

vins系列安装完成后,将自己采集的图像和imu数据进行测试时,发现很难初始化化,即使初始化成功机器位姿总是跑飞(尤其是旋转时),内外参必须标定!!过来整理标定的填坑过程。。。

二、imu_utils 工具的使用

1. 安装

1.1 下载与编译

mkdir -p imu_calib_WS/src
cd imu_calib_WS/src

# 下载 code_utils 、imu_utils
# 注意:全局安装ceres库,code_imu依赖ceres;
git clone https://github.com/gaowenliang/code_utils.git
git clone https://github.com/gaowenliang/imu_utils.git

cd ..
catkin_make

1.2 编译bug解决

  1. error: “code_utilsConfig.cmake”
    编译过程中,遇到如下图中的Could not find the required component 'code_utils'的错误。
    在这里插入图片描述原因是:imu_utils功能包依赖code_utils功能包,而在编译imu_utils功能包时code_utils功能包尚未编译完成解决方法:需指定依赖功能包,具体操作步骤如下:
// 1.在imu_utils 功能包的 CMakeLists.txt 添加
catkin_package(CATKIN_DEPENDS code_utils)

// 2.在imu_utils 功能包的 package.xml 添加
<depend>code_utils</depend>
  1. error: “fatal error: backward.hpp”
    编译过程中,遇到如下图中的fatal error: backward.hpp的错误:
    在这里插入图片描述
    解决方法:修改code_utils/src/sumpixel_test.cpp文件:
#include "backward.hpp"
改成
#include "code_utils/backward.hpp"
  1. error: “libdw.h”
    编译过程中,遇到如下图中的fatal error: libv4l2.h的错误,直接 sudo apt-get install libdw-dev 解决。
    在这里插入图片描述

2. 标定 IMU

2.1 imu bag包录制

2.1.1 imu 数据格式

不同imu硬件驱动包驱动方式不同,此处只整理imu产生数据后的后期处理,下面为一帧imu数据(话题名为/imu0 ,话题消息格式采用ros官方的 sensor_msgs/Imu)。

rostopic echo -n 1 /imu0 
		header: 
		  seq: 5970
		  stamp: 
		    secs: 1403637140
		    nsecs: 448319000
		  frame_id: "imu4"
		orientation: 
		  x: 0.0
		  y: 0.0
		  z: 0.0
		  w: 1.0
		orientation_covariance: [99999.9, 0.0, 0.0, 0.0, 99999.9, 0.0, 0.0, 0.0, 99999.9]
		angular_velocity: 
		  x: 0.010471975511965976
		  y: 0.10402162341886204
		  z: 0.13683381335635544
		angular_velocity_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
		linear_acceleration: 
		  x: 9.022118
		  y: -0.8253930416666666
		  z: -2.5415567916666664
		linear_acceleration_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
---
2.1.2 imu 数据录制

执行如下命令,进行imu的bag包录制。

# --duration=0.5h  		0.5h
# --duration=1m  		1min
# --duration=30  		30s
rosbag record -O imudata_30m.bag /imu0 --duration=0.5h  # 录制/imu0数据0.5h,并保存在imudata_30m.bag 中

2.2 imu 标定

上述步骤完成后,进入imu_utils功能包文件夹下 icm42652.launch 文件(自己添加)进行相关设置:

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/imu0"/>					 <!-- imutopic名称 -->
        <param name="imu_name" type="string" value= "icm42652"/>        <!-- imu名称 -->
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/icm42652/"/>  <!-- 标定结果文件保存位置 -->
        <param name="max_time_min" type="int" value= "60"/>            <!--使用bag数据的最大时长 60为60min,默认是120分钟,程序会在最大时间截断读取数据-->
        <param name="max_cluster" type="int" value= "100"/>
    </node>

    <arg name="bag_name" default = "imudata_30m" /> 	<!--imu的bag名-->
    <node pkg="rosbag" type="play" name="player" output="log" args="$(env HOME)/data/datasets/0428_localization/$(arg bag_name).bag  -r 5"/>		<!-- 5倍速播放bag包-->
</launch>

imu_utils/data 路径下添加上面launch文件配置 imu_name 的内容,方便后续程序结束保存标定的结果文件(理论上应该程序自动生成路径,但实操后未生成)。

执行如下命令进行标定:

roslaunch imu_utils icm42652.launch

幸运的话,等待一会对应的目录文件夹会有yaml标定文件生成:

%YAML:1.0
---
type: IMU
name: icm42652
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 1.4349307905863827e-03			# 陀螺仪误差模型高斯白噪声
      gyr_w: 1.9369393077422063e-05			# 陀螺仪bias
   x-axis:
      gyr_n: 1.4784338214134302e-03
      gyr_w: 2.1455538970808570e-05
   y-axis:
      gyr_n: 1.5718208003725456e-03
      gyr_w: 2.2505267719503148e-05
   z-axis:
      gyr_n: 1.2545377499731717e-03
      gyr_w: 1.4147372541954469e-05
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 1.4501213884079829e-02		# 加速度计误差模型高斯白噪声
      acc_w: 1.4807089586902465e-04		# 加速度计bias
   x-axis:
      acc_n: 1.4483543834083238e-02
      acc_w: 7.5054689915566628e-05
   y-axis:
      acc_n: 1.4540207652520546e-02
      acc_w: 1.9777915646436287e-04
   z-axis:
      acc_n: 1.4479890165635700e-02
      acc_w: 1.7137884122714445e-04

根据launch文件配置,标定文件生成路径:
在这里插入图片描述

建议imu_utils/src/imu_an.cpp 的 imu_callback 回调函数中添个获得imu数据的标记,否则,终端一直停留在 wait for imu data. 很容易让人自我怀疑(尤其是首次标定),,,
在这里插入图片描述

三、Kalibr 工具的使用

1. 安装

1.1 下载与编译

mkdir -p kalibr_cam_WS/src
cd kalibr_cam_WS/src

git clone https://github.com/ethz-asl/kalibr.git

cd ..
catkin_make

1.2 问题解决

编译过程中,遇到如下图中的fatal error: libv4l2.h的错误,直接 sudo apt-get install libv4l-dev 解决。
在这里插入图片描述

# 生成4.5cm*4.5cm的aprilgrid(适应A3打印)
rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 4 --tsize 0.045 --tspace 0.3 --eps

# 生成 棋盘格标定板
rosrun kalibr kalibr_create_target_pdf --type checkerboard --nx 8 --ny 11 --csx 0.05 --csy 0.05

aprilgrid 生成图片如下所示:

在这里插入图片描述
其对应的 checkboard.yaml 文件如下设置:

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 4               #number of apriltags
tagSize: 0.045           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          #ratio of space between tags to tagSize

标定板参数说明
--type apriltag 标定板类型
--nx [NUM_COLS] 列个数
--ny [NUM_ROWS] 行个数
--tsize [TAG_WIDTH_M] 二维码方格长度(size),单位m
--tspace [TAG_SPACING_PERCENT] 小方格与二维码方格长度比例
--eps参数,可以生成eps文件

在这里插入图片描述

转换工具:EPS转PNG/JPG/TIFF工具PDF转PNG工具