3D激光SLAM:ALOAM:异常点剔除机制代码解析

  • 前言
    • LOAM中的异常点
  • Code

前言

在LOAM的论文中,作者提到了要剔除两种异常点.

  • 平行点
  • 遮挡点

但是在ALOAM的代码中并未写相关的功能.

如果想把论文中两种异常点的剔除机制加进去,可以参考下面的代码.

之前把一些其它的异常点剔除的方法总结了,可以参考这个地方

  • 去除掉非常近的点
  • 去除掉非常远的点
  • 去除NaN的点
  • 反射率处理
  • 去除入射角较小的点 (实际就是平行点)

LOAM中的异常点

再回顾下LOAM中定义的两类异常点
平行点:

平行点指的就是 图中的B点
就是激光的射线几乎和物体的平面平行了

剔除这种点的原因有两个:
1 激光的数据会不准,射线被拉长
2 这种点被视为特征点后会非常不稳定,下一帧可能就没了,无法做配对了
例如图片中的lidar向左移一点,那么B点就消失了,形成对比的就是A点,极短时间内不会消失

遮挡点:

遮挡点就是 图中的A点
lidar一条sacn上,相邻的两个或几个点的距离偏差很大,被视为遮挡点

剔除这种点的原因是:
这种点被视为特征点后会非常不稳定,下一帧可能就没了,无法做配对了
例如图片中的lidar向右移一点,那么A点就消失了,形成对比的就是B点,极短时间内不会消失

此时最后把A点的左边几个点,都剔除掉

Code

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        //获取点云中点的个数int cloudSize = extractedCloud->points.size();

获取点云中点的个数

        // 循环处理每个点,判断是否是遮挡点还是平行点for (int i = 5; i < cloudSize - 6; ++i){

循环处理每个点,判断是否是遮挡点还是平行点
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

            /* occluded points  遮挡点的判断 */float depth1 = cloudInfo.pointRange[i];//当前点距离float depth2 = cloudInfo.pointRange[i+1];//下一个点的距离

首先是判断 遮挡点
depth就是点的距离 = sqrt(xx+yy+z*z)

             // 列索引间的距离int columnDiff = std::abs(int(cloudInfo.pointColInd[i+1] - cloudInfo.pointColInd[i]));

计算点的 一条scan上的 索引偏差
因为前面可能要去掉一些点,比如NAN点,如果索引偏差很大,那么就可以不进行遮挡点的判断了
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

            // 相邻两点如果列索引太小,则这个点周围的点不进行特征提取if (columnDiff < 10){// 如果相邻两点距离大于0.3,选出6个点if (depth1 - depth2 > 0.3){//如果i点在后面,那么i点也不能要,并且i-1至i-5不要cloudNeighborPicked[i - 5] = 1;cloudNeighborPicked[i - 4] = 1;cloudNeighborPicked[i - 3] = 1;cloudNeighborPicked[i - 2] = 1;cloudNeighborPicked[i - 1] = 1;cloudNeighborPicked[i] = 1;}else if (depth2 - depth1 > 0.3){//如果i在前面,那么i+1是被遮挡的点,那么i+1至i+6不要cloudNeighborPicked[i + 1] = 1;cloudNeighborPicked[i + 2] = 1;cloudNeighborPicked[i + 3] = 1;cloudNeighborPicked[i + 4] = 1;cloudNeighborPicked[i + 5] = 1;cloudNeighborPicked[i + 6] = 1;}}

如果点的索引偏差不大的话,那么进行判断是否是遮挡点
偏差大不进行判断的原因就是比如下图

如图上的情况,因为去了NAN点,那么i和i+1点距离偏差过大,也不是遮挡点,要排除此种情况

如果相邻两点距离大于0.3,选出6个点
这时候要分两种情况
一个是i点的距离大,即i为被遮挡点,那么i点也不能要,并且i-1至i-5不要,因为i-1至i-5也不稳定

另外一种情况是i在前面,那么i+1是被遮挡的点,那么i+1至i+6不要


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

            /* parallel beam  平行点的判断  */// 平行线的情况,根据左右两点与该点的深度差,确定该点是否会被选择为特征点float diff1 = std::abs(float(cloudInfo.pointRange[i-1] - cloudInfo.pointRange[i]));float diff2 = std::abs(float(cloudInfo.pointRange[i+1] - cloudInfo.pointRange[i]));if (diff1 > 0.02 * cloudInfo.pointRange[i] && diff2 > 0.02 * cloudInfo.pointRange[i])cloudNeighborPicked[i] = 1;}

这个是平行点的判断

平行线的情况,根据左右两点与该点的深度差,确定该点是否会被选择为特征点

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
整体代码

