A-LOAM源码阅读

2023-05-16

LOAM 论文地址:https://www.ri.cmu.edu/pub_files/2014/7/Ji_LidarMapping_RSS2014_v8.pdf

A-LOAM地址:https://github.com/HKUST-Aerial-Robotics/A-LOAM

本人注释的A-LOAM:https://github.com/linzs-online/A-LOAM_notes.git

在本文中不再贴出代码进行句句阐述,详细的代码注释可以产看仓库中,这里仅对每个模块的核心内容进行总结,一方面可以帮助刚刚接触这个领域的同学对整个工程有一个初步的认识;另一方面对于比较熟悉的同学快速回顾LOAM中的核心思路。希望能帮到大家,如有错误欢迎指出。

一、跑通A-LOAM

源码地址:https://github.com/HKUST-Aerial-Robotics/A-LOAM

依赖库:Ceres Solver、PCL

sudo apt install libpcl-dev

Ubuntu 20.04 + noetic 编译中遇到的问题:

1、PCL库报错

最新的PCL库需要C++14支持,所以在CMakeLists.txt中:

  • set(CMAKE_CXX_FLAGS "-std=c++11") 改为 set(CMAKE_CXX_FLAGS "-std=c++14")

2、OpenCV 4中的一些宏定义冲突

  • scanRegistration.cpp中的 #include <opencv/cv.h> 修改为#include <opencv2/imgproc.hpp>
  • 修改kittiHelper.cppCV_LOAD_IMAGE_GRAYSCALEcv::IMREAD_GRAYSCALE

二、代码框架

在这里插入图片描述

LOAM作为经典的3D激光SLAM的框架,它的结构比较清晰和简洁,首先是Lidar的输入,然后对点云进行整理;之后是激光里程计部分,这部分主要是scan-to-scan,匹配相邻两帧的特征得到相邻两帧的变换;之后地图构建,这部分主要是scan-to-map,通过当前帧去匹配一个局部地图,进一步得到更准确的位姿。

下面是A-LOAM运行时的节点流图,整个结构还是非常清晰的,从订阅原始的点云数据到最后的位姿输出,基本上和论文里面的结构是一致的。

在这里插入图片描述

三、代码总览

  • kittiHelper.cpp

这个文件主要是把KITTI数据集转换为rosbag格式的bag文件。因为KITTI数据集本身并不是rosbag格式的,里面的很多个文件夹,分别存放在image、lidar、IMU等数据,ROS没办法之间使用这种数据集格式,所以这个节点主要是用来做数据格式转换的转换成xxx.bag文件,这样ros就可以用rosbag把消息播放出来

  • scanRegistration.cpp

这个文件主要是把点云数据进行整理,把特征进行提取、分类。

  1. 激光雷达点云原始数据的无序的,首先通过计算垂直角度,把点云按雷达scan line来进行存储
  2. 接着给每个点云分配所在scan中的时间,计算point.intensity,这是为后面里程计匹配的时候做准备的
  3. 计算每个点的曲率,提取出四种特征 cornerPointsSharp、cornerPointsLessSharp、surfPointsFlat、surfPointsLessFlat
  • laserOdometry.cpp

这个文件主要是实现激光里程计的功能,通过ICP匹配相邻两帧的特征,求得相邻两帧的位姿变换。在A-LOAM中使用了Ceres优化库,代码可以写得简洁

  1. 遍历当前帧边线特征点,对于当前特征点i,从上一帧的kdtree中找一个最近邻点j 和 次近邻点 l,最小化点i到 jl 的距离
  2. 遍历当前帧平面特征点,对于当前特征点i,从上一帧的kdtree中找一个三个近邻点,最小化点i到近邻点构造的平面的法向量
  • laserMapping

这个文件主要是实现地图的构建,因为里程计得到的位姿是有累积误差的,在此处通过Scan-to-map的方式进一步修正位姿。下图就很生动的表达了scan-to-map这个过程

在这里插入图片描述

主要方法是通过Submap和localmap的ICP把里程计的位姿进一步优化,相当于融合了近期的好几帧的信息,而不是像里程计一样只利用相邻两帧的信息。最后得到的是地图坐标系下的位姿变换,把点云转换到地图坐标系下,发布点云地图。

1、选取一个局部地图,把局部地图划分为21*21*11的栅格地图

2、构造一个Submap,以当前帧位置为中心,向前后拓展两个栅格、向上下拓展一个栅格,并把点云拷贝到栅格中构成Submap

3、对上一帧的点云进行下采样,用Submap中的点云构建KDtree,遍历上一帧中的边线点,在KDtree中取5个近邻点,求这5个近邻点的主方向构造一条直线,然后构造点到该直线的约束加入到优化问题中

4、遍历上一帧中的平面点,选取Submap中的5个近邻点,以最小二乘的方式拟合一个平面,构造点到面的约束加入到优化问题中

5、增量QR分解,用ceres进行位姿优化,并根据优化后的结果得到当前帧到地图坐标系原点的位姿变换,把点云变换到地图坐标系下

在阅读源码的过程中,本人对此工程做了一个思维导图:

在这里插入图片描述

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

