前期已经完成了 IMU 的标定,需要运行 LIO-SAM 的话需要进行激光雷达和 IMU 的外参标定
采用浙江大学开发的 lidar_imu_calib
工具(以下简称LI_calib)进行外参标定,原因是其他标定工具在各个方面都有一定局限(如苏黎世联邦理工的 lidar_align
工具作者提到不能用于纯imu与雷达的标定;哈工大的 lidar_imu_calib 只能标定旋转矩阵)
# 建立工作空间并下载源码
mkdir -p ~/catkin_li_calib/src
cd ~/li_calib/src
catkin_init_workspace
git clone https://github.com/APRIL-ZJU/lidar_IMU_calib.git
# 安装依赖
wstool init
wstool merge lidar_IMU_calib/depend_pack.rosinstall
wstool update
cd lidar_IMU_calib
./build_submodules.sh
# 编译
cd ~/li_calib
catkin_make
录制数据时,需要将两个设备充分固定到一起,并基于充分的运动激励
选择把这两个设备的框架整体拆卸下来,录制好数据以后再整体装回去
录制时其他的注意事项:
Collecting Lidar Inertial Data for Motion Based Calibration of a Lidar and an IMU
rosbag record -O ***.bag /lidar_topic /IMU_topic
#其中,***.bag是你期望保存的文件名;
#/lidar_topic是你自己的激光雷达topic名称,必须使用生成有序点云的话题;
#/IMU_topic是你自己的IMUtopic名称,可使用rostopic list命令查看。
#下面是我的指令:
rosbag record -O li.bag /velodyne_packets /IMU_data
其中,两个斜杠后面分别是雷达和IMU的话题名称,VLP-16雷达的话题必须使用 velodyne_packets
而不是 velodyne_points ,否则会生成无序点云而导致后面无法标定;其他雷达也应该使用生成有序点云的话题
开始录制以后,让两设备做充分运动,整个流程1分钟左右即可。结束以后使用CTRL+C结束录制,留存好录制的数据包
1、修改 calib.sh
#!/usr/bin/env bash
bag_path="/home/redwall/lidar_imu_kalibr_ws/src/lidar_IMU_calib/datasets"
outdoor_sync_bag_name=(
#"Court-01.bag"
#"Court-02.bag"
#"Court-03.bag"
#"Court-04.bag"
#"Court-05.bag"
)
indoor_sync_bag_name=(
# "Garage-01.bag"
#"Garage-02.bag"
#"Garage-03.bag"
#"Garage-04.bag"
#"Garage-05.bag"
"lidar_imu_kalibr.bag"
)
imu_topic_name=(
# "/imu1/data_sync"
#"/imu2/data_sync"
#"/imu3/data_sync"
"/zedm/zed_node/imu/data"
)
bag_start=1
bag_durr=95
scan4map=15
timeOffsetPadding=0.015
show_ui=true #false
bag_count=-1
sync_bag_name=(${outdoor_sync_bag_name[*]} ${indoor_sync_bag_name[*]})
for i in "${!sync_bag_name[@]}"; do
let bag_count=bag_count+1
ndtResolution=0.5 # indoor
if [ $bag_count -lt ${#outdoor_sync_bag_name[*]} ]; then
ndtResolution=1.0 # outdoor
fi
for j in "${!imu_topic_name[@]}"; do
path_bag="$bag_path/${sync_bag_name[i]}"
echo "topic_imu:=${imu_topic_name[j]}"
echo "path_bag:=${path_bag}"
echo "ndtResolution:=${ndtResolution}"
echo "=============="
roslaunch li_calib licalib_gui.launch \
topic_imu:="${imu_topic_name[j]}" \
path_bag:="${path_bag}" \
bag_start:="${bag_start}" \
bag_durr:="${bag_durr}" \
scan4map:="${scan4map}" \
lidar_model:="VLP_16" \
time_offset_padding:="${timeOffsetPadding}"\
ndtResolution:="${ndtResolution}" \
show_ui:="${show_ui}"
done
done
主要是确定数据包路径和数据包时间
2、运行 calib.sh
3、执行标定流程,在弹出的UI窗口中,依次点击以下按钮:
点击一次即可,耐心等待终端出现以下字段即初始化成功
Ceres Solver Report: Iterations: 31, Initial cost: 4.028359e+06, Final cost: 7.998847e+02, Termination: NO_CONVERGENCE
[Initialization] Done. Euler_ItoL initial degree: 178.919 179.266 -82.6326
点击一次即可,耐心等待终端出现以下字段即数据关联成功
[Association] start ....
Plane type : 2 3 35; Plane number: 40
Surfel point number: 22868
[Association] 21146.2 ms
点击一次即可,耐心等待终端出现以下字段即初始化优化成功
================ Iteration 0 ==================
Ceres Solver Report: Iterations: 31, Initial cost: 2.108107e+06, Final cost: 1.865830e+04, Termination: NO_CONVERGENCE
============== After optimization ================
[Gyro] Error size, average: 13186; 0.00404703 0.00418349 0.0116175
[Accel] Error size, average: 13186; 0.0288359 0.0256794 0.0211061
[LiDAR] Error size, average: 22868; 0.0492501
P_LinI : -0.0184348 0.00617126 0.0859926
euler_LtoI : 179.582 179.409 80.1761
P_IinL : 0.00216661 0.0199835 -0.0858406
euler_ItoL : 0.510795 0.512208 99.8237
time offset : 0
gravity : 0.0586642 -0.111867 9.78919
acce bias : 0.0143021 -0.00411509 0.0325699
gyro bias : 0.000672399 0.001224 -0.000264742
[BatchOptimization] 29117.3 ms
多次点击,终端出现 [Refinement] 24056.2 ms 字段以后就点击一次,直至每次出来的数据不再变化(具体表现是后续每次迭代,终端弹出的字段都完全一样),即视为标定成功,然后手动退出程序
标定完成后,标定的结果文件在之前配置文件中"path_bag"设置的路径下,有个calib_result.csv
文件,这就是要的最终结果文件,建议妥善保存,在建图时会用到
另外还有 3 个 pcd 文件,保存标定过程中的点云
共迭代优化 30 次
标定过程的截屏
标定后的文件
redwall@redwall-G3-3500:/media/redwall/SUN/lidar_imu_kalibr$ tree
.
├── calib_result.csv
├── NDT_target_map.pcd
├── refined_map.pcd
└── surfel_map.pcd
0 directories, 4 files