一起自学SLAM算法:7.7 典型SLAM算法

news2024/11/16 1:28:02

连载文章,长期更新,欢迎关注:

针对式(7-38)所述的在线SLAM系统,以扩展卡尔曼滤波(EKF)为代表的滤波方法,是求解该状态估计问题最典型的方法,在7.4节中已经详细讨论了这些滤波方法的基础原理,而基于滤波方法基础原理的两种典型实现框架EKF-SLAM和Fast-SLAM将在下面进行详细讨论。虽然式(7-39)所示的完全SLAM系统可以用滤波方法求解,比如著名的Fast-SLAM实现框架。但是,贝叶斯网络表示下的完全SLAM系统能很方面地转换成因子图表示,这部分内容已经在7.2.4节中讨论过了。利用因子图表示完全SLAM问题,然后用最小二乘估计进行求解会更方便。

针对式(7-39)所述的完全SLAM系统,优化方法是求解该状态估计问题最典型的方法。这部分内容,首先将贝叶斯网络表示的SLAM问题转化到因子图表示。这样贝叶斯网络中的最大后验估计就等效为因子图中的最小二乘估计,这种最小二乘估计常常是非线性最小二乘估计。在7.5节中已经介绍了这种非线性最小二乘估计的求解方法,一种方法是经过线性化近似后直接求解,这种直接求解方法的典型实现框架Graph-SLAM将在下面进行详细讨论;另一种方法是采用迭代方式间接求解,也就是所谓的优化方法,现今主流SLAM算法中大多数都基于这种优化方法。

按照在线SLAM还是完全SLAM,贝叶斯网络表示还是最小二乘表示,SLAM框架可以用表7-4来分类。

表7-4  SLAM框架分类

在线SLAM系统

完全SLAM系统

贝叶斯网络表示

EKF滤波

EKF-SLAM

粒子滤波

Fast-SLAM

最小二乘表示

直接法

Graph-SLAM

优化法

现今主流SLAM

7.7.1 EKF-SLAM

在7.4节中介绍滤波法的基本原理时,为了方便讨论,只考虑了估计机器人位姿状态x_{k}这个最简单的情况,如式(7-88)所示。现在来讨论在线SLAM系统中同时估计机器人位姿状态x_{k}和路标m=\left \{ m_{1},m_{2},...,m_{L} \right \}的情况,如式(7-89)所示。求解在线SLAM问题,使用最早也最经典的方法就是基于EKF滤波方法,相应的实现框架就是EKF-SLAM[3] p306~318。

使用EKF滤波方法求解式(7-89)所示的在线SLAM问题,首先就是将估计问题的后验概率用高斯分布参数化表示,如式(7-169)所示。

其实,就是将待估计量x_{k}m=\left \{ m_{1},m_{2},...,m_{L} \right \}用一个新的状态向量s_{k}来集中表示。考虑新的状态估计量s_{k},那么机器人的运动和观测方程可以改写成式(7-170)和(7-171)所示形式。

 其中r_{k}为运动过程携带的高斯噪声,协方差矩阵记为R_{k}=\begin{bmatrix} {R_{k}}' & 0\\ 0 & 0 \end{bmatrix}q_{k}为观测过程携带的高斯噪声,协方差矩阵记为Q_{k}

这些变量定义好后,就可以直接拿式(7-116)所示EKF的5个核心公式进行滤波了。下面把这5个核心公式搬出来,如式(7-172),便于大家阅读。这就是EKF-SLAM框架的滤波实现过程,滤波器的输入是当前运动与观测量(u_{k}z_{k})和前一时刻的状态分布(\mu _{k-1}\Sigma _{k-1}),滤波器的输出是当前时刻的状态分布(\mu _{k}\Sigma _{k})。可以看到滤波方法是一种增量求解方法,只需要输入新量测信息u_{k}z_{k}就能完成对SLAM状态量的求解,也就是所谓的在线SLAM系统。

7.7.2 Fast-SLAM

以EKF-SLAM为代表的在线SLAM系统,其EKF滤波方法是一种增量求解方法,只需要输入新量测信息u_{k}z_{k}就能完成对SLAM状态量的求解,这种增量求解方法具有很大优势。但是EKF-SLAM也有两个明显的缺点,一方面,其将所估计后验分布假设成高斯分布,非线性高斯系统必须被线性化近似成线性高斯系统,这种简单粗暴的线性化近似容易引起较大误差;另一方面,状态量s_{k}的协方差矩阵\Sigma _{k}的复杂度随路标数量是二次方增长,即O(L^{2})复杂度,也就是说其无法建立大规模地图。为了解决线性化和构建大规模地图的问题,大家开始放弃EKF-SLAM这种在线SLAM增量求解的好处,转向完全SLAM系统的研究,如式(7-173)所示。

