SLAM因子图构建笔记

2023-05-16

因子图简介

  最近在读了Joan Sola所写的Course on SLAM中有关因子图部分的介绍后,发现其中有关于因子图构建的思路觉得很有意思,因此在这里记录一下。

DBN网络

  首先简单地介绍一下如何将一个SLAM问题建立成为一个DBN(Dynamic Bayes Network 动态贝叶斯网络)。DBN是一种统计模型,它可以用一个有向无环图来表示随机变量以及它们之间的依赖关系。它们之间的条件依赖可以用用箭头表示。比如 B ⟶ A B\longrightarrow A BA代表A在B条件下的概率,无环则表示不会出现诸如A依赖于B,B依赖于C,C又依赖于A的情况。在SLAM问题中,我们有四种类型的随机变量:
43266.png)
其中运动模型表示为:
x i = f i ( x i − 1 , u i ) + w i x_i=f_i(x_{i-1},u_i)+w_i xi=fi(xi1,ui)+wi用子图表示 x i x_i xi在给定 x i − 1 x_{i-1} xi1以及 u i u_i ui时的条件概率即为:
在这里插入图片描述
同样,测量模型可以表示为:
z k = h k ( x i , m ) + v k z_k=h_k(x_i,m)+v_k zk=hk(xi,m)+vk用子图表示为:
在这里插入图片描述
m表示传感器对周围环境的测量值,在SLAM问题中经常表示为路标点的位置(landmark),因此在传感器姿态为 x i x_i xi时测量得到的路标点 l j l_j lj的测量模型为: z k = h k ( x i , l j ) + v k z_k=h_k(x_i,l_j)+v_k zk=hk(xi,lj)+vk此时子图可以表示为:
在这里插入图片描述
将所有的子图聚合在一起可以得到完成的DBN网络:
在这里插入图片描述
此时所有随机变量的联合概率写为:
P ( X , L , U , Z ) ∝ P ( X 0 ) ∏ i = 1 M P ( x i ∣ x i − 1 , u i ) ∏ k = 1 K P ( z k ∣ x i k , l j k ) P(X,L,U,Z)\propto P(X_0)\prod_{i=1}^{M}P(x_i|x_{i-1},u_i)\prod_{k=1}^{K}P(z_k|x_{i_k},l_{j_k}) P(X,L,U,Z)P(X0)i=1MP(xixi1,ui)k=1KP(zkxik,ljk)其中 P ( x 0 ) P(x_0) P(x0)表示初始时的先验概率,我们最终要优化的目标函数和状态量是:
{ X ∗ , L ∗ } = arg ⁡ max ⁡ X , L P ( X 0 ) ∏ i = 1 M P ( x i ∣ x i − 1 , u i ) ∏ k = 1 K P ( z k ∣ x i k , l j k ) \{X^*,L^*\}=\arg\max_{X,L} P(X_0)\prod_{i=1}^{M}P(x_i|x_{i-1},u_i)\prod_{k=1}^{K}P(z_k|x_{i_k},l_{j_k}) {X,L}=argX,LmaxP(X0)i=1MP(xixi1,ui)k=1KP(zkxik,ljk)

SLAM转化为因子图

  联合概率问题可以转化表示成 M + K M+K M+K个因子组成的图,每一个因子由测量值(可以是控制量 U U U也可以是观察量 Z Z Z)产生,并且连接在不同的节点(位姿或者路标点或者两者都有)两端。所以一个因子图通常由两个节点组成:变量节点(variable)该节点由我们需要求解的变量组成,比如位姿或者路标点的位置,以及因子(factor),表示两个节点之间的约束关系。

