卡尔曼滤波

2023-05-16

系列文章目录

前言

一、线性高斯系统

二、卡尔曼滤波算法

1.卡尔曼滤波算法的应用

2.卡尔曼滤波的数学推导

1、预测部分的推导

2、观测部分的推导


前言

最近在阅读概率机器人这本书,读到了卡尔曼滤波的相关内容,想要记录下来以供以后的复习。对书中的内容进行了翻译并加入了自己的理解。在看之前大家可以先了解一下贝叶斯滤波算法的基本思想和基本的数学公式的推导。


一、线性高斯系统

卡尔曼滤波的使用场景是在线性系统中用于连续状态的预测的滤波算法。在某一时刻t,卡尔曼滤波的可信度是由两个参数来表示,分别是均值\mu _{t}和协方差\Sigma _{t}。满足一下三个性质以及贝叶斯滤波中的马尔可夫性质即满足卡尔曼滤波后验,可以进行状态的预测。

1、在添加加性高斯噪声之后状态转移概率函数必须是一个线性函数,其数学表达式如下:

x_{t}=A_{t}x_{t-1}+B_{t}u_{t}+\varepsilon _{t}

其中x_{t}x_{t-1}都是n维的状态向量(列向量),A_{t}是状态转移矩阵,B_{t}是控制矩阵,\varepsilon _{t}是高斯噪声其均值是0,协方差矩阵是R_{t}。把这个公式带入到高斯分布的概率密度函数中去可以得到以下公式:

p(x_{t}|u_{t},x_{t-1})=det(2\pi R_{t})^{-1/2}exp\left \{ -\frac{1}{2}(x_{t}-A_{t}x_{t-1}-B_{t}u_{t})^{T}R_{t}^{-1}(x_{t}-A_{t}x_{t-1}-B_{t}u_{t}) \right \}

2、在添加加性高斯噪声之后,其观测概率密度函数也必须是线性函数,其数学表达式如下:

z_{t}=C_{t}x_{t}+\delta _{t} 

同样带入高斯分布的概率密度函数中去可以得到

p(z_{t}|x_{t})=det(2\pi Q_{t})^{-1/2}exp\left \{ -\frac{1}{2}(z_{t}-C_{t}x_{t})^{T}Q_{t}^{-1}(z_{t}-C_{t}x_{t}) \right \} 

 下面这个图是卡尔曼滤波状态量和协方差矩阵的更新流程。

3、 初始的bel(x_{0})必须是正态分布(normal distributed)。其数学表示为:

bel(x_{0})=p(x_{0})=det(2\pi \Sigma _{0})^{-1/2}exp\left \{ -\frac{1}{2}(x_{0}-\mu _{0})^{T}\Sigma _{0}^{-1}(x_{0}-\mu _{0}) \right \}

 满足以上这三个性质,就能够确保bel(x_{t})是一个高斯分布。

二、卡尔曼滤波算法

1.卡尔曼滤波算法的应用

下图是一个卡尔曼滤波算法在一维上的简单的定位的应用。假设机器人沿着横轴移动。机器人的先验定位由高斯分布给出如图 (a)。通过机器人安装的传感器来返回一个它的位置信息如图(b)中的黑体线的峰值。其峰值是由传感器预测得到的,曲线的宽度表明了观测的不确定度,再结合先验的测量,如图(c)的粗体线是由先验以及传感器的测量得到的。可以看出来它的均值位于两条曲线的均值之间,且不确定度比之前两条曲线的不确定度都要小。

下一时刻,假设机器人向右移动,由于下一个状态的不确定性是随机的,它的不确定性会变大,所以会比较宽。如图(d)中的黑体曲线,然后在该时刻接受传感器的观测如图(e)中的黑体线。结合先验和测量信息可以得到如图(f)中的黑体线,同样可以看出该曲线的均值在两条曲线之间,且不确定性也减小。

 

2.卡尔曼滤波的数学推导

