使用浙大LI Calib工具标定3D雷达和IMU--全过程完整记录

一、准备工作

我使用的环境为Ubuntu20.04+ros noetic版本。

下载编译

首先建立一个工作空间,并下载包,这里工作空间均以ws代替,可自己命名。

mkdir ws
cd ws
mkdir src
cd src
git clone https://github.com/APRIL-ZJU/lidar_IMU_calib

通过wstools导入,wstool是一个用于管理ros工作空间的工具。

wstool init
wstool merge lidar_IMU_calib/depend_pack.rosinstall
wstool update

再进入标定工具包内,导入第三方包,官方已经提供了一个脚本实现

cd lidar_IMU_calib/
./build_submodules.sh

第三方库编译完成后,回到工作空间,编译整个包

cd ../..
catkin_make

可能会报错提示缺包,缺什么装什么就好了,例如我这里缺少了velodyne_msgs

安装

sudo apt-get install ros-noetic-velodyne-msgs

中间我还出现了PCL的报错

需要使用C++14编译,可能是因为我系统中有多个C++版本,错误识别到了gnu9.4,手动指定以下就好了,如果安装过不知道在哪的话可以去/usr/local/bin找一找,如果有的话可以通过version参数查看一下版本。

在进入c++所在位置的文件夹后,
./g++ -v

可以在当前窗口输入以下命令暂时更改变量

export CC=/usr/local/bin/gcc  
export CXX=/usr/local/bin/g++

进入工作空间,再次catkin_make编译。

成功!

数据包录制

使用rosbag录制数据包即可,先打开一个终端启动roscore,再分别启动自己的雷达节点和imu节点。

我使用的是速腾聚创的Helios16雷达,启动后可以输入rostopic list查看话题

启动完成后,开始录制

rosbag record -O lidar16_imu.bag /imu/data /rslidar_points

其中lidar16_imu.bag是数据包名字,可以自己起, /imu/data /velodyne_points分别为imu和雷达话题名,也要换成自己的。

然后就可以将整个框架进行多方向多角度的移动,可以尽量缓慢一点。

录制完成后,查看以下包信息。

rosbag info lidar16_imu.bag 

可以记一下这个时间140s,完成收集。

二、标定

打开launch文件,建议复制一份进行更改,我的命名为my_calib_gui.launch

<?xml version="1.0"?>
<launch>
    <arg name="topic_imu"           default="/imu/data" />
    <arg name="topic_lidar"         default="/rslidar_points" />
    <arg name="path_bag"            default="/home/zsf/zyh/lidar16_imu.bag" />
    <arg name="bag_start"           default="1" />
    <arg name="bag_durr"            default="140" />
    <arg name="scan4map"            default="15" />
    <arg name="lidar_model"         default="VLP_16" />
    <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 &#45;&#45;args">-->

        <param name="topic_imu"         type="string"   value="$(arg topic_imu)" />
        <param name="topic_lidar"       type="string"   value="$(arg topic_lidar)" />
        <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>

跟原本launch文件比增加了一些内容,因为我的lidar不是velodyne的,所以要做一些变更

其中:

topic_imu  为imu话题,改成自己的         
topic_lidar 为雷达话题,改成自己的                 
path_bag  为rosbag包地址,改成上面录制的包存放的位置            
bag_durr   包长度,改成上面用rosbag info看到的值 

还有一个show_ui,这个就是可视化,根据自己需求来就行

然后返回工作空间,执行

source devel/setup.bash
roslaunch li_calib my_calib_gui.launch

然后报了这个错误

经查阅资料,可以进入src/include/utils,修改dataset_reader.h文件

把这个函数类型改成void,这个方法是github的大佬Gouqtitai提供的。

看了看明明是bool类型的函数,却没写返回值。前面我还以为是雷达点云信息类似的问题,去搞了个rslidar转velodyne的包,但是最后发现转完也不行)

重新编译然后运行

这次就成功运行起来了

打开ui界面后

按顺序点击Initialization,DataAssociation,BatchOptimization,多次Refinement,最后SaveMap。

我在这里又出了一个错,当点击BatchOptimization的卡住,最后的输出为在Iteration=0,而且长时间没有反应,如下

在这个路径下找到constant_bias_imu.h

lidar_IMU_calib/thirdparty/Kontiki/include/kontiki/sensors

 

修改LockGyroscopeBias和LockAccelerometerBias,增加return true;

修改完了重新进到功能包里执行./build_submodules.sh编译第三方库,但是又出了这个错,也有提示

按照提示找到路径加入#include <cstdint>

我直接加在了这些里

/thirdparty/Pangolin/include/Pangolin/log/packetstream_tags.h
/thirdparty/Pangolin/include/Pangolin/image/typed_image.h
/thirdparty/Pangolin/external/pybind11/include/pybind11/pytyoes.h

完成!

再回到工作空间编译运行试试

稍微卡了一小会得到结果了!

然后就可以多次进行refinement迭代结果

我这里到第五次其实就没什么太大变化了,但是也多点了两回。

save map点不点都可以。

得到的这些结果就是以imu为基坐标的外参平移向量P_LinI,欧拉角eulerLtoI和以雷达为基坐标的外参P_LinL和eulerLtoL。

最后总结一下,感觉总体工作量还行,主要就是最后运行卡在iteration 0耗费了比较长时间,前面基本上一个下午就都搞定了,最后执行时改错又搞了小两天,还重新录制了一套数据(可以看到我后面包的名字改成_2.bag了),但是就结果来看error还是蛮小的,也算是这几天努力都没有白费吧。

长文制作不易,看到这了给个点赞收藏吧^_^

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值