【LIO-SAM】速腾激光雷达与IMU的联合标定并使用 LIO-SAM 建图

目录

1、 LIO-SAM 安装

1.1  安装依赖

1.2  下载源码并编译

2、lidar-align 安装

2.1 下载源码编译

2.2 解决 nlopt 报错

2.3 解决定义冲突报错

3、安装 rs_to_velodyne 转化节点

3.1 下载源码编译

3.2 建立 launch 文件

3.3 将节点写进驱动运行文件

3.4 解决 intensity 警告

4、 Lidar-IMU外参标定

4.1 数据采集

4.2 使用  lidar_align 标定

5、IMU的内参标定

5.1 安装依赖

5.2 下载 imu_utils 和 code_utils

5.3 编译

5.4 录制 imu.bag

5.5 标定

6、 实际环境 LIO-SAM 建图

6.1 实际环境地图数据采集

6.2 修改 LIO-SAM 配置参数

6.3 实际数据集跑 LIO-SAM

参考


 

1、 LIO-SAM 安装

 

1.1  安装依赖

安装 ROS 依赖

sudo apt-get install -y ros-melodic-navigation
sudo apt-get install -y ros-melodic-robot-localization
sudo apt-get install -y ros-melodic-robot-state-publisher

浏览器中复制下方网址下载 gtstam

https://github.com/borglab/gtsam/archive/4.0.2.zip

打开终端,对压缩包进行解压和安装

cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/
cd ~/Downloads/gtsam-4.0.2/
mkdir build && cd build
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
sudo make install -j8

 

1.2  下载源码并编译

创建新的工作空间

makdir -p ~/lio_sam_ws/src
cd ~/catkin_ws
catkin_make
sudo gedit ~/.bashrc

将下列代码写进打开的文件,保证每次打开终端都能刷新新工作空间的环境变量

source ~/lio_sam_ws/devel/setup.bash

在工作空间下克隆 Lio-sam 工程,编译

cd ~/lio_sam_ws/src
git clone https://ghproxy.com/https://github.com/TixiaoShan/LIO-SAM.git
cd ..
catkin_make

编译成功界面如下

67b39aa8f97ca9e83a5f7f6da0a9f663.png

 

2、lidar-align 安装

 

lidar_align基本原理:
1、读取rosbag的数据,通过时间戳匹配LiDAR每帧里面的每个点和IMU的坐标变换
2、通过上面的变换矩阵将利用位姿信息将LiDAR的每帧拼接成点云,迭代优化坐标变换使得距离最小。

 

2.1 下载源码编译

lidar-align 是苏黎世理工大学开源的一种标定里程计与雷达的算法,经改动后也可以对IMU和雷达进行联合标定,其 github 链接为 lidar_align ​ ,改动后的链接为 lidar_align_wwtx ,建议直接下载改动后的链接,将代码放进工作空间 ~/lio_sam_ws/src

cd ~/lio_sam_ws
catkin_make

直接编译会出现依赖报错的情况

62d958d9ee80dec9b7f447f012f78fa2.png

 

2.2 解决 nlopt 报错

下载依赖 nlopt

sudo apt-get install ros-melodic-nlopt

b4e39eed63b6b9768aedcc7db18cf4d5.png

同时也安装了另一种方式的依赖

sudo apt-get install libnlopt-dev

将 ~/lio_sam_ws/src/lidar_align_wwtx-main/NLOPTConfig.cmake 文件移动到  ~/lio_sam_ws/src下,并进行第二次编译

c4dcc7fcdbb82ef0affd530b412bdb9c.png

fe2aa46708062c105f0ea6c5ee05780c.png

catkin_make

 

2.3 解决定义冲突报错

第二次编译依旧会报错,这属于是定义冲突问题

fe523eb449c4641a2feecf3bac7ab2e8.png

运行以下指令,处理定义冲突问题

