LeGo-LOAM 跑通与源码学习

2023-05-16

论文链接:https://www.researchgate.net/LeGO-LOAM

源码仓库:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM

本人注释:https://github.com/linzs-online/lego-LOAM_note.git

1、因为LeGo-LAOM的优化是基于gtsam库实习的,所以首先要安装该库

  • Ubuntu 20.04 安装gtsam
git clone git@bitbucket.org:gtborg/gtsam.git
cd gtsam
mkdir build
cd build
cmake ..
make -j
make install
  • 编译LeGo-LOAM
cd xx_ws/src
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd ../..
catkin_make

OpenCV 版本问题报错

#include<opencv/cv.h>,修改为#include <opencv2/imgproc.hpp>

  • 运行LeGo-LOAM

1、报错找不到libmetis-gtsam.so

error while loading shared libraries: libmetis-gtsam.so: cannot open shared object file: No such file or directory

解决办法:安装libparmetis

sudo apt install libparmetis-dev

2、tf出warning,找不到变换,rviz黑屏

解决办法:tf2默认不需要在frame前面已经加了/,所以这里将代码中所有的/camera和/camera_init的/去掉

LeGO与LOAM的不同点

LeGO-LOAM是LOAM的升级版,LeGO-LOAM相比LOAM的改进有如下几点:

1、对点云进行了两大类划分:地面点云、非地面聚类点云

2、激光里程计部分采用两步优化的方式得到6ToF的位姿估计,相比LOAM减少了冗余计算,提升了速度

3、采用关键帧进行局部地图和全局地图管理,后端采用因子图iSAM优化的方式进行了位姿优化

LeGO-LOAM整体框架

image-20220717202028495

image-20220717202201441

  • imageProjection节点负责将原始点云投影为深度图,并利用深度图把点云分割为地面点和目标点聚类

1、计算点云的水平角度、垂直角度,把点云投影到深度图rangeMat中,深度图为16 × \times × 1800。每个scan有1800个点,对于16线的雷达有16条scan line。

image-20220719220156185

2、遍历深度图中的点,对于地面上的点云(scan line 为 0-7)分割为groundMat,groundMat中 -1 代表无效点、0代表虽然是在scan line 为 0-7但是并不是地面点,1代表地面点

BJHK202102015_070

3、对非地面的点进行聚类,通过判断邻域与雷达原点构成的∠OAB的大小判断是否是属于同一个类别。填充labelMat,labelMat为-1则代表是地面的点,1-n代表着聚类之后的不同的类别。把能聚成类的点统一存放到segmentedCloudPure中,后面用来提取边线点特征

image-20220719215432239
原始点云图

原始的点云地图中的激光点的数量太多,下面进行点云分割,分离地面点和非地面点

image-20220719215505929
分离了地面的点云,然后进行了一次聚类之后的点云
image-20220719215523383
分离出来的地面点云
  • featureAssociation节点负责从分割点中提取线面特征,并进行scan-to-scan的特征匹配

1、对每个点云进行插值,用点云前后两个时刻的IMU信息,根据该点云离这两个时刻的时间段在这两个时刻的时间段的占比进行插值

2、计算每个点的曲率,并记遮挡点(比如:一颗树后面还有一辆车,如果不剔除这些点,因为深度的跳变那么会使得在树干的边缘的点也会被检测为边线特征,这显然是不合理的)

3、提取四种特征,和LOAM一样,这里也把每个scan分成6个区域进行特征提取,每个区域提取2个边线点(在非地面点中提取)、4个平面点(在地面点中提取)

image-20220719225419399

可以看到,对应平面特征点只在地面点云中进行提取,边线特征点只在非地面点云中提取

4、根据特征点构建KDtree,这里构建了两棵KDtree,一个是边线点的,一个是平面点的