完全SLAM系统的一个方向仍然是基于贝叶斯的滤波方法,将EKF参数滤波换成非参数化的粒子滤波,这样就不用处理EKF中的非线性高斯系统线性化近似的问题了,并且还可以处理非线性非高斯系统这种更一般的情况。但是,如果每个状态用c个粒子点表示其后验分布情况,那么表示所有状态的后验分布所需要的粒子点复杂度就是O(c^{k+L})。其中RBPF(Rao-Blackwellization Particle Filter)这种改进版的粒子滤波,能将粒子点复杂度降低到O(c^{k})。RBPF的思路是将SLAM问题中的机器人轨迹估计和路标估计分离开来,如式(7-174)所示,轨迹估计其实就是定位问题,采用粒子滤波来实现;在每个粒子点确定的一条机器人轨迹上,都可以用EKF来估计对应的路标,其实就是建图问题,采用EKF来实现。基于RPBF有很多具体的SLAM实现框架,Fast-SLAM就属于其中一种实现[3] p318~333。

完全SLAM系统的另一个方向是基于最小二乘的方法,贝叶斯网络表示转化到了图结构表示,利用图结构中的约束关系构建非线性最小二乘,如式(7-175)所示,最后利用直接法或者迭代优化法求解该最小二乘。最小二乘法解决了EKF-SLAM中不能建立大规模地图的问题,因为最小二乘法只是将系统收集到的所有时刻信息构建成一个方程,求解该方程或者迭代求解,利用方程的稀疏性等特点很好求解,求解复杂度受建图规模的影响没那么大。

完全SLAM系统的另一个方向是基于最小二乘的方法,贝叶斯网络表示转化到了图结构表示,利用图结构中的约束关系构建非线性最小二乘,如式(7-175)所示,最后利用直接法或者迭代优化法求解该最小二乘。最小二乘法解决了EKF-SLAM中不能建立大规模地图的问题,因为最小二乘法只是将系统收集到的所有时刻信息构建成一个方程,求解该方程或者迭代求解,利用方程的稀疏性等特点很好求解,求解复杂度受建图规模的影响没那么大。

7.7.3 Graph-SLAM

现在讨论基于最小二乘的完全SLAM系统,其直接求解方法的典型实现框架是Graph-SLAM。从滤波法的最大后验推导出最小二乘表示,如式(7-50)所示。然后利用一阶泰勒展开将式(7-50)中的运动和观测函数线性化,就得到了式(7-126)所示的形式。在7.5.2节中已经介绍了求解式(7-126)所示线性方程的方法,就是采用Cholesky分解和QR分解对线性方程中的信息矩阵进行数值分解,间接性解线性方程。在Graph-SLAM中,解法也是类似的,只不过换了种说法,即所谓的信息滤波。

在Graph-SLAM中的信息滤波中,首先将式(7-126)所示线性方程替换成信息参数\Omega\xi表示,关于信息参数与矩参数的关系,如式(7-100)所示。然后,该最小二乘的求解方式就转换成信息滤波过程了。可以看到Graph-SLAM中求解最小二乘的过程,是一种解析过程,即信息参数的预测和更新,也就是所谓的直接法。关于Graph-SLAM中信息滤波的具体过程,可以参考文献[4] p353~362中的内容,不要求大家掌握。

7.7.4 现今主流SLAM算法

虽然EKF-SLAM、Fast-SLAM和Graph-SLAM是最经典的几个SLAM框架,也囊括了SLAM的几个主要研究方向,但是只在学术上还会被提起,工程应用上已经不会使用这些框架了。工程应用中,现今主流SLAM算法大多是基于最小二乘的迭代优化求解,也就是所谓的优化方法。下面就介绍一些工程中常用的SLAM框架,如图7-39所示,当然其中也有一些不是优化方法的算法,只是列出来方便对比学习。

 图7-39  现今主流SLAM算法

参考文献

【1】 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

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

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

相关文章

GY-US42超声波传感器模块介绍

GY-US42超声波传感器模块简介GY-US42 是一款低成本高品质测距传感器模块。工作电压 3-5v,功耗小,体积小,安装方便。其工作原理是,探头发射超声波,照射到被测物体后,探头接收返回声波,利用时间差…

学人工智能电脑主机八大件配置选择指南

来源:深度之眼 作者:frank 编辑:学姐 本篇主要是帮助大家构建高性能、高性价比的AI开发的硬件平台。如何不把钱浪费到不必要的硬件上,并合理搭配硬件配置节省预算是本文想要去讨论的问题。如果预算充足,笔者建议购买一…

【JavaSE专栏1】Java的介绍、特点和历史

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

Python ·保险理赔分析:数据分析

介绍 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 在本笔记本中,我们将仔细研究保险索赔,并弄清一些有关血压、BMI、糖尿病、吸烟、年龄和性别等条件如何影响索赔价值的事实。 我们将使用散点图、饼图、直…

IDEA必装插件-Gyro

前言用SpringBootTest运行单测的时候,是不是每运行都需要重新启动Spring容器?大型应用启动一次会浪费大量的时间,导致效率比较低。Gyro插件可以解决你的问题。Gyro介绍它是一个IDEA插件,安装之后,用Gyro Debug运行你的…

一起自学SLAM算法:7.4 基于贝叶斯网络的状态估计

