激光雷达-IMU联合标定

2023-12-28 11:03:26

激光雷达-IMU联合标定

前期已经完成了 IMU 的标定,需要运行 LIO-SAM 的话需要进行激光雷达和 IMU 的外参标定

采用浙江大学开发的 lidar_imu_calib 工具(以下简称LI_calib)进行外参标定,原因是其他标定工具在各个方面都有一定局限(如苏黎世联邦理工的 lidar_align 工具作者提到不能用于纯imu与雷达的标定;哈工大的 lidar_imu_calib 只能标定旋转矩阵)

编译安装 LI_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

录制标定数据

录制数据时,需要将两个设备充分固定到一起,并基于充分的运动激励

选择把这两个设备的框架整体拆卸下来,录制好数据以后再整体装回去

录制时其他的注意事项:

  1. 需要在平面多的房间里录制,特征点过少或者平面过少可能会导致失败,经测试一般办公室环境就可以
  2. xyz三轴方向都需要充分移动、充分转动,但不宜加速度过大的猛烈撞击式运动,具体操作可以看下面的视频

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窗口中,依次点击以下按钮:

  • 初始化(Initialization)

点击一次即可,耐心等待终端出现以下字段即初始化成功

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
  • 数据关联(Data Association)

点击一次即可,耐心等待终端出现以下字段即数据关联成功

[Association] start ....
Plane type  : 2  3 35; Plane number: 40
Surfel point number: 22868
[Association] 21146.2 ms
  • 初始化优化(Batch Optimization)

点击一次即可,耐心等待终端出现以下字段即初始化优化成功

================ 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)

多次点击,终端出现 [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

参考

激光雷达和IMU联合标定并运行LIOSAM

IMU+激光雷达融合使用LIO-SAM建图学习笔记——详细、长文、多图、全流程

文章来源:https://blog.csdn.net/Solititude/article/details/135260237
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。