卡尔曼滤波器和优化的本质理解

2023-05-16

非线性最小二乘优化中,最重要的是那个雅克比矩阵。每一行对应一个观察两,里面的值代表要减少这个观察量的误差,其他被优化的量需要做的改变。而每一列就是这个观察量需要怎么变才能减少不同的观察量。对于一个优化量,对有的观察量需要增加值,有的需要减少。那到底是要减少还是增加呢?就把所有观察量对应的变化求个平均,得到这个迭代优化量的跟新值。

如果所有观察对应的更新量都是一致的,说明观察量质量高,反之亦然。

换个角度想,即使只有一行,我们仍然可以算出一个跟新量。所以我们有两个选择,一个是用所有观察量结算出一个更新量,还是每次用一个观察算出一个更新量,跟新变量,再用第二个观察量算出一个更新量,然后。。。这两种方式就是全局优化和滤波器的本质不同。

而滤波器为什么很在意不确定度,因为不确定度给出了两次观察的重要性的比值。就还比求均值,我们是把所有东西加一起了,除以个数。还是每次先把一个值除以一个系数再累加上去。当你用第一种方法的时候,你不关系某个数据对最终的结果的总要性。

============================

假设我们有两个未知量想要知道他们的值。最直接的方法是找到两个和这两个未知量相关的方程,求解方程组就能得到他们的值。

但如果我们只能得到一个方程呢?也许你会说这个问题无解。但是换个角度想,虽然只有一个方程,但也不没有好,至少我们还是多了一些关于这两个位置量的信息。

很多情况下,我们不能一下得到足够的关于所有未知量的方程,但随着时间的推进,我们能不断地得到越来越多的方程(信息)。再往后面,我们不仅能得到足够的信息,还能得到更多的信息。所以我们想要有一种方法能够在信息不足的时候,尽可能的缩小对位置量的不确定性(未知量可能的取值范围),在信息有余的时候,还能不断的优化对未知量的判断。甚至在位置量发生变化的时候,我们还能通过新的信息来跟新未知量。这就是卡尔曼滤波的背景理解了。

一次使用绝对足够,甚至多余的方程来求解的方法就是优化发。而不断的融合新的信息的方法就会滤波法。

假设我们有x,y两个未知量。

有关于他们的两个方程:

  • x+2y=0
  • x-y=1

我们可以得出x=2/3,y=-1/3

但如果我们在第一个时刻只知道x+2y=0这个信息呢?虽然不能求出x,y的具体值,但是我们大概知道x,y的一个关系。画在一个二维的空间中,就是一条直线。如果我们还对这个关系不太确定,这条线就会变成一个带状物。

换个说法,一开始我们对x,y一无所知。所以这个x,y组成的二维空间上,任何一点都是有可能的。当我们得到第一条消息x+2y=0后,我们对x,y的不确定度缩小到那个带状区域了。当又收到x-y=1这个消息的时候,我们对x,y的不确定度缩小到一个点状物。如果还有更多的消息来,这个不确定度区域还能不断缩小。

基于这个理解还可以思考下无偏估计的原理:我们希望这些消息对应的不确定区域都是有一个共同重叠区的,这样才能对真值有越来越稳定的估计,随着获得的信息越来越多。

再举一个计算机视觉的例子。假设摄像头只观测到一个空间位置已知的点,我们没法只用这一个点确定摄像机的位置。但是我们对摄像机未知的不确定度,已经从之前的6d空间均匀分布,缩小到一个用高斯分布表示的区域。这个区域由相机pose这个随机变量的均值和方差同时决定。但我们观察到越来越多的点后,pose的不确定区域也会越来越小。但有一点很重要,方差和均值同时确定了pose的可能取值。这也是为什么对于滤波法,我们一般只需要把协方差的初值取得足够大就行了。

这里还有一点需要注意:如果我们想要增量的融合信息,我们必须知道未知量的协方差,不然我们没有办法去融合新的信息。但最终有用的信息只有均值。这也是为什么对于一次性使用所有信息进行的优化法,就不需要关注最终结果的协方差了,虽然这个协方差是存在,也能求出来。

