从零入门激光SLAM(十一)——如何求解SLAM问题

news2024/11/18 11:51:13

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激光SLAM,也方便想入门SLAM的同学和小白学习参考,相信看完会有一定的收获。如有不对的地方欢迎指出,欢迎各位大佬交流讨论,一起进步。

目录

1.做个游戏深刻理解SLAM问题

2.基于滤波的SLAM问题

2.1 贝叶斯概率

 2.2  贝叶斯滤波

 2.3  粒子滤波

 2.3  求解SLAM问题

3. 基于图优化的SLAM

3.1 图

3.2 最小二乘算法

3.3 最小二乘求解

3.4 基于图优化的SLAM框架

1.做个游戏深刻理解SLAM问题

首先我们先来玩一个游戏,猜猜我在哪?

下图选取我们学校的地图,只给你说我在学校里,那么请你猜一猜我在哪?

你应该会说,我在学校的任何一个地方,且是等概率的。

 下面我给自己规定我开始行走了,每一步是70cm,每次转身是90° ,我给你说我开始移动了,并且给你发了一张我附近环境的照片。这时你会觉得我在操场附近周围的概率很大,但学校有三个操场,你还是不知道我具体位置。

 我走了100步给你说我看到了宿舍楼在我前方,你会认为我在下图深色区域的概率比较大,但学校有三个宿舍区,你还是不知道我具体位置。

我向左走了500m,看到了体育馆我在右边,这时你可以更精确的定位到我大概的位置,因为满足这样有体育馆和宿舍区方位的路径只能是这一条。但还是一个大概的区域,不能精确定位。

 这时我又给你说,我向右转走50步到体育馆门口了,你可以更加精确的定位我在体育馆门口的某处,并且你估计出我行走的路径如下图的右下角所示。

 但是我自己本身走路是不可能走直线的,并且转向时也不能保证自己一定是90°,所以目前你估计的路径和真实我走的路径是存在差异的。但是如果我每走一步都给你精确的周围环境信息和距离,我相信你是可以很精确的估计出我的位姿变化和路径的。

好了游戏到此结束,上述的游戏证明了两点

  • 位姿估计问题靠自己的估计是不够的,就像我设定自己每一步是70cm,但不可能每一步都走70cm一点不差。
  • 位姿估计的过程似乎和概率有点关系,上述游戏从开始的整个九龙湖为可能空间到最后的几个点。

2.基于滤波的SLAM问题

2.1 贝叶斯概率

上述游戏让我们觉得位姿估计过程好像和概率有关,那么既然说到了概率问题,我们就从最常用的抛硬币问题说起,让你预测下一次正面反面的概率是多少?你会说正反,反面各0.5呗,大家都知道,没错是这样。

下面增加难度了,我让你估计一下明天股票是涨还是跌,给你整不会了,这谁知道,这要是我知道了,我就不上学炒股了。那为什么抛硬币容易估计,估计股票就难呢?这是因为股市是一个随机过程,随机过程:研究的随机变量之间不独立,由于不独立,无法做随机实验,难度较高。

随机实验需要满足3个条件:

①相同条件下,可重复进行;

②一次试验,结果不确定,但所有结果已知(比如抛硬币,要么正要么反,所有结果已知);

③试验之前,结果未知。

换句话说,你想如果你想在相同条件下做股市实验,除非时间倒流。很多跟时间有关系的都是随机过程,比较难以估计(做重复实验),例如股市、温度、位姿估计——预测问题。

那好,你不知道怎么估计了,我们看一下股市大佬是怎么估计股票涨跌的。他们会每天看各种新闻,搜寻各种各样的外界信息来判断明天股市的涨跌情况。

比如你初始估计股票涨跌的概率是各0.5,但你看到今天特斯拉刹车失灵了,那么你肯定会觉得明天特斯拉股票大概率是跌。 

 到这里你会觉得,这个估计股市的涨跌和估计位姿咋似乎有点像呢?没错,这就是贝叶斯概率,贝叶斯概率的核心思想就是先验概率根据外部观测得到后验概率。

 2.2  贝叶斯滤波

