CSM快速匹配与多分辨率匹配代码实现

0. 简介

CSM在Cartographer中是比较基础且非常适合拓展的功能。他主要的步骤如下图。

主要实现的步骤为:

1)获取先验位姿,通过TF获取里程计的值,作为当前scan的预测位姿,将这个预测位姿当做扫描匹配的先验。

2)使用滑动窗口法来生成局部地图;Karto使用了一个队列保存最近24米范围内的所有雷达数据,通过将滑动窗口内的所有雷达数据写成分辨率为0.01m的栅格地图,这样就生成了局部地图。

3)通过暴力求解的方式,遍历一定范围内所有的平移与旋转的位姿,选出得分最大的一个位姿。(扫描匹配)加速方式:

4)生成角度查找表,实现暴力求解内部的两个循环(对于xˆ和yˆ)只是转换查询点。
5)多分辨率概率查询表,先粗匹配计算位置协方差,输出坐标均值,再次进行精匹配,计算角度协方差。

1. CSM原理

帧间匹配可以理解成一个:已知 x i − 1 x_{i-1} xi1 m m m,也测量到了 u u u z i z_i zi ,如何尽可能准确的求出 x i x_i xi。即: p ( x i ∣ x i − 1 , u , m , z i ) p(x_i|x_{i-1},u,m,z_i) p(xixi1,u,m,zi)

应用高斯分布, p ( x i ∣ x i − 1 , u , m , z i ) = p ( z ∣ x i , m ) p ( x i ∣ x i − 1 , u ) p(x_i|x_{i-1},u,m,z_i)=p(z|x_i,m) p(x_i|x_{i-1},u) p(xixi1,u,m,zi)=p(zxi,m)p(xixi1,u) 。其中 p ( x i ∣ x i − 1 , u ) p(x_i|x_{i-1},u) p(xixi1,u)是我们熟悉的运动模型, p ( z ∣ x i , m ) p(z|x_i,m) p(zxi,m) 是观测模型。前者容易求解;后者的计算是一个难题,容易陷入局部最优解。
  假设:第 i i i次观测 Z i Z_i Zi中的各个激光点(以 z i k z_i^k zik表示)位置的概率分布是彼此独立的,则:

对上述公式两侧取对数,让乘法变加法,我们有:

公式(3)是我们的观测模型,我们通过下面的思路对其进行求解:

  • 根据 前面的观测 m m m(或若干帧)建立出来的概率栅格地图!

  • 按照位姿 x i x_i xi把当前观测 z i z_i zi投影到 m m m中,把所有被击中的栅格的概率值相加,就是在栅格地图的基础上,公式(3) 的求解。 所得的即是位姿的得分,代表着在这个位姿下,当前观测 与已知环境 相一致的程度(i.e., 相关性)。得分越高,表明这个位姿越靠谱。

通过上面的介绍,我们可以总结出CSM的主要思想:
  CSM帧匹配算法基于概率栅格地图运行,每个栅格都维护一个对数形式的占据概率;对于新进来的激光scan,将scan中所有点通过一个预估位姿投影到栅格地图上,这样每个激光点都会落到一个栅格中,激光点所在栅格的对数概率值之和既为当前位姿的得分,代表着这个位姿的可信度。但是预估位姿是不准确的,我们在预估位姿附近建立一个搜索空间,通过分支定界策略加速搜索,求出得分最高的备选位姿,作为最优结果输出 。

2. CSM代码实现

这里实现了一种扫描匹配算法,用于比较两个点云并找到它们之间的最佳平移和旋转。首先,它使用给定的点云和分辨率创建一个LookupTable,并对每个点赋值,然后通过高斯模糊和归一化来处理。接着,它根据高分辨率从高分辨率LookupTable生成新的低分辨率LookupTable。然后,根据给定的旋转矩阵旋转点云,并计算一组点云在某个平移和旋转情况下与目标网格的得分。接下来,它预计算可能的平移和旋转范围,保存在一个低分辨率的概率列表中。最后,它根据高分辨率网格进行平移和旋转搜索,以获取最佳匹配的得分和转换信息。

这段代码的核心思想是利用不同分辨率的LookupTable和预计算的概率列表来寻找最佳的平移和旋转,以实现点云的匹配。通过预先处理和优化计算,能够在保证匹配精度的同时提高匹配速度。另外,代码中还实现了计算匹配的精度或不确定性矩阵的功能,以及计算多个点云与目标点云的比较结果,统计每组匹配的条件数和比例的功能。

…详情请参照古月居

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

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

相关文章

力扣力扣力:动态规划入门(1)

相信大家在第一次学动态规划的时候都是一脸懵逼的,在看了很多题解之后,陷入到了空的“最优子结构”等的大词上,依旧看不懂动态规划到底在干什么。今天我们也是老样子再一次的从零开始学习与讲解,俺也是从零开始学动态规划&#xf…

私域流量时代下的新型商业模式:以开源链动 2 + 1 模式、AI 智能名片、S2B2C 商城小程序源码为例

摘要:本文探讨了私域流量时代的特点及其对商业盈利模式的影响。通过分析从大众消费时代到私域流量时代的转型,阐述了商品到“人”的变化过程。同时,深入研究了开源链动 2 1 模式、AI 智能名片和 S2B2C 商城小程序源码在私域流量发展中的作用…

多模态交互智能体全面解析:定义、架构、学习机制、系统实现、分类、应用场景及评估方法

多模态AI系统很可能会成为我们日常生活中无处不在的存在。使这些系统更具交互性的一种有希望的方法是将它们作为物理和虚拟环境中的智能体。目前,系统利用现有的基础模型作为创建具身智能体的基本构建块。将智能体嵌入这些环境中,有助于模型处理和解释视…

