loam 框架流程描述

news2024/11/28 8:41:01

前端流程(scanRegistration.cpp)

多线激光雷达即有多个激光发射器同时工作,如常见的 Velodyne16,就是共有 16 个激光发射器,一般这些发射器竖排排列,然后一起水平旋转。
激光雷达在一定的时间内旋转一圈,即一帧的点云数据。值得注意的是,在一帧时间内激光雷达的载体也会运动,因此,一帧数据内会包括不同时间的点云,这也就是激光雷达的运动畸变。
下图是kitti数据集的坐标系表示
在这里插入图片描述

1.scanRegistration.cpp

main函数:

  1. 建立scanRegistration节点
  2. 设置雷达线束(64),最小范围(5m)
  3. 订阅雷达原始点云信息,发布的信息包括有效点云、大曲率角点、稍微大曲率角点、小曲率面点,稍微小曲率面点,主要处理过程在原始点云信息的回调函数

laserCloudHandler回调函数

  1. ros格式转pcl点云,移除空点及车体范围内的点
  2. 角度补偿, 计算起始角度和结束角度,确保相差2 PAI
  3. 遍历点云,根据俯仰角计算对应的扫描线,根据水平角计算当前角度距离起始角度的差值,根据差值计算时间戳,用于后面进行运动补偿,将点云存储进对应的扫描线。这里注意intensity属性整数部分存储的是扫描线的索引,小数部分是相对于起始时刻的时间
  4. 提取特征并均匀化。首先计算所有点云曲率,将每个扫描线分为6等分,将角点曲率从小到大排序,每段取最大的两个作为大曲率角点,次大的20个作为稍微大曲率的角点,取曲率最小的4个作为面点,对面点进行下采样滤波
  5. 发布点云信息,包括包括有效点云、大曲率角点、稍微大曲率角点、小曲率面点,稍微小曲率面点

2.异常点筛选

这一步其实是需要放在特征提取之前做的
但是这块A-loam中没有,借助lio-sam中featureExtraction.cpp讲解

首先遍历所有点云,取出相邻两点的距离信息,计算两个点的列数id差。由于在筛选时会去除空点,因此防止两个有效点云虽然相邻但是间隔很远。
根据深度信息筛选下图中b的情况,根据相邻点的距离差,筛选下图中a的情况。
在这里插入图片描述

3.激光运动畸变及补偿