贝叶斯公式的的推导如下所示:

 为了加深理解,再举一个测温度的小例子

 这样你知道这类概率估计问题如何求解了,主体就是自己不会,就找外界信息。下面让你估计这一天的温度,你会说这有啥难的,我每一时刻都进行一次贝叶斯公式的计算,先估计一个概率,再根据外界观测修正。但你会觉得每次估计有点麻烦吧,如果我就第一次温度的先验是估计,得到后验估计,将这个后验估计当做下一时刻的先验估计以此类推,这样我整个过程不就只需要开始自己估计一次,后续都是自动的多米诺骨牌一样。太棒了同学,你自己推出了贝叶斯滤波。

 上图就是贝叶斯滤波的过程和公式,贝叶斯滤波虽然能够解决这类问题,但大多数情况下没有解析解,因为需要做无穷积分,那怎么求解呢?

 2.3  粒子滤波

粒子滤波的核心思想就是用一堆粒子来近似概率密度,从而避免无穷积分,看下图你会觉得咋和咱们的游戏越来越有种说不出来的关系。

 粒子滤波相比于贝叶斯滤波的区别是,它需要选择粒子,并且用粒子去传播的,那么如何高效的采样粒子是一个重要的问题。

下图就用咱们之前的游戏很简单的说明了一下如何选择高效的例子,初始采样,权重评估和重采样。假设游戏只让你选择81个点去猜我所在的位置,一开始你只能平均选择位置点,在我发来一张操场照片后,让你再选择81个点,你肯定会在操场周围选择。

总结一下选粒子的过程:

初始在一定区域平均选 50 个粒子
随后根据观测数据,该区域每个地点权重不同
根据权重把地点做成转盘,转动转盘 50 次重新选择 50 个粒子
进行下次迭代

 2.3  求解SLAM问题

好了,现在我们知道位姿变换问题要用到贝叶斯滤波迭代,并且引入了粒子滤波来方便求解,这下子我们终于可以求解SLAM问题了。

以惯性测量作为初始的先验估计,用激光雷达的观测信息来修正得到后验位姿,这就是最初的SLAM系统——Fast-SLAM。后续大名鼎鼎的Gmapping算法在Fast-SLAM的基础上,进行了内存爆炸优化和粒子耗散优化,具体什么操作大家搜一下,我写累了hhh。

 Gmapping是一个基于2D激光雷达使用RBPFRao-Blackwellized Particle Filters)算法完成二维栅格地图构建的SLAM算法,适用于室内小范围SLAM

优点:gmapping可以实时构建室内环境地图,在小场景计算量少,且地图精度较高,对激光雷达扫描频率要求较低。

缺点:随着环境的增大,构建地图所需的内存和计算量就会变得巨大,所以gmapping不适合大场景构图。一个直观的感受是,对于200x200米的范围,如果栅格分辨率是5cm,每个栅格占用一个字节内存,那么每个粒子携带的地图都要16M的内存,如果是100粒子就是1.6G内存。

但由于用滤波去求解永远都无法消除上述的三个红色问题,SLAM就进入了图优化时代。

3. 基于图优化的SLAM

3.1 图

首先介绍什么是图,用一个图(Graph)来表示SLAM问题,图中的节点来表示机器人的位姿,两个节点之间的边表示两个位姿的空间约束。

Graph-based SLAM:构建图,并且找到一个最优的配置(各节点的位姿),让预测与观测的误差最小。

 图优化的过程就像是织一个好看的蜘蛛网。图优化核心思想:误差不是突然来的,而是和整个过程都有关系,需要整体调整一下找到全局最优,保证总误差最小。

全局最优这个词是不是有点熟悉,这不就是我们的最小二乘算法所解决的问题吗?没错图优化SLAM的求解思想还真是用的最小二乘算法,只不过是非线性的。 

3.2 最小二乘算法

我们最早应该在高中接触过最小二乘算法,用于直线拟合。如果将每个点看成位置,曲线看成路径,这不就SLAM位姿估计了嘛。

