• 3D激光SLAM:LIO-SAM整体介绍与安装编译


    LIO-SAM的全称是:Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping

    从全称上可以看出,该算法是一个紧耦合的雷达惯导里程计(Tightly-coupled Lidar Inertial Odometry),借助的手段就是利用GT-SAM库中的方法。

    LIO-SAM 提出了一个利用GT-SAM的紧耦合激光雷达惯导里程计的框架
    实现了高精度、实时的移动机器人的轨迹估计和建图。

    框架的构成
    通过相对观测(两帧间的估计)及绝对观测(GPS),还包括回环检测,构成因子图

    这个框架必须要有激光雷达IMU。可以没有回环和GPS。

    IMU的作用:
    用IMU的数据对激光雷达点云作畸变矫正
    为激光雷达里程计的优化提供一个初值

    系统对IMU的作用:
    获得的雷达里程计会用来估计IMU的零偏(bias)

    点云匹配建图方式
    为了保障性能和实时,并不是将激光雷达一帧数据和全局地图进行匹配,而是和经过边缘化的历史地图进行匹配
    这种当前帧和局部地图配置而不是全局地图的做法,可以显著提高系统的实时性。

    局部地图构成
    通过选取关键帧的方式,利用滑窗的方法,将当前的关键帧和历史尺度和大小一致的子关键帧集合配准。

    测试情况
    提出的方法在三个平台进行了测试,手持设备、UGV、船,在不同场景下表现都很不错。

    LIO-SAM整体框架

    在这里插入图片描述

    输入层中的三个矩形框是是三个传感器

    • IMU
    • 点云
    • GPS(可选)

    输出以IMU的频率发布里程计的结果

    LIO-SAM中的四个矩形图,对应ROS中的四个节点。每个节点都有其单独的功能。

    图像映射节点

    可以先看图像映射的节点
    该节点订阅3个消息

    • 原始imu数据
    • 原始点云数据
    • imu里程计数据 来自IMU预积分节点

    其中imu里程计数据在系统初始化阶段没有该消息,图像映射节点仅有两个数据

    主要功能有四个:

    • 获得变换初始估计,该估计是从imu里程计数据获得
    • 组织点云,与lego-loam类似,将点云转为深度图像
    • 点云畸变矫正 只对旋转部分补偿,平移部分在代码中注释掉了。利用的IMU原始数据

    该节点发布的消息:
    处理后的点云

    特征提取节点

    订阅信息1个:
    来自图像映射节点的处理后的点云

    功能:
    提取角点和面点

    该节点发布的消息:
    处理后的点云

    建图优化节点

    订阅信息两个

    • 特征提取处理后的点云
    • 原始GPS数据(可选)

    主要功能

    • 点云匹配
    • 计算雷达里程计的位姿
    • 因子图优化(雷达里程计因子、GPS因子、回环因子),注意这里没有IMU因子

    发布消息

    • 激光雷达里程计,发送给IMU预积分节点

    IMU预积分节点

    该节点最后一个工作,需要前面3个工作完,得到激光雷达里程计后,再进行IMU预积分

    订阅数据:

    • imu原始数据
    • 激光雷达里程计(来自建图优化节点)

    功能:

    • 因子图优化(IMU预积分因子、雷达里程计因子)
    • 估计IMU零偏

    发布消息:

    • IMU里程计信息

    LIO-SAM编译与安装

    可以参考官网
    官网地址

    该功能包的依赖有

    • ROS
      验证的版本有Kinetic 和 Melodic
      同时需要安装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
    
    • 1
    • 2
    • 3
    wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2.zip
    cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/
    cd ~/Downloads/gtsam-4.0.0-alpha2/
    mkdir build && cd build
    cmake ..
    sudo make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    cmake 可以改成如下指令

    cmake -DGTSAM_BUILD_EITH_MARCH_NATIVE=OFF -DGTSAM_USE_SYSTEM_EIGEN=ON ..
    
    • 1

    目的是设置一些宏
    DGTSAM_BUILD_EITH_MARCH_NATIVE 是开启css加速的宏,要关闭。避免其它库(比如PCL或者自己代码)没有开启的话,会造成运行时出现异常的情况
    DGTSAM_USE_SYSTEM_EIGEN 这个是用系统装的eigen编译的宏,要开启。OFF的话会用gtsam自带的eigen,代码运行存在两个版本eigen会容易出问题

    之后就可以下载LIO-SAM的代码进行安装了

    cd ~/catkin_ws/src
    git clone https://github.com/TixiaoShan/LIO-SAM.git
    cd ..
    catkin_make
    
    • 1
    • 2
    • 3
    • 4

    安装编译成功后,会提示如下:
    在这里插入图片描述

    运行

    roslaunch lio_sam run.launch
    
    • 1

    通过上面的指令就能运行了。

    但是在运行前,要根据自己的情况进行一些参数配置

    在params.yaml文件中可以看到一些配置

      pointCloudTopic: "points_raw"               # Point cloud data
      imuTopic: "/imu_correct"                         # IMU data
      odomTopic: "odometry/imu"                   # IMU pre-preintegration odometry, same frequency as IMU
      gpsTopic: "odometry/gpsz"                   # GPS odometry topic from navsat, see module_navsat.launch file
    
    • 1
    • 2
    • 3
    • 4

    其中

    • 点云的Topic名称为points_raw
    • IMU的Topic名称为/imu_correct

    这两个如果自身的数据发布名称不一致,需要改成一致的

    • GPS的Topic名称为odometry/gpsz
      如果没有GPS可以不用管
      sensor: velodyne                            # lidar sensor type, either 'velodyne' or 'ouster'
      N_SCAN: 16                                  # number of lidar channel (i.e., 16, 32, 64, 128) 雷达的通道数量
      Horizon_SCAN: 1800                          # lidar horizontal resolution (Velodyne:1800, Ouster:512,1024,2048)激光雷达水平分辨率   也就是水平角度分辨率  360/1800=0.2
      downsampleRate: 1                           # default: 1. Downsample your data if too many points. i.e., 16 = 64 / 4, 16 = 16 / 1
      lidarMinRange: 1.0                          # default: 1.0, minimum lidar range to be used  雷达最小距离长度
      lidarMaxRange: 1000.0                       # default: 1000.0, maximum lidar range to be used  雷达最大距离长度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这边雷达参数也要对应的设置

      extrinsicTrans: [0.0, 0.0, 0.0]
      extrinsicRot: [1, 0, 0,
                      0, 1, 0,
                      0, 0,  1]
      extrinsicRPY: [ 1, 0, 0,
                    0, 1 , 0,
                      0, 0, 1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    IMU和类的外参配置一下
    别的就没啥了

    配置完即可运行launch文件,然后在rviz中就可以看到地图了

    在这里插入图片描述
    在这里插入图片描述
    粉色的是面点,绿色的是角点

  • 相关阅读:
    数据结构与算法——算法时间复杂度
    HBase之异步Replication机制
    01、Python 安装 ,Pycharm 安装
    【软件测试】bug篇|软件测试的生命周期|描述bug的要素|bug的级别|bug的生命周期|高频面试题:与开发产⽣争执怎么处理
    机器学习笔记(1)常见符号,批次梯度下降,随机梯度下降
    在linux上部署一个web项目的小经验
    vmware vcenter conventer 可以转换windows2000的版本有下载链接吗
    L2-048 寻宝图(PTA)
    SAP ABAP Gateway Client 里 OData 测试的 PUT, PATCH, MERGE 请求有什么区别
    神经网络与深度学习——第4章 前馈神经网络
  • 原文地址:https://blog.csdn.net/qq_32761549/article/details/126140151