再来想想卡尔曼滤波器的场景:一开始我们对相机pose一无所知,当进行了第一次观察后,pose的不确定区域有所缩小。然后通过一次运动方程变换。pose的总体不确定区域虽然没有变小,但是形状和位置发生了变化。然后再进行一次观察,不确定区域又缩小一些。就这样我们对pose的变化规律越来越确定。但因为每次观察和运动都会带来额外的不确定度(加噪音)。所以最终观察带来的不确定性减少和额外的不确定性增加达到平衡状态。

还可以换一种理解角度。假设不同时刻的pose都是不同的随机变量。但和第一个pose不同,在我们用观察值来跟新这个pose的时候,他就已经有一个先验的概率分布了,而不是一无所知。而这个先验概率正好是由上一个时刻的pose通过运动方程推算过来的。这样就是卡尔曼滤波的问题划分为多个最普通的高斯概率合并的问题。(这里不是边缘化,后面会讲区别)

y=a*x+n中,x和y都是变量,没有不确定度一说,而不是随机变量。而这个式子代表的事y和x的一个联合概率分布。只是一个联合随机变量的两种不同表示。而n其实是p(y|x),大概是这个意思,不太严格。

obs=a*x中,x和obs都有自己的不确定度。代表随机变量的变换。

b-a*x~n,只有x是变量,这个表示的是X这个随机变量满足的方程

卡尔曼滤波问题中:运动方程其实属于第二种意义,从一个随机变量变换到另外一个随机变量,再加上一个随机变量。

观察方程 其实属于第二种意义,观察值是已知的,我们需要求能让观察值概率最大的那个x的值。

而融合不是讲把一个随机变量变换为另一个随机变量,而是把一个随机变量的两种分布相乘,得到这个随机变量的第三种分布。上面三种表达都和融合无关。

所以他们讲的不同的东西,不用强行把他们联系在一起。运动方程通过原理2得到一个关于x的分布,观察方程通过原理3得到关于x的另外一个分布。然后通过融合x的这两种分布,得到x的第三种分布。为什么要用相乘的方式来融合呢?因为两个分布同时发生的概率分布就是这两个分布的乘积。

关于这里提到的一个随机变量的不同分布可以这样理解:不同分布其实对应的还是不同的随机变量,这是这两个随机变量的取值一模一样,然后问他们同时取相同值得概率分布是什么。而上面原理2的两个随机变量的取值可以是完全不同的,就算相同,要说他们取相同值的概率也是么有太大意义的。

滤波法和优化法的等价理解

这两个方法都在解决的问题是:如果一个随机变量的概率分布可以用一个自变量x来表示。求x取值为什么的时候,能够让概率最大。这本来就是个优化问题,优化法直接进行求解。而滤波法是把x和一个正太分布之间用一个变换矩阵联系起来。先求变换矩阵的表示,然后由变换矩阵反推x的分布。最后取出平均值。这样做的前提是x也是正态分布,才能用一个矩阵来表示变换。优化法没有这个限制。当x不是高斯分布的时候,只有对这个变换进行线性展开,这里就出现了误差。所以当x不是正太分布的时候,两者就出现了差异。

另外当目标分布是标准正太分布的时候,优化法中的模就是普通的二次模而不是协方差的模。但一般来说观察的误差值之间都是独立同分布的,其实就是标准正太分布了。

在EKF中,虽然我们总把pose看做一个正态分布。但是旋转或者通过观察得到的pose都不再是正态分布。所以这里每个时刻的pose的正太分布表示都是近似表示。

总结一下就是:让误差最小的那个普通变量x的取值对应让概率函数取最大的那个随机变量x的取值。这里的的概率分布是指随机变量x通过一定变换后(包含了求误差的变换)得到的那个正太分布的概率分布。而这里的误差是指普通变量x通过某个变化后和应该取得的值之间的差异。

先验概率和边缘化的理解