说起来简单做起来难啊,线性的我会求解,那非线性的最小二乘问题咋求解嘞。

3.3 最小二乘求解

3.4 基于图优化的SLAM框架

总结一下基于图优化:考虑了移动载体历程中全部的位姿状态和环境观测信息,用节点和边形成的图来表示一系列的移动机器人位姿和约束,建立和维护关联数据,可独立出前端实现并行计算,是一种更为高效和普适的优化方法。一般分为扫描匹配、闭环检测、后端优化、点云地图存储。

 我自己根据理解,画了一下现在广泛使用的激光SLAM系统,如有不对请指正。

到此,你了解了SLAM的前世今生了,下一节我将针对SLAM系统的每一块进行讲解,之后再结合Lego-loam源码进行讲解。如果内容对你有用的话,请订阅本专栏吧,免费哦~

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

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

相关文章

(转载)从0开始学matlab(第9天)—第一阶段总结

1.编程实例 下面的例子将向大家介绍如何用 MATLAB 解决问题。 例1 温度转换程序 问题: 设计一个 MATLAB 程序,读取一个华氏温度的输入,输出开尔文温度。 答案: 华氏温度和开尔文温度的转换关系式可在物理学课本中找到。其关系式…

HCIP-RIP双向重发布综合实验

拓扑结构: 要求: 1、两个协议间进行多点双向重发布 2、R7的环回没有宣告在OSPF协议中,而是在后期重发布进入的 3、解决环路,所有路径选择最优,且存在备份 4、R2的环回要在RIP中宣告,R3的环回要在OSPF中宣…

如何优雅的写C#,使用Visual studio

免责声明 本人接触C#,.Net一年时间,本文内容基于我平时对于C#语法的积累,如有问题请多包涵。以下内容除了C#之外,还有Visual studio编译器相关的内容。 在使用C#的一年多里面,我发现C#的语法糖真的很不错,Visual Stu…

SaaS系统用户权限设计

SaaS系统用户权限设计 学习目标: 理解RBAC模型的基本概念及设计思路 了解SAAS-HRM中权限控制的需求及表结构分析完成组织机构的基本CRUD操作 完成用户管理的基本CRUD操作完成角色管理的基本CRUD操作 组织机构管理 需求分析 需求分析 实现企业组织结构管理&#xff0…

PCB 基础~典型的PCB设计流程,典型的PCB制造流程

典型的PCB设计流程 典型的PCB制造流程 • 从客户手中拿到Gerber, Drill以及其它PCB相关文件 • 准备PCB基片和薄片 – 铜箔的底片会被粘合在基材上 • 内层图像蚀刻 – 抗腐蚀的化学药水会涂在需要保留的铜箔上(例如走线和过孔) – 其他药水…

如何封装React无限滚动加载列表组件【含源码】

前言 由于需要考虑后端接口的性能问题,我们在请求业务数据列表的时候并不能直接请求全量数据。所以我们在请求数据时常见的方式是做分页查询。 对于前端交互而言,我们需要考虑如何优雅的让用户触发请求下一页数据的接口。常用的方法有两种:…

i春秋春季赛2023

只有两道逆向和一道misc,其他的有时间再写 wordle 不断筛有什么和没什么字母猜就行了 [6x] Guess a 5-letter word : first first [5x] Guess a 5-letter word : ideas Please enter a real English word that exists. [5x] Guess a 5-letter word : icily first…

View的基础与滑动

View的基础与滑动 1.View的基础知识 1.1View是什么 View是一种界面层的控件的一种抽象 ,我们知道的大多数控件都是直接或间接继承自View 如EditText,TextView等等 注意: EditText在compose中并没有相关控件,而是通过TextField来进行组合 Android中View本身就可以是单个控…

rt-thread启动流程(最详细教程)

资料下载 RT-Thread Simulator 例程 操作流程 将上面的仿真例程下载并解压,通过MDK打开,编译,调试,并打开串口点击运行,就可以看到如下输出了: 添加自己的 thread:在main()函数中添加即可&am…

