LIO-SAM:配置环境、安装测试、适配自己采集数据集

LIO-SAM是IROS 2020的一篇论文,目前已经开源,作者曾发表过Lego-loam,整体框架与Lego-loam结构相同,但是可读性感觉要比Lego-loam好的多,并添加了gps因子且真正融合了imu。

网上也已经出现了很多关于解读LIO-SAM的文章,但是配置LIO-SAM并运行自己数据集的教程很少,所以本文也是记录自己踩坑的过程,希望能够对大家有用。我也是菜鸟一个,文章中如果有出现理解并不正确的地方,还希望大家批评指正。

Paper:https://github.com/TixiaoShan/LIO-SAM/blob/master/config/doc/paper.pdf

工程源码:https://github.com/TixiaoShan/LIO-SAM

环境配置及安装、运行

1、首先安装ros kinetic,可以按照wiki官网教程安装。

2、安装好ros后,还需要安装一些依赖功能包

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

3、安装gtsam 4.0.2

gtsam官网:https://github.com/borglab/gtsam

git clone https://github.com/borglab/gtsam.git
mkdir build && cd build
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
sudo make install -j4

4、创建好工作空间catkin_ws,将lio-sam源码下载到catkin_ws/src目录下编译

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

5、运行官方数据集进行测试

LIO-SAM的github首页提供了很多的数据集,但是这些数据集都是在Google网盘中,国内下载很慢或者根本下载不了,但是好在有大神已经做了搬运,大家可以去下面的地址中下载,同时该博主也写了关于LIO-SAM的安装配置教程。

LIO_SAM实测运行,论文学习及代码注释[附对应google driver数据]

上述博客中分享了三个官方数据集:casual_walk_2.bag、outdoor.bag、west.bag。

如果运行casual_walk_2.bag不需要修改任何参数,使用默认文件即可;如果要运行其它两个数据集,则需要做如下修改:

imuTopic: "imu_raw"  改为 imuTopic: "imu_correct"
extrinsicRot 和 extrinsicRPY 设为单位矩阵

其中extrinsicRot表示imu->lidar的坐标变换, 用于旋转imu坐标系下的加速度和角速度到lidar坐标系下, extrinsicRPY则用于旋转imu坐标系下的欧拉角到lidar坐标下, 由于lio-sam作者使用的imu的欧拉角旋转方向与lidar坐标系不一致, 因此使用了两个旋转不同, 但是大部分的设备两个旋转应该是设置为相同的。

同时GitHub主页还提供了验证GPS的数据集(park.bag),如果要使用GPS数据,则需要进行如下修改:

gpsTopic: "odometry/gpsz"  改为 gpsTopic: "odometry/gps"  
useImuHeadingInitialization: false 改为 useImuHeadingInitialization: true   # 如果使用gps数据这里一定要设置为true,不然可能会跑飞

为了记录测试过程,将GitHub给出的示例数据集做了转移,并将相应的配置参数文件与相对应的数据集放在了一起,有兴趣的朋友可以直接下载数据集和对应的配置参数使用。

链接:https://pan.baidu.com/s/1MqQD22d4sA3iUszlWg3C8Q 提取码:2eyj

启动程序运行示例数据:

# 启动lio-sam功能包
roslaunch lio_sam run.launch
# 播放数据集
rosbag play outdoor.bag

在这里插入图片描述

工程参数修改及问题解决

1、如果想要保存地图,需要对config/params.yaml文件进行如下修改

# 保存地图设置为true
savePCD: true                              # https://github.com/TixiaoShan/LIO-SAM/issues/3
# 设置地图保存路径
savePCDDirectory: "自己设置的路径"        # in your home folder, starts and ends with "/". Warning: the code deletes "LOAM" folder then recreates it. See "mapOptimization" for implementation

更改了配置文件后,还需更改一下_TIMEOUT_SIGINT参数,否则可能造成地图保存失败(这是由于ros会在_TIMEOUT_SIGINT秒后关闭ros节点,但是地图过大时,保存地图会花费一些时间,如果_TIMEOUT_SIGINT太小,很可能造成地图还未保存,节点就已经关闭了,所以需要适当调高_TIMEOUT_SIGINT值),具体方法如下:

sudo gedit /opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/nodeprocess.py

找到_TIMEOUT_SIGINT并调整数值(默认15s,我的参考值60s)

参考github:https://github.com/TixiaoShan/LIO-SAM/issues/3

2、编译LIO-SAM功能包时遇到错误提示:

static assertion failed: Error: GTSAM was built against a different version of Eigen

