一起自学SLAM算法:7.5 基于因子图的状态估计

news2024/9/27 15:18:31

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

虽然式(7-90)所示的完全SLAM系统可以用滤波方法求解,比如著名的Fast-SLAM实现框架。但是,贝叶斯网络表示下的完全SLAM系统能很方面地转换成因子图表示,这部分内容已经在7.2.4节中讨论过了。利用因子图表示完全SLAM问题,然后用最小二乘估计进行求解会更方便。这样贝叶斯网络中的最大后验估计就等效为因子图中的最小二乘估计,这种最小二乘估计常常是非线性最小二乘估计。

求解该非线性最小二乘问题的方法大致上有两种,一种方法是先对该非线性问题进行线性化近似处理,然后直接求解线性方程来得到待估计量;另一种方法并不直接求解,而是通过迭代策略,让目标函数快速下降到最值处,对应的估计量也就求出来了。常见的迭代策略有steepest descent、Gauss-Newton、Levenberg-Marquardt、Dogleg等,这些迭代策略被广泛应用在机器学习、数学、工程等领域,有大量的现成代码实现库,比如Ceres-Solver、g2o、GTSAM、iSAM等。

本节内容旨在通过对非线性最小二乘问题解法的分析,让大家理解优化方法的基础原理。经过线性化近似后直接求解非线性最小二乘,这种直接求解方法的典型实现框架Graph-SLAM将在7.7.3节中详细讨论;另一种方法是采用迭代方式间接求解,也就是所谓的优化方法,在7.7.4节所介绍的现今主流SLAM算法中大多数都基于这种优化方法。

7.5.1 非线性最小二乘估计

式(7-50)已经给出了描述SLAM问题的最小二乘形式,式中包含2种类型的约束,即运动约束和观测约束。为了更一般地进行最小二乘的讨论,这里将这2种类型的约束用统一的方式来表述,那么式(7-50)就可以改写成式(7-123)所示的形式。由于式中的函数f通常是非线性函数,所以这是一个非线性最小二乘。

 7.5.2 直接求解方法

要求解式(7-123),可以将函数f进行线性化近似,这样就能将非线性最小二乘转化成线性最小二乘,然后直求解线性方程就能得到线性最小二乘的解。可以采用泰勒展开进行线性化,泰勒展开公式如下式(7-124)所示。也就是说非线性函数f(x)x_{0}附近的局部区域取值可以用泰勒级数来近似。

在没有特别精度要求时,可以用最简单的一阶泰勒展开对式(7-123)中的非线性函数f(x_{i})进行线性化,如式(7-125)所示。其实这一线性化过程已经在7.4.2节中的扩展卡尔曼滤波中讲解过了,展开点x0_{i}一般取状态量x_{i}的均值,F_{i}是函数f(x_{i})x_{i}=x0_{i}处的一阶导数。

那么,将式(7-125)代入式(7-123),就将非线性最小二乘转化成线性最小二乘了,如式(7-126)所示[7] p20~21。其中协方差矩阵\Sigma _{i}^{-1}可以开平方后放到平方运算里面去,并将平方运算里面的式子进行整理,与变量x_{i}无关的常数项用b_{i}表示,变量x_{i}的系数用A_{i}表示。

在理想情况下,\sum_{i}^{}\left \| b_{i}-A_{i}\cdot x_{i} \right \|^{2}可以取到最小值0。而\sum_{i}^{}\left \| b_{i}-A_{i}\cdot x_{i} \right \|^{2}取0值,可以等价于求和累加的每一项b_{i}-A_{i}\cdot x_{i}都取0值,数学表达如式(7-127)所示。

 通过式(7-127)可以看出,线性最小二乘的直接求解方法,就是解Ax=b这个线性方程。大家可能最容易想到,直接对A求逆,就能解出x=A^{-1}b。实际情况,A往往为不可逆矩阵,所以不能直接求逆运算。该线性方程通常采用数值方法解算,比如Cholesky分解和QR分解。

 首先来看一下Cholesky分解求Ax=b线性方程的过程,如式(7-128)所示。先在方程两边左乘A^{T},然后利用Cholesky分解将A^TA分解成n\times n的上三角矩阵R的乘积R^TR。令新的变量y=Rx,那么就得到新的R^Ty=A^Tb线性方程,由于R是上三角方阵,其转置R^T则为下三角方阵,那么很容易从上到下依次解R^Ty=A^Tb中的线性方程而求出y。求出y之后,利用R是上三角方阵的性质,也很容易从下到上依次解Rx=y的线性方程而求出x,这样原来的Ax=b线性方程就求解出来了。

 另一种比Cholesky分解数值更精确和稳定的方法是QR分解,如式(7-129)所示。利用QR分解将A分解成矩阵Q和矩阵R的乘积,其中Q是正交矩阵(即Q^{-1}=Q^{T}),R是上三角矩阵。接着,在方程两边左乘Q^{-1}对方程化简,并利用Q^{-1}=Q^{T}就可以得到新的Rx=Q^{T}b线性方程。跟Cholesky分解中的方法一样,由于R是上三角矩阵,那么很容易从下到上解Rx=Q^{T}b线性方程而求出x,这样原来的Ax=b线性方程就求解出来了。

 7.5.3 优化方法