1、预测部分的推导

 x_{t}的均值和方差分别是A_{t}x_{t-1}+B_{t}u_{t}R_{t},把这两个变量带入上面的公式可以得到下面这个公式:

 为了看起来简单一些,记为

其中

L_{t}=\frac{1}{2}(x_{t}-A_{t}x_{t-1}-B_{t}u_{t})^{T}R_{t}^{-1}(x_{t}-A_{t}x_{t-1}-B_{t}u_{t})+\frac{1}{2}(x_{t-1}-\mu _{t-1})^{T}\Sigma _{T-1}^{-1}(x_{t-1}-\mu _{t-1}) 

 

现在把L_{t}分解成两部分函数L_{t}(x_{t-1},x_{t})L_{t}(x_{t}),如下

L_{t}=L_{t}(x_{t-1},x_{t})+L_{t}(x_{t})

 把x_{t-1}这个变量全部集中在L_{t}(x_{t-1},x_{t})中,这样就可以把含有x_{t}变量的项移出积分的外部,所以可以得到下面这个公式:

上式积分的值与x_{t}无关,经过积分之后就可以得到:

 我们需要找到一个L_{t}(x_{t-1},x_{t}),关于x_{t-1}的二次函数(这个二次函数中也会有x_{t},但是并不影响我们的求解),为了确定这个函数,对L_{t}求两次导数分别得到:

\psi _{t}是函数的曲率,令一阶导数为0可以得到一个均值(注意我们是在求解x_{t-1}),

 我们就可以得到一个二次函数如下所示:

 这个函数不是唯一的,事实上

是关于变量x_{t-1}的高斯分布的密度函数,由概率密度函数的定义可得:

所以有:

由于积分的值和x_{t}无关所以,可以得到如下的公式: 

注意到等式两边的\eta是不一样的,但是没有加以区分,在原书中有说明。接下来我们继续求解函数L(x_{t}),注意到它和L_{t}是不一样的,由之前的定义可以得到:

 将\psi _{t}回带可以解得:

从上式中可以看出来L(x_{t})x_{t-1}无关,且是关于x_{t-1}的一个二次函数。也可以证明服从正态分布,对该函数分别求一阶导数和二阶导数可以得到均值和协方差。

由 inversion lemma 定理可得:

 令其一阶导数为零可以得到

 对其求二阶导数:

曲率的逆就是协方差矩阵。

2、观测部分的推导 

同样的从贝叶斯滤波出发有如下式子:

其中p(z_{t}|x_{t})也服从正态分布,均值是C_{t}x_{t},协方差是Q_{t}。故上式也可以表达为:

 其中

同样分别求一阶导数和二阶导数:

 对二阶导数取逆可以得到其协方差矩阵:

令一阶导数为0可以得到:

 上式的左侧可以写为:

把上式带入上上式可以得到: 

 接下来就会得到一系列式子:

 定义K:

 

 到这里数学公式的推导就结束了。因为是第一次看所以肯定有不对的地方,大家可以一起讨论。图片来自概率机器人书籍。


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

