【论文阅读】LOAM: Lidar Odometry and Mapping in Real-time

article/2025/7/22 14:27:41

一、概述

Loam主要是一种激光匹配slam的方法,也就是一种定位与建图的方法,相比于其他的制图方法,loam主要解决的是雷达快速移动的过程中的畸变问题,如果雷达的扫描速度和雷达的移动速度相差太大,会导致扫描过程中偏差太大,利用loam就可以一定程度上改善这个问题。

对于这篇论文,一个很关键的点就是搞明白一些量的定义,首先对于雷达的扫描过程需要有一个大体的了解。雷达是分线的,一般有十六线、三十二线等等,线代表的就是竖直方向上发送激光的数目,这堆线是在同一列上的,十六线就代表一个时刻扫描的一列上发出了16条射线,下一个时刻扫描方向水平移动一定角度,再扫描下一列的点,如此重复,就得到了全部的点云数据。可以看出,线越多,扫描的内容也就越多。在这篇论文中,将一个sweep定义为对空间全部扫描一次,也就是取到了范围内的所有列,而一个scan代表同一线上扫描到的所有点,换个角度来看,如果将所有的点放到一个矩阵里面,对于一个十六线的雷达,每次移动0.5°,扫描范围是180°,那么矩阵有十六行,每一行都对应一线,一共有360列,每一列代表每次移动扫描到的列,一个scan就代表一行的全部数据,一个sweep就代表整个矩阵。
在这里插入图片描述
了解了雷达的工作过程,就不难发现,一帧点云的构建并不是一瞬间就完成的,而是一点一点拼出来了,在转向速度和雷达移动速度偏差不太大的情况下,扫描也不会出现太大的偏差,一旦偏差过大,甚至极限一点,移动速度远大于转向速度,那么对于一个sweep来说,可能现在这一列是在原点扫描的结果,到了下一列扫描的时候已经到终点了,那构建的结果必然也偏差很大。这篇论文提供的解决方法就是一方面执行高频率的里程计但是低精度的运动估计用于定位;另一方面在比定位低一个数量级的频率执行匹配和注册点云信息,实现建图和校正里程计。

由于loam主要的目的在于推进偏移的最小化,所以在这篇论文里面并没有加入回环检测的部分,这个算法主要的结构如下图所示:
在这里插入图片描述

这篇论文将复杂的问题划分为了两部分:高频率的里程计和低频率的制图,里程计用于提取特征点来进行相邻帧之间点云数据的匹配,也就是找出变换关系,用这个变换关系去消除畸变,制图则是用校正后的数据进行点云的拼接。可以看见雷达的数据送入odometry之后产出的结果一部分送入了mapping,之后再变换整合的部分又将这两部分的变换整合了一下,从而达到了一个很好的效果。

二、Lidar Odometry

在里程计的部分中,主要有三部分:特征点提取、建立匹配关系和运动估计。
特征点提取主要是提取两类点:边点和平面点。从名字就可以看出,边点其实是原来三维空间上边上的点,而平面点则是原来三维空间里面平面上的点。这里的特征点提取是针对scan来操作的,也就是说是在一次scan上提取特征点。
提取特征点本质上是根据点的曲率来计算平面光滑度作为提取当前帧的特征,平面点是在三维空间中处于平滑平面上的点,其和周围点的大小差距不大,曲率较低,平滑度较低。相反边缘点是在三维空间中处于尖锐边缘上的点,其和周围点的大小差距较大,曲率较高,平滑度较高。提取时按照下面的公式计算c值,c值最大的为边点,c值最小的称为平面点。
在这里插入图片描述
为了保证特征点分布的均匀,提取时将一个scan分为了四个区域,对每个区域上限制了特征点的数目:一个区域只能有2个边点和4个平面点。同时选的点周围不能有点已经被选中。并且,为了避免选到一些可靠性比较低的点,选点的时候还排除了下面的两种情况:
在这里插入图片描述
左图的情况是指不希望出现点B这样物体面本身与激光的射线方向接近平行的平面上的点,右图的情况是指不希望出现这种存在间隔的情况,AB可能在一条线上,但是因为间隔的存在,会存在距离的偏差。
所以,候选的点必须满足三个条件:子区域数量要求、周围没有别的被选点、位置要求。满足要求的候选点送入计算c值的模块,通过计算c值,找出最大的两个和最小的四个点,从而得到了2个边点和4个平面点。