卡尔曼滤波和贝叶斯定律虽然都是讲概率的,而且过程都是之前和之后的关系。但严格的说卡尔曼滤波没有用到任何贝叶斯的东西。

如果硬要分析他们的相关性,贝叶斯是和融合相关的:一个随机变量x本来的分布是先验分布,然后和一个特殊条件下的条件分布融合,最后求两个分布相乘后的分布。相乘就是融合,所以说先验概率就是在做融合。这里不是上面的原理3,所以和优化没关系。

实际情况中,条件概率会有多个:t时刻的pose基于t-1, t-2等时刻的条件概率。这些概率都是通过融合(相乘)在一起,然后最终得到的那个概率分布又要满足某个概率分布,然后问里面各个变量的取值。融合后的概率分布函数通过log后。里面各个相乘的项就变成了相加的项。这也是为先验项在优化问题里面,就变成了加一个误差项。这也是为啥我们在融合不同数据的时候,能够简单的把这些误差项加起来。这个就是因子。

但是因为是不同的观察量,所以虽然是独立的,但是分布就不一样了,不同的观察量的方差不一样。所以需要在每个因子前面都要乘以一个超参系数。

如果这么看的话他们都是在做融合。但这里我们先抛开贝叶斯,因为卡尔曼滤波的整个推导并没有用到贝叶斯。所以要注意先验概率和卡尔曼滤波里的被更新前的状态没有关系,注意区分他们。

当状态只包含一个pose的时候,事情很简单。直接把前一个时刻的分布变换后给后一个时刻,再在这个基础上更新。但如果硬要使用优化法就会出现一个问题:优化法假设处理的变量是系统中所有的变量,但其实又只优化了当前帧。但明显过去的pose对当前pose肯定是有限制作用的。虽然不管历史pose,情况好也能优化出很好的结果。这就相当于滤波法里面跟新前的状态很差,但是更新非常有精确。滤波法把历史信息用起来是很自然的,但优化法就需要把历史限制作为一个误差项来利用历史信息了。这个也很好理解,卡尔曼滤波其把更新前的概率乘以更新的概率。那么更新前的概率自然就成为一个误差项了。

另外还有种做法是把状态的先验信息当做非线性优化的初值来用。这个其实是说不通的,因为如果优化很完美的话,不管初值是什么,都会达到相同的值。也就是结果和先验无关。但是因为问题的非线性性,初值的好坏对结果影响很大。而用先验来做初值不失为一个好方法。重点的差异是,这种做法并没有把先验信息加入到优化的constrain里面

马尔科夫假设

对于多个随机变量组成的联合概率密度函数(x1,x2,x3等),这里一般指不同时刻的状态变量。可以用他们之间的条件概率函数以很多不同的组合相乘表示出来。

马尔科夫假设指: p(x3,x2,x1)=p(x3|x2x1)p(x2|x1)p(x1)=>p(x3,x2,x1)=p(x3|x2)p(x2|x1)p(x1)

因为有:p(x3|x2x1)=p(x3|x2)

p(x3,x2,x1)是我们最终要求得东西,虽然我们一般只用x3,x2,x1的均值。而这个被求的东西可以分解为多个两两耦合的因子。

正是有马尔科夫假设,我们才能像卡尔曼滤波器那样把上个时刻的概率变换后直接当做当前时刻的概率。也就是x3的分布由x2唯一决定。

 

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