5、两步LM优化。这里平面点就去平面点对应的KDtree中查找,边线点就去边线点对应的KDtree中查找,(这样显然比LOAM中的要更快找到,LOAM中是把所有的特征点用来构造KDtree),先用平面点对 [ t z , t roll  , t pitch  ] \left[t_{z}, t_{\text {roll }}, t_{\text {pitch }}\right] [tz,troll ,tpitch ] 进行优化,然后在第一步优化的结果上再用边线点对 [ t x , t y , t y a w ] \left[t_{x}, t_{y}, t_{y a w}\right] [tx,ty,tyaw] 进行优化,这样很快就可以优化出6ToF的位姿,这相对于LOAM是一个比较大的进步。另外,这里并没有使用Ceres优化库,这里是手动构造非线性最小二乘求解的方程 J^(T) * J * f(x)= -J^(T) * f(x),调用的是OpenCV里面的矩阵方程求解API(cv::solve(matAtA, matAtB, matX, cv::DECOMP_QR))

image-20220718092621868

6、之后就是积分姿态结果,发布里程计的结果以及点云

  • mapOptmization节点负责回环检测、因子图优化、可视化

1、首先根据里程计输出的上一帧到当前帧的变换给当前位姿优化赋一个初始值

2、提取关键帧,构建子地图。如果开启了回环检测,那么就选取过去的50个关键帧作为子地图,如果没有开启回环检测,那么就选取当前位置50m以内的帧构建子地图

3、对于关键帧的选取标准是:机器人移动相较上一帧位置大于0.3m才会把当前帧作为关键帧标志。之后就是构建因子图进行优化。

4、根据因子图优化的结果修正所有关键帧的位姿,并发布出去

  • transformFusion节点主要负责整合前面优化的结果发布TF变换

下图是本人根据源码梳理出来的一个思维导图,里面基本包含了一些技术细节。