在这里插入图片描述
已知运动和测量模型为:
在这里插入图片描述
因此每一个因子的条件概率写为:
在这里插入图片描述
我们可以将上边的条件概率(i.e factor)表示为更加紧凑的形式,令:
e k ( x i k − 1 , x i k ) = f i k ( x i k − 1 , u i k ) − x i k (1) e_k(x_{{i_k}-1},x_{i_k})=f_{i_k}(x_{{i_k}-1},u_{i_k})-x_{i_k}\tag{1} ek(xik1,xik)=fik(xik1,uik)xik(1)
e k ( x i k , l j k ) = h k ( x i k , l j k ) − z k (2) e_k(x_{i_k},l_{j_k})=h_k(x_{i_k},l_{j_k})-z_k\tag{2} ek(xik,ljk)=hk(xik,ljk)zk(2)
此时所有的因子可以写成一个统一的形式:
ϕ k = exp ⁡ ( − 1 2 e k ⊤ Ω k e k ) \phi_k=\exp(-\frac{1}{2}e_k^\top\Omega_ke_k) ϕk=exp(21ekΩkek)
这表明,只要我们可以从第k个测量值与状态量 i k i_k ik j k j_k jk里边计算得到误差项 e k e_k ek
e k ( x i k , x j k , z k ) e_k(x_{i_k},x_{j_k},z_k) ek(xik,xjk,zk)
那么该测量值具体是控制变量 U U U还是传感器的测量值 L L L就不重要了,换句话说,控制变量 U U U和测量值 L L L都可以作为测量值 Z Z Z构建因子。 K K K个测量值就有 K K K个因子。(注:这里的 K K K和上边表示路标点数量的 K K K我猜测应该不是一个 K K K,这里的 K K K表示控制变量和路标点数量的总和,而上边的K仅表示路标点的数量)
  现在我们的待估计量为:
x = [ x 1 , . . . , x N ] ⊤ \mathbf{x}=[\mathbf{x}_1,...,\mathbf{x}_N]^{\top} x=[x1,...,xN]
x i = { X i , L i } , i ∈ 1 , 2 , . . . , N \mathbf{x}_i=\{X_i,L_i\},i\in1,2,...,N xi={Xi,Li},i1,2,...,N
测量值为:
z = [ z 1 , . . . , z K ] ⊤ \mathbf{z}=[\mathbf{z}_1,...,\mathbf{z}_K]^{\top} z=[z1,...,zK]
z j = { U j , Z j } , j ∈ 1 , 2 , . . . , K \mathbf{z}_j=\{U_j,Z_j\},j\in1,2,...,K zj={Uj,Zj},j1,2,...,K
此时的联合概率为:
P ( x , z ) ∝ ∏ i = 1 K ϕ k ∝ ∏ i = 1 K exp ⁡ ( − 1 2 e k ⊤ Ω k e k ) P(\mathbf{x},\mathbf{z})\propto\prod_{i=1}^{K}\phi_k\propto\prod_{i=1}^{K}\exp(-\frac{1}{2}\mathbf{e}_k^{\top}\mathbf{\Omega}_k\mathbf{e}_k) P(x,z)i=1Kϕki=1Kexp(21ekΩkek)
对该联合概率取负对数可以将 exp ⁡ ( ⋅ ) \exp(·) exp()消掉,得到:
x o p t = arg max ⁡ x ∑ k = 1 K e k ( x i , x j ) ⊤ Ω k e k ( x i , x j ) \mathbf{x}_{opt}=\argmax_{\mathbf{x}}\sum_{k=1}^{K}\mathbf{e}_k(\mathbf{x}_i,\mathbf{x}_j)^\top\mathbf{\Omega}_k\mathbf{e}_k(\mathbf{x}_i,\mathbf{x}_j) xopt=xargmaxk=1Kek(xi,xj)Ωkek(xi,xj)

有关于运动误差因子的构建技巧