激光雷达的一帧数据是过去一段时间而非某个时刻的数据,在这一帧时
间内的激光雷达或者其载体通常会发生运动,因此,这一帧数据的原点都不一致,运动补偿的目的就是把所有的点云补偿到某一个时刻,这样就可以把本身在过去100ms 内收集的点云统一到一个时间点上去
P s t a r t = T s t a r t c u r r e n t ∗ P c u r r e n t P_{start}=T_{start_current} * P_{current} Pstart=TstartcurrentPcurrent
运动补偿需要知道每个点该时刻对应的位姿$ T_{start_current $,通常有几种做法:

  1. 如果有高频里程记,可以比较方便的获取每个点相对起始扫描时刻的位姿
  2. 如果有 imu,可以方便的求出每个点相对起始点的旋转
  3. 如果没有其他传感器,可以使用匀速模型假设,使用上一个帧间里程记的结果作为当前两帧之间的运动,同时假设当前帧也是匀速运动,也可以估计出每个点相对起始时刻的位姿

代码对应laserOdometry.cpp
去畸变
TransformToStart()函数 将输入的点云坐标转到起始时刻
输入点云信息
对于旋转,使用Eigen的四元数插值得到当前时刻的四元数
对于平移,使用根据时间占当前周期的比例直接相乘
由于kitti里面是补偿过的,因此这里比例都设置为1
输出去畸变后的点云
TransformToEnd()函数 将输入的点云坐标转到结束时刻
先调用TransformToStart()将输入点云转到起始时刻
根据帧到起始时刻到结束时刻的位姿信息,将点云转到结束时刻

主函数

  1. 定义节点laserOdometry
  2. 设置参数
  3. 订阅scanRegistration发布的角点、面点、有效点云5个topic,每个回调函数只负责把输入存入数组
  4. 发布5个topic,分别是
  5. while循环实现激光里程计

** while循环 **
1.触发一次回调函数(spinOnce)
2. ros消息转为pcl格式
3. 第一帧的点云信息不处理,只加入kd tree。对第二帧开始构建约束求解,对于点线约束,构建当前点和上一帧两点的距离约束,两个点分别是kd tree中最近的点和不同扫描线上较近的点;对于点面约束,找的三个面点分别是kd tree最近的点、相同扫描线较近的点、不同扫描线较近的点。
4. 根据约束构建ceres优化器,迭代4次进行优化
5. 递推更新相对世界系的位姿
6. 将当前帧点云加入kd tree,发布雷达里程计信息、路径、将较平坦的面点、曲率较大的角点、有效角点转为ros发布,用于后端

后端流程

laserMapping.cpp

main()函数

建立laserMapping节点,加载体素滤波参数,订阅前端点云和里程计信息,回调函数就是把信息存进队列。将后端数组复位,建立process线程进行处理

process()函数

1.里程计、点云、面点队列的首个元素时间戳都和角点队列的首个元素时间戳对齐,然后将首个元素都转为ros格式并弹出,清空角点数组以保证每次处理的实时性
2.将前端得到的位姿转到后端地图下 T m a p _ c u r = T m a p _ o d o m ∗ T o d o m _ c u r T_{map\_cur}=T_{map\_odom} * T_{odom\_cur} Tmap_cur=Tmap_odomTodom_cur
得到当前帧在地图中的初始估计
3.根据初始估计确定在栅格中的索引,每个栅格是505050的正方体,宽21个(x)、高21个(y)、深11个(z),一共4851个。如果当前点的栅格太靠左,就将整体右移,将第i-1个栅格点云放到第i个,靠近右边界就左移,其他两个轴也这样操作,这样移动完后会空出一列。经过这个步骤保证当前的位姿步骤栅格地图的边缘。
4.取出当前栅格附近 250250150的局部小地图做当前帧的配准,取出小地图的栅格id以及点云信息。
5.对当前帧的角、面特征下采样。下采样后如果还有足够的特征,进行优化。对于点线约束,先将角点点云投影到当前坐标系下,使用kd tree从小地图找到5个最近的角点,最远的必须小于1m,然后计算这个五个点的协方差矩阵,使用eigen进行特征值分解,如果最大特征值大于次大特征值的3倍,就认为是线特征,可以添加到ceres优化器。对于点面约束,同样kd tree搜索5个最近面点,计算其法向量,然后判断每个点到平面的距离,都小于0.2则将当前点和法向量送入优化器,开始优化。
6.进行位姿更新
T m a p _ o d o m = T m a p _ c u r ∗ T o d o m _ c u r − 1 T_{map\_odom}=T_{map\_cur} * T_{odom\_cur}^{-1} Tmap_odom=Tmap_curTodom_cur1
7.将当前帧优化后的点云加到局部地图,将特征投影到地图坐标系,计算其在栅格中的位置,得到索引后加入一维数组。
8.对局部地图进行体素滤波,然后发布位姿、轨迹、tf、点云信息。

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

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

相关文章

Flutter教程之使用不同的方法维护 Flutter 应用程序状态

在开发应用程序时,主要关注的是当我们使用Tabs或Bottom Navigation Bar类的Widgets (Flutter 中几乎所有东西都是 widgets)时我们的应用程序将如何执行。 至于示例,让我们考虑一下我们有三个选项卡 UsersTab2Tab3在BottomNavBar和第一个索引上,我们有一个API 调用请求,它…

高效!启科量子线路模拟器 QuSprout 与 Amazon HPC 集成,赋能量子计算

KY1, Bertran Shao2, Adam Sun Amazon HERO;2.开发者生态负责人;3.Solutions Architect2022.11.17,启科量子正式开源其内部团队研发的量子线路模拟器:QuSprout 软件。结合早前其开源的启科量子编程框架 QuTrunk,开发者…

能源与经济面板数据集(中国能源统计年鉴面板数据+区域经济、人口与二氧化碳排放量面板数据)

一、中国能源统计年鉴面板数据 1、数据来源:中国能源统计年鉴 2、时间跨度:1991-2020 3、区域范围:全国 4、指标说明: 部分数据如下: 能源平衡表: 部分指标如下: 国内生产总值增长速度&am…

HTML网页设计制作——响应式网页影视动漫资讯bootstrap网页(9页)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

地图轨迹跟踪系统设计与实现(Android+Eclipse+APP)

目 录 1 在线地图轨迹APP概述 1 1.1 本论文的背景及意义 1 1.2 本论文的主要方法和研究进展 1 1.3 本论文的主要内容 1 1.4 本论文的结构安排 1 2 系统分析 3 2.1 研究目标 3 2.2 可行性分析 3 2.2.1 经济可行性 3 2.2.2 技术的可行性 3 2.3 需求分析 3 2.4 性能分析 4 3 系统开…

TPAMI 2022 | 自动搜索文本识别网络的高性能特征提取器

©PaperWeekly 原创 作者 | 陈卓群单位 | 清华大学论文标题:Searching a High Performance Feature Extractor for Text Recognition Network收录情况:TPAMI论文链接:https://ieeexplore.ieee.org/document/9887897代码链接:…

HTTPS(对称加密+非对称加密+证书)

目录 1. 加密和解密 HTTPS工作过程 2. 对称加密 3. 对称加密 4. 既然都有非对称加密了,那为啥还要有对称加密 5. 中间人攻击 6. 引入证书 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在…

笔记本电脑恢复删除数据的5种方法

我们都知道笔记本电脑比台式电脑拥有方便携带的优势,但是不论是笔记本还是台式电脑,难免会出现数据丢失情况,如最近有位小伙伴,不小心将自己出差需要使用的工作资料误删了,那么问题来了,笔记本数据删除怎么…

Vuex的搭建与使用

Vuex 专门在Vue中实现集中式状态(数据)管理的插件 (Vue.use(Vuex)),对Vue应用中多个组件的共享状态进行集中式的管理(读、写),也是一种组件间通信的方式,且适用于任意组件间通信。 如果多个组…

git的使用规范及技巧总结

一、什么是Git? Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同&#x…

聚观早报 | 黑五电子产品销售额飙升;谷歌不满微软收购动视暴雪

今日要闻:黑五电子产品销售额飙升;谷歌不满微软收购动视暴雪;特斯拉海外充电站价格下降;欧盟对微软发起反垄断调查;小米13渲染图曝光黑五电子产品销售额飙升 据消息,Adobe数据和分析部门Adobe Analytics发布…

Navicat Premium 16 连接Oracle注意事项

起因 新同学使用的新版本的Mac电脑 但是装的W系统M芯片 发现 PLSQL Developer 并不兼容 导致无法连接到Oracle数据 就临时换成Navicat Premium 16进行连接 然后就出现了一系列问题 Oracle默认编码集 ZHS16GBK 该问题是Navicat Premium默认使用Navicat自带的instantclient_…

激光雷达发射的PCB布局

1、激光发射的电路如下图所示。 重点就是要考虑电容、GaN、激光器三部分的布局。 2>第一种布局方式 激光器、GaN、电容三者都在同一层上,放电的回路也都在顶层上,此时临近的第二层没有铺地。 用ANSYS仿真得到此时得回路电感为2nH左右。我们都以500M时得寄生电感来评估。…

面试官:介绍一下 Redis 三种集群模式

小码今天去面试。 面试官:给我介绍一下Redis集群, 小码:啊,平时开发用的都是单机Redis,没怎么用过集群了。 面试官:好的,出门右转不谢。 小码内心困惑:在小公司业务量也不大&…

操作系统

文章目录一,操作系统是什么二,操作系统的发展史1) 1945~1955年2) 1955~1965年:首个操作系统诞生3) 1964~1979年:多道程序系统诞生4) 1979~至今:网络操作系统和分布式操作系统快速发展三,操作系统的类别一&a…

静态HTML旅行主题网页设计与实现——联途旅游网服务平台网(39页)HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

KafKa C++实战

1 集群 1. Kafka架构是由producer(消息生产者)、consumer(消息消费者)、borker(kafka集群的 server,负责处理消息读、写请求,存储消息,在kafka cluster这一层这里,其实里面是有很多个…

SpringBoot+Vue项目校园防疫管理系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

Apollo 应用与源码分析:Monitor监控-硬件监控-GPS

硬件架构图 可以看到左下角的“GNSS定位模块”其实是有IMU和GPS Antenna 组成的。 执行分析 代码 class GpsMonitor : public RecurrentRunner {public:GpsMonitor();void RunOnce(const double current_time) override; };void GpsMonitor::RunOnce(const double current_t…

为什么要把Linux机器加入到Windows AD/域控制器(Linux机器为什么要入域)?

文章目录1. 如何入域?2. 如何判断入域成功?3. 入域的效果(目的)是什么?4. 入域和SSSD之间是什么关系?1. 如何入域? sudo yum -y install oddjob oddjob-mkhomedir sssd samba-common-tools adcli \krb5-workstation o…