卡尔曼滤波 的相关文章

  • 视觉SLAM十四讲

    内部交流 xff0c 写的很乱 xff0c 各路大神不建议观看以免影响思路 1 激光SLAM 激光SLAM相对成熟 xff0c 比如2005年出版的 概率机器人 中就介绍了很多关于激光SLAM的知识 xff0c 在ROS里也能找到许多关于激
  • 推荐几本学习c++的靠谱书

    入门推荐 C 43 43 Primer Plus 第6版 中文版 C 43 43 程序设计经典教程 xff0c 畅销30年的C 43 43 大百科全书 xff0c 零基础自学C 43 43 入门 C 43 43 是在 C 语言基础上开发的一
  • Python进阶书籍经典书有这样三本

    1 Python核心编程 xff08 第3版 xff09 Core Python Applications Programming xff08 3rd Edition xff09 美 Wesley Chun 著 xff0c 孙波翔 xff0
  • PID控制算法 无人机的精准悬停 机器人和机械臂的运动系统 飞机和火箭的姿态调整

    目录 应用数学公式机器人为例无人机为例PDI总结参考链接 应用 空调的温度控制 无人机的精准悬停 机器人和机械臂的运动系统 飞机和火箭的姿态调整 数学公式 机器人为例 无人机为例 P D I
  • Docker容器图形界面显示(运行GUI软件)的配置方法

    0 环境说明 Ubuntu 16 04 docker 1 35 1 Docker的 可视化 Docker本身的工作模式是命令行的 xff0c 因为主要的使用场景可能是做服务器后端方面的比较多 但有时候我们会有在docker容器里运行一些图形
  • 即时通讯 3

    即时通讯 3 内容待写
  • HMC5883L 磁力计校准

    原文地址 xff1a http blog sina com cn s blog 402c071e0102v8ie html 这里针对 HMC5883L 磁力计 的校准 xff0c 做一个简单讲解 欢迎交流 xff0c 新浪长沙 64 Wal
  • linux下如何编译c++工程项目

    首先 xff0c 你必须 有一 个Linux开发环境 xff0c 这样才能进行C 43 43 开发 笔者用的是安装在虚拟机中的Ubuntu 9 04 xff0c Ubuntu操作系统是没带C 43 43 编译器g 43 43 在连网的情况下
  • 【ROS程序】 --- 4-1. URDF-GAZEBO 文件介绍

    没人天赋异禀 xff0c 介绍两种实现对比发现 gaze中的urdf文件1 碰撞参数设置2 惯性矩阵设置3 颜色设置 介绍 在前边提过的rviz中 xff0c 只负责整体机器人的建模和运动 xff0c 而在gazebo中集成urdf文件则需
  • 【ROS机器人】 --- 2-2.slam建图保存

    山无拦 海无遮 xff01 前期准备建图I 运行机器人 gazebo II 建图文件编写III 配置rviz并保存1 添加机器人和雷达2 添加TF3 地图map4 保存配置 IV 控制运动建图V 保存地图1 map server2 保存查看
  • 【ROS机器人】 --- 2-4. 路径规划_move_base

    我回来啦 前期准备基础知识1 action通信2 代价地图及组成3 碰撞算法 文件详解及过程I 集成参数的launch文件II 配置文件1 costmap common params yaml2 global costmap params
  • 【ROS机器人】 --- 2-5.自主导航并slam建图

    压线才低头 前期准备基础知识编写launch文件执行流程最后重写launch文件 本节目标 xff1a 加载一张未知地图 xff0c 为机器人设置目标点 机器人会边走路 边建图 最后还可以用map server保存 实现 xff1a 打开g
  • [xdm+ip]ubuntu下载数据慢或者不通

    解决了从官网下载kitti数据集慢的问题 1 改ip 测ping2 更改 etc hosts文件3 使用xdm工具4 配置浏览器和xdm5 使用 环境 ubuntu20 04 问题 从kitti数据集官网下载数据集慢或不通的问题 使用过we
  • 【Docker】--5.docker图形化(享用主机的屏幕)

    心向骄阳万丈光 1 主机操作2 初始化容器3 注意查看效果 docker图形无法显示 网上流传两种方法解决 一种是lightdm 容器初始化好后 另一种是我亲测有用的这种 初始化容器时 1 主机操作 安装 span class token
  • [ros+python]无法rosrun 导入自定义.py文件的python可执行文件

    问题描述 在ROS环境下 自定义a py文件作为模块 被b py引用 rosrun b的时候疯狂报错 not found python文件可以单独用python编译器跑通过 放在rosrun下边就不对 解决办法 删除掉工作空间下之前编译残留
  • 【从kitti开始自动驾驶】--9.1 利用IMU/GPS测距并比较效果(jupyter)

    义勇添青史几段 1 基础知识1 1 角度计算1 2 距离计算 2 python程序编写2 1 大圆距离公式函数2 2 a GPS测距离2 2 b IMU测距离2 3 绘图2 4 效果展示2 5 结论 3 Measure distance源码
  • 【gdb调试器】gdb的调试参数和使用方法

    34 江山不负英雄泪 34 GDB调试器GDB主要功能常用调试命令参数 小例子测试gdb编译生成可执行文件调试查看 GDB调试器 GDB GNU Debugger 是一个用来调试C C 43 43 程序的功能强大的调试器 是linux系统开
  • 磁力计的基本工作原理

    此文详细讲解了 磁力计 的基本工作原理 干扰产生的原因以及如何校准 磁力计与倾角传感器如何结合使用等内容 原文地址 xff1a http www dzsc com data html 2010 11 29 87454 html 电子罗盘是一
  • Linux安装confluence

    一 准备工作 1 安装jdk 在官网下载Linux环境下的jdk1 8 xff1a https www oracle com technetwork java javase downloads jdk8 downloads 2133151
  • [ROS+catkin_make]编译100%后出现 unreference to ...的现象

    问题描述 catkin make编译100 后 突然出现unreference to 的情况 但是能定义过去 即根据VSCODE可以追踪过去问题解决 静态成员变量必须在类外初始化