从上边的推导中,当给定我们一个运动向量 u i \mathbf{u}_i ui,我们可以利用运动模型构建运动误差为:
e = f ( x i − 1 , u i ) − x i \mathbf{e}=f(\mathbf{x}_{i-1},\mathbf{u}_{i})-\mathbf{x}_i e=f(xi1,ui)xi但是这样构建误差是有一个前提假设的,那就是高斯噪声 w i \mathbf{w}_i wi在函数 f ( ⋅ ) f(·) f()之外。即:
x i = f x ( x i − 1 , u i ) + w i , w i ∼ N ( 0 , Ω ) (3) \mathbf{x}_i=f_x(\mathbf{x}_{i-1},\mathbf{u}_i)+\mathbf{w}_i,\mathbf{w}_i\sim\mathcal{N}(0,\mathbf{\Omega})\tag{3} xi=fx(xi1,ui)+wi,wiN(0,Ω)(3)
但是显示情况中,我们更常见的却是如下的运动模型:
x i = f x ( x i − 1 , u i − w i ) , w i ∼ N ( 0 , Ω ) (4) \mathbf{x}_i=f_x(\mathbf{x}_{i-1},\mathbf{u}_i-\mathbf{w}_i),\mathbf{w}_i\sim\mathcal{N}(0,\mathbf{\Omega})\tag{4} xi=fx(xi1,uiwi),wiN(0,Ω)(4)在这种情况下,我们常常做的是通过 f ( ⋅ ) f(·) f()关于 w i \mathbf{w}_i wi J a c o b i a n Jacobian Jacobian将原函数线性化,即:
x i ≈ f x ( x i − 1 , u i ) + ∂ f ∂ w w i (5) \mathbf{x}_i\approx f_x(\mathbf{x}_{i-1},\mathbf{u}_i)+ \frac{\partial f}{\partial \mathbf{w}} \mathbf{w}_i\tag{5} xifx(xi1,ui)+wfwi(5)
但是这样做非常容易发生由于 J a c o b i a n Jacobian Jacobian不满秩而导致的协方差矩阵 Ω \mathbf{\Omega} Ω为奇异矩阵的错误(无法求逆),为了解决这个问题,我们通常避免 J a c o b i a n Jacobian Jacobian的计算,即可以将误差项表示为如下的形式:
u i = f − 1 ( x i , x i − 1 ) + w i \mathbf{u}_i=f^{-1}(\mathbf{x}_i,\mathbf{x}_{i-1})+\mathbf{w}_i ui=f1(xi,xi1)+wi
e = f − 1 ( x i , x i − 1 ) − u i \mathbf{e}=f^{-1}(\mathbf{x}_i,\mathbf{x}_{i-1})-\mathbf{u}_i e=f1(xi,xi1)ui
该形式和之前测量值的误差表达式形式一致:
e = h ( x i , l j ) − z \mathbf{e}=h(\mathbf{x}_{i},\mathbf{l}_{j})-\mathbf{z} e=h(xi,lj)z
但是在一些特殊的传感器上(比如IMU), f − 1 ( ⋅ ) f^{-1}(·) f1()可能不那么容易求得,此时我们就需要将测量值通过一个函数变形为: z = z ( u ) \mathbf{z}=z(\mathbf{u}) z=z(u),此时由控制变量得到的测量值写为:
z i = g ( x i , x i − 1 ) + w i \mathbf{z}_i=g(\mathbf{x}_i,\mathbf{x}_{i-1})+\mathbf{w}_i zi=g(xi,xi1)+wi
误差项变为:
e = g ( x i , x i − 1 ) − z i \mathbf{e}=g(\mathbf{x}_i,\mathbf{x}_{i-1})-\mathbf{z}_i e=g(xi,xi1)zi
由于IMU的测量值有6个自由度,因此导致 f ( ⋅ ) f(·) f()的非线性效应十分严重,逆函数不容易求出,一个解决方法就是利用观测的差值,即先将IMU的读数进行数次预积分,以降低 f ( ⋅ ) f(·) f()的维度,这样 f ( ⋅ ) f(·) f()的逆函数就比较容易求得了。

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