连载文章,长期更新,欢迎关注: 在7.2.4节中,讨论了表示机器人观测与运动之间依赖关系的概率图模型,主要是贝叶斯网络(实际应用在机器人中的是动态贝叶斯网络)和马尔可夫网络(实际应用…

fpga实操训练(lcd字符显示)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 用fpga编写屏幕显示,和c语言编写有很大的不同。用c语言开发,很大程度上是遵循soc ip提供的规范进行编写。而用fpga开发的话,则需要考虑不同信号的时序关系。但是,用fpga开发也有…

c++ 优先级队列priority_queue的使用

c priority_queue是对其他容器元素顺序的调整包装; 堆的原理 1.定义 priority_queue<Type, Container, Functional> q; 其中&#xff0c;Type是数据类型&#xff0c;Container是低层容器&#xff0c;如vector, stack, deque等. Functional是比较函数&#xff1b;默认可…

day25-类加载器反射

1.类加载器 1.1类加载器【理解】 作用 负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 1.2类加载的过程【理解】 类加载时机 创建类的实例&#xff08;对象&#xff09;调用类的类方法访问类或者接口的类变量&#xff0c;或者为该类变量赋值使用反…

NodeJS 之 HTTP 模块(实现一个基本的 HTTP 服务器)

NodeJS 之 HTTP 模块&#xff08;实现一个基本的 HTTP 服务器&#xff09;参考描述HTTP 模块搭建 HTTP 服务器http.createServer()监听检测服务器端口是否被占用终端Error Code超时处理处理客户端的请求request 事件http.IncomingMessagehttp.ServerResponse中文乱码问题问题解…

Java EE之线程编(进阶版)

这些锁策略能适用于很多中语言&#xff0c;博主是学Java的&#xff0c;所以下面的代码会用Java去写&#xff0c;请大家见谅&#xff0c;但是处理的方法是大差不差的。 一、常见锁和锁策略&#xff1a; (一)、乐观锁和悲观锁 1、何为乐观锁和悲观锁呢&#xff1f; 答&#…

Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

Linux服务器常见运维性能测试&#xff08;3&#xff09;CPU测试常见性能测试软件CPU测试&#xff1a;super_pi &#xff08;计算圆周率&#xff09;CPU测试&#xff1a;sysbench&#xff08;CPU功能测试部分&#xff09;下载安装sysbench综合测试功能执行CPU测试最近需要测试一…

Java面试题含答案,最新面试题(1)

Java 中 InvokeDynamic指令是干什么的&#xff1f; JVM字节码指令集一直比较稳定&#xff0c;一直到Java7中才增加了一个InvokeDynamic 指令&#xff0c;这是JAVA为了实现『动态类型语言』支持而做的一种改进&#xff1b;但是在Java7中并没有提供直接生成InvokeDynamic 指令的…

自定义类型:结构体,枚举,联合

目录一、结构体内存对齐二、位段2.1 什么是位段2.2 位段内存分配规则2.3 位段的跨平台问题三、枚举四、联合体4.1 联合类型的定义4.2联合的特点4.3 联合大小的计算4.4 练习一、结构体内存对齐 struct s {char c1;int i;char c2; }; int main() {printf("%d\n", size…

【Hadoop】HDFS体系结构分析

文章目录1. NameNode2. Secondary NameNode3. DataNodeHDFS主要包含NameNode、Secondary NameNode和DataNode三部分&#xff0c;且这三部分在分布式文件系统中分属不同的机器&#xff0c;其中Secondary NameNode不是必须的&#xff0c;在HA架构中Standby NameNode可以替代它。 …

【深度学习】详解 SimCLR

目录 摘要 一、引言 二、方法 2.1 The Contrastive Learning Framework 2.2. Training with Large Batch Size 2.3. Evaluation Protocol 三、用于对比表示学习的数据增广 3.1 Composition of data augmentation operations is crucial for learning good representa…

5-2中央处理器-指令周期的数据流

文章目录一.指令周期二.数据流向1.取指周期2.间址周期3.执行周期4.中断周期三.指令执行方案1.单指令周期2.多指令周期3.流水线方案一.指令周期 指令周期&#xff1a;CPU从主存中每取出并执行一条指令所需的全部时间。 此处&#xff1a;取指周期取指令指令译码 指令周期常用若…

SSM整合(Spring + SpringMVC + MyBatis)

SSM Spring SpringMVC MyBatis 准备数据库 SET FOREIGN_KEY_CHECKS0; DROP TABLE IF EXISTS user; CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(20) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,real_name varchar(…

Linux常用命令——startx命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) startx 用来启动X Window 补充说明 startx命令用来启动X Window&#xff0c;实际上启动X Window的程序为xinit。 语法 startx(参数)参数 客户端及选项&#xff1a;X客户端及选项&#xff1b;服务器及选项&a…

[LeetCode周赛复盘] 第 329 场周赛20230122

[LeetCode周赛复盘] 第 329 场周赛20230122 一、本周周赛总结二、 [Easy] 6296. 交替数字和1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6297. 根据第 K 场考试的分数排序1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6298. 执行逐位运算使字符串相等1. 题目描述2. 思路…