Ubuntu20.04使用lidar_IMU_calib
浙大开源的lidar_IMU_calib提供了在无目标的情况下进行Lidar和IMU的标定。下面记录了我在使用过程中遇到的一些问题,希望对大家有所帮助,也希望大家指出错误。
源代码只支持了VLP-16, 实际使用过程中常常需要使用其他类型的雷达,需要对代码进行拓展,本文提供了百度网盘下载拓展后的代码(支持了RS_Helios5515)。
1.编译
Github源码地址
编译步骤:
mkdir -p ~/catkin_li_calib/src
cd ~/catkin_li_calib/src
catkin_init_workspace
####下载源码###########
git clone https://github.com/APRIL-ZJU/lidar_IMU_calib
####下面是安装一些依赖############
####ndt_omp###
wstool init
wstool merge lidar_IMU_calib/depend_pack.rosinstall
wstool update
cd lidar_imu_calib
./build_submodules.sh
cd ../..
catkin_make
source ./devel/setup.bash
###
注意:ubuntu20.04一般是pcl1.10和c++ 14,如果编译不通过,在CMakeLists.txt中修改。
2.源码修改
源码只支持了VLP-16,要使用其他的雷达信号需要自己自己增加相关的代码。这里参考了@
kero-czh博主的思路,主要修改在*/include/utils/vlp_common.h和dataset_reader.h文件,以及/src/ui/calib_helper.cpp*文件中的内容。修改主要内容是根据其他雷达的用户手册在源码中增加新的雷达模型。
修改后的完整项目我放在了百度网盘中,有需要请自行下载。
注意:由于ubuntu系统是20.04,在编译成功后运行代码会导致Pangolin链接到python3.7m.so.1.0。所以可以修改项目文件的CMakeLists.txt,将PANGOLIN_DIR的路径注释掉,然后在系统中重新安装Pangolin,重新编译即可。
find_package(Eigen3 REQUIRED)
# find_package(Boost REQUIRED COMPONENTS system filesystem thread date_time)
find_package(Boost REQUIRED)
# set(PANGOLIN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/build-pangolin")
find_package(Pangolin REQUIRED)
在运行时也有可能找不到Pangolin的相关Lib,这是需要把自己安装的Pangolin链接加入到环境变量中。首先知道自己安装的Pangolin的位置,一般安装在 /usr/local/lib 中,打开 .bashrc文件,添加:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
3.录制数据集
录制标定数据集时,尽量在室内平面较多的地方,也要注意不要在太过狭窄的小房间内。需要在录制时,固定lidar和imu,让雷达和imu在各个方向上旋转和移动充分。(更新,其实移动充分就可以了)。
4.标定
标定之前,需要在launch 文件中更改录制的bag包的地址,和持续时间,以及lidar的类型,话题名。
launch文件如下(标红的部分)
<?xml version="1.0"?>
<launch>
<arg name="topic_imu" default="/imu/data" />
<arg name="path_bag" default="*****(path to your bag)" />
<arg name="bag_start" default="1" />
<arg name="bag_durr" default="**以秒为单位" />
<arg name="scan4map" default="15" />
<arg name="lidar_model" default="your lidar model" />
<arg name="ndtResolution" default="0.5" /> <!-- 0.5 for indoor case and 1.0 for outdoor case -->
<arg name="time_offset_padding" default="0.015" />
<arg name="show_ui" default="false" />
<node pkg="li_calib" type="li_calib_gui" name="li_calib_gui" output="screen">
<!-- <node pkg="li_calib" type="li_calib_gui" name="li_calib_gui" output="screen" clear_params="true" launch-prefix="gdb -ex run --args">-->
<param name="topic_imu" type="string" value="$(arg topic_imu)" />
<param name="topic_lidar" type="string" value="your lidar topic" />
<param name="LidarModel" type="string" value="$(arg lidar_model)" />
<param name="path_bag" type="string" value="$(arg path_bag)" />
<param name="bag_start" type="double" value="$(arg bag_start)" />
<param name="bag_durr" type="double" value="$(arg bag_durr)" /> <!-- for data association -->
<param name="scan4map" type="double" value="$(arg scan4map)" />
<param name="ndtResolution" type="double" value="$(arg ndtResolution)" />
<param name="time_offset_padding" type="double" value="$(arg time_offset_padding)" />
<param name="show_ui" type="bool" value="$(arg show_ui)" />
</node>
</launch>
其中参数bag_durr可以使用下面的命令得到持续时间
rosbag info ***.bag
运行有两种方法
一种是按照源码的方法,运行calib.sh(这种方法还需要在callib.sh中修改相关的参数)
./src/lidar_IMU_calib/calib.sh
一种是直接运行launch文件
roslaunch li_calib licalib_gui.launch
运行可能出现的错误
1:提示报错,找不到libpython3.7m.so.1.0,没有这个文件
这个报错是由于系统中没有python3.7。这种情况不需要再安装python3.7,请转到本篇文章第二部分的源码修改中的部分,查看解决方案。
2.代码在优化时迭代卡在了0次,不往下运行。
在GitHub的issue55中找到解决方案:在 /thirdparty/Kontiki/kontiki/sensors.const_bias_imu.h 中找如下代码,并在代码中加入 return true
bool LockGyroscopeBias(bool lock) {
gyro_bias_locked_ = lock;
//加入
return true;
}
bool AccelerometerBiasIsLocked() const {
return acc_bias_locked_;
}
bool LockAccelerometerBias(bool lock) {
acc_bias_locked_ = lock;
//加入
return true;
}
5.标定结果
P_LinI 为Lidar在IMU坐标系下的平移,euler_LtoI:为Lidar变换到imu的欧拉角(变换为旋转矩阵即为lidar->imu)。