卡尔曼滤波笔记

news2024/10/7 14:28:10

资料:https://www.zhihu.com/question/47559783/answer/2988744371
https://www.zhihu.com/question/47559783
https://blog.csdn.net/seek97/article/details/120012667

一、基本思想

  • 在对一个状态值进行估计的时候,如果想测量值更准,很自然的一个想法就是用多个传感器去对同一个状态进行测量,然后取平均值。
    x 估计 = ( x 传感器 1 + x 传感器 2 ) 2 x_{估计} = \frac{(x_{传感器1} + x_{传感器2})}{2} x估计=2(x传感器1+x传感器2)

  • 如果不同的传感器之间准确度有区别,那么对不同传感器的测量值取加权值就很有必要了。
    x 估计 = α ∗ x 传感器 1 + ( 1 − α ) ∗ x 传感器 2 x_{估计} = \alpha*x_{传感器1} + (1-\alpha)*x_{传感器2} x估计=αx传感器1+(1α)x传感器2

  • 如果我们并没有多余的对状态直接测量的传感器,但是有物理模型。基于上一时刻的状态估计值对当前时刻进行预测,也可以作为一个“传感器”的测量值。
    x 估计 = α ∗ x 预测 + ( 1 − α ) ∗ x 传感器 x_{估计} = \alpha*x_{预测} + (1-\alpha)*x_{传感器} x估计=αx预测+(1α)x传感器

  • 至此,卡尔曼滤波的基本思想就给出了,通过预测值和测量值的加权和作为当前状态的估计。那么问题的关键就变成了如何设置权重才能让这个估计是最优估计。

二、如何获得权重

1、直观理解

在这里插入图片描述

  • 上面这种图中曲线是数值的概率分布情况(横轴是数值,纵轴是概率,积分是1),粉色曲线代表预测值,绿色代表测量值,蓝色是我们想得到的估计值。

  • 针对正态分布的数据,如果方差越大,概率就约集中,也说明数值越可信。以方差为权重,并考虑和为1,则有如下公式:
    x 估计 = σ 传感器 2 ( σ 传感器 2 + σ 预测 2 ) ∗ x 预测 + σ 预测 2 ( σ 传感器 2 + σ 预测 2 ) ∗ x 传感器 x_{估计} = \frac{{\sigma_{传感器}}^2}{({\sigma_{传感器}}^2+{\sigma_{预测}}^2)}*x_{预测} + \frac{{\sigma_{预测}}^2}{({\sigma_{传感器}}^2+{\sigma_{预测}}^2)}*x_{传感器} x估计=(σ传感器2+σ预测2)σ传感器2x预测+(σ传感器2+σ预测2)σ预测2x传感器

  • 如何从数学推导的角度印证上面这个公式呢?

2、数学推导

  • α \alpha α是最佳的权重
    x 估计 = α ∗ x 预测 + ( 1 − α ) ∗ x 传感器 x_{估计} = \alpha*x_{预测} + (1-\alpha)*x_{传感器} x估计=αx预测+(1α)x传感器
  • 基于概率公式进行推导
    σ 估计 2 = α 2 ∗ σ 预测 2 + ( 1 − α ) 2 ∗ σ 传感器 2 {\sigma_{估计}}^2 = {\alpha}^2*{\sigma_{预测}}^2+{(1-\alpha)}^2*{\sigma_{传感器}}^2 σ估计2=α2σ预测2+(1α)2σ传感器2
  • 基于导数=0计算 σ 估计 2 {\sigma_{估计}}^2 σ估计2的最小值
    σ 估计 = σ 传感器 2 ( σ 传感器 2 + σ 预测 2 ) \sigma_{估计} = \frac{{\sigma_{传感器}}^2}{({\sigma_{传感器}}^2+{\sigma_{预测}}^2)} σ估计=(σ传感器2+σ预测2)σ传感器2

3、迭代计算

  • 卡尔曼滤波有五个公式,相互联系组成了迭代更新的公式

(1)预测状态的更新公式

x t , t − 1 = a ∗ x ^ t − 1 , t − 1 + b + q x_{t,t-1} = a* {\hat x}_{t-1,t-1}+b+q xt,t1=ax^t1,t1+b+q

  • x t , t − 1 x_{t,t-1} xt,t1是这一次的预测状态值, x ^ t − 1 , t − 1 {\hat x}_{t-1,t-1} x^t1,t1是上一次的估计值。a是状态转移,b是控制量,q是先验的模型噪声(很多没有这一项)

(2)预测状态协方差的更新公式