助眠白噪音视频素材哪里找?这些平台帮你快速找到放松素材

在现代社会,信息的轰炸让人们的生活节奏变得越来越快,很多人晚上都在床上辗转反侧,难以入眠。如果你也遇到这样的困扰,想要寻找助眠的白噪音视频素材,那么今天介绍的这些网站将会是你的福音!它们提供高质量…

一年四起供应链投毒事件的幕后黑手

前言 2017年,黑客入侵Avast服务器,在CCleaner更新中植入恶意代码,被数百万用户下载。 2017年,M.E.Doc遭黑客攻击,篡改更新植入NotPetya,影响全球公司。 2020年,黑客入侵SolarWinds服务器&…

Qt信号和槽-->day04

Qt信号和槽 标准的信号和槽函数Qt中的槽函数Qt中的信号 connect案例 自定义信号和槽案例分析 信号槽的拓展信号连接信号案例 信号槽的两种连接方式Qt5中的处理方式Qt4中的处理方式Qt5处理信号槽重载问题案例 lambda表达式简单案例Qt中的应用 补充知识点 标准的信号和槽函数 QW…

【超级详细】基于Zynq FPGA对雷龙SD NAND的测试

目录 一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 一、SD NAND特征 1.1 SD卡简介 雷龙的SD NAND有很多型号,在测试中使用的是CSNP4GCR01-AMW与CSNP32GCR01-AOW。芯片是基于NAND FLASH和 SD控制器实现的…

linux物理内存管理:node,zone,page

一、总览 对于物理内存内存,linux对内存的组织逻辑从上到下依次是:node,zone,page,这些page是根据buddy分配算法组织的,看下面两张图: 上面的概念做下简单的介绍: Node&#xff1a…

STM32-Flash闪存

目录 一、简介 1、闪存模块组织 2、FLASh基本结构 3、FLash写入和读取操作 4、编程流程 5、选项字节格式 6、选项字节编程步骤 二、读写芯片内部FLASH编程 三、器件电子签名 1、简介 2、编程实现 一、简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节…

数据结构之带头双向循环链表

前言:前面我们实现了顺序表和单链表,这次来实现一个结构更复杂的链表-----带头双向循环链表。不要被它的名字吓到哦,只是结构复杂而已,它的结构更有利于代码的实现。 1 双向循环链表的介绍 有了单链表的基础,要实现这…

10个最常用的Python包,程序员必备!

世界上有超过200,000个Python程序包(这只是基于官方的Python程序包索引PyPI托管的程序包)。 这就引出了一个问题:拥有这么多的软件包,每个Python程序员都需要学习哪些软件包是最重要的? 为了帮助回答这个问题&#x…

线上问题的排查-java死锁问题如何排查

这里写目录标题 1.java死锁如何排查2.具体步骤1.1识别死锁现象1.2收集线程转储1.3分析线程转储1.4代码审查1.5重现问题1.6使用调试工具1.7.优化和验证 3. 解决方案总结 1.java死锁如何排查 在Java应用程序中,死锁是一个经典的并发问题,它会导致线程永久阻…

shodan(4-5)

以下笔记学习来自B站泷羽Sec: B站泷羽Sec 1. 查看自己的出口IP 可以知晓自己是哪个IP连接的公网 shodan myip2. 指定标题搜索 http.title:内容搜索被挂黑页的网页:获得标题中含有hacked by的IP shodan search --limit 10 --fields ip_str,port htt…

三种风格截然不同的实验室工控界面

三种风格截然不同的实验室工控界面各具特色。一种可能是简洁现代风,以简洁的线条、纯净的色彩和直观的图标,呈现出高效与专业。 另一种或许是科技未来风,运用炫酷的光影效果和立体感十足的设计,展现实验室的前沿科技感。 还有一…

Redis如何保证数据不丢失(可靠性)

本文主要以学习为主,详细参考:微信公众平台 Redis 保证数据不丢失的主要手段有两个: 持久化 多机部署 我们分别来看它们两的具体实现细节。 1.Redis 持久化 持久化是指将数据从内存中存储到持久化存储介质中(如硬盘&#xf…

STM32F405RGT6单片机原理图、PCB免费分享

大学时机创比赛时画的板子,比到一半因为疫情回家,无后续,,,已打板验证过,使用stm32f405rgt6做主控 下载文件资源如下 原理图文件 pcb文件 外壳模型文件 stm32f405例程 功能 以下功能全部验证通过 4路…

“穿梭于容器之间:C++ STL迭代器的艺术之旅”

引言: 迭代器(Iterator)是C STL(标准模板库)中非常重要的一部分,它提供了一种统一的方式来遍历容器中的元素。无论容器是数组、链表、树还是其他数据结构,迭代器都能够以一致的方式访问这些数据…

jmeter常用配置元件介绍总结之用linux服务器压测

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测,由于是没有界面的,因此我们可以先在界面上把压测脚本写好: 如图:我这里简单的写…

Ubuntu 的 ROS 操作系统安装与测试

引言 机器人操作系统(ROS, Robot Operating System)是一个用于开发机器人应用的开源框架,它提供了一系列功能丰富的库和工具,能够帮助开发者构建和控制机器人。 当前,ROS1的最新版本为Noetic Ninjemys,专为…

计算机组成原理——编码与纠错(汉明编码)

校验码放在2^x次方的位置——即1,2,4——将检测位按序排列p3p2p1 汉明编码从左到右数某个位置位1(位数),就表示第几组 奇偶校验 例题 纠错过程 汉明编码的最小距离是3