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

2023-05-16

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


写在前面

第1章-ROS入门必备知识

第2章-C++编程范式

第3章-OpenCV图像处理

第4章-机器人传感器

第5章-机器人主机

第6章-机器人底盘

第7章-SLAM中的数学基础

        7.1 SLAM发展简史

        7.2 SLAM中的概率理论

        7.3 估计理论

        7.4 基于贝叶斯网络的状态估计

        7.5 基于因子图的状态估计

        7.6 SFM、BA和SLAM比较

        7.7 典型SLAM算法

第8章-激光SLAM系统

第9章-视觉SLAM系统

第10章-其他SLAM系统

第11章-自主导航中的数学基础

第12章-典型自主导航系统

第13章-机器人SLAM导航综合实战


虽然式(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

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

源码仓库

  • Github下载:github.com/xiihoo/Books_Robot_SLAM_Navigation

  • Gitee下载(国内访问速度快):gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation

参考文献

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • FlinkSQL CDC实现同步oracle数据到mysql

    环境准备 1 flink 1 13 0 2 oracle 11g 3 flink connector oracle cdc 2 1 0 1 oracle环境配置 首先需要安装oracle环境 xff0c 参考 https blog csdn
  • MySQL窗口函数OVER()

    下面的讲解将基于这个employee2表 mysql gt SELECT FROM employee2 43 43 43 43 43 43 id name age salary dept id 43 43 43 43 43 43 3 小肖
  • ubuntu安装mysql详细过程

    1 安装mysql server sudo apt install mysql server 2 登录 sudo mysql u root p 两点要注意 添加sudo password中 任意密码都能登录 3 修改登录密码 ALTER U
  • 修改docker容器端口映射的方法

    大家都知道docker run可以指定端口映射 xff0c 但是容器一旦生成 xff0c 就没有一个命令可以直接修改 通常间接的办法是 xff0c 保存镜像 xff0c 再创建一个新的容器 xff0c 在创建时指定新的端口映射 有没有办法不
  • 【操作系统入门到成神系列 五】CPU 是如何执行任务的

    作者简介 xff1a 大家好 xff0c 我是 xff0c 独角兽企业的Java开发工程师 xff0c Java领域新星创作者 个人公众号 xff1a xff08 回复 技术书籍 可获千本电子书籍 xff09 系列专栏 xff1a Java
  • 群晖docker镜像源更换为阿里云镜像源

    群晖硬件 xff1a DS218 43 系统版本 xff1a DSM 7 0 41890 docker版本 xff1a 20 10 3 1233 前言 xff1a 除了群晖自带的应用之外 xff0c docker里也拥有及其丰富的软件 xf
  • 学好Windows编程要看的书籍

    本文是接着前面的学好C 43 43 要阅读的书籍而写的 xff0c 如果想了解C 43 43 的学习的话请先看学好C 43 43 要阅读的书籍 xff1a http blog csdn net a809146548 article deta
  • Git分支与标签(干货!!!)

    目录 一 Git分支 分支的概念 xff1a 分支的类别 xff1a 分支策略 xff1a 分支命令 xff1a git操作之pull拉取远程指定分支以及push推送到远程指定分支 xff1a 1 pull操作 2 push操作 二 Tag
  • 单片机结构及一些寄存器

    SCM 将通用微计算机基本功能部件集成在一块芯片上构成的一种专用微计算机系统 SCM 61 CPU 43 OSC 43 ROM 43 RAM 43 T C 43 INT 43 BEC 43 I O 43 UART CPU 中央处理器 OSC
  • Git Gui

    目录 1 什么是Git Gui 2 什么是ssh key 3 git github生成密钥并通过 第一步 xff1a 本地电脑配置 1 配置用户名和邮箱 xff08 如果已经配置 xff0c 就跳过 xff09 2 检查下自己之前有没有已经
  • 韦东山百问网freeRTOS教程

    欢迎阅读韦东山百问网freeRTOS教程 xff01 韦东山百问网freeRTOS教程 文档 100ask net
  • 金三银四跳槽季,Linux面试题放送

    进入金三银四 xff0c 很多小伙伴有被动跳槽的打算 xff0c 所以更新一些Linux面试题 xff0c 希望能帮到大家 xff01 一 你之前在公司使用linux命令做什么 我们公司之前测试系统搭建在linux上 xff0c 使用lin
  • 【软件测试】简历中的项目经历可以怎么写?

    工作这10多年来 xff0c 也经常做招聘的工作 xff0c 面试过的人超过50人次了 xff0c 而看过的候选人的简历则有几百份了 xff0c 但是清晰且能突出重点的简历 xff0c 确实很少遇到 这里基本可以说明一个问题 xff0c 很
  • 一名高级的Javaer,应该了解的 MYSQL 高级知识点

    SQL查询流程 1 通过客户端 服务器通信协议与 MySQL 建立连接2 查询缓存 xff0c 这是 MySQL 的一个可优化查询的地方 xff0c 如果开启了 Query Cache 且在查询缓存过程中查 询到完全相同的 SQL 语句 x
  • 激光slam基础入门笔记2——位姿表示与变换矩阵

    前言 xff1a 初步了解位置与位姿 xff1a 参考链接 xff1a 机器人学 1 0 位置与姿态概述 已注销 的博客 CSDN博客 位置和姿态 二维空间位姿表示与变换矩阵推导 xff1a 参考链接 xff1a 机器人学 1 1 二维空间
  • 【githubgirl】自主导航无人机的硬件组成与搭建方案

    不久前 xff0c 浙江大学 FASTLAB 实验室 xff0c 在 GitHub 上开源了一套自主导航无人机的硬件组成与搭建方案 xff1a Fast Drone 250 该项目可应用于无人机在未知环境中的自主飞行 xff0c 集群飞行等
  • React路由传参的几种方式

    react路由传值有三种方式 xff1a 1 props params 方法 xff0c 该方法可以传递一个或多个值 xff0c 但是每个值的类型都是字符串 xff0c 没法传递一个对象 xff1b 2 query方法 xff0c 该方法类
  • 文章五:Python 网络爬虫实战:使用 Beautiful Soup 和 Requests 抓取网页数据

    一 简介 本篇文章将介绍如何使用 Python 编写一个简单的网络爬虫 xff0c 从网页中提取有用的数据 我们将通过以下几个部分展开本文的内容 xff1a 网络爬虫的基本概念Beautiful Soup 和 Requests 库简介选择一
  • 无人机目标检测:使用YOLOv4在VisDrone数据集上进行目标检测任务

    在本篇博客中 我们将探讨如何使用YOLOv4在VisDrone数据集上进行无人机目标检测任务 目标检测是计算机视觉中的一个重要任务 可以用于自动驾驶汽车 无人机监测和视频分析等多种应用 YOLOv4是一种实时目标检测算法 以其速度和准确性而
  • rospy的publisher和init_node

    文章目录 1 xff0c class Publiser xff08 发布者 xff09 2 rospy init node 初始化节点 1 xff0c class Publiser xff08 发布者 xff09 废话不多说 xff0c 先

随机推荐

  • ros功能包

    使用ROS的功能包使用以下常见的机器视觉应用 1 xff09 摄像头标定 xff1a 摄像头本身存在光学畸变 xff0c 可以使用camera calibration功能包实现双目和单目摄像头的标定 2 xff09 基于opencv的人脸识
  • 如何彻底关闭Win10自动更新,Win10永久关闭自动更新的方法

    如何彻底关闭Win10自动更新 xff1f Win10自动更新的问题是很多用户都遇到的问题 xff0c 很多时候我们关闭了自动更新 xff0c 过一段时间系统又自动更新了 xff0c 由于win10自动更新非常顽固 xff0c 所以我们要从
  • 函数模板及库函数

    函数模板 xff08 function template xff09 是一个独立于类型的函数 xff0c 可作为一种模式 xff0c 产生函数的特定类型版本 使用函数模板可以设计通用型的函数 xff0c 这些函数与类型无关并且只在需要时自动
  • Vmware虚拟机Ubuntu的ssh远程登陆--笔记

    SSH远程登录 apt更新网路更新ssh配置了解的部分 SecureCRTPortable登陆 apt更新 版本号 xff1a Ubuntu 16 04 环境 xff1a Vmware 17 2 网路 首先 xff0c 先检查网络是否畅通
  • Docker的常用命令

    一 Docker中几个重要的概念 镜像 和容器 是docker中两个非常重要的 概念 镜像 xff08 Image xff09 xff1a Docker 将应用程序及其所需的依赖 函数库 环境 配置等文件打包在一起 xff0c 称为镜像 容
  • Linux-C语言编写-UDP服务器客户端通信流程简介(代码)

    目录 一 xff0c 服务器 1 创建数据报套接字 2 填充结构体 3 绑定服务器的ip和端口 4 接收来自客户端的消息 recvfrom 5 关闭套接字 6 详细代码 二 xff0c 客户端 1 创建数据报套接字 2 填充结构体 xff0
  • C++三阶贝塞尔曲线

    文章目录 1 贝塞尔曲线2 示意图3 c 43 43 代码实现 1 贝塞尔曲线 贝塞尔曲线阶数等于控制点个数n 1将控制点首尾相连并且取每段连线上一点P xff0c 再将每个线段上的P点连接设第一个控制点为P1 xff0c 第二个为P2 x
  • Ubuntu 图达通激光雷达可视化/获取点云

    文章目录 0 ILA 平台网页预览1 Ubuntu的安装2 安装Ubuntu对应版本ros3 激光雷达接线4 解压SDK文件5 启动ros可视化点云6 录制点云7 播放录制文件8 rosbag文件 gt pcd文件 0 ILA 平台网页预览
  • Python的while循环

    目录 一 计数器 二 while循环使用 三 不同循环的使用环境判断 xff1a 四 while循环使用break和continue 五 while的嵌套使用 一 计数器 计数器 xff0c 是一个叫法 xff0c 代表的是一个功能 用于记
  • 字符串结束符

    在C语言中 xff0c 存储一个字符串通常用一个char 数组 在C语言中 xff0c 为了方便存储 xff0c 要求在最后一个字符的后面存储一个0 xff08 一个字节 xff09 这个0称为 字符串结束符 xff0c 常用 0 表示 在
  • 一起自学SLAM算法:1.1 ROS简介

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.2 ROS开发环境搭建

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 戴尔电脑恢复系统后,D盘被加密Bitlocker,要求输入48位密钥,才能打开D盘---解决过程

    一 前言 今天DELL电脑恢复系统后 xff0c D盘被加密 xff08 D盘图标上有一把黄色的锁 xff09 xff0c 鼠标双击准备打开D盘 xff0c 提示了一个密钥ID xff0c 让输入48位码解密 xff0c 被microsof
  • 一起自学SLAM算法:1.4 ROS调试工具

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.5 ROS节点通信

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:3.4 图像特征点提取

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 3 1 认识图像数据 3 2 图像滤波 3 3 图像变换 3 4 图像特
  • 一起自学SLAM算法:第4章-机器人传感器

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 4 1 惯性测量单元 4 2 激光雷达 4 3 相
  • 一起自学SLAM算法:5.4 ARM主机Jetson-tx2

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 5 1 X86与ARM主机对比
  • 一起自学SLAM算法:6.1 底盘运动学模型

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 6 1 底
  • 一起自学SLAM算法:7.5 基于因子图的状态估计

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S