卡尔曼滤波器和优化的本质理解 的相关文章

  • 【环境配置】初试使用mitmproxy搭建网络代理

    初试使用mitmproxy搭建网络代理 1 参考文章 老版本的很多功能已经不能用了 xff0c 用新的版本研究了一下 参考文章 https mitmproxy org http www freebuf com sectool 76361 h
  • 关于Keil 的快速注释功能,并为其添加快捷键

    原地址 xff1a http blog sina com cn s blog 6859cadf0101i3p4 html Keil版本uVision 4 03 1 在Keil gt Edit gt Advanced中有两项 Comment
  • 【OpenCV】ArUco Marker

    1 创建 span class token keyword import span cv2 span class token keyword as span cv span class token keyword import span n
  • 非常实用,华为、新华三、锐捷交换机的配置命令分享

    干弱电这一行难免会接触到交换机 xff0c 华为 新华三锐捷交换机又是最常见的交换机 xff0c 关于他们的命令配置很容易弄混 xff0c 而且在实际项目配置中也很容易出错 xff0c 因此 xff0c 本期我们将来介绍这三家交换机的基础配
  • 打飞机小游戏

    设计目标 xff1a 高质量的代码要有这些优点 复用性好 扩展性好 维护性好 可移植性好 健壮性好 效率好 可读性好 所以设计代码的时候不要只想到功能的实现 xff0c 还要考虑功能的扩展及代码复用等 设计规则 xff1a 需求分析抽取共性
  • windows 安装 Navicat Premiun

    Navicat Premiun 中文网站 Navicat Premiun 官网下载 简介 Navicat Premium 是一套数据库管理工具 xff0c 结合其它Navicat 成员 xff0c 支持单一程序同时连接到 MySQL Mar
  • 论文排版中MathType的使用(论文投稿必备)

    使用mathtype往论文中插入公式时 xff0c 若需要编号 xff0c 则点击 右编号 xff08 若只需插入文本行内 xff0c 则点 内联 xff09 由于论文是分栏格式 xff0c 单行公式太长导致编号串行 xff0c 因此需要将
  • python语言中变量的共享引用及原处修改

    代码段一 xff1a 代码段1 gt gt gt a 61 6 gt gt gt b 61 a gt gt gt a b 输出 xff1a 6 6 上述代码段一中 xff0c 第一行我们创建了对象6 xff0c 并将变量a 与之相关联 xf
  • 通用环形缓冲区 LwRB 使用指南

    什么是 LwRB xff1f LwRB 是一个开源 通用环形缓冲区库 xff0c 为嵌入式系统进行了优化 源码点击这里 Github LwRB 特性 使用 ANSI C99 编写FIFO xff08 先进先出 xff09 无动态内存分配 x
  • Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端

    基于 TCP 的服务器端 客户端 绝大多数 TCP 服务器端都按照如下顺序调用 xff1a 在 Windows 环境下 xff0c 代码表示为 xff1a WSADATA wsaData span class token punctuati
  • 随想006:帮忙的时机

    我一直不理解发生在我身边的一个现象 从我第一次发现到现在已经几年了 xff0c 在一个又一个人身上 xff0c 不断地出现 在编程界 xff0c 重复 可能是软件中一切邪恶的根源 xff0c 我为此吃过苦头 让我记忆尤深的是 xff0c 当
  • 仿真软件 LTspice XVII 操作方法

    原理图编辑 与其它软件不同 xff0c LTspice XVII 软件先选择动作 xff0c 然后选择对象 比如要移动一个元件时 xff0c 首先选择 移动 xff08 move xff09 命令 xff0c 然后单击一个元件或框住一系列元
  • LwIP IP 层常用函数和宏

    1 将 4 字节数据组成 IP 地址 头文件 xff1a ip addr h span class token function IP ADDR4 span span class token punctuation span ipaddr
  • 测试驱动的嵌入式开发 001:VSCode + CMake + CppUTest 环境搭建

    本文是对 测试驱动的嵌入式 C 语言开发 第二章的实践 对资源受限的嵌入式项目如何进行测试驱动开发的所有疑问 xff0c 都因为本书第二章最开始的一句话而消解 xff0c 当我读到这句话时 xff0c 脑袋里有闪电掠过 这句话是 xff1a
  • 测试驱动的嵌入式开发 002:VSCode + CMake + Unity 环境搭建

    本文是对 测试驱动的嵌入式 C 语言开发 第二章的实践 搭建 VSCode 这部分参考博文 基于Windows 的 VS Code C C 43 43 编译环境搭建 安装 CMake 安装 CMake xff0c 在官网下载最新安装包 安装
  • 原理图与 PCB 绘制备忘

    原理图绘制 导出 BOM 点击菜单 Reports Bill of Materials xff0c 在弹出的生成 BOM 界面中 xff0c 点击 OK 按钮导出 BOM 批量修改器件标识 xff08 比如型号 xff0c 阻值 xff09
  • Windows 10 安装 MySQL

    确认是否已安装 MySQL xff08 1 xff09 按 win 43 r 快捷键打开运行 xff1b xff08 2 xff09 输入 services msc xff1b xff08 3 xff09 点击 确定 xff0c 在打开的服
  • lwIP 细节之四:ARP 相关知识

    ARP 表项的最大存活时间与宏 ARP MAXAGE 相关 xff0c 默认为 240 x 5000ms 61 20 分钟 当 ARP 表项还有最后一分钟 xff08 由宏 ARP AGE REREQUEST USED 控制 xff09 存
  • Windows 环境下的 Socket 编程 4 - 基于 UDP 的服务器/客户端

    在 TCP 中 xff0c 套接字之间应该是一对一的关系 若向 10 个客户端提供服务 xff0c 则除了守门的服务器套接字外 xff0c 还需要 10 个服务器端套接字 但在 UDP 中 xff0c 不管是服务器端还是客户端都只需要 1
  • ADS1120 备忘

    ADS1120 是一个小型 低功耗 16 bit 模数转换器 xff08 ADC xff09 xff1a 内置 PGA xff08 1 128 xff09 内置参考基准 xff08 2 048V xff09 内置温度传感器内置 2 个已配对