//依次运行以下指令
sudo mv /usr/include/flann/ext/lz4.h /usr/include/flann/ext/lz4.h.bak

sudo mv /usr/include/flann/ext/lz4hc.h /usr/include/flann/ext/lz4.h.bak

sudo ln -s /usr/include/lz4.h /usr/include/flann/ext/lz4.h

sudo ln -s /usr/include/lz4hc.h /usr/include/flann/ext/lz4hc.h

重新编译

catkin_make

编译成功

5e6f8cc6d7439fd6ae0b5f7169dc0271.png

 

3、安装 rs_to_velodyne 转化节点

 

LIO-SAM 作者对激光雷达的数据格式有要求,考虑到与 IMU 时间同步问题,源码中会检查激光雷达的ring通道和时间戳是否符合要求,即对数据格式要求为 XYZIRT(- x, y, z, intensity, ring, timestamp)格式,这种格式就包含了ring通道和timestamp时间戳数据,速腾新款驱动支持两种激光雷达点云格式,即 XYZI (x, y, z, intensity)格式和 XYZIRT(- x, y, z, intensity, ring, timestamp)格式

因此需要把 rslidar_sdk 中的数据输出格式改为 XYZIRT 格式,修改 CMakeLists.txt 中的内容,将输出格式改为 XYZIRT

(此处缺一张图)

 

但是运行 LIO-SAM 的时候,直接使用速腾输出的 XYZIRT 格式的点云仍然会保存,是因为速腾的 RS16 雷达输出中包含了部分 Nan 的点,需要做剔除。为了方便起见,可以直接使用 rs_to_velodyne 转化节点,直接把 robosense XYZIRT 转成 velodyne XYZIRT 即可

 

3.1 下载源码编译

打开之前安装速腾雷达驱动的工作空间 ~/rslidar/src,下载转化节点,可以使用 git clone,也可以直接网页下载 rs_to_velodyne,下载后退到上一级空间编译

git clone https://github.com/HViktorTsoi/rs_to_velodyne.git
cd ..
catkin_make

0b2780cbf651e5d2777ddbc08ca4683e.png

 编译成功

86ecba25b4acdba50b673957e7ec55ec.png

 

3.2 建立 launch 文件

在与 src 并列的位置新建 launch 文件夹,在 launch 文件夹内新建 rs2velodyne.launch 文件用来启动节点

105d927e94c2789925de8a3a5cf220a0.png

cd ~/rslidar_ws/src/rs_to_velodyne-master/launch
touch rs2velodyne.launch

并在 launch 内写入

<launch>
  <node pkg="rs_to_velodyne" name="rs_to_velodyne" type="rs_to_velodyne"  args="XYZIRT XYZIRT"   output="screen">
  </node>
</launch>

 注意 args 参数,采集 XYZIRT 格式的点输入 XYZIRT,采集 XYZI 格式的点输入 XYZI

可先启动 launch 文件测试一下

roslaunch  rs_to_velodyne rs2velodyne.launch

看到 Listening to /rslidar_points … 就说明可以了

f2f74b9f1fb03dc50ffa015f26d32f95.png

 

3.3 将节点写进驱动运行文件

以上步骤无误后打开 src/rslidar_sdk/launch/start.launch ( SDK 驱动的 launch 文件),添加以下语句,将转化节点随激光雷达驱动一起启动

 <!--- rs_to_velodyne -->
  <include file="$(find rs_to_velodyne)/launch/rs2velodyne.launch" />

添加节点以后,电脑连接激光雷达,启动激光雷达驱动的 launch 文件

roscore
roslaunch rslidar_sdk start.launch

270a7d2ad38c6c7975013a614467a0ca.png

 2ff8ac7e9c6b7b07699ac057a1159636.png

6258a7838d9016db841ad87c3cc8baa0.png

输入代码查看节点是否运行 

rostopic list 

566c56e91f6f727c6f719b1466c4d91f.png

 

 

3.4 解决 intensity 警告