建立匹配关系则是找出前后两帧特征点的对应关系,从这部分开始,最头痛的就是里面的时间戳关系,也就是下面这张图:
在这里插入图片描述
tk时间开始,到tk+1时刻,也就是蓝色的线,由于点云数据是一点一点生成的,所以蓝色线表现为一个不断上升的过程,这一个时间段生成的原始点云数据记作pk,前面也提到过了,在这篇论文的背景下蓝色的pk是存在偏差的,对这部分偏差进行校正,得到的点云会投射到结束时刻也就是tk+1时刻,这部分无偏差的点云数据称为pk-(横线画在上面),算法实际上是从这个时刻开始的,也就是已知上一帧的变换矩阵和无偏点云数据pk-,对未校正的pk+1进行处理得到下一个时刻的转换矩阵。

这里的匹配关系主要是选取特征点间的匹配关系,我们现在得到了校正后的且投影到tk+1时刻的点云pk-,这里面是有上一个时刻的特征点的,之后在未校正的点云pk+1中,利用粗略的转换矩阵,将点云前投影回tk+1时刻,也就是这一帧点云的开始时刻,这时我们就得到了tk+1时刻的两个点云,我们点的选择也是在这两个点云中进行的。对于边点,首先选择前投影点云中的一个边点i,再在pk-中选择距离i最近的点j,最后选择pk-中与i最近且不在同一个scan的点,这样做主要是为了防止在构建特征区域的时候出现三点共线的情况。
在这里插入图片描述
对于平面点,选择前投影的点云中的一个平面点i,之后在pk-的平面点中选择与i距离最近的点j,再在j同一个scan找一个最近点l和与j不在一个scan的另一个最近点m,这样相当于在pk-的平面点中找了三个平面点。
在这里插入图片描述
找这些点最基本的出发点是想建立一个优化的方向,前面提到过,前投影本身是粗略的,也就是存在偏差的,在没有偏差的情况下,前投影的特征点应该是和pk-的特征点重合的,但因为偏差存在,特征点之间也是存在距离的,所以我们优化的方向应该是让这个距离尽可能小,为了增加算法的鲁棒性,这里没有选择特征点之间的距离最小,而是让点到特征区域的距离最小,这个距离对于边点就是点i到直线jl的距离:
在这里插入图片描述
对于平面点就是点i到平面jlm的距离:
在这里插入图片描述
对于这两个式子,只有前投影的i的坐标是不知道的,这里就涉及到前面提到的粗略的转换矩阵,这个矩阵其实就对应着第三部分也就是运动估计。
对这篇论文而言,它假设雷达的运动是匀速的,所以变换矩阵理论上是可以根据时间关系,进行线性插入的,也就是下面的式子:
在这里插入图片描述
这个式子最难看懂的地方就是那些该死的时间戳下标,首先对这个式子来说,时间轴的关系式tk——tk+1——ti——t,其中tk+1——t正好对应这一个sweep的时间,所以右边分数的部分实际上就是扫描的i的时候用的时间在整个sweep耗时中所占的比例。再看两个变换矩阵,变换矩阵上标L表示的是这个变换矩阵是在雷达坐标系下的,这个上标倒还好理解,主要是在后面制图的时候区分坐标系的,下标就离谱,不带括号的实际上是带括号的一种缩写,左边的部分表示的是tk+1时刻与ti时刻的坐标转换,右边不加括号的,表示的是tk+1与t时刻的坐标转换,也可以看成是帧间的变换矩阵,也就是我们最终的目标。
也就是说,利用上面的式子我们可以利用粗略的帧间转换矩阵通过时间关系实现ti时刻与tk+1时刻的坐标转换,而这个坐标转换被用在前面的前投影中,从而和距离挂上了钩,我们要优化的距离,最终变成优化一个最优的帧间变换矩阵,让特征点到达特征区域的距离最小。
这里就省略一下了,大量的数学运算过后,我们得到了对于边点和平面点的两个优化式子:
在这里插入图片描述
在这里插入图片描述
让这些式子最优化,可以联合写成下面的式子:
在这里插入图片描述
之后利用列文伯格-马夸特法(LM)法去进行非线性优化,最终得到一个最优的帧间变换矩阵TLk+1。这个矩阵也就是我们要求的运动估计。

三、Lidar Mapping

