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学习笔记相关推荐

  1. SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别

    本文为我在浙江省北大信研院-智能计算中心-情感智能机器人实验室-科技委员会所做的一个分享汇报,现在我把它搬运到博客中. 由于参与分享汇报的同事有许多是做其他方向的机器人工程师(包括硬件.控制等各方面并 ...

  2. SLAM学习笔记(二十)LIO-SAM流程及代码详解(最全)

    写在前面 关于安装配置,博客LIO_SAM实测运行,论文学习及代码注释[附对应google driver数据] 我觉得已经写的比较完善了.但是我觉得在注释方面,这位博主写的还不够完善,因此在学习以后, ...

  3. 激光SLAM入门学习笔记

    激光SLAM入门学习笔记 激光SLAM入门学习笔记 一.推荐阅读书籍 二.推荐公众号.知乎.博客 1.公众号 2.知乎 3.博客 三.推荐阅读论文&代码(参考泡泡机器人) 2D激光SLAM 3 ...

  4. 学习笔记之——LIO-mapping

    之前博文<学习笔记之--激光雷达SLAM(LOAM系列的复现与学习)>介绍了LOAM系列的作品.本博文看看LIO-mapping(Tightly Coupled 3D Lidar Iner ...

  5. Apollo源码剖析学习笔记2

    Apollo 源码剖析学习笔记2 Talker-ListenerNode 目录中包含了 Node 对象.Reader 对象和 Writer 对象.Node 对象主要对应 Ros 中的 Node 节点, ...

  6. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  7. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  8. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  9. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  10. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

最新文章

  1. 干货丨计算机视觉必读:图像分类、定位、检测,语义分割和实例分割方法梳理(经典长文,值得收藏)
  2. Linux实战教学笔记49:Zabbix监控平台3.2.4(一)搭建部署与概述
  3. 拜托,面试别再问我表达式求值了!!!
  4. html 消息通知声音,ajax实现web页面的消息实时提醒时播放提示音
  5. 谷歌为什登不上去github_安卓开源是假的,谷歌随时禁用,华为手机在海外市场已经快跌没了...
  6. Java多线程学习三十:ThreadLocal 适合用在哪些实际生产的场景中
  7. clienttop,clientleft,scrolltop,scrollleft,offsettop,offsetleft全解析
  8. nginx反代web页面没有正常显示_web漏洞-SSI注入漏洞深入详解
  9. 嵌入式开发中数值常量如何转化为内存地址?
  10. 不只是新车,2019上海车展还有这些彩蛋 | 一级供应商、科技公司篇
  11. 国产CAD_手机也能看CAD图纸了?国产软件助力CAD告别电脑时代!
  12. OpenLayers 加载 百度 地图
  13. Codeforces 1194B+1194D
  14. BTE1650 FBL1N/FBL2N/FBL3N/FBL5N-增加客制化字段 客商及科目描述
  15. Android 扫码盒子全局接收付款码(全局事件上层接收多重下发)
  16. Quartz 2.4.0 源码解析
  17. python中的可迭代是什么意思_Python可迭代跟迭代器的区别
  18. 计算机自带输入法在哪里设置方法,Windows7设置默认输入法_Win7默认输入法怎么设置?-192路由网...
  19. 网页禁止鼠标右键复制的解决办法
  20. python自动化脚本常用方法小结

热门文章

  1. 虚拟机免密登录 (SSH 无密登录配置)
  2. SSRF 302跳转 gopher协议攻击redis写入ssh公钥,实现远程无密登录(学习总结)
  3. eac 反调试_一种可能被用于EAC保护的检测调试器方案
  4. 《AutoCAD 2014中文版超级学习手册》——2.4 上机实验
  5. 《极客时间·每日一课》笔记
  6. 修改MOSSAD用户密码或本地用户密码
  7. SOA (面向服务的体系结构)
  8. Cortex-A8与STM32的区别
  9. 7.15亿元转让债转股 内蒙古建行拟退出包钢集团
  10. mindmanager2022如何设置切换中文?