随机推荐

  • Windows 环境下的 Socket 编程 5 - 套接字的可选项

    套接字具有多种特性 xff0c 这些特性可以更改 更改和读取可选项函数 span class token keyword int span span class token function getsockopt span span cla
  • 使能中断与禁止中断策略比较

    本文描述的内容仅适用于 Cortex M3 M4 架构 Keil MDK 编译环境 在阅读 RT Thread 源码和 FreeRTOS 源码时 xff0c 发现二者使能中断和禁止中断的方式不同 xff0c 再加上 CMSIS 也提供了使能
  • FreeModbus RTU 移植指南

    FreeModbus 简介 FreeModbus 是一个免费的软件协议栈 xff0c 实现了 Modbus 从机功能 xff1a 纯 C 语言支持 Modbus RTU ASCII支持 Modbus TCP 本文介绍 Modbus RTU
  • 随想007:模块化代码

    你一定不止一次的听说过模块化代码 理想的模块化代码高内聚低耦合 逻辑清晰 经过严格测试 xff0c 易于复用 嵌入式 C 编程界到处流传着它的大名 在学校 在公司 在各种技术书籍中 xff0c 你总能找到它的身影 它被描述的像是无所不能 x
  • VS Code 用作嵌入式开发编辑器

    使用 Keil MDK 进行嵌入式开发时 xff0c Keil 的编辑器相对于主流编辑器而言有些不方便 xff0c 比如缺少暗色主题 缺少智能悬停感知 xff08 鼠标停在一个宏上 xff0c 能自动展开最终的宏结果 xff09 代码补全不
  • CSDN Marddown 编辑器语法备忘

    原文链接 xff1a https blog csdn net blogdevteam article details 103478461 本文对其二次加工 xff0c 增加渲染样式 补充例程 添加未收录的常用语法 CSDN Markdown
  • 随想008:烂摊子

    我看到过很多离谱的现象 比如 xff1a 程序 代码重复 命名随意 逻辑混乱 甚至对齐都不一致 xff0c 当我询问代码为什么这样写时 xff0c 他们告诉我 xff1a 我接手时就是这样 xff01 原理图参数错误 器件老旧 xff0c
  • MySQL —— Database initialization failed 错误处理

    安装 MySQL 过程中遇到的错误 xff0c 记录一下 xff0c 避免下次又遇到同样的错误 安装 MySQL 8 0 33 到最后一步时 xff0c 出现了小红点无法往下执行了 找了网上的方法解决了问题 xff0c 为了避免下次遇到同样
  • 随想009:读书

    我很懊恼的意识到 xff0c 直到过了 30 岁 xff0c 我才明白如何读书 我们在网上浏览新闻 阅读小说 xff0c 这些让人愉悦的阅读不叫读书 xff0c 顶多叫消遣 xff1b 我们在学校背诵历史 地理 xff0c 记住数学公式和化
  • 找文心一言问了几个嵌入式软件开发的问题

    百度终于通知我可以试用文心一言了 xff0c 试验了一番 xff0c 总体满意 xff0c 记录几个文心一言回答的问题 我是一个嵌入式软件开发者 xff0c 你能帮我做什么工作以提高我的开发效率 作为一个嵌入式软件开发者 xff0c 以下是
  • JavaScript常用数组属性和方法

    本文给出了js xff08 JavaScript xff09 数组 xff08 Array xff09 操作所涉及到的所有常用内置函数说明及用法 xff0c 希望对大家有所帮助 数组的属性和方法 属性length属性 xff1a 方法1 把
  • FreeRTOS三种数据结构区别(StreamBuffer,MessageBuffer,Queue)

    转载自博客 xff1a https blog zh123 top p 61 308 Queue队列是最基本的数据结构 xff0c 在FreeRTOS v10 0后提供了另外两种高级数据结构为Streambuffer和MessageBuffe
  • MySQL知识点(详细)

    结构化查询语言SQL 结构化查询语言SQL xff08 Structured Query Language xff09 xff1a 是在关系数据库上执行数据操作 xff0c 检索及维护所使用的标准语言 xff0c 可以用来查询数据 定义数据
  • linux驱动系列学习之Framebuffer子系统(三)

    一 Framebuffer子系统简介 Framebuffer xff08 帧缓冲 xff09 时Linux系统位显示设备提供的一个接口 属于偏底层的显示接口 它将显示缓冲区抽象 xff0c 屏蔽图像硬件的底层差异 xff0c 允许上层应用程
  • Linux系统通过远程终端修改分辨率

    最近的工作是测试服务器的板载GPU xff0c 由于一切处于开发阶段 xff08 没有USB驱动 xff0c 无法通过键鼠操作 xff09 xff0c 切换桌面分辨率成了一项难题 用谷歌 用百度 xff0c 总算找到了一个在远程终端修改分辨
  • ubuntu安装WPS字体缺失的解决办法

    作者最近新安装的ubuntu系统 xff0c 所以缺少了很多的办公软件 xff0c 之前安装了WPS xff0c 但是Linux系统的wps缺少了windows的字库 xff0c 因此使用起来不太方便 xff0c 所以作者就整理了这样的一份
  • Qt实现串口通信(C++实现串口通信小助手)---串口收发及串口数据解码、串口通信模拟器。

    Qt实现串口通信示例 前言 xff1a 以下串口通信示例 xff0c 参考了现有网上前辈们的资源 xff0c 最后结合部分个人的思想 xff0c 所以下述博客会将实现的原理及代码的案例进行公开 这里我们先上效果图 xff1a 一 串口通信简
  • vins-mobile代码解析3:drawAR

    AR功能主要流程是 xff1a 先检测平面 xff0c 然后计算AR物体 xff08 box xff09 的各个顶点3d位置 xff0c 然后写程序把每个顶点投影到相平面 xff0c 用cv的多边形填充功能来绘制到照片上面 先求一个相机朝向
  • Error:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol

    MySQL 8 0 33 安装完成 xff0c 使用时候报错 xff1a Error xff1a ER NOT SUPPORTED AUTH MODE Client does not support authentication proto
  • 卡尔曼滤波器和优化的本质理解

    非线性最小二乘优化中 xff0c 最重要的是那个雅克比矩阵 每一行对应一个观察两 xff0c 里面的值代表要减少这个观察量的误差 xff0c 其他被优化的量需要做的改变 而每一列就是这个观察量需要怎么变才能减少不同的观察量 对于一个优化量