由于实际SLAM问题的非线性最小二乘中,很难找到合适的线性化方法,初值也比较难确定,并且代价函数的误差往往不能最小化到0值,所以上面介绍的直接求解方法很难利用在实际问题中。下面就来介绍求解非线性最小二乘最常用的方法,即优化方法。优化方法并不直接求解代价函数来得出解析形式的解,而是通过迭代的方法,按照一定的策略不断调整自变量的取值使代价函数逐渐变小,当代价函数不再下降或者下降幅度很小时迭代就完成了。接下来介绍5种流行的迭代策略,即梯度下降算法、最速下降算法、高斯-牛顿算法、列文伯格-马夸尔特算法和狗腿算法。

1.梯度下降算法

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

2.最速下降算法

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

3.高斯-牛顿算法

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

 4.列文伯格-马夸尔特算法

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

5.狗腿算法

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

7.5.4 各优化方法对比

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

 7.5.5 常用优化工具

上面介绍了这么多优化算法,其实这些算法并不需要我们亲自写代码来实现。这些迭代策略被广泛应用在机器学习、数学、工程等领域,有大量的现成代码实现库,比如Ceres-Solver、g2o、GTSAM、iSAM等。

1.图优化工具g2o

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

2.非线性优化工具Ceres-Solver

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

3.增量优化工具GTSAM

(先占个坑,有时间再来补充详细内容,大家可以直接看文后的参考文献)

参考文献

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

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

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

相关文章

字符串匹配: BF与KMP算法

文章目录一. BF算法1. 算法思想2. 代码实现二. KMP算法1. 算法思想概述2. 理解基于最长相等前后缀进行匹配3. 代码中如何实现next数组5. 代码实现6. next数组的优化一. BF算法 1. 算法思想 BF 算法, 即暴力(Brute Force)算法, 是普通的模式匹配算法, 假设现在我们面临这样一个…

24/365 java 观测线程状态 线程优先级

1.观测线程 JDK中定义的线程的六个状态 &#xff1a; 可以用getState()来观测线程 public static void main(String[] args) throws InterruptedException {Thread thread new Thread(()->{for (int i 0; i < 10; i) {try {Thread.sleep(100);} catch (InterruptedExc…

2023适合新手的免费编曲软件FL Studio水果21中文版

水果软件即FL Studio&#xff0c;这是一款较为专业的编曲软件&#xff0c;这款软件自带高品质打击乐、钢琴、弦乐以及吉他等107种乐器效果&#xff0c;内置了包括经典电子音色、合成利器3xosc、sytrus、slicex等多种插件&#xff0c;可以帮助音乐制作人创作不同的音乐曲风&…

数据结构进阶 哈希表

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;模拟实现高阶数据结构 哈希表 哈希表 哈希桶哈希概念举例哈希冲突哈希函数哈希冲突的解决方式之一闭散列 --开放定址法哈希表的…

Python CalmAn(Calcium Imaging Analysis)神经生物学工具包安装及环境配置过程

文章目录CalmAn简介安装要求我的设备1>CalmAn压缩包解压&#xff08;caiman文件夹要改名&#xff09;2>conda创建虚拟环境3>requirements依赖包配置&#xff08;包括tensorflow&#xff09;4>caiman安装(mamba install)5>caimanmanager.py install6>PyCharm添…

51单片机独立按键

文章目录前言一、按键原理图二、代码编写三、模块化管理按键总结前言 本篇文章将带大家学习独立按键按键的基本操作。 独立按键式直接用I/O口线构成的单个按键电路&#xff0c;其特点是每个按键单独占用一根I/O口线&#xff0c;每个按键的工作不会影响其他I/O口线的状态。 一…

MongoDB学习笔记【part5】基于 MongoRepository 开发CURD

一、MongoRepository Spring Data 提供了对 mongodb 数据访问的支持&#xff0c;只需继承 MongoRepository 类&#xff0c;并按照 Spring Data 规范就可以实现对 mongodb 的操作。 SpringData 方法定义规范&#xff1a; 注意事项&#xff1a; 不能随便声明&#xff0c;必须要…

汇编语言学习笔记 下

本文承接汇编语言学习笔记 上 上篇文章记录了汇编语言寄存器&#xff0c;汇编语言基本组成部分&#xff0c;数据传送指令&#xff0c;寻址指令&#xff0c;加减法指令&#xff0c;堆栈&#xff0c;过程&#xff0c;条件处理&#xff0c;整数运算的内容 高级过程 大多数现代编程…