这是由于gtsam自带eigen版本与系统ros中自带eigen版本之间冲突问题,需要修改gtsam包的CMakeLists.txt文件,使其编译时使用系统eigen,然后重新编译安装gtsam。

在gtsam的CMakeLists.txt文件中找到:

if(GTSAM_USE_SYSTEM_EIGEN)
     find_package(Eigen3 REQUIRED)
     …

在 if(GTSAM_USE_SYSTEM_EIGEN) 上方添加一句:

set(GTSAM_USE_SYSTEM_EIGEN ON)

然后重新编译安装GTSAM即可。

参考:https://blog.csdn.net/unlimitedai/article/details/107378759#t1
https://github.com/TixiaoShan/LIO-SAM/issues/3
https://blog.csdn.net/moyu123456789/article/details/107058418/

Lidar + IMU方案运行自己采集数据

以下是适配过程中一些较为重要的注意点,由于lio-sam源码中使用了参数"ring"和"time",在lio-sam系统启动后,会在imageProjection.cpp的cachePointCloud函数中检查输入点云数据是否包含这两项参数,如果没有,则程序会报错。

        // check ring channelstatic int ringFlag = 0;if (ringFlag == 0){ringFlag = -1;for (int i = 0; i < (int)currentCloudMsg.fields.size(); ++i){if (currentCloudMsg.fields[i].name == "ring"){ringFlag = 1;break;}}if (ringFlag == -1){ROS_ERROR("Point cloud ring channel not available, please configure your point cloud data!");ros::shutdown();}}// check point timeif (deskewFlag == 0){deskewFlag = -1;for (auto &field : currentCloudMsg.fields){if (field.name == "time" || field.name == "t"){deskewFlag = 1;break;}}if (deskewFlag == -1)ROS_WARN("Point cloud timestamp not available, deskew function disabled, system will drift significantly!");}

这两个参数分别表示一个激光点所属的线束序号和当前激光点在一帧激光点云的相对扫描时间(例如一个16线激光雷达,ring代表了激光点在竖直方向上所属的线束序号,而time表示当前激光点相对于当前激光帧第一个激光点的扫描时间)。

如果你使用的激光雷达,采集的数据中包含参数"ring"和"time",那么是不需要进行源码改动的,只需要改动config/params.yaml中的话题名及extrinsicRot和extrinsicRPY矩阵即可(extrinsicRot和extrinsicRPY矩阵如果设置不正确则建出的地图或出现重叠)。

自己使用其它品牌雷达采集的点云数据中往往没有“ring”和”time“参数,因此需要自己在源码中进行修改,适配自己的数据。

  • 对于"ring"参数,我们可以参考lego-loam的做法,利用公式求出当前激光点所属线束序号
// 计算竖直方向上的角度(雷达的第几线)
float verticalAngle = atan2(thisPoint.z, sqrt(thisPoint.x * thisPoint.x + thisPoint.y * thisPoint.y)) * 180 / M_PI;// rowIdn计算出该点激光雷达是竖直方向上第几线的
// 从下往上计数,-15度记为初始线,第0线,一共16线(N_SCAN=16)
int rowIdn = (verticalAngle + ang_bottom) / ang_res_y;
  • 对于“time“参数,其实这个参数的作用是记录每个点的扫描时间,用于消除点云运动畸变,因此如果暂时不考虑点云运动畸变,则可以将与time相关代码和函数注释,不影响程序运行; 如果必须考虑点云运动畸变,则可以参考lego-loam中的方法,利用公式求出每个激光点的扫描时间
float startOri = -atan2(laserCloudIn->points[0].y, laserCloudIn->points[0].x);
float endOri = -atan2(laserCloudIn->points[cloudSize - 1].y,laserCloudIn->points[cloudSize - 1].x) + 2 * M_PI;if (endOri - startOri > 3 * M_PI) {endOri -= 2 * M_PI;} else if (endOri - startOri < M_PI) {endOri += 2 * M_PI;
}bool halfPassed = false;// range image projection
for (int i = 0; i < cloudSize; ++i)
{float ori = -atan2(laserCloudIn->points[i].y, laserCloudIn->points[i].x);if (!halfPassed) {if (ori < startOri - M_PI / 2) {ori += 2 * M_PI;} else if (ori > startOri + M_PI * 3 / 2) {ori -= 2 * M_PI;}if (ori - startOri > M_PI) {halfPassed = true;}} else {ori += 2 * M_PI;if (ori < endOri - M_PI * 3 / 2) {ori += 2 * M_PI;} else if (ori > endOri + M_PI / 2) {ori -= 2 * M_PI;}}float relTime = (ori - startOri) / (endOri - startOri);....................................
}