前面的帧间优化的执行频率是高于这部分制图的执行频率的,也就是说大量的优化少量的制图,累计一定的帧数目的点云数据才会进行建图,虽然频率较低,但是精度很高。
本质上来说建图的目的就是将点云数据融入到世界地图里面去,精确估计点云数据在世界坐标系下面的位姿。
就过程而言,制图和前面的里程计实际上是很像的,区别在于制图多了一个坐标系的转换。
在这里插入图片描述
上图是制图的一个过程的模拟,行驶方向是从右向左,已经知道的量有:k+1帧之前的扫描的点云在全局坐标系下面的投影QK,可以理解为目前为止前面全部的已经校正的点云数据;第k次扫描的末尾也就是k+1帧起始的时候的位姿变换信息TKW,注意这里的转换矩阵是在世界坐标系下的,而在里程计中已知的是雷达坐标系下的;利用里程计得到的输出TK+1L,也就是在雷达坐标系下将第K+1帧映射到k+2时刻的变换矩阵。
利用这三个量,我们可以首先将TKW通过TK+1L向后推演一个时刻,也就是得到TK+1W,再利用这个转换关系,将k+1帧点云投影到全局坐标系下,即为QK+1-(这里加横杠变成了前投影)。这样问题转换为对TK+1W的优化,优化用到的工具是QK和QK+1-两个点云数据。问题和里程计很像,同样都是利用两个投影到同一个时刻的点云进行距离最优化,最后变成位姿的最优化,从而得到前后两帧的转换关系。转换关系得到后进行点云的匹配拼接,就可以扩大地图的范围。

因为针对的对象换成了制图,所以需要做一定的改变,一方面使用的QK+1-是十帧里程计输出的数据,而QK是之前的地图数据。也就是说QK+1-是攒了十次sweep的数据。对于QK,如果采用之前全部的地图来计算,必然会导致开销很大,所以这里变为使用边长为10m的立方体,用来代替全局地图进行TK+1W的计算。
由于实时性的缘故,找对应的特征点更换了方法,制图其他的算法步骤和里程计的基本一致:
在这里插入图片描述
在这里插入图片描述
参考链接:
https://zhuanlan.zhihu.com/p/111388877
https://www.cnblogs.com/zhjblogs/p/14221647.html
https://blog.csdn.net/i_robots/article/details/108331306


http://chatgpt.dhexx.cn/article/qNly9QyD.shtml

相关文章

使用EKF融合odometry及imu数据

整理资料发现早前学习robot_pose_ekf的笔记,大抵是一些原理基础的东西加一些自己的理解,可能有不太正确的地方。当时做工程遇到的情况为机器人在一些如光滑的地面上打滑的情形,期望使用EKF利用imu对odom数据进行校正。就结果来看,…

【论文阅读】LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain

LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain 文章摘要I. 简介II. 硬件系统III. 轻量级激光雷达里程计和建图A. 系统概况B. 分割C. 特征提取D. 激光里程计E. 激光建图 IV. 实验V. 总结与讨论 本文主要是对LeGO-LOAM论文的一些…

ros移动机器人,激光雷达里程计rf2o_laser_odometry的使用与分析

目录 1.问题分析 2.激光雷达里程计 2.1 代码下载 2.2 使用方法 (1) ERRO:“base_link” passed to lookupTransform argument source_frame does not exist. (2)"Waiting for laser_scans...." (3)无法发布odom->base_footprint的tf信息 2.3 导…

Super odometry:以IMU为核心的激光雷达视觉惯性融合框架(ICRA2021)

Super Odometry: IMU-centric LiDAR-Visual-Inertial Estimator for Challenging Environments 作者:Shibo Zhao,Hengrui Zhang, Peng Wang, Lucas Nogueira,Sebastian Scherer 论文地址:https://arxiv.org/pdf/2104.14938.pdf 视…

svo: semi-direct visual odometry 论文解析

SVO 从名字来看,是半直接视觉里程计,所谓半直接是指通过对图像中的特征点图像块进行直接匹配来获取相机位姿,而不像直接匹配法那样对整个图像使用直接匹配。整幅图像的直接匹配法常见于RGBD传感器,因为RGBD传感器能获取整幅图像的…

LIMO: Lidar-Monocular Visual Odometry

IROS2018的论文 本文提出了LIMO SLAM框架,主要工作是融合了LiDAR和Monocular。 https://github.com/johannes-graeter/limo 前端 特征 本文使用的是viso2特征,它能 non-maimum suppression, outlier rejection 和 subpixel refinement. 30-40ms能提…

Visual Odometry技术 (Of VSLAM)

目录 什么是SLAM 经典视觉SLAM框架 Visual Odometry Lucas–Kanade光流 Acknowledgements and References 什么是SLAM SLAM是Simultaneous localization and mapping缩写,意为“同步定位与建图”1。它是指搭载了特定传感器的主体,如机器人或者无人…