day24-网络编程02

1.NIO 1.1 NIO通道客户端【应用】 客户端实现步骤 打开通道指定IP和端口号写出数据释放资源 示例代码 public class NIOClient {public static void main(String[] args) throws IOException {//1.打开通道SocketChannel socketChannel SocketChannel.open();//2.指定IP和端…

你是真的“C”——2023年除夕夜 牛客网刷题经验分享~

2023年除夕夜 牛客网刷题经验分享~&#x1f60e;前言&#x1f64c;BC89 包含数字9的数 &#x1f60a;BC90 小乐乐算多少人被请家长 &#x1f60a;BC91 水仙花数 &#x1f60a;BC92 变种水仙花 &#x1f60a;BC93 公务员面试 &#x1f60a;总结撒花&#x1f49e;&#x1f60e;博…

Android Studio 支持安卓手机投屏

有时当我们在线上做技术分享或者功能演示时&#xff0c;希望共享连接中的手机屏幕&#xff0c;此时我们会求助 ApowerMirror&#xff0c;LetsView&#xff0c;Vysor&#xff0c;Scrcpy 等工具。如果你是一个 Android Developer&#xff0c;那么现在你有了更好的选择。 Android…

Day59| 503. 下一个更大元素 II | 42. 接雨水 --三种方法:1.双指针 2.动态规划 3.单调栈

503. 下一个更大元素 II注意点&#xff1a;初始化了2倍的题目中的nums.size()&#xff0c;最后直接/2即可分清逻辑nums[i] > nums[st.top()]的时候&#xff0c;才进行st.pop()操作class Solution { public:vector<int> nextGreaterElements(vector<int>& nu…

STM32——独立看门狗

目录 看门狗产生背景 看门狗的作用 STM32 独立看门狗 独立看门狗特点 &#xff08;IWDG&#xff09; 独立看门狗常用寄存器 独立看门狗超时时间计算 独立看门狗工作原理 独立看门狗操作库函数 看门狗产生背景 当单片机的工作受到来自外界电磁场的干扰&#xff0c;造…

bert-bilstm-crf提升NER模型效果的方法

1.统一训练监控指标和评估指标评估一个模型的最佳指标是在实体级别计算它的F1值&#xff0c;而不是token级别计算它的的准确率&#xff09;。自定义一个f1值的训练监控指标传给回调函数PreliminaryTP&#xff1a;实际为P&#xff0c;预测为PTN&#xff1a;实际为N&#xff0c;预…

【Java IO流】缓冲流及原理详解

文章目录前言字节缓冲流原理字符缓冲流Java编程基础教程系列前言 前面我们已经学习了四种对文件数据操作的基本流&#xff0c;字节输入流&#xff0c;字节输出流&#xff0c;字符输入流&#xff0c;字符输出流。为了提高其数据的读写效率&#xff0c;Java中又定义了四种缓冲流…

LwIP系列--内存管理(堆内存)详解

一、目的小型嵌入式系统中的内存资源&#xff08;SRAM&#xff09;一般都比较有限&#xff0c;LwIP的运行平台一般都是资源受限的MCU。基于此为了能够更加高效的运行&#xff0c;LwIP设计了基于内存池、内存堆的内存管理以及在处理数据包时的pbuf数据结构。本篇的主要目的是介绍…

Ubuntu22.10安装和配置R/FSL/Freesurfer

2018年购入的台式机&#xff0c;一直处于吃灰状态&#xff0c;决定安装Ubuntu方便学习和使用一些基于Linux系统的软件。本文记录相关软件的安装和配置。>安装Ubuntu22.10<到官网下载ISO文件。将一个闲置U盘通过Rufus制作为安装盘。重启按F11设置引导盘&#xff0c;选择U盘…

国家实用新型发明专利:一种机器视觉的流水线智能检测报警系统

国家实用新型发明专利&#xff1a;一种机器视觉的流水线智能检测报警系统 【系统装置设计图】 文章目录国家实用新型发明专利&#xff1a;一种机器视觉的流水线智能检测报警系统【说明书摘要】【权利要求书】【说明书】***技术领域******背景技术******发明内容******有益效果…

C++类和对象(上): 封装与this指针

目录 一.前言 二. 类的引入和定义 1.C和C结构体的区别 2.C类的定义 3.类的成员方法的声明和定义是可分离的 三.面向对象之封装特性 1.封装思想的介绍 2.类封装编程模式的优点 四. 类实例(对象)的内存模型 五.this指针 章节导图&#xff1a; 一.前言 面向过程和面向对…

分享167个PHP源码,总有一款适合您

PHP源码 分享167个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 167个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1fzoQ4_4VXc1e1ZHOUKuhbQ?pwdsb6s 提取码&#x…