运行自己数据时未使用点云去畸变,并且按照自己设备中传感器安装关系设置了extrinsicRot和extrinsicRPY矩阵(一定要设置正确,否则各种跑飞和抖动现象)。

在这里插入图片描述

  • 修改版本1:为了方便快速适配不同雷达数据, 以及便于扩展适配雷达驱动不包含ring、time参数的数据, 更改了一版简单的适配其他厂商雷达数据以及自动解算ring、time属性的代码, 现已上传到github, 有需要的朋友可以Star一下, 具体适配自己设备需要修改的参数可以参考README.md文件.

Github链接: https://github.com/YJZLuckyBoy/LIO-SAM-Modified

  • 修改版本2:为了后续想要适配更多激光雷达(机械/固态/多雷达),而不用考虑特征提取模块的通用性,因此参考FAST-LIO2更改了一版移除LIO-SAM特征提取模块的代码,直接使用全部点云数据进行里程计解算,并且代码适配了速腾雷达、6轴IMU、9轴IMU数据,目前测试LIO-SAM提供数据(Velodyne、Livox、Ouster)及UrbanNavDataset数据集均没有问题,并且进行一些性能测试和对比,现已上传到github, 有需要的朋友可以Star一下, 具体适配自己设备需要修改的参数可以参考README.md文件.

建图算法链接: https://github.com/YJZLuckyBoy/liorf

定位算法链接: https://github.com/YJZLuckyBoy/liorf_localization

B站优化算法视频:liorf系列算法效果演示

Lidar + IMU + GPS方案适配自己采集数据

要添加自己的GPS数据作为约束,首先要清楚lio-sam中是如果对原始的IMU数据和GPS数据进行转换的,这里一开始并不是太清楚,后来经过很多次单个节点调试才搞明白。

在lio-sam中的params.yaml文件中可以看到,里面设置了两种IMU话题类型:“imu_raw” 和 “imu_correct”,其中"imu_raw"是IMU原始输出,而"imu_correct"是作者通过更改IMU驱动发布的REP-105格式的数据,并且将输出的参考坐标系改为了"base_link"。

如果想要适配自己的GPS数据,首先确保你具有"sensor_msgs/NavSatFix"类型的GPS数据,然后需要对一些配置文件进行修改,首先在params.yaml文件中要修改下面的一些参数:

lio_sam:pointCloudTopic: "yourself_lidar_topic"               # Point cloud dataimuTopic: "yourself_imu_topic"                         # IMU datagpsTopic: "odometry/gps"    useImuHeadingInitialization: true
ekf_gps:imu0: yourself_imu_topic

然后要修改launch/include/module_navsat.launch文件:

    <!-- Navsat --><node pkg="robot_localization" type="navsat_transform_node" name="navsat" respawn="true"><!-- <rosparam param="datum">[42.35893211, -71.09345588, 0.0, world, base_link]</rosparam> --><remap from="imu/data" to="yourself_imu_topic" /><remap from="gps/fix" to="yourself_gps_topic" /><remap from="odometry/filtered" to="odometry/navsat" /></node>

最后最重要的一步是要修改launch/include/config/robot.urdf.xacro文件,不然robot_localization功能包无法发布"odometry/gps",修改此文件主要是添加imu->base_link,gps->base_link的tf变换,供robot_localization的节点查找并对IMU数据和GPS数据进行转换:

<?xml version="1.0"?>
<robot name="lio" xmlns:xacro="http://tixiaoshan.github.io/"><xacro:property name="PI" value="3.1415926535897931" /><link name="chassis_link"></link><link name="base_link"></link><joint name="base_link_joint" type="fixed"><parent link="base_link"/><child link="chassis_link" /><origin xyz="0 0 0" rpy="0 0 0" /></joint><link name="imu_link"> </link><joint name="imu_joint" type="fixed"><parent link="chassis_link" /><child link="imu_link" /><origin xyz="0 0 0" rpy="0 0 0" /></joint><link name="velodyne"> </link><joint name="velodyne_joint" type="fixed"><parent link="chassis_link" /><child link="velodyne" /><origin xyz="0 0 0" rpy="0 0 0" /></joint><link name="navsat_link"> </link><joint name="navsat_joint" type="fixed"><parent link="chassis_link" /><child link="navsat_link" /><origin xyz="0 0 0" rpy="0 0 0" /></joint><!-- 添加自己的传感器坐标系到base_link变换关系 --><link name="yourself_imu_Coordinate"> </link><joint name="yourself_imu_Coordinate_joint" type="fixed"><parent link="chassis_link" /><child link="yourself_imu_Coordinate" /><origin xyz="0 0 0" rpy="0 0 0" /></joint><link name="yourself_gps_Coordinate"> </link><joint name="yourself_gps_Coordinate_joint" type="fixed"><parent link="chassis_link" /><child link="yourself_gps_Coordinate" /><origin xyz="0 0 0" rpy="0 0 0" /></joint></robot>