以上运行结果可以看出来虽然可以正常输出点云,但是终端会输出 intensity 的警告,出现这个警告的原因,大概率是因为 rs_to_velodyne功能包中定义的点云数据结构中的 intensity 出现了不一致的原因。首先,这个包希望接收的 rslidar 点云的数据格式中的 intensity 是 uint8_t 类型的,但是它转换之后的 velodyne 点云的数据格式中的 intensity 是通过一个宏定义来定义的,看到这里,答案已经很明确了,就是因为这里使用的 intensity 是 float 类型的,导致了两种数据格式不匹配,所以才出现了我们一开始报的那个 ``warming`

把 rslidar 的点云格式中的 uint8_t intensity;  使用PCL_ADD_INTENSITY; 替换,并将POINT_CLOUD_REGISTER_POINT_STRUCT 中 intensity 的数据类型也改成 float 即可

 a5226ee106efb948ff6974af45f11a5d.png

 修改完成之后,重新编译一次,我们运行再看看是否还有那个警告,警告消失了,但依旧存在以下问题,这个问题不知道咋解决,不影响点云显示,看网友评论速腾工程师说这个并不影响结果,不是报错,就先不解决,先放着

068cb8bda23ed6d579acb5f2f86496b2.png

 

4、 Lidar-IMU外参标定

开始标定,使用轮趣小车,robosense helios 16p 激光雷达,N10 mini IMU,寻找一个室内场景录制1-2分钟不超过2G大的 bag 包

4.1 数据采集

启动小车

roscore
roslaunch turn_on_wheeltec_robot turn_on_wheeltec_robot.launch

 启动雷达

roslaunch rslidar_sdk start.launch

 启动IMU

roslaunch fdilink_ahrs ahrs_data.launch

 使用 rosbag 录制标定数据集

rosbag record -O lidarimu.bag /velodyne_points /imu

保险起见录制了5个数据集,均不超过 2G 大小

010cbd81e190b6b74cfd06cf64411d1b.png

 

4.2 使用  lidar_align 标定

 使用录制的数据集跑标定算法,打开 lidar_align.launch 文件,修改 bag 包的地址,如下图第四行,将 “/home/nuc/自己录制的数据集/ lidarimu.bag”写进去

c30947d958312436518bed08fd2aa862.png

 重新打开一个终端,运行程序

roslaunch lidar_align lidar_align.launch

 运行过程图如下所示

8ad02680b74c9e6ba912891ffcb1e63a.png

 ac1a9391d5f6788170af76bde92ba7f9.png

标定完成

7b282ecc2209ccfa4d729c71ce6c4df5.png

 可以看到在程序结束后并没有退出终端,所以在 launch 文件中的 node 节点中添加 required=“true”,如果 node 标记为 required ,这个 node 结束时,会结束整个 launch 启动的所有 node

11667f7a9b95d207f5b640e1b4553d84.png

 

5、IMU的内参标定

 IMU内参是一项非常重要的参数,建图的时候各种跑飞基本是这一项误差未标定的原因。笔者使用的标定工具是港科大的一个标定工具imu_utils,使用Allan方差来标定高斯白噪声和随机游走噪声(即零偏Bias)。有了这一项参数即可准备开始建图了。

 

5.1 安装依赖

sudo apt-get install libdw-dev

 

5.2 下载 imu_utils 和 code_utils

imu_utils下载地址为:https://github.com/gaowenliang/imu_utils

code_utils下载地址为: https://github.com/gaowenliang/code_utils
 

在编译之前我们先注意三个问题,避免入坑

(1)全局安装 ceres 库,code_imu 依赖 ceres

(2)不要同时把 imu_utils 和 code_utils 一起放到 src 下进行编译

由于imu_utils 依赖 code_utils,所以先把 code_utils 放在工作空间的 src 下面,进行编译。然后再将 imu_utils 放到 src 下面,再编译
 

5.3 编译

先解压 code_utils 编译,编译时会遇到头文件报错

catkin_make

136723ae4eaed45f31de1feb631d0ce1.png

解决办法:修改~/imuCali_ws/src/code_utils/src/sumpixel_test.hpp文件中的头文件为:

#include "code_utils/backward.hpp"

之后重新编译即可编译成功,此时解压 imu_utils,再重新编译即可编译成功

ba2e59b605b838784cea5de547318f7b.png

 

5.4 录制 imu.bag

让 imu 静止不动两个小时,录制 imu 的bag.,开启 imu

roslaunch fdilink_ahrs ahrs_data.launch

 查看运行的节点,可以看到 imu 的节点已经运行了

rostopic list

515781cff96a04a74c2e1a7572c2545c.png

 启动十分钟后开始录制 imu 数据集,在准备保存数据集的文件夹下打开终端

rosbag record -O imu.bag /imu

两个小时后 CTRL+C 结束录制

 

5.5 标定

打开 imu_utils 下面有一堆 launch 文件,将 A3.launch 复制并重命名为 test.launch,打开,将下面的 value 换成你自己的 IMU 数据 topic,下面的120是读取数据时间长度,录了俩小时就写120。之后开始标定

182d0520b129e3c47ba36c75457e5449.png

roscore
roslaunch imu_utils test.launch 
//以两百倍速播放IMU数据包
rosbag play -r200  imu.bag

终端接收到数据是没有反应的,结束时才会显示标定结果。同时在data文件夹下会生成一堆文件我们需要的是图中选中的

b8fe3dc52992b83e28012bbfd239d81d.png

%YAML:1.0
---
type: IMU
name: A3
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 7.2335662478452336e-04
      gyr_w: 2.5839245379852482e-05
   x-axis:
      gyr_n: 7.1439149985839186e-04
      gyr_w: 1.1065778084095001e-05
   y-axis:
      gyr_n: 9.9490070066998271e-04
      gyr_w: 5.5351755000790449e-05
   z-axis:
      gyr_n: 4.6077767382519551e-04
      gyr_w: 1.1100203054671986e-05
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 1.1880020152589913e-02
      acc_w: 2.4785727564746469e-04
   x-axis:
      acc_n: 1.6381922962635669e-02
      acc_w: 2.5041696441884117e-04
   y-axis:
      acc_n: 9.6692762380288406e-03
      acc_w: 2.3425782678078804e-04
   z-axis:
      acc_n: 9.5888612571052335e-03
      acc_w: 2.5889703574276493e-04

 

6、 实际环境 LIO-SAM 建图

嘤嘤嘤,终于到这一步了,天不负我!!!!

6.1 实际环境地图数据采集

启动小车

roscore
roslaunch turn_on_wheeltec_robot turn_on_wheeltec_robot.launch

启动键盘控制 

roslaunch wheeltec_robot_rc keyboard_teleop.launch

 启动雷达

roslaunch rslidar_sdk start.launch

 启动 IMU

roslaunch fdilink_ahrs ahrs_data.launch

 使用 rosbag 录制标定数据集

rosbag record -O dalou.bag /velodyne_points /imu


6.2 修改 LIO-SAM 配置参数

打开 config 文件夹下 params.yaml 文件,最好是 copy 一份源文件保存下来)

修改雷达和 imu 的话题,pointCloudTopic 改为自己的雷达话题名称,imuTopic 修改为自己的 imu 话题名称

485ef3625e9587f77577c4e82538b370.png

 修改 imu 内参,内参数据参考上述步骤中内参标定文件,其对应关系为(均为avg-axis下数据)

// Acc误差模型高斯白噪声
  imuAccNoise<---------->acc_n 
  // Gyro误差模型高斯白噪声
  imuGyrNoise<----------> gyr_n
  // Acc误差模型随机游走噪声
  imuAccBiasN<---------->acc_w
  // Gyro误差模型随机游走噪声
  imuGyrBiasN<----------> gyr_w

80ed7eb5cd1cff6957b192edd9e6b1ef.png

 d2e0972e5ec31d7ce097c96aeea63388.png

 

修改 Lidar–>IMU 外参,打开标定好激光雷达和IMU外参的 txt 文件找到以下参数

4d576cc1ef8ff51c4ec58ef405494661.png

 将上述方框标注的参数对应写到下方配置文件中

387ff524cc2d1f61777aeaca1fd7af1a.png

 

 其他参数最好是不要改动,修改完保存。最好是在编译一下,没有错误之后可运行 launch 文件启动,进行播包。(另外默认是不会保存 pcd 文件的,可以自己修改一下,但是每次运行都要修改路径,否则会覆盖掉上次的文件。)

 

6.3 实际数据集跑 LIO-SAM

关闭所有终端,新开终端开始运行数据集

roscore
roslaunch lio_sam run.launch

在保存数据集的文件夹打开终端,播放数据集、

rosbag play ladirimut.bag

解决 libmetis.so 报错,如果运行时出现以下报错,是因为运行时需要用到 libmetis-gtsam.so 这个动态库,libmetis-gtsam.so 这个文件位于路径“/usr/local/lib” 中,而程序默认找的位置是路径“/usr/lib”,所以没有找到,把文件复制过去就行

641fa4e788d4dc7acb882f8cd8abb601.png

 

 sudo cp /usr/local/lib/libmetis.so /usr/lib

报错这种,属于是第一步依赖没有装,滚回去第一步装依赖!!!

f8e13240d3dcde42b124ce404300336f.png

最终运行结果如下所示 

4e0a271ef38dd5390085081d1cddd534.png

虽然结果没有很精确,但是这组标定参数能够完整建出一张图,没有飘的很离谱,那就说明可用,是一只能抓耗子的猫!!!时间紧任务重,就这么着了,还要什么自行车!!!!! 

89885b5bd05f0e87b16c281ed5a7bf25.png

27c0ce4ee326c6d0ed8053eb92b96783.png

2c04fc136143a9a81f88a68c721cc648.png

 

最终比较好的结果

 

7e97154ecf0b51f7aa6a00e925f9b9f8.png

 

6116bc92f7e51707677cb53bb65ee6c9.png

ac65e16842ae608e4d82c39887238610.png

保存 pcd 地图,修改 /config/params.yaml 文件,将 savePCD 后面 false 改为 true,在双引号中写清楚保存地址,注意不用写 /home/gongmeifang 最后保存的时候会在你写的地址前主动加上这俩,写了的话保存就会出错,修改完编译

b467da5598f950523e6877da1fea8730.png

 在 rviz 中建图过程结束了之后,终端 ctrl+c 就能保存地图

9ab84422f1a0ce6d78b4674090654308.png

 查看 pcd 点云图

pcl_viewer GlobalMap.pcd

15a5e6f1220bd73ef813808fb6133081.png

天不负我!!!!!!

 

参考

 

激光雷达和IMU联合标定并运行LIOSAM_imu和雷达联合标定后怎么使用_岁暮&C的博客-CSDN博客

Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题_^oprater^的博客-CSDN博客

Ubuntu18 安装ROS节点解决----速腾聚创雷达点云格式转换为Velodyne雷达点云格式 --SLAM不学无术小问题_^oprater^的博客-CSDN博客

使用lidar_align标定lidar与imu_imu怎么录制数据_zhhao1326的博客-CSDN博客

用imu_utils标定IMU,之后用于kalibr中相机和IMU的联合标定_imu_untils的作者_一ping就通的博客-CSDN博客

解决error while loading shared libraries: libmetis-gtsam.so: cannot open shared object file_橘子皮一下的博客-CSDN博客

lio-sam运行并保存地图_lio-sam怎么保存建图_等下完这场yu的博客-CSDN博客

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值