随机推荐

  • 【linux基础】7.linux系统自定义应用名和应用图标

    34 懦弱之人毫无价值 34 1 做应用和图标1 1 测试和加入侧边栏 3 命令行重命名唤醒 任务叙述 xff1a 有一个x sh文件可以在命令行执行 sh x sh xff0c 这样太麻烦 将其做成app且配上logo xff0c 下次直
  • [Linux基础]8. linux下脚本将pdf转各图片并合成长图

    34 你也有不看星星 34 1 将PDF的每一页转换为图片2 将转换后的多张图片合并为一张长图3 完整脚本 任务叙述 xff1a 已经有一个很长的pdf xff0c 要在linux上用脚本合成一张长图 xff0c 如果由程序完成将PDF转换
  • 【linux网络问题】,ping出现connect问题,知乎(ipv6)能通,百度ipv4通不了

    问题 今天遇到一个很奇怪的事情 xff0c 有线连接的ifconfig中没有ipv4的解析 xff0c 只有ipv6的解析系统是ubuntu20 04及以上nslookup 43 网址的时候发现能访问网络的都是被解析成ipv6的 xff0c
  • 制作树莓派SD卡备份镜像——树莓派系统备份与还原指南

    制作树苺派SD卡备份镜像 树苺派系统备份与还原指南 科技爱好者关注 0 1452016 05 28 22 12 33字数 501阅读 26 658 树莓派使用SD卡来安装系统 xff0c 如果SD卡丢失或者损坏 xff0c 那么树莓派上的数
  • ARM Cortex-M4和Cortex-M0+中断优先级及嵌套抢占问题

    转自 xff1a http blog chinaaet com jihceng0622 p 5100001238 坐在上海回北京的高铁上 xff0c 漫长的旅途着实让人感到无聊 xff08 没买到直达的高铁 xff0c 只能慢悠悠的走一站停
  • 基于MFC的简易TCP/IP调试助手开发

    在学习TCP IP通讯过程中 xff0c 打算参考网上的教程写一个简易的调试助手 xff0c 服务器与客户端分别参考以下两位代码完成 xff0c 效果图如下 1 如何基于TCP IP协议进行MFC Socket网络通讯编程 Ezreal z
  • 下载的软件包保存在缓存中,直到下次成功执行事务。 您可以通过执行 'dnf clean packages' 删除软件包缓存。 错误:事务检查错误

    下载的软件包保存在缓存中 xff0c 直到下次成功执行事务 您可以通过执行 dnf clean packages 删除软件包缓存 错误 xff1a 事务检查错误 使用yum安装时出现了这个错误 xff0c 更新一下 sudo yum upd
  • @SpringBootApplication注解无效

    64 SpringBootApplication注解无效 import或clone下来的项目idea打开后 64 SpringBootApplication注解无效 1 查看看maven依赖是否报红 xff0c 如果报红说明依赖有问题检查p
  • 修改docker容器中的配置文件

    容器创建好后有时需要进入容器修改配置 xff0c 发现没有vim 我们可以使用sed命令来修改配置文件 sed i 3s yes no a conf 将a conf中第3行中的yes修改为no sed i 3ayes 61 no a con
  • 最近开始研究openpilot的开源飞控,记录一下

    国内用这个飞控的人比较少 xff0c 也没有太多的文章来描述包括代码结构之类的 xff0c 其实该飞控相当强大 xff0c 而且有一个用QT做的很强悍的GCS xff0c 我用380的机架已经搭建了一个四轴 xff0c 用默认参数就能飞得很
  • 解决aria2下载磁力链接或bt文件时没有速度或速度为0

    使用aria2下载磁力链接和种子时 xff0c 发现长时间都没有速度 xff0c 因为默认的配置是没有加tracker列表的 xff0c 就像迅雷没有p2p共享一样 xff0c 所以要在配置文件中加入trackers xff0c 速度就会提
  • UDP 打洞 java demo

    UDP打洞的具体原理就不细说了文章还是很多 xff0c 说下我的网络环境 xff0c 家里台式电脑网线连的家里路由器 移动宽带 xff0c 公司台式电脑网线连的公司路由器 电信宽带 xff0c 一台有公网IP的华为云主机 xff08 我是试
  • 云服务器内存不够,设置swap交换分区

    购买了一台阿里的云服务器1核2G的 xff0c 装上docker后 xff0c 运行了十几个容器后面的容器就再也没法启动了 xff0c 一看物理内存为0 xff0c 加内存又没钱 xff0c 只能牺牲速度了 xff0c 阿里云的服务器默认是
  • sql 拼接一列数据为一个字段

    最近有个功能中需要把一列数据拼接成一个字段的需要 xff0c 本以为concat 轻松就能实现 xff0c 结果却差点意思 xff0c 这个是拼接一行之间的 xff0c group concat 需要分组才能拼接组内的一列数据 xff0c
  • idea反编译

    idea有自带的反编译插件java decompiler jar xff0c 默认是安装的 这个工具包在F Program Files JetBrains IntelliJ IDEA 2020 2 3 plugins java decomp
  • android远程协助

    一部手机有时候需要远程协助另一台手机如QQ的远程协助一样 xff0c 准备两个手机 下面用AB代替 1 A手机 xff08 需要被协助的手机 xff09 开启开发者选项 xff0c usb连接电脑 xff0c 命令开启ADB xff08 手
  • 阿里云服务器安装图形界面

    为了自动化流程安装图形界面 xff0c 我的服务器是Centos7 1 yum安装gnome图形界面 yum groupinstall GNOME Desktop y 2 安装远程桌面服务端 yum y install tigervnc s
  • 国网 内网U盘 服务未启动 驱动版本不符问题

    国网内网U盘问题处理 1 提示服务未启动 是因为Bios开启了Secure BOOT xff0c 将这个选项设置为disable就可以 xff0c 进入Bios这个选项有的主板在Boot选项下 xff0c 有的在Security选项下 xf
  • 【C++】面试题目,整理自牛客网

    来源 1 写出完整版的strcpy函数 char strcpy char strDest const char strSrc assert strDest 61 NULL amp amp strSrc 61 NULL char addres
  • 卡尔曼滤波

    系列文章目录 前言 一 线性高斯系统 二 卡尔曼滤波算法 1 卡尔曼滤波算法的应用 2 卡尔曼滤波的数学推导 1 预测部分的推导 2 观测部分的推导 前言 最近在阅读概率机器人这本书 xff0c 读到了卡尔曼滤波的相关内容 xff0c 想要