LeGo-LOAM

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeGo-LOAM 跑通与源码学习 的相关文章

  • 论文阅读 | LOAM:实时Lidar里程计和建图

    Zhang J Singh S LOAM Lidar odometry and mapping in real time C Robotics Science and Systems 2014 2 9 1 9 64 inproceeding
  • LOAM livox论文学习笔记

    Loam livox A fast robust high precision LiDAR odometry and mapping package for LiDARs of small FoV 参考 xff1a 多激光雷达的协同定位建图
  • LEGO-LOAM(LOAM)部分公式推导---未完待续

    一 featureAssociation相关推导 1 xff09 帧间匹配雅可比矩阵推导 首先明确LEGO LOAM中 xff0c 运动坐标系 xff08 符合右手系 xff09 的设置为 xff1a 因此对于平面运动来说 xff0c 影响
  • lego-loam加入imu数据建图,使用自己的数据集建图

    配置lego loam教程 https blog csdn net qq 35102059 article details 122671432 spm 61 1001 2014 3001 5501 激光雷达与imu的外参标定教程 https
  • SLAM会议笔记(一)LOAM

    LOAM Lidar Odometry and Mapping in Real time ABSTRACT 将复杂的SLAM问题分离为两个算法 xff0c 一个高频低精度的运动估计 xff0c 另一个低一个数量级的点云匹配和配准算法 REL
  • SLAM会议笔记(三)V-LOAM

    Visual lidar Odometry and Mapping Low drift Robust and Fast Abstract 提出了一种新的使用激光雷达里程计和视觉里程计的框架 xff0c 提升了表现 xff0c 特别是在剧烈运
  • SLAM会议笔记(四)Lego-LOAM

    LeGO LOAM Lightweight and Ground Optimized Lidar Odometry and Mapping on Variable Terrain Abstract 提出一种轻量级的ground optimi
  • 激光雷达 LOAM 论文 解析

    注意 xff1a 本人实验室买的是Velodyne VLP 16激光雷和 LOAM 论文中作者用的不一样 xff0c 在介绍论文之前先介绍一下激光雷达的工作原路 xff0c 这样更容易理解激光雷达的工作过程 xff0c 其实物图如下图1所示
  • loam中imu消除重力加速度的数学推导

    最近在看loam的源码发现里面有一段关于imu消除重力加速度的源码 xff0c 刚开始看不明白后来终于搞清楚了 xff0c 欢迎大家批评指正 要理解这个问题首先得明白欧拉角到旋转矩阵的变换 先上图 此图描述的是先绕X xff0c 再绕Y x
  • 运行LeGO-LOAM

    参考 链接 xff1a https blog csdn net weixin 39754100 article details 112186264 https blog csdn net NEU Ocean article details
  • A-LOAM源码阅读

    LOAM 论文地址 xff1a https www ri cmu edu pub files 2014 7 Ji LidarMapping RSS2014 v8 pdf A LOAM地址 xff1a https github com HKU
  • velodyne运行Loam_velodyne过程记录

    刚拿到手的3D激光雷达 xff0c 运行一下试试 xff08 1 xff09 loam velodyne环境配置 cd catkin ws src git clone https github com laboshinl loam velo
  • A-LOAM学习

    A LOAM学习 一 复现1 1 Ubuntu 和 ROS1 2 Ceres Solver1 3 PCL 二 下载A LOAM三 下数据集 一 复现 1 1 Ubuntu 和 ROS A LOAM 1 2 Ceres Solver span
  • A-LOAM学习

    A LOAM学习 一 kittiHelper cpp二 scanRegistration cpp三 laserOdometry cpp四 laserMapping cpp 一 kittiHelper cpp 本代码旨在实现 将kitti数据
  • SC-Lego-LOAM解析(上)

    文章目录 正文imageProjectionfeatureAssociationFeature Extraction 正文 SC Lego LOAM实际上应该并不对应某一篇特定的论文 xff0c 而是韩国KAIST在github开源的代码
  • SC-Lego-LOAM解析(中)

    上回说到经过连续帧间匹配 xff0c 激光odo给出来一个位姿估计 xff0c 但是是存在不断的误差的积累的 xff0c 需要与绝对的参考 xff08 地图 xff09 进行匹配 xff0c 以及进行回环检测和全局位姿优化 这也是正是map
  • 保存并查看Lego-Loam的三维点云地图

    Loam的安装及运行方法可以参考 https blog csdn net qq 36396941 article details 82973772 本文提供ROS wiki http wiki ros org loam velodyne上无
  • LOAM_velodyne学习(三)

    终于到第三个模块了 我们先来回顾下之前的工作 点云数据进来后 经过前两个节点的处理可以完成一个完整但粗糙的里程计 可以概略地估计出Lidar的相对运动 如果不受任何测量噪声的影响 这个运动估计的结果足够精确 没有任何漂移 那我们可以直接利用
  • 作为科技迷,你必须要了解的乐高机器人常识!

    Source by Fans 主要材料 乐高机器人常识 所需工具 乐高机器人常识 制作步骤 第1步 从今天起 给大家盘点一下主流的机器人开发套件 谈及机器人套件 乐高是回避不掉的 既然这样 那我们索性从乐高机器人套件开始说起 第2步 乐高
  • 利用python语言编程控制LEGO EV3

    1 环境搭建 安装WinSCP 网址 https sourceforge net projects winscp 下载一个自己喜欢的python IDE 例如pycharm 将EV3的系统换为ev3dev 参考网址 https www ev