σ t , t − 1 = a 2 ∗ σ x ^ t − 1 , t − 1 + σ q {\sigma}_{t,t-1} = a^2* {\sigma}_{{\hat x}_{t-1,t-1}}+{\sigma}_q σt,t1=a2σx^t1,t1+σq

  • 系统模型的方差是变化的,系统的方差来源于两部分,一部分是上一时刻的估计值导致的误差,我们利用模型计算当前的状态时,只能使用上一次的估计值代替实际值。另一部分就是模型本身的误差,模型本身也会存在着系统误差。

(3)卡尔曼增益的更新公式

k t = σ x , t − 1 σ x , t − 1 + σ z k_t = \frac{{\sigma}_{x,t-1}}{{\sigma}_{x,t-1}+{\sigma}_{z}} kt=σx,t1+σzσx,t1

  • 这就是上面推导出的对估计值方差的最佳估计,在这种情况下估计值应该方差最小
  • 传感器的方差一般是固定的,可以认为是先验知道的。预测值的方差在上一步已经获得。

(4)估计状态的更新公式

x ^ t = ( 1 − k t ) ∗ x t − 1 + k t ∗ z t {\hat x}_{t} = (1-k_t)*x_{t-1}+k_t*z_t x^t=(1kt)xt1+ktzt

(5)估计状态协方差的更新公式

  • 根据公式4就可以获得协方差:
    σ x ^ t = ( 1 − k t ) 2 ∗ σ x t − 1 + k t 2 ∗ σ z , t {\sigma}_{{\hat x}_{t}} = (1-k_t)^2*{\sigma}_{x_{t-1}}+k_t^2*{\sigma}_{z,t} σx^t=(1kt)2σxt1+kt2σz,t
  • 再把公式3代入:在这里插入图片描述

(6)扩展到多维情况

在这里插入图片描述

  • H是观测值到状态值的转换矩阵
  • Q是模型噪声,R是观测噪声。越小表示越相信对应的值,如果为0就代表完全相信(没有噪声当然可以完全相信了)

三、例子

(1)chatgpt生成的一维python代码

import numpy as np
import matplotlib.pyplot as plt

def kalman_filter(data, Q, R):
    # 初始化
    x = 0
    P = 1
    result = []

    for z in data:
        # 预测
        x_pred = x             #没有控制量
        P_pred = P + Q

        # 更新
        K = P_pred / (P_pred + R)
        x = x_pred + K * (z - x_pred)
        P = (1 - K) * P_pred

        result.append(x)

    return result

# 生成随机数据
np.random.seed(42)
data = np.random.normal(0, 1, 50)  # 生成50个均值为0,方差为1的随机数

# 添加噪声
data_noisy = data + np.random.normal(0, 0.8, 50)  # 添加方差为0.8的高斯噪声

# 卡尔曼滤波
Q = 0.1
R = 0.5
filtered_data = kalman_filter(data_noisy, Q, R)

# 绘图
plt.figure(figsize=(12, 6))
plt.plot(data, label='True Data', color='blue')
plt.plot(data_noisy, label='Noisy Data', color='red', alpha=0.7)
plt.plot(filtered_data, label='Filtered Data', color='green', linestyle='--')
plt.legend()
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Kalman Filter Example')
plt.show()

在这里插入图片描述

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

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

相关文章

数据结构进阶篇 之 【插入排序】详细讲解(直接插入排序,希尔排序)

千万不要因为一件事不会做而失去信心,你又不是只有这一件事不会,你还有很多呢 一、插入排序 1.直接插入排序 InsertSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接插入排序的特性总结 2.希尔排序 ShellSort 2.1 基本思想 2.2 实现原理 …

6.7物联网RK3399项目开发实录-驱动开发之Camera摄像头的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f Camera 使用 简介 AIO-3399J 开发板分别带有两个 MIPI,MIPI 支持最高 4K 拍照,并支持 1080P 30fp…

282: 数字的秘密

收藏 难度:简单 标签:卓越班选拔 题目描述 在数字王国中,人人都有一个号码,人人都想知道这个号码对自己意味着什么。国王便做了很多个盒子,每个盒子拥有一个号码。人们需要通过一定的方法才能确定哪个盒子有自己的…

【Java 集合进阶】单练集合顶层接口collction迭代器

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

jsp将一个文本输入框改成下拉单选框,选项为字典表配置,通过后端查询

一,业务场景: 一个人员信息管理页面,原来有个最高学历是文本输入框,可以随意填写,现在业务想改成下拉单选框进行规范化,在专科及以下、本科、研究生三个选项中选择; 二,需要解决问…

流程控制分支结构