SLAM因子图构建笔记 的相关文章

  • FreeRTOS快速笔记——信号量

    信号量的阻塞时间 单位是系统的节拍周期configTICK RATE HZ 为100 xff0c 则系统节拍时钟周期为10ms xff0c 设置0就是不等待 xff0c 设置1 无限就是按时钟节拍算时间 xff0c 设置portMAX DE
  • Python获取Excel中超链接并下载至本地

    在这一任务的处理中 xff0c 我是用的是 xlrd模块 xff0c 它是用来读取Excel表格数据的模块 特别注意 xff1a 高版本的xlrd目前去除了对xlsx格式的支持 xff0c 仅支持 xls格式 xlrd biffh XLRD
  • MATLAB:梯度下降法求解一元和多元函数极小值和极大值

    梯度下降法 xff0c 顾名思义即通过梯度下降的方法 对于一个函数而言 xff0c 梯度是一个向量 xff0c 方向是表示函数值增长最快的方向 xff0c 而大小则表示该方向的导数 下面展示了用梯度下降法求解一元函数的MATLAB代码 xf
  • 根据Qfont中的family 得到字体文件的路径和文件名称

    转载 xff1a https www zhihu com question 25834024 根据Qfont中的family 得到字体文件的路径和文件名称 xff1b 源码 xff1a 头文件 include include include
  • 如何修改DirectUIHWND类里控件的数据

    有成功修改SysTlistView32 SysTreeVier32 ListVier32 Static类的方法 但对VISTA系统的DirectUIHWND类 没有好的办法 恳请高人指教
  • Jeston-TX2和小觅智能魔方安装tensorflow和keras

    1 下载TensorFlow离线文件 根据自己的JetPack版本在下面链接中选择对应的tensorflow 链接为tensorflow下载链接 如图所示 2 使用pip安装TensorFlow xff0c 如果是Python2用pip2
  • 2023python自动化抢单茅台

    2023python自动化下单抢茅台 xff08 小白篇 xff09 提前声明 本人实测一周 xff0c 均以失败告终 网络超时 当前人数过多等等原因 人格担保程序没有问题 xff0c 毕竟天底下那有这么好的事 最终结果不是重要的 xff0
  • [React] 核心属性refs—— 需要注意的问题

    官网链接 xff1a Refs and the DOM React 1 避免使用字符串的ref 什么是字符串的ref lt button ref 61 34 test 34 gt lt button gt ref所赋予的值是一个字符串 官方
  • AIDL-JNI-HIDL

    Android项目开发经常会遇到各种概念性的技术 AIDL xff08 Android Interface definition language xff09 Android中的一种IPC xff08 Inter Process Commu
  • Android Verified Boot

    Android Verified Boot 验证程序用来保护用户使用软件在设备上运行的完整性 它通常从设备固件的只读部分开始 xff0c 该部分加载代码并仅在密码验证代码是真实的且没有任何已知的安全缺陷之后执行 AVB是经过验证的引导的一种
  • Android快速编译镜像

    make bootimage 编译bootimagemake vendorimage编译 vendorimagemake dtboimagedtbo ninja快速编译系统 xff08 前提是编译部分的Android mk没有改变 xff0
  • nuttx-概述

    早期基于MSP430系列 STM32系列 EFM32系列 AT91SAM9X imx6ul系列做各种物联网产品 xff0c 近几年国芯片慢慢崛起 xff0c 加上ST芯片价格暴涨 xff0c 更是让国产芯片赢得了难得的发展机会 xff0c
  • nuttx-环境搭建

    尽管nuttx主要遵循Posix 和 ANSI 标准 xff0c 但是毕竟向下支持到了STM32F1系列的芯片 xff08 不带MMU xff09 xff0c 所以这个操作系统本质上还是一个微操作系统 下面从helloworld开始 官网
  • nuttx-第一个app demo

    应用开发 xff0c 与ucos freeRTOS等完全不一样 xff0c 看起来更像是linux的方式 xff0c os与app独立开发 xff0c 但是从单片机不具备MMU这一点就能判断出来 xff0c 假的就是假的 xff0c 即便是
  • nuttx-app的编译和执行原理

    首先阅读apps readme md Built In Applications NuttX also supports applications that can be started using a name string In thi
  • 如何远程登录ubuntu图形界面

    Server u need XDM service client u need exceed xwin32 Here is an instruction I found long time ago when I played with it
  • 网络操作系统 第十三章 邮件服务器及其安装与配置

    1 简述电子邮件的工作原理 用户编辑的E mail被转换成一个标准的邮件格式 xff0c 包括各种样式的文件 xff0c 如图像 声音 可执行程序等 邮件的内 容以各种编码方式转换成ASCII码的形式 xff0c 邮件的接收人地址由 用户名
  • nuttx-OS启动前的准备工作

    程序的基本编译过程为 xff1a 预处理 编译成汇编语言 汇编成机器指令 链接成可执行文件 xff0c 链接依赖于链接脚本 xff0c 使用链接脚本来进行更复杂的地址设置 xff0c 包括了代码段 xff0c 数据段 xff0c bss段等
  • linux线程调度方式测试总结

    总结 xff1a 对三种线程调度方式进行测试 1 SCHED OTHER 分时调度策略 xff0c 为默认方式 xff0c 凡是采用本模式的线程 xff0c 线程优先级会强制为0 xff0c 通俗点将 xff0c 工作在本模式下的线程 xf
  • 网络小白入门之路之以太网链路聚合 ---尚文网络奎哥

    随着业务的发展和园区网络规模的不断扩大 xff0c 用户对于网络的带宽 可靠性要求越来越高 传统解决方案通过升级设备方式提高网络带宽 xff0c 同时通过部署冗余链路并辅以STP xff08 Spanning Tree Protocol x