【5.19】四、性能测试—流程

4.4 性能测试的流程 性能测试也遵循测试需求分析→测试计划制订→测试用例设计→测试执行→编写测试报告的基本过程,但在实现细节上,性能测试有单独一套流程: 1. 分析性能测试需求 在性能测试需求分析阶段,测试人员需要收集有关…

【AI Earth试玩】权限配置与openAPI调用工具库

前言 AI earth是阿里达摩院出的遥感云计算平台,我简单体验下来感觉像是GEE的python版本遥感深度学习计算平台,整体体验还是挺不错的,尤其是多分类的结果还是挺惊艳的。 平台提供工具箱和notebook两种模式,工具箱整个交互简单易用…

DJ 5-4 以太网 Ethernet

目录 一、以太网的物理拓扑结构 二、以太网物理层标准 1、以太网技术:10Base-T 和 100Base-T 2、以太网技术:1000Base 系列 3、曼彻斯特编码* 4、差分曼彻斯特编码机制* 三、以太网链路层控制技术 四、以太网的帧结构 1、前同步码 2、MAC 地址…

Spring Boot 项目【前后端分离】之后端实现加 LambdaQueryWrapper实现源码分析和手动模拟

目录 Spring Boot 项目【前后端分离】 之架子搭建 技术栈 实现功能03-创建Spring Boot 后端项目 需求分析/图解 思路分析 代码实现 1. 创建springboot_furn 项目 2. 修改pom.xml , 引入mybatis-plus 等相关依赖 3. 创建application.yml 配置port & 配置DB 连接信息…

【数据结构】KMP算法:计算next与nextval函数值(图解)

例&#xff1a;计算模式串"abaabcac"的KMP算法中next函数值 由函数定义 n e x t [ j ] { 0 , j 1 M a x { k ∣ 1 < k < j 且 " t 1 t 2 ⋅ ⋅ ⋅ t k − 1 " " t j − k 1 t j − k 2 ⋅ ⋅ ⋅ t j − 1 " } 1 , k 1 next[j]\left…

asp.net高校运动会管理系统的设计与实现

本高校运动会管理系统是针对我院当前运动会工作需要而开发的B/S模式的网络系统&#xff0c;涉及到运动会赛前的报名录入准备与分组编排、赛中的成绩处理、赛后的成绩汇总与团体总分的统计。它将是一个完整统一、技术先进、高效稳定、安全可靠的基于Internet/Intranet的高校运动…

一、Git安装(Git+TortoiseGit图形化)

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布式版本库的方式…

《计算机网络—自顶向下方法》 Wireshark实验(八):ICMP 协议分析

ICMP&#xff08;Internet Control Message Protocol&#xff09;网络控制报文协议。它是 TCP/IP 协议簇的一个子协议&#xff0c;用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户…

进程概念

目录 冯诺依曼体系结构 操作系统OS 系统调用和库函数概念 进程 task_struct内容分类 组织进程 初识fork 进程状态 Z(zombie)-僵尸进程 孤儿进程 进程优先级 环境变量 和环境变量相关的命令 环境变量的组织方式 程序地址空间 冯诺依曼体系结构 关于冯诺依曼&…

Linux 防火墙 iptables

iptables概述 Linux 系统的防火墙 &#xff1a;IP信息包过滤系统&#xff0c;它实际上由两个组件netfilter 和 iptables组成。 主要工作在网络层&#xff0c;针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上。 iptables是Linux系统防火墙的一种&#xff0c;是Ce…

SpringBoot【开发实用篇】---- 整合第三方技术(消息)

SpringBoot【开发实用篇】---- 整合第三方技术&#xff08;消息&#xff09; 消息的概念Java处理消息的标准规范JMSAMQPMQTTKafka 购物订单发送手机短信案例订单业务短息处理业务 SpringBoot整合ActiveMQ安装整合 SpringBoot整合RabbitMQ安装整合&#xff08;direct模型&#x…