随机推荐

  • 解决 ssh: Could not resolve hostname \342\200\223t: Name or service not known

    问题 xff1a 在配置github时输入以下内容时报错 xff1a ssh T git 64 github span class token punctuation span com 方法 xff1a 将上述内容换为以下内容 ssh sp
  • python实现随机森林

    定义 xff1a 随机森林指的是利用多棵决策树对样本进行训练并预测的一种分类器 可回归可分类 所以随机森林是基于多颗决策树的一种集成学习算法 xff0c 常见的决策树算法主要有以下几种 xff1a 1 ID3 xff1a 使用信息增益g D
  • 从Github上下载文件的方法汇总

    前言 对于程序猿来说 xff0c Github简直就是个宝藏 xff0c 里面有世界各地大神的代码 xff0c 可以放心安全高效的食用 xff0c 本文整理了Github文件的一些下载方法 xff0c 仅供参考 1 通过git命令行 特点
  • fatal error: Python.h: No such file or directory #include “Python.h“

    在TX2上安装h5py时 xff0c pypi org没有对应的轮子 xff0c 需要自己用源码安装 xff0c 源码中涉及到C语言 xff0c 所以需要编译 xff0c 然而在编译的过程中报错 fatal error span class
  • 基于Python的ZED2教程 0.ZED2介绍

    本文主要介绍了ZED2的基本简介和硬件配置 基本简介 ZED2双目深度传感立体相机是位于美国旧金山Stereo labs公司制作的一款产品 xff0c 其与Kinect相机等流行的深度图像原理不同 xff0c 该深度相机的深度计算是通过双目
  • 基于Python的ZED2教程 1.打开ZED2

    本教程简单的对ZED相机进行了配置和打开 xff0c 然后打印出ZED 相机的串口号 xff0c 接着关闭相机 准备工作 由于ZED SDK在GPU上运算 xff0c 因此需要先在 nvidia com下载最新版的Cuda 然后 xff0c
  • 2.Open3D教程——文件读取和保存

    文件读取和保存 本教程演示了Open3D如何读写基本数据结构 1 点云 下面的代码读取和写入点云 span class token keyword print span span class token punctuation span s
  • 7.Open3D教程——表面重建

    在许多情况下 xff0c 我们希望生成密集的三维几何体 xff0c 即三角形网格 然而 xff0c 从多视点立体方法 xff0c 或深度传感器 xff0c 我们只能获得一个非结构化的点云 为了从非结构化输入中得到三角形网格 xff0c 我们
  • PASCAL VOC数据集

    一 简介 PASCAL pattern analysis statistical modelling and computational learning VOC visual object classes 该挑战赛的竞赛项目主要包括 图像
  • ubuntu python 通过奥比中光摄像头获取深度图片和彩色图片

    1 依赖 安装Openni Openni下载Openni添加至环境 xff08 要通过全局变量找到Openni头文件和库 xff09 安装primesense和openni pip install primesense pip instal
  • ROS tf使用报错:ImportError: dynamic module does not define module export function (PyInit__tf2)

    1 报错内容 Traceback span class token punctuation span most recent call last span class token punctuation span File span cla
  • ubuntu cuda cudnn tensorRT的卸载和安装

    1 安装显卡驱动 显卡安装教程 查看N卡驱动支持的最高cuda版本 nvidia smi 2 卸载 span class token function sudo span span class token function apt get
  • 初识VSCode

    Visual Studio Code xff08 以下简称vscode xff09 是一个轻量且强大的代码编辑器 xff0c 跨平台支持Windows xff0c Mac OS X和Linux 内置JavaScript TypeScript
  • Modbus通信及数据存储读取

    1 存储区代号 代码号功能1区输入线圈0区输出线圈3区输入寄存器4区输出寄存器 2 功能码 代码功能0x01读取输出线圈0x02读取输入线圈0x03读取输出寄存器0x04读取输入寄存器0x05写入单个线圈0x06写入单个寄存器0x0F写入多
  • 着色器语言 GLSL (opengl-shader-language)入门大全

    GLSL 中文手册 基本类型 类型说明void空类型 即不返回任何值bool布尔类型 true falseint带符号的整数 signed integerfloat带符号的浮点数 floating scalarvec2 vec3 vec4n
  • Data structure alignment (数据结构对齐 / 内存对齐)

    开篇的话 在比较老的编译器里 xff0c 如果没有对变量取地址的操作 xff0c 那么有些局部变量是通过寄存器保存的 xff0c 不占栈上内存 xff0c 根本不存在内存中如何排列的问题 xff0c 比如TurboC 2 0这种 在一些较新
  • C++primer plus和C++ primer的读书心得

    C 43 43 两本巨著primer plus和primer太过于经典 xff0c 以至于读过多次 xff0c 每次阅读仍然有新的收获 xff0c 所以将一些零碎的知识点整理在这里 xff0c 与大家共同进步 1 i 43 43 与 43
  • VINS 外参在线标定

    在VINS中相机的外参 R i c R ic R i c 是可以在线动态标定的 xff0c 实现函数为 xff1a 6
  • A-LOAM源码阅读

    LOAM 论文地址 xff1a https www ri cmu edu pub files 2014 7 Ji LidarMapping RSS2014 v8 pdf A LOAM地址 xff1a https github com HKU
  • LeGo-LOAM 跑通与源码学习

    论文链接 xff1a https www researchgate net LeGO LOAM 源码仓库 xff1a https github com RobustFieldAutonomyLab LeGO LOAM 本人注释 xff1a