修改完成以后即可运行lio-sam中Lidar + imu + gps的方案了,可能中间关于"imu_correct"理解不到位的地方,希望大家指出并一起交流学习,祝好!

融合视觉方案(LVI-SAM)

Lidar-Camera-IMU融合方案详细配置过程可以参考:LVI-SAM:配置环境、安装测试、适配自己采集数据集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1622019.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于华硕AX3000 WPA2-Personal认证方式,设备连接失败问题处理

1 问题背景 最近在XXX项目上&#xff0c;测试在做路由器兼容性测试&#xff0c;发现XX设备在连接ASUS TUF-AX3000型号路由器的WPA2-personal认证方式时&#xff0c;出现必现连接不上的现象&#xff0c;最后排查发现居然跟有多种Wpa2-personal有关。 本文主要结合该问题&#…

官方项目《内容示例》中Common UI部分笔记: 1.1 Activatable Widgets

本文主要面向UMG以及Common UI的初学者 文章目录 效果展示概要Activate和Deactivate可见性绑定UI动画设置Common Activatable Widget的默认焦点 效果展示 概要 这个例子非常简单&#xff0c;定义了13个Common Activatable Widget CommonUI_ActivatableWidgets相当于一个容器包…

win10链接无线打印服务器,win10怎么连接网络打印机 win10添加网络打印机详细教程...

自从有了win10系统&#xff0c;互联网变得越来越方便了&#xff0c;最近非常流行网络打印机&#xff0c;只需要共享IP就可以实现扩地区打印&#xff0c;那么该如何操作呢&#xff1f;首先让我们先添加一个网络打印机&#xff0c;怎么添加&#xff1f;大家只需要看看下方的win10…

计算机重新如何连接网络打印机,电脑怎样连接打印机,小编教你电脑如何连接网络打印机...

打印机是办公室里经常会用到的一种办公设备&#xff0c;由于工作性质的不同&#xff0c;以及其他原因&#xff0c;网络打印机可以实现多台电脑连接&#xff0c;实现资源共享。网络打印机自带ip&#xff0c;只需指定ip就可以快速连接。那电脑如何连接网络打印机&#xff1f;下面…

Linux之iptables防火墙

目录 一.网络安全技术 二.防火墙 2.1.防火墙分类 2.2.iptables工具简述 2.3.iptables基本语法 2.4.控制类型 2.5.查看规则 2.6.添加规则 2.7.黑白名单 2.8.根据规则编号删除 清空 替换规则 2.9.默认策略 2.10.隐藏扩展模块 2.11.显示扩展模块 三.iptables保存规则…

Qt应用开发(基础篇)——日历 QCalendarWidget

一、前言 QCalendarWidget类继承于QWidget&#xff0c;是Qt设计用来让用户更直观的选择日期的窗口部件。 时间微调输入框 QCalendarWidget根据年份和月份初始化&#xff0c;程序员也通过提供公共函数去改变他们&#xff0c;默认日期为当前的系统时间&#xff0c;用户通过鼠标和…

星际争霸之小霸王之小蜜蜂(七)--消失的子弹

目录 前言 一、删除子弹 二、限制子弹数量 三、继续重构代码 总结 前言 昨天我们已经让子弹飞了起来&#xff0c;但是会面临一个和之前小蜜蜂一样的问题&#xff0c;小蜜蜂的行动应该限制在窗口内&#xff0c;那么子弹也是有相同之处&#xff0c;也需要限制一个移动范围&…

《影响力》,到底有多可怕?

通过案例引出主题。介绍《影响力》的六大原理。附录: 本文书籍以及个人视频账号介绍。本文6300字左右&#xff0c;预计阅读时间10分钟。 上周&#xff0c;我到李宁专卖店买一双跑步鞋&#xff0c;挑来挑去看中了一双黑色的鞋&#xff0c;款式不错&#xff0c;穿起来也很舒服。…

谋定政策经信研究扶持-万祥军:对话李玉庭跨界电商重整