一,流程控制 分为三种:顺序流程控制,分支流程控制,循环流程控制 二,顺序流程控制 先执行A,再执行B 三,分支流程控制if语句 从上到下执行代码的过程中,根据不同的条件&#xff0…

[游戏开发]Unreal引擎知识

工程通常会选择Development_Editor模式,它会过滤掉很多Debug信息,开发期间占用内存更小,项目运行更流畅,但也有缺点,就是部分断点信息看不到, 有两种解决办法: 1,选择DebugGame_Ed…

NULL与nullptr的区别

NULL是宏定义,如下: 如果用NULL,在函数重载时,NULL的类型被推断为int。这是不好的,所以引入nullptr。nullptr是c11引入的关键字,它就代表空指针。

Maven是什么? Maven的概念+作用

1.Maven的概念 Maven中文意思为“专家“、”内行“的意思,它是一个项目管理工具,可以对Java项目进行构建、依赖管理,通俗点 就是通过pom.xml文件的配置获取jar包不用手动的去添加jar包。 2.Maven的作用 对于大的工程,需要引用各…

Linux和Windows安装PHP依赖管理工具Composer

Composer 是 PHP 的一个依赖管理工具。它允许申明项目所依赖的代码库,会在项目中安装它们。 Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的…

Java进阶-反射的详解与应用

本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力,包括在运行时动态获取类信息、操作对象字段和方法的能力。随后,通过具体代码示例,展示了如何利用反射进行字段访问、方法…

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集 卡码网46. 携带研究材料题目解法 416. 分割等和子集题目解法 感悟 卡码网46. 携带研究材料 题目 解法 题解链接 二维数组 # include <bits/stdc.h> using namespace std;int n, bagweig…

谷歌google广告和必应Bing广告,是否二选一?

搜索引擎广告凭借其精准定向、高度可见性和高效转化能力&#xff0c;成为众多企业拓展海外市场、提升品牌影响力的重要手段。其中&#xff0c;谷歌Google与必应Bing作为全球两大主流搜索引擎&#xff0c;各自拥有庞大的用户群体与独特的市场优势。面对这两大广告平台&#xff0…

《自动机理论、语言和计算导论》阅读笔记:p68-p114

《自动机理论、语言和计算导论》学习第4天&#xff0c;p68-p114总结&#xff0c;总计47页。 一、技术总结 1.inverted indexes 明白单词的意思是“反转的索引”&#xff0c;但是不明白其在书中具体指什么&#xff0c;去查询资料的话需要花很不多时间&#xff0c;先继续往下看…

dcoker 下redis设置密码

修改Docker里面Redis密码 Redis是一个开源的内存数据结构存储系统&#xff0c;常用于缓存、消息队列和数据持久化等场景。在使用Docker部署Redis时&#xff0c;默认情况下是没有设置密码的&#xff0c;这可能会导致安全隐患。因此&#xff0c;为了保证数据的安全性&…

关于第十二届蓝桥杯时间显示题中包和模块的使用解释

题目信息&#xff1a; 解题代码&#xff1a; from datetime import datetime, timedelta # 定义起始时间&#xff0c;即 Unix 时间戳的零点&#xff08;1970年1月1日&#xff09; start datetime(year1970, month1, day1) # 定义时间间隔&#xff0c;这里以毫秒为单位 dela …

营销归因模型 - 销售员想知道却不敢问的问题

当谈到营销归因时&#xff0c;单一的尺寸并不适合所有人。了解归因的基本原理、可用的模型以及哪些模型最适合您的公司。我在翻译这个单词的时候&#xff0c;一度要翻译成属性&#xff0c;归因还是贡献值&#xff0c;纠结了很久。后来还是觉得归因比贡献值更贴切一下。 今天的…

数据结构(初阶)第二节:顺序表

从本文正式进入对数据结构的讲解&#xff0c;开始前友友们要有C语言的基础&#xff0c;熟练掌握动态内存管理、结构体、指针等章节&#xff0c;方便后续的学习。 顺序表&#xff08;Sequence List&#xff09; 线性表的概念&#xff1a;线性表&#xff08;linear list&#xff…

【数字图像处理】二值图和灰度图的形态学处理

文章目录 形态学处理二值图形态学处理二值图形态学基本算子二值图连通分量提取、区域标记二值图细化算法 灰度图形态学处理灰度图形态学基本算子灰度图形态学梯度灰度图 tophat 算法 形态学处理 二值图形态学处理 二值图形态学基本算子 二值图形态学图像处理通常在目标图像中…

JavaBean是什么?

Bean的本意为豌豆、子实&#xff0c;在这里引申为一种实体。JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean&#xff0c;类必须是具体的和公共的&#xff0c;并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性&#xff0…