一、准备工作
我使用的环境为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 --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还是蛮小的,也算是这几天努力都没有白费吧。
长文制作不易,看到这了给个点赞收藏吧^_^