// 标记遮挡点与平行点,不进行特征提取void markOccludedPoints(){//获取点云中点的个数int cloudSize = extractedCloud->points.size();// 循环处理每个点,判断是否是遮挡点还是平行点for (int i = 5; i < cloudSize - 6; ++i){/* occluded points  遮挡点的判断 */float depth1 = cloudInfo.pointRange[i];//当前点距离float depth2 = cloudInfo.pointRange[i+1];//下一个点的距离// 列索引间的距离int columnDiff = std::abs(int(cloudInfo.pointColInd[i+1] - cloudInfo.pointColInd[i]));// 相邻两点如果列索引太小,则这个点周围的点不进行特征提取if (columnDiff < 10){// 如果相邻两点距离大于0.3,选出6个点if (depth1 - depth2 > 0.3){//如果i点在后面,那么i点也不能要,并且i-1至i-5不要cloudNeighborPicked[i - 5] = 1;cloudNeighborPicked[i - 4] = 1;cloudNeighborPicked[i - 3] = 1;cloudNeighborPicked[i - 2] = 1;cloudNeighborPicked[i - 1] = 1;cloudNeighborPicked[i] = 1;}else if (depth2 - depth1 > 0.3){//如果i在前面,那么i+1是被遮挡的点,那么i+1至i+6不要cloudNeighborPicked[i + 1] = 1;cloudNeighborPicked[i + 2] = 1;cloudNeighborPicked[i + 3] = 1;cloudNeighborPicked[i + 4] = 1;cloudNeighborPicked[i + 5] = 1;cloudNeighborPicked[i + 6] = 1;}}/* parallel beam  平行点的判断  */// 平行线的情况,根据左右两点与该点的深度差,确定该点是否会被选择为特征点float diff1 = std::abs(float(cloudInfo.pointRange[i-1] - cloudInfo.pointRange[i]));float diff2 = std::abs(float(cloudInfo.pointRange[i+1] - cloudInfo.pointRange[i]));if (diff1 > 0.02 * cloudInfo.pointRange[i] && diff2 > 0.02 * cloudInfo.pointRange[i])cloudNeighborPicked[i] = 1;}}

以上是ALOAM中 异常点剔除 功能的 代码 分析

3D激光SLAM:ALOAM:异常点剔除机制代码解析相关推荐

  1. 3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析

    3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析 前言 利用地面点优化 利用角点优化 代码部分 gazebo测试 前言 LeGO-LOAM的全称是 Lightweight an ...

  2. 3d激光slam:LIO-SAM框架---特征点提取

    3d激光slam:LIO-SAM框架---特征点提取 前言 特征点提取 Result 前言 LIO-SAM的全称是:Tightly-coupled Lidar Inertial Odometry vi ...

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

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

  4. 3D激光SLAM:Livox激光雷达硬件时间同步

    3D激光SLAM:Livox激光雷达硬件时间同步 前言 同步原理 PTP时间同步原理 GPS时间同步原理 PPS时间同步原理 GPS+PPS时间同步使用方法 Livox Hub Livox Conve ...

  5. 彻底搞懂基于LOAM框架的3D激光SLAM全套学习资料汇总!

    地图定位算法是自动驾驶模块的核心,而激光SLAM则是地图定位算法的关键技术,其重要性不言而喻,在许多AI产品中应用非常多(包括但不限于自动驾驶.移动机器人.扫地机等).相比于传统的视觉传感器,激光传感 ...

  6. 32线镭神雷达跑LeGO-LOAM:3D 激光SLAM

    32线镭神雷达跑LeGO-LOAM:3D 激光SLAM 安装LeGO-LOAM 镭神雷达的相关修改 LeGO-LOAM的修改 修改utility.h 修改imageproject.cpp Enjoy ...

  7. 3D激光SLAM:ALOAM---gazebo仿真测试场景搭建

    3D激光SLAM:ALOAM---gazebo仿真测试场景搭建 gazebo世界场景 AGV模型 Velodyne 激光雷达 测试 gazebo世界场景 在launch文件中加入 gazebo世界场景 ...

  8. 3d激光SLAM:LIO-SAM框架—IMU预积分功能数据初始化

    前言 LIO-SAM的全称是:Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping 从全称上可以看出,该算法是一个紧耦合的 ...

  9. 3D激光SLAM:LOAM 论文--算法详细解读

    3D激光SLAM:LOAM 论文--算法详细解读 LOAM简介 论文里面的符号表示 算法部分 激光雷达里程计 A 特征点提取 B 找特征点的匹配对 C 运动估计 lidar 建图 测试结果 LOAM是 ...

最新文章

  1. 【Python】选择数组中的数,拼接成一个最大字符串数(易错题,cmp_to_key举例)
  2. Faster R-CNN论文详解
  3. java导入、导出Excel文件
  4. java 洗牌_java数组之完美洗牌算法
  5. Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法
  6. 一张图搞定SDF的概念
  7. kali字典_kali黑客系统wpscan工具扫描wordpress漏洞入侵攻击测试教程
  8. Arcgis10安装说明
  9. STL 源码剖析 空间配置器
  10. 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展...
  11. mac系统如何进入系统偏好设置_MacOS Big Sur 系统偏好设置无法解锁Bug解决
  12. LeetCode 1035. 不相交的线(最长公共子序列DP)
  13. 利用维纳滤波编码实现给定的运动模糊图像恢复
  14. Centos7 把php5.4升级到php5.6
  15. 直播实录丨十年主导15个产品从0到1,她的经验与思考现场拆解
  16. Fiddler代理配置
  17. [RE]如何调整堆栈平衡
  18. 冰蝎shell_冰蝎动态二进制加密WebShell特征分析
  19. 真赔麻了!!一个BUG和一个回帖直接赔了20万!
  20. POJ 1511:Invitation Cards

热门文章

  1. oneinStack配置无域名网站
  2. 【音视频编解码】查看软解还是硬解
  3. 网易社招面经,纯干货分享
  4. 10寸 nuc972_NUC972----最简单的驱动(转)
  5. matplotlib.pyplot 所有方法目录
  6. Kendo UI常见问题
  7. 全备+增量备份的测试
  8. 重返20岁(2020年末,到2021年新年计划)
  9. 公司hadoop客户端试用
  10. mysql启动错误10061