随机推荐

  • libGL error: MESA-LOADER: failed to open swrast libGL error: failed to load driver: swrast X Error o

    在ubuntu22 04 运行代码 出现这个错误 xff0c 显卡驱动正常 xff0c 并且cuda也能调 xff0c 目前还不知道怎么处理 后续 查了很多资料 xff0c 有些说是环境没配好 xff0c 有些说是显卡驱动与内核版本不一致
  • SDN(一) 用OpenWRT将路由器刷成openflow交换机

    1 引言 积跬步以至千里 xff0c 积怠情以至深渊 xff0c 我要做一个踏实的ABCer 没想到还是正式步入了SDN这条康庄大道上 一切还需从初识Mininet WIFI说起 xff0c 以为SDN如仿真层面那般 xff0c 一个模块对
  • 树莓派(二) 树莓派开启VNC远程连接服务

    1 启用树莓派 VNC 服务 在树莓派命令行终端执行如下命令 xff1a sudo raspi span class token operator span config 出现如下界面 xff1a 依次操作 xff1a Interfacin
  • 自己操作SMT贴片过程 BGA QFN封装

    提前准备 xff1a 1 钢网 xff08 如果有bga 尽量选择0 01mm的厚度吧 xff09 2 锡膏 xff08 如果过期了 xff0c 可以找个空板 xff0c 加点锡膏过一次回流焊测一下导通性 xff09 3 固定台 xff08
  • Linux系统Ubuntu终端用命令编辑一文件并保存

    1 首先进入到该文件所在的目录下 xff0c 比如我要找learn test1 file txt这个文件 xff1a ls表示查看该目录下的所有文件 2 查看该文件的内容 xff0c 使用命令cat file txt xff0c 如下可看到
  • 异常与中断

    异常比中断的优先级高 xff0c 中断可以屏蔽 xff0c 但异常是一定要去处理的 1 undefined instruction CPU遇到了不认识的指令 xff0c 则会进入未定义指令异常处理函数 xff0c 因为CPU不认识该指令 x
  • 大学老师告诉我:20年内程序员会被取代,未来不需要程序员...

    今天收到一个同学的邮件 xff0c 他告诉我 xff0c 他们的大学计算机老师告诉他 xff0c 以后机器人可以自动生成代码 xff0c 估计20年 xff0c 程序员就会被取代 所以他现在感觉很苦恼 xff0c 既然会被淘汰 xff0c
  • MySQL 主从复制

    新建主服务器容器实例3307 span class token function docker span run p span class token number 3307 span 3306 name mysql master span
  • 盘点strlen()、sizeof()、length()、size()的区别

    目录 序言 1 总览 2 用法 2 1 sizeof 2 2 strlen 3 length 和size 序言 项目中经常用到这些用于计算大小的函数 或运算符 xff0c 网上也有许多关于其间区别的文章介绍 xff0c 在此按自己的思路整理
  • Android:知识体系结构

    刚开始接触android xff0c 学习之初 xff0c 各种迷茫阿 xff0c 网上看到了这个知识结构体系的图 xff0c 觉得很有用 xff0c 在此备份一下 xff0c 或许以后的某一天我成了android大神 xff08 PS x
  • android studio导入一个已存在的项目

    在使用android studio导入一个已经存在的项目之前 xff08 xff01 xff01 xff01 记住是导入之前 xff09 xff0c 需要做三件事 xff1a 1 xff0c 查看项目的gradle wrapper grad
  • 从内部类中访问本地变量temp; 需要被声明为最终类型

    class Outer 定义外部类 private String info 61 34 hello world 34 定义外部类的私有属性 public void fun final int temp 定义外部类的方法 class Inne
  • Android学习笔记 ---- 四大组件之 Activity

    1 Activity的概念与Activity的生命周期图 xff1a Activity是一个应用程序的组件 xff0c 他在屏幕上提供了一个区域 xff0c 允许用户在上面做一些交互性的操作 xff0c 比如打电话 xff0c 照相 xff
  • Docker ubuntn 使用apt-get update报错

    在docker 容器中执行apt get update有时候会报错 xff0c 当然造成错误的原因有很多情况 xff0c 具体情况具体分析 xff0c APT Hash sum mismatch错误的常见解决方法总结这篇博客写的不错 xff
  • npm安装报错 rollbackFailedOptional verb npm-session 解决办法

    该问题一般情况是因为代理问题 xff0c npm代理和git代理都要设置 首先确认网络是否需要设置代理 如果是公司网络需要设置代理 xff0c 则设置npm代理和git代理 1 设置npm代理 1npm config set proxy a
  • Docker 安装C#编译环境

    Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 xff0c 然后发布到任何流行的 Linux或Windows操作系统的机器上 xff0c 也可以实现虚拟化 本文主要介绍Docke
  • 关于句柄中带命名空间对实际程序运行中的影响

    ROS头文件 include lt ros ros h gt 自定义msg产生的头文件 include lt topic demo gps h gt int main int argc char argv 用于解析ROS参数 xff0c 第
  • 部署Redis集群

    部署Redis集群 span class token comment 创建网卡 span span class token function docker span network create redis subnet span clas
  • ROS编译出现generate_messages() must be called after add_message_files()错误

    新人小白 xff0c 刚刚开始学ROS 编译出现这个错误 xff0c 搞了好久也没找到这个问题 xff0c 后来偶然发现了问题所在 CMake Error at opt ros kinetic share genmsg cmake genm
  • SLAM因子图构建笔记

    因子图简介 最近在读了Joan Sola所写的Course on SLAM中有关因子图部分的介绍后 xff0c 发现其中有关于因子图构建的思路觉得很有意思 xff0c 因此在这里记录一下 DBN网络 首先简单地介绍一下如何将一个SLAM问题