A-LOAM学习笔记
LOAM源码解析1——scanRegistration - 知乎
LOAM笔记及A-LOAM源码阅读 - WellP.C - 博客园
参考以上大佬的博客,结合自己的理解,对A-LOAM框架做一些整理
整体框架
A-LOAM框架非常简介,一共有4个ROS节点,共有5个c++文件,分别为
kittiHelper.cpp 读取kitti odometry的数据集,包括点云、左右相机的图像、以及pose的groundtruth(训练集才有),然后分成5个topic以10Hz的频率发布出去。点云用于定位,后面4个用于rviz可视化
scanRegistration.cpp 对输入点云进行滤波,提取4种feature,边缘点特征sharp、less_sharp,面特征flat、less_flat
laserOdometry.cpp 基于4种feature进行帧与帧的点云特征配准,最终得到里程计坐标系下的激光雷达的位姿
laserMapping.cpp 基于less_sharp特征点和less_flat特征面,对帧与submap的点云特征配准,对Odometry线程计算的位姿进行优化
lidarFactor.hpp 计算laserOdometry和laserMapping中位姿变化时的残差
Ros下坐标系
1、map坐标系⼀般是固定的,通过点云匹配或者视觉特征匹配可以获得在地图坐标系下的位姿
2、odom坐标系 通常是以机器⼈上电时刻的位置作为原点,然后通过机器⼈对⾃⾝运动的估计来获取odom坐标系下的 位姿,可以理解为⾥程记构建的坐标系,通常会遭遇累计漂移的问题
3、baselink坐标系 ⻋体坐标系,通常以⻋上某个位置作为⻋体坐标系的原点,⼀般来讲,如果多个传感器需要都标定到⻋ 体系才能进⾏多传感器融合
4、lidar坐标系 我们获得的lidar点云都是在lidar坐标系下的,都是相对lidar中⼼的坐标,这也是从驱动拿到的lidar数据的所在的坐标系
odom坐标系=map坐标系+里程计累计漂移
ROS 中的三种坐标系(map、odom与base_link)_虚境的博客-CSDN博客
kittiHelper.cpp
主要用于ros的消息发布。
注意:kitti的训练集真值pose的坐标系和点云的坐标系不相同,为了统一,坐标系均采用点云的坐标系,所以需要将真值pose转到点云的坐标系下。
scanRegistration.cpp
一旦接受到一帧点云就执行一次回调函数laserCloudHandler
1 点云滤波,去除NaN值的无效点以及距离激光雷达传感器过近的点
2 通过Lidar坐标系下点的仰角以及水平夹角计算点云的scanID和时间戳
3 将子点云合并成一帧点云laserCloud,单帧点云laserCloud已经是按照scanID和时间戳顺序存放有序点云
4 计算点的曲率,曲率最大的两个点是corner_sharp特征点,最大的前20个点是corner_less_sharp特征点,曲率最小的前4点是surf_flat,其他的非corner特征点组成了surf_less_flat特征点,对surf_less_flat特征点降采样
laserOdometry.cpp
1 进行点到线以及点到面的ICP匹配,迭代2次,使用Ceres优化
2 用最新计算的位姿增量,得到当前帧的位姿(世界坐标系下)
3 发布当前帧在世界坐标系的位姿,点/面特征点,滤波后的点云
4 更新 laserCloudCornerLast和laserCloudSurfLast以及相应的kdtree,为下一次点云特征匹配提供target
laserMapping.cpp
Mapping线程估计当前帧在世界坐标系下的位姿,但不同于前端,这些位姿是需要优化的变量
黄色区域就是submap,将当前帧的角/面特征与局部地图的角/面特征进行匹配,对前端计算出的位姿进行优化。
1 由于Mapping线程耗时长,为了保证LOAM算法的实时性,线程只处理最新的那部分消息,其他的缓存将被清空
2 为建图设定初始位姿。当前帧在世界坐标系下的位姿=上一帧在世界坐标系下的位姿×当前帧到上一帧的位姿变换。
3 动态调整map的位置,尽量保证当前帧在submap的中心
4 以降采样后的submap特征点云为target(世界坐标系),以当前帧降采样后的特征点云(Lidar坐标系)为source进行ICP匹配。
5 在submap的corner特征点(target)中采集距离当前特征角点最近的5个点,建立协方差矩阵,如果这5个点的呈线性特征,则需要submap利用PCA原理再次构建线ceres问题,以确保边界线足够直;
6 同理,对最近邻的5个点进行基于最小二乘的平面拟合,check拟合出的平面是不是“足够平”,更新位姿增量、更新submap:
lidarFactor.hpp
计算库,包含不同线程下点到线、点到面的运算。
A-LOAM学习笔记相关推荐
- SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别
本文为我在浙江省北大信研院-智能计算中心-情感智能机器人实验室-科技委员会所做的一个分享汇报,现在我把它搬运到博客中. 由于参与分享汇报的同事有许多是做其他方向的机器人工程师(包括硬件.控制等各方面并 ...
- SLAM学习笔记(二十)LIO-SAM流程及代码详解(最全)
写在前面 关于安装配置,博客LIO_SAM实测运行,论文学习及代码注释[附对应google driver数据] 我觉得已经写的比较完善了.但是我觉得在注释方面,这位博主写的还不够完善,因此在学习以后, ...
- 激光SLAM入门学习笔记
激光SLAM入门学习笔记 激光SLAM入门学习笔记 一.推荐阅读书籍 二.推荐公众号.知乎.博客 1.公众号 2.知乎 3.博客 三.推荐阅读论文&代码(参考泡泡机器人) 2D激光SLAM 3 ...
- 学习笔记之——LIO-mapping
之前博文<学习笔记之--激光雷达SLAM(LOAM系列的复现与学习)>介绍了LOAM系列的作品.本博文看看LIO-mapping(Tightly Coupled 3D Lidar Iner ...
- Apollo源码剖析学习笔记2
Apollo 源码剖析学习笔记2 Talker-ListenerNode 目录中包含了 Node 对象.Reader 对象和 Writer 对象.Node 对象主要对应 Ros 中的 Node 节点, ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
最新文章
- 干货丨计算机视觉必读:图像分类、定位、检测,语义分割和实例分割方法梳理(经典长文,值得收藏)
- Linux实战教学笔记49:Zabbix监控平台3.2.4(一)搭建部署与概述
- 拜托,面试别再问我表达式求值了!!!
- html 消息通知声音,ajax实现web页面的消息实时提醒时播放提示音
- 谷歌为什登不上去github_安卓开源是假的,谷歌随时禁用,华为手机在海外市场已经快跌没了...
- Java多线程学习三十:ThreadLocal 适合用在哪些实际生产的场景中
- clienttop,clientleft,scrolltop,scrollleft,offsettop,offsetleft全解析
- nginx反代web页面没有正常显示_web漏洞-SSI注入漏洞深入详解
- 嵌入式开发中数值常量如何转化为内存地址?
- 不只是新车,2019上海车展还有这些彩蛋 | 一级供应商、科技公司篇
- 国产CAD_手机也能看CAD图纸了?国产软件助力CAD告别电脑时代!
- OpenLayers 加载 百度 地图
- Codeforces 1194B+1194D
- BTE1650 FBL1N/FBL2N/FBL3N/FBL5N-增加客制化字段 客商及科目描述
- Android 扫码盒子全局接收付款码(全局事件上层接收多重下发)
- Quartz 2.4.0 源码解析
- python中的可迭代是什么意思_Python可迭代跟迭代器的区别
- 计算机自带输入法在哪里设置方法,Windows7设置默认输入法_Win7默认输入法怎么设置?-192路由网...
- 网页禁止鼠标右键复制的解决办法
- python自动化脚本常用方法小结