谋定政策经信研究扶持-万祥军&#xff1a;对话李玉庭跨界电商重整 中国经济和信息化网 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 万赢信采编&#xff1a;“企业抱团集群发展成趋势&#xff0c;扶持政策持续加码。业内有人戏称&#xff0…

临期食品,是否只是个“过期“市场?

如今的年轻人&#xff0c;越来越喜欢在生活上精打细算。 无论是知乎豆瓣&#xff0c;还是微博贴吧&#xff0c;在各类平台论坛之中&#xff0c;都会有着"省钱"相关的话题。如何用更少的钱过上更加精致充实的生活&#xff0c;成为了当代年轻人最受欢迎的生活方式。 在…

跨界巨头谋定现代农业-农民丰收节交易会:全产业链布局

跨界巨头谋定现代农业-农民丰收节交易会&#xff1a;全产业链布局 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 哲商对话 万权采编&#xff1a;“既有农业的种植管理技术&#xff0c;又有食品深加工的能力&#xff0c;还有食品和农产品营销…

她在女性大会上请求马云“教育”老公,夫妻俩开店一年销售10个亿

“我是做淘宝的&#xff0c;然后我老公也是做淘宝的。我一年大概做两三个亿的销售额&#xff0c;我老公一年做七八个亿的销售额。我老公比较注重应酬&#xff0c;经常把自己灌醉。我老公非常想要宝宝&#xff0c;但是他每天因为生意&#xff0c;熬夜、应酬、喝醉&#xff0c;我…

深度:蒙牛老年高端产品营收增长9倍,中老年消费品市场趋势不变,创新机会涌现!

疫情仍在肆虐&#xff0c;许多行业和公司遭受重创&#xff0c;面临生死存亡的困境。 在一片悲观之下&#xff0c;中老年消费品市场凸显出顽强的生命力和独特价值&#xff0c;AgeClub在对电商平台数据和行业密切跟踪中发现&#xff1a; 蒙牛2019年“悠瑞”中老年高端系列营收增…

2021年中国奶粉行业发展现状分析,行业集中度不断提升,下沉市场发展空间广阔「图」

一、概述 奶粉是将动物奶除去水分后制成的粉末&#xff0c;它适宜保存。奶粉是以新鲜牛奶或羊奶为原料&#xff0c;用冷冻或加热的方法&#xff0c;除去乳中几乎全部的水分&#xff0c;干燥后添加适量的维生素、矿物质等加工而成的冲调食品。奶粉主要可分为全脂奶粉、脱脂奶粉…

乐高武汉楚河汉街授权专卖店重装焕新开业;玛氏中国“宠享潮生活”共建人宠友好新风尚 | 知消...

百威亚太携高端波本威士忌品牌助阵2021 Whisky L。2021年12月9日至11日&#xff0c;百威亚太携美国波本威士忌野牛仙踪亮相2021 Whisky L。与此同时&#xff0c;出产野牛仙踪威士忌的野牛仙踪蒸馏酒厂的高端线Bond and Royal也空降现场&#xff0c;参与此番共饮盛况。 伊利奶粉…

Drupal 安装语言时报错

中文下载地址: 下载 | Drupal 中文网 进入下载 | Drupal 中文网或者Chinese, Simplified overview | Translations下载语言包&#xff0c;根据你的Drupal版本下载相应的语言包 我选的是9.4.8版本&#xff0c;下载好后放到你的安装包里sites\default\files\translations 有什么…

Drupal安装配置文档(一)

Drupal安装配置文档 前段时间帮公司弄了个内部网站&#xff0c;作为一个内部信息交流平台&#xff0c;发现一个叫Drupal的内容管理系统很适合&#xff0c;于是研究了一番。由于篇幅有限&#xff0c;本文档分为&#xff08;一&#xff09;&#xff08;二&#xff09;两篇&#x…

Excel 2007

Excel 2007 一.数据的呈现与挖据 1. 开始->条件格式下 2.插入->数据透视表, 数据透视表工具->选项,&设计 二.数据的整理与分析 1.数据->分列; 2.数据的合并: 用函数公式(A1&"-"&A2) 3. 选中某个需要排序的cell, 数据->排序 4.数…

【【STM32分析IO该设置什么模式的问题】】

STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉&#xff0c;但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…

Linux操作系统--shell编程(运算符)

语法: "$((运算式))" 或 "$[运算式]" 下面我们介绍几种Linux操作系统中的运算符的使用方式: 方式1:这一个使用比较麻烦,不推荐使用 方式2:推荐使用