文章目录
一、问题描述
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解决
- 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>
- error: “fatal error: backward.hpp”
编译过程中,遇到如下图中的fatal error: backward.hpp
的错误:
解决方法:修改code_utils/src/sumpixel_test.cpp
文件:
#include "backward.hpp"
改成
#include "code_utils/backward.hpp"
- 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工具