A-LOAM源码阅读 的相关文章

  • DispatcherServlet 源码阅读(1)

    有时间还是应该多看看源码 DispatcherServlet 是一个实实在在的 Servlet xff0c 所以 Spring MVC 引入后不会改变 Servlet 容器的行为 xff0c 仍然是解析 web xml 部署文件 xff0c
  • kube-proxy源码阅读(iptables实现)

    Reference 文章目录 1 入口2 ProxyServer创建及调用3 ProxyServer 核心调用流程3 1 func o Options Run err3 2 func o Options runLoop error3 3 f
  • 【FreeRTOS源码阅读】<2> task.c (1) 任务创建以及TCB、List的结构

    上篇讲述了list c关于链表操作的源码阅读 xff0c 此片文章将开始阅读task c task h相关结构体 由eTaskGetState返回的任务状态 typedef enum eRunning 61 0 一个任务查询自己的状态 xf
  • 【Python源码阅读】PYC 文件剖析

    pyc 文件相信大家见怪不怪 xff0c 大家经常在 pycache 里面见到这些文件 这些文件存储了 python 编译出来的字节码文件 xff0c 还有一些元信息 xff08 例如版本号 xff0c 对应文件的修改时间 xff09 接下
  • lego-loam加入imu数据建图,使用自己的数据集建图

    配置lego loam教程 https blog csdn net qq 35102059 article details 122671432 spm 61 1001 2014 3001 5501 激光雷达与imu的外参标定教程 https
  • 源码阅读——validate-npm-package-name

    文章目录 前言一 源码阅读工具二 阅读源码1 目录结构2 package json3 index js 三 使用该包1 vue cli中使用2 create react app 中使用 总结 前言 validate npm package
  • ucos源码阅读3——信号量,互斥信号量(未完待续)

    ucos源码阅读3 信号量 xff0c 互斥信号量 事件控制块ECBInitEventList xff08 xff09 EventWaitListInit xff08 xff09 EventTaskRdy xff08 xff09 Event
  • SLAM会议笔记(三)V-LOAM

    Visual lidar Odometry and Mapping Low drift Robust and Fast Abstract 提出了一种新的使用激光雷达里程计和视觉里程计的框架 xff0c 提升了表现 xff0c 特别是在剧烈运
  • 激光雷达 LOAM 论文 解析

    注意 xff1a 本人实验室买的是Velodyne VLP 16激光雷和 LOAM 论文中作者用的不一样 xff0c 在介绍论文之前先介绍一下激光雷达的工作原路 xff0c 这样更容易理解激光雷达的工作过程 xff0c 其实物图如下图1所示
  • 运行LeGO-LOAM

    参考 链接 xff1a https blog csdn net weixin 39754100 article details 112186264 https blog csdn net NEU Ocean article details
  • 在用robosense的rslidar(16线)运行lego-loam遇到的问题总结

    在将rslidar通过github上开源的工具包转换成velodyne的点云格式后 运行测试lego loam时遇到了关于kdtree的报错问提 pcl KdTreeFLANN setInputCloud Cannot create a K
  • 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
  • SC-Lego-LOAM解析(中)

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

    回环检测是一个相对独立的模块 xff0c 这里再开一篇专门说明 前面两篇已经说过 xff0c 先对点云做了预处理 xff0c 然后进行连续帧之间的匹配即激光odom xff0c 然后是scan to map匹配 xff0c 并保存关键帧的位
  • 保存并查看Lego-Loam的三维点云地图

    Loam的安装及运行方法可以参考 https blog csdn net qq 36396941 article details 82973772 本文提供ROS wiki http wiki ros org loam velodyne上无
  • Caffe 源码(二) —— common 文件

    caffe 源码 common hpp cpp 文章目录 caffe 源码 common hpp cpp 1 宏定义 2 全局初始化函数 3 Caffe 类 单例模式 rng hpp 这里主要是对 caffe 框架源码进行梳理与学习 主要是
  • “npm create vite“ 是如何实现初始化 Vite 项目?

    欢迎关注我的公号 前端我废了 查看更多文章 前言 我们从 vite 的官方文档中看到 可以使用 npm yarn pnpm create 命令来快速初始化一个基于 Vite 的项目 其实很多框架或库都会开发相应的脚手架工具 用于快速初始化项
  • JDK源码阅读之AbstractStringBuilder类

    AbstractStringBuilder类源码阅读 AbstractStringBuilder类的作用 AbstractStringBuilder类的类图 AbstractStringBuilder类的重点方法 属性变量 构造方法 精华方
  • Quartz框架多个trigger任务执行出现漏执行的问题分析

    一 问题描述 使用Quartz配置定时任务 配置了超过10个定时任务 这些定时任务配置的触发时间都是5分钟执行一次 实际运行时 发现总有几个定时任务不能执行到 二 示例程序 1 简单介绍 采用spring quartz整合方案实现定时任务

随机推荐

  • 保存图像(cv::imwrite)

    保存图像文件道指定目录路径 只有8位 xff0c 16位的PNG xff0c JPG xff0c Tiffy文件格式而且时单通道或者三通道的BGR的图像才通过这种方式保存 保存PNG格式的时候可以保存透明通道的图片 可以指定压缩参数 inc
  • 解决 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