当前位置: 首页 > news >正文

8. 《自动驾驶与机器人中的SLAM技术》基于保存的自定义NDT地图文件进行自动驾驶车辆的激光定位

目录

1. 为 NDT 设计一个匹配度评估指标,利用该指标可以判断 NDT 匹配的好坏。

2. 利用第 1 题的指标,修改程序,实现 mapping 部分的回环检测。

3. 将建图结果导出为 NDT map,即将 NDT 体素内的均值和协方差都存储成文件。

4. 实现基于 NDT map 的激光定位。根据车辆实时位姿,加载所需的 NDT 体素并完成定位。

5. 给出上述结果相比于 PCL NDT 的性能、存储空间等关键指标

1. 为 NDT 设计一个匹配度评估指标,利用该指标可以判断 NDT 匹配的好坏。

2. 利用第 1 题的指标,修改程序,实现 mapping 部分的回环检测。

下图是 PCL 版本 NDT 匹配,在阈值设置( ndt_score_th )为 4.5 时的匹配结果( 其中加载
的关键帧数目我删掉了一些,因为实在是耗时有点久。。。)
根据上面 PCL 版本的 NDT 检测结果来确定适配自定义指标的阈值( ndt_score_th )。
使用原来的阈值明显不对,观察,得分在 0.2 附近,于是试着在这个范围寻找合适的阈值。
可见,阈值设置为 0.15 pcl 版本的阈值为 4.5 时的结果差不多。

3. 将建图结果导出为 NDT map,即将 NDT 体素内的均值和协方差都存储成文件。

这里参考 split_map.cc 代码的内容:加载关键帧对应的点云,对其进行滤波,然后计算点
云中的每个点对应的地图区块 id ,最后将区块索引和对应点云分别存储起来。
我们要导出 NDT map ,需要构建 NDT 体素并计算均值和协方差,这些在第七章的 ndt_3d.h
SetTarge 函数中已经实现。
保存的结果:

4. 实现基于 NDT map 的激光定位。根据车辆实时位姿,加载所需的 NDT 体素并完成定位。

原先基于点云地图的激光定位使用的是 PCL 版本 NDT RTK 角度搜索中用到了 10 米, 5 米, 4 米, 2 米的多分辨率 NDT 匹配来确定 RTK 的朝向,所以实现基于 NDT map 的激光定位,也需要加载多分辨率 的体素,所以参照第 3 题重新修改为保存多分辨率的 NDT map 。代码如下:
存储 NDT 体素中的均值和协方差矩阵信息。
①首先,在 fusion 初始化时配置要加载的 NDT map 路径,并参考原来的 loadMapIdex()
数,将多分辨率的 NDT 地图数据加载进来。
②接下来就是定位流程 ProcessMeasurements(m) 。首先要确定 RTK 朝向,加载多分辨率
NDT map ,使用多分辨率来进行寻找。
当然,同样也要准备卸载超出范围的 NDT 地图。
以上过程包含在 loadNdtMap 函数中。
RTK 初始化成功后后续定位流程在 LidarLocalization() 中进行。
至此,实现了基于 NDT map 进行激光定位的功能。
③实现效果:
两者定位效果差不多。

5. 给出上述结果相比于 PCL NDT 的性能、存储空间等关键指标。

①统计比较两者在加载地图和配准过程两方面的耗时情况。
可以发现,基于 NDT map 的方法,加载地图数据耗时要比加载点云要慢很多;而配准方面
会快很多。
比较一下跑完一个 bag ,总的耗时情况。
经过对比发现,基于 NDT map 的激光雷达定位效率是基于 PCL NDT 的接近六倍。
②统计比较两者需要加载的地图数据占存储大小。
原先加载的是以 100x100 大小地图区块索引命名的 pcd 格式点云数据,而现在需要加载 4
种不同分辨率的 NDT 体素地图数据中,仅存储了均值和信息矩阵。因此存储空间应该要小得多,果然,对比如下:

相关文章:

  • 如何进行产品的人机交互设计?
  • 十、Qt 操作PDF文件
  • 文心一言 vs. ChatGPT:哪个更胜一筹?
  • 整合junit与热部署
  • C技能树-学习笔记(1-2)C语言概述和数据类型
  • 2024年第十届控制、自动化与机器人国际会议(ICCAR 2024)即将召开!
  • 三种引入CSS的方式
  • 1 python计算机基础
  • 数据结构-第一章
  • androidkiller的两种异常情况
  • What is `@Controller` does?
  • Kali Linux保姆级教程|零基础从入门到精通,看完这一篇就够了!(附工具包)
  • 圈小猫游戏HTML源码
  • Docker之网络配置的使用
  • iOS UI掉帧和卡顿优化解决方案记录
  • __proto__ 和 prototype的关系
  • Android系统模拟器绘制实现概述
  • C++入门教程(10):for 语句
  • java 多线程基础, 我觉得还是有必要看看的
  • js对象的深浅拷贝
  • js面向对象
  • linux安装openssl、swoole等扩展的具体步骤
  • Magento 1.x 中文订单打印乱码
  • node和express搭建代理服务器(源码)
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQLServer之创建数据库快照
  • Webpack 4 学习01(基础配置)
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 容器服务kubernetes弹性伸缩高级用法
  • 算法-图和图算法
  • 小而合理的前端理论:rscss和rsjs
  • 【干货分享】dos命令大全
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • #{}和${}的区别是什么 -- java面试
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (备忘)Java Map 遍历
  • (笔试题)分解质因式
  • (二)windows配置JDK环境
  • (万字长文)Spring的核心知识尽揽其中
  • (一)80c52学习之旅-起始篇
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)LINQ之路
  • (转)人的集合论——移山之道
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 版本不支持的问题
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net wcf memory gates checking failed
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?