ROS 位置姿态Odometry仿真模拟(gmapping)

使用单纯的雷达数据进行 2D 建立图像的时候,建图的效果和雷达的性能也有关系,雷达的扫描频率会随着小车的移动速度增大而变化,通过更改扫描的频率来更新栅格地图的完整性。 点击DEMO-LINK 所需要的环境 ubuntu 18.04 ROS Melodic desktop fu…

rospy Odometry天坑小计

rospy Odometry天坑小计 在使用 python 自己搭建 ros 控制小车的上位机接口时,遇到了一个非常奇怪的问题,发布里程计的时候,一旦里程计得到订阅,发布者就会报 ndarray 属性找不到错误,乍一看着实让人脑瓜疼&#xff0…

Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(一)

Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(一) 1. LiDAR inertial odometry and mapping简介2. Tightly coupled LiDAR inertial odometry2.1 LiDAR-IMU odometry overview2.2 IMU and pre-integration2.3 De-skewing and feature e…

SLAM——入门到放弃:ROS里程计(odometry)

ROS gmapping导航包,要求有2 个 输入,一个是激光数据,另一个就是里程计信息。 里程计又包含2 个方面的信息: 位姿(位置和转角),即(x,y,θ)是速度(前进速度和…

Ros Odometry获取机器人位置-python 代码打印

纪念一下,辛苦了一天多,终于找出来了,经过网上的资料反向推出结构。 博主需要通过机器人的实时位置来进行计算。从网上查阅得知nav_msgs/Odometry消息中存储机器人的位置和速度估计等。 下面展示一下操作流程: 1.首先通过 ros…

ROS里程计消息nav_msgs/Odometry的可视化方法

ROS中里程计的消息类型为nav_msgs/Odometry,该消息类型具有以下结构: 可以看到,里程计消息中的pose包含了位置pose.position和姿态pose.orientation 在ROS中,有一种常用消息类型为nav_msgs/Path,可视化的方法为&#…

基于rf2o_laser_odometry纯激光里程计的gmapping建图

ROS环境:ubuntu16.04 & ROS kinetic激光雷达:EAI-X4 or RPlidar-A1激光里程计:rf2o_laser_odometry建图:gmapping 对于很多刚入门的同学,购买一台带有高精度轮式里程计的ROS小车经济上往往不允许。但是大多数同学…

nav_msgs/Odometry消息的发布和tf变换

一。ROS使用tf来决定机器人的位置和静态地图中的传感器数据,但是tf中没有机器人的速度信息,所以导航功能包要求机器人 能够通过里程计信息源发布包含速度信息的里程计nav_msgs/Odometry 消息。 本篇将介绍nav_msgs/Odometry消息,并且通过代码…

【视觉SLAM】DM-VIO: Delayed Marginalization Visual-Inertial Odometry

L. v. Stumberg and D. Cremers, “DM-VIO: Delayed Marginalization Visual-Inertial Odometry,” in IEEE Robotics and Automation Letters, vol. 7, no. 2, pp. 1408-1415, April 2022, doi: 10.1109/LRA.2021.3140129. 论文阅读方法:Title,Abstract…

DSO(Direct Sparse Odometry)

DSO(Direct Sparse Odometry) 文章目录 1. 简述2. 概述3. 框架流程3.1 代码框架与数据表示3.2 VO流程 4. DSO详细介绍4.1 残差的构成与雅可比4.2 滑动窗口的维护与边缘化4.3 零空间,FEJ4.4 其他零散的模块和算法 5. 光度标定6. 评述7. 资料与…

SVO(SVO: fast semi-direct monocular visual odometry)

SVO2系列之深度滤波DepthFiltersvo_noteSVO(SVO: fast semi-direct monocular visual odometry)SVO 半直接视觉里程计【DepthFilter】深度滤波器【svopro】代码梳理 SVO(SVO: fast semi-direct monocular visual odometry)翻译 1、…

航迹推演

​ 做机器人底层程序的时候,经常用到航迹推演(Odometry),无论是定位导航还是普通的方向控制。航迹推演中除了对机器人位姿进行估计,另一个很重要的关系是移动机器人前进速度、转向角速度与左轮速度、右轮速度之间的转换…

航迹推演(Odometry)

做机器人底层程序的时候,经常用到航迹推演(Odometry),无论是定位导航还是普通的方向控制。航迹推演中除了对机器人位姿进行估计,另一个很重要的关系是移动机器人前进速度、转向角速度与左轮速度、右轮速度之间的转换。…