卡尔曼滤波笔记

资料: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 pltdef kalman_filter(data, Q, R):# 初始化x = 0P = 1result = []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_predresult.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.hqwc.cn/news/587563.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue3源码学习】— CH2.7 Computed: Vue 3 计算属性深入解析

Computed: Vue 3 计算属性深入解析 1.计算属性的基本用法2. ComputedRefImpl 类深入解析JavaScript 中的 getter 函数 3. 计算属性的创建:computed 方法解析3.1 源码解析3.2 使用示例 4. 计算属性的工作原理5. 手动实现简化的计算属性6. 结语 在 Vue 3 的响应式系统…

【Go】二十、反射

文章目录 1、反射2、对基本数据类型反射3、对结构体进行反射4、获取变量的类别5、通过反射修改基本类型变量的值6、通过反射操作结构体的属性和方法 1、反射 //核心包 import ("reflect")通过反射: 可以在运行时动态获取变量的类型、获取结构体的信息&a…

mac mini m1芯片 Xcode 15.3 各种报错的问题

错误一: /Users/mac/Desktop/Test_project/mobile-ios/Test/Test-Bridging-Header.h:4:9 failed to emit precompiled header /Users/mac/Library/Developer/Xcode/DerivedData/App-apvcgkuclncgfqdlzqcoffyaexos/Build/Intermediates.noindex/PrecompiledHeaders/…

谷粒商城实战(008 缓存)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第151p-第p157的内容 简介 数据库承担落盘(持久化)工作 拿map做缓存 这种是本地缓存,会有一些问题 分布…

LeetCode每日一题之专题一:双指针 ——移动零

移动零OJ链接:283. 移动零 - 力扣(LeetCode) 题目: 解法(快排的思想:数组划分区间-数组分两块): 算法思路:在本题中,我们可以用一个 dest 指针来扫描整个数组…

Nginx 高级

文章目录 Nginx反向代理概念配置 负载均衡概念配置 动静分离概念配置 网关防盗链keepalivednginx跨域 Nginx 反向代理 概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器&…

美联储,非必要,不降息

美联储“没必要、没空间、没动力”降息,也会尽量避免货币政策干扰大选,用“口头降息”代替实际调整是现实选择,市场降息预期将继续推迟和下调。 前言: 当前美国经济从各个方面看均并未表现出疲态——新增就业持续修复,…

JVM 内存溢出排查

说明:记录一次JVM内存溢出的排查过程; 场景 项目开发完成后,首次提交到测试环境。测试、产品同事反馈页面先是操作响应慢,抛出超时异常,最后直接无法使用。查看日志后得知是内存溢出。 重启服务后,我对前…

苹果开发者账号注册后生成开发证书和发布证书的流程解析

转载:注册苹果开发者账号的方法 在2020年以前,注册苹果开发者账号后,就可以生成证书。 但2020年后,因为注册苹果开发者账号需要使用Apple Developer app注册开发者账号,所以需要缴费才能创建ios证书了。 所以新政策出…

使用kubeadm工具搭建Kubernetes集群

本文目录 一、CentOS7最小化安装(master)1、下载ISO镜像2、安装3、进入centos安装界面4、安装最小化安装必要的一些工具 二、克隆虚拟机(node1、node2)三、基础配置1、节点规划——部署架构图2、防火墙和SElinux配置2、主机名和ho…

关于不同AR(增强现实)SDK(软件开发工具包)的汇总和特性描述

以下是每个AR SDK的核心内容概述: ARCore 开发者:Google支持平台:Android(部分设备不支持)功能:运动追踪、平面追踪、点云图、云锚点、光照估计、环境探针、人脸追踪、2D图片追踪、人物遮挡、射线测试。官网链接:ARCoreARKit 开发者:Apple支持平台:iOS(iPhone和iPad)…

2024年最新版FL Studio21.2.3 Build 4004 for Mac 版激活下载和图文激活教程

FL studio21中文别名水果编曲软件,是一款全能的音乐制作软件,包括编曲、录音、剪辑和混音等诸多功能,让你的电脑编程一个全能的录音室,它为您提供了一个集成的开发环境,使用起来非常简单有效,您的工作会变得…