卡尔曼滤波:理论与代码

卡尔曼滤波:理论与代码

引言

卡尔曼滤波是一种用于估计系统状态的优化技术,特别适用于含有噪声的测量数据和系统动态变化的情况。本文将简单探讨卡尔曼滤波的理论基础、数学公式的推导,并通过Python代码示例演示其在实际应用中的效果。

一、卡尔曼滤波的基本理论

卡尔曼滤波基于动态系统的模型,通过对系统状态的预测和测量值的融合,提供对系统状态的最优估计。它通过递归地更新估计值,适应系统状态的变化,并考虑测量误差,使得估计更加准确。

二、卡尔曼滤波的基本假设

卡尔曼滤波基于以下两个基本假设:

  1. 线性系统: 系统的动态模型和观测模型必须是线性的。
  2. 高斯噪声: 系统的过程噪声和测量噪声都应该是高斯分布的。

三、卡尔曼滤波的数学公式推导

在这里插入图片描述

1. 预测步骤

1.1 状态预测:

x ^ k − = A x ^ k − 1 + B u k − 1 \begin{equation}\hat{x}_{k}^- = A \hat{x}_{k-1} + B u_{k-1} \end{equation} x^k=Ax^k1+Buk1

其中, x ^ k − \hat{x}_{k}^- x^k是系统状态的先验估计, A A A 是系统矩阵,$\hat{x}_{k-1}$是上一时刻的估计值, B B B 是输入矩阵, u k − 1 u_{k-1} uk1 是系统输入。

1.2 协方差预测:

P k − = A P k − 1 A T + Q \begin{equation} P_{k}^- = A P_{k-1} A^T + Q \end{equation} Pk=APk1AT+Q

其中, P k − P_{k}^- Pk是状态估计的先验协方差矩阵, Q Q Q 是过程噪声协方差。

2. 更新步骤

2.1 卡尔曼增益计算:

K k = P k − H T ( H P k − H T + R ) − 1 \begin{equation}K_{k} = P_{k}^- H^T (H P_{k}^- H^T + R)^{-1} \end{equation} Kk=PkHT(HPkHT+R)1

其中, K k K_{k} Kk是卡尔曼增益, H H H 是测量矩阵, R R R是测量噪声协方差。

2.2 状态更新:

x ^ k = x ^ k − + K k ( z k − H x ^ k − ) \begin{equation}\hat{x}_{k} = \hat{x}_{k}^- + K_{k} (z_{k} - H \hat{x}_{k}^-) \end{equation} x^k=x^k+Kk(zkHx^k)

其中, x ^ k \hat{x}_{k} x^k是系统状态的后验估计, z k z_{k} zk是测量值。

2.3 协方差更新:

P k = ( I − K k H ) P k − \begin{equation}P_{k} = (I - K_{k} H) P_{k}^- \end{equation} Pk=(IKkH)Pk

其中, P k P_{k} Pk 是状态估计的后验协方差矩阵, I I I 是单位矩阵。

四、一维卡尔曼滤波的Python代码示例

以下是一个简单的一维卡尔曼滤波的 Python 代码示例。在这个例子中,我们假设系统是一个匀速运动的目标,我们通过测量得到目标的位置信息。

import numpy as np
import matplotlib.pyplot as plt# 系统参数
A = np.array([[1]])  # 状态转移矩阵
H = np.array([[1]])  # 观测矩阵
B = np.array([[1]])  # 控制输入矩阵
Q = np.array([[0.01]])  # 过程噪声协方差
R = np.array([[0.1]])   # 观测噪声协方差# 初始化
x_hat = np.array([0])  # 初始状态估计
P = np.array([1])      # 初始协方差矩阵# 模拟数据
true_states = np.array([i for i in range(100)])  # 真实状态,匀速增加
measurements = true_states + np.random.normal(0, np.sqrt(R[0, 0]), 100)  # 加入观测噪声# 卡尔曼滤波
filtered_states = []for z in measurements:# 预测步骤x_hat_minus = np.dot(A, x_hat)P_minus = np.dot(np.dot(A, P), A.T) + Q# 更新步骤K = np.dot(np.dot(P_minus, H.T), np.linalg.inv(np.dot(np.dot(H, P_minus), H.T) + R))x_hat = x_hat_minus + np.dot(K, (z - np.dot(H, x_hat_minus)))P = np.dot((np.eye(1) - np.dot(K, H)), P_minus)filtered_states.append(x_hat[0])filtered_states = np.array(filtered_states)# 可视化结果
plt.figure(figsize=(12, 6))plt.plot(true_states, label='True States')
plt.plot(measurements, 'ro', label='Measurements')
plt.plot(filtered_states, label='Filtered States')plt.title('1D Kalman Filtering')
plt.legend()
plt.show()

在这个例子中,模拟了一个一维系统,其中目标的真实状态是一个匀速增加的序列。观测值通过加入观测噪声生成。卡尔曼滤波器通过预测和更新步骤,对目标的状态进行估计。最终结果显示了真实状态、观测值和卡尔曼滤波估计的对比。

五、二维卡尔曼滤波的Python代码示例

下面是一个简单的二维卡尔曼滤波的Python代码示例。这个例子假设系统是一个匀速运动的目标,通过测量得到位置信息。请注意,这个例子中假设噪声是高斯分布的。

import numpy as np
import matplotlib.pyplot as plt# 系统参数
dt = 1  # 时间步长
A = np.array([[1, dt],[0, 1]])H = np.array([[1, 0],[0, 1]])B = np.array([[0.5 * dt**2],[dt]])Q = np.array([[0.01, 0],[0, 0.01]])  # 过程噪声协方差R = np.array([[0.1, 0],[0, 0.1]])   # 测量噪声协方差# 初始化
x_hat = np.array([[0],[0]])  # 初始状态估计
P = np.eye(2)  # 初始协方差矩阵# 模拟数据
true_states = np.array([[i, 2 * i] for i in range(100)])
measurements = true_states + np.random.multivariate_normal([0, 0], R, 100)  # 加入测量噪声# 卡尔曼滤波
filtered_states = []for z in measurements:# 预测步骤x_hat_minus = np.dot(A, x_hat) + np.dot(B, 1)P_minus = np.dot(np.dot(A, P), A.T) + Q# 更新步骤K = np.dot(np.dot(P_minus, H.T), np.linalg.inv(np.dot(np.dot(H, P_minus), H.T) + R))x_hat = x_hat_minus + np.dot(K, (z - np.dot(H, x_hat_minus)))P = np.dot((np.eye(2) - np.dot(K, H)), P_minus)filtered_states.append(x_hat.flatten())filtered_states = np.array(filtered_states)# 可视化结果
plt.figure(figsize=(12, 6))plt.plot(true_states[:, 0], true_states[:, 1], label='True States')
plt.scatter(measurements[:, 0], measurements[:, 1], color='red', marker='o', label='Measurements')
plt.plot(filtered_states[:, 0], filtered_states[:, 1], label='Filtered States', linestyle='dashed')plt.title('2D Kalman Filtering')
plt.legend()
plt.show()

这个例子中,系统状态是一个二维向量,表示目标在水平和垂直方向上的位置。通过模拟数据生成目标的真实运动轨迹,并在每个时刻添加高斯分布的测量噪声。卡尔曼滤波通过预测和更新步骤,对目标的状态进行估计,最终结果显示了真实状态、测量值和卡尔曼滤波估计的对比。

在实际应用中,系统动态模型 A A A、测量矩阵 H H H、过程噪声协方差 Q Q Q 和测量噪声协方差 R R R都需要根据具体情况进行调整。

六、卡尔曼滤波的应用场景

卡尔曼滤波在许多领域都有广泛的应用,特别适用于需要实时估计的系统,如:

  1. 导航系统: 用于飞行器、汽车等导航系统,通过融合GPS测量和惯性测量,提供准确的位置估计。
  2. 金融领域: 用于股票价格预测和投资组合管理,通过融合历史价格和实时市场数据,提供更稳健的估计。
  3. 机器人技术: 用于移动机器人的自我定位,通过融合传感器测量,提供准确的位置信息。

结论

卡尔曼滤波是一种强大的估计技术,通过有效地融合系统动态模型和测量数据,提供对系统状态的最优估计。本文深入解释了卡尔曼滤波的基本理论、数学公式的推导,并通过Python代码示例演示了其在实际应用中的效果。希望读者通过学习和实践更好地理解和应用卡尔曼滤波技术。

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

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

相关文章

基于SSM+vue的篮球场预约管理系统(Java毕业设计)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

Python 最新版本 3.12.1 环境配置(windows)

文章目录 python 3.12.1环境安装3.12.1 网盘下载3.12.1 官网下载 python 安装完成测试第一个 python 程序Hello Python python 3.12.1环境安装 3.12.1 网盘下载 python 3.12.1 百度网盘地址:https://pan.baidu.com/s/1SAcH_uH0T3DiERn6AZeQlg?pwd4242 提取码&a…

不同activity项目创建时的区别

在 Android Studio 中创建项目时,可以选择创建不同类型的 Activity 作为应用程序的入口点。其中,包括 Empty Activity、Basic Activity、Empty Compose Activity 和 Basic Compose Activity 四种类型。 Empty Activity:这是最简单的 Activity…

最新靠谱可用的-Mac-环境下-FFmpeg-环境搭建

最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事,Google 了 N 篇文章竟然没有一篇是可以跑起来的! 少部分教程是给出了自我矛盾的配置(是的,按照贴出来的代码和配置,他自己都跑不起来),大部…

【Leetcode】2182. 构造限制重复的字符串

文章目录 题目思路代码 题目 2182. 构造限制重复的字符串 问题:给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全…

【新年福利】买1送1,告别360!这个系统清理神器干净无广告!

在日常的工作中,面对重要文件时往往都会备份一份;在下载文件时,有时也会不小心把一份文件下载好多次。这些情况会导致电脑中出现重复的文件,删除这些重复文件,可以节省电脑空间,帮助提高电脑运行速度。那么…

mysql关于创建表的小试题

目录 例题: 解题思路及步骤: 实验步骤: 步骤一:创建数据库 步骤二:创建表 步骤三:插入数据 例题: 1、创建一个英雄表(hero),管于四大名著的主键 nam…

2-《Java并发编程实战》(Java Concurrency in Practice) 代码示例

说明 这是针对《Java并发编程实战》(Java Concurrency in Practice)一书中的示例代码进行扩展,并且进行验证的完整代码,具体背景可看这篇文章:1-《Java并发编程实战》(Java Concurrency in Practice) 代码示例 下面的示例代码都是针对书中的&…

Android Studio个性化修改

Android Studio原始界面看着也太无趣了叭,话不多说跟步骤走就可以。 1.更改Android Studio主题及背景 1.背景修改 File->Settings->Plugins,搜索Sexy Editor 重启后,左侧边栏出现Other Settings选项,点击SexyEditor进行背…

二分搜索边界问题的简单结论

引言 二分搜索是一个说简单也很简单(代码很固定,也没几行),说难也很难(边界问题可能会让人想不太清楚)。 事实上,边界问题也是是算法题中普遍存在的难点。 这篇文章讲两个简单的结论&#xff0…

009-Zynq基操之如何去玩转PL向PS的中断(对新手友好,走过路过千万不要错过)

文章目录 前言一、PL-PS的中断是啥?二、PL-PS端中断详细步骤1.ZYNQ核配置2.PS端中断函数配置3.需要拓展多个中断函数 总结 前言 本设计跟我的ZYNQ实战合集专栏中的脉冲触发电路有关系,也正好趁这个机会讲述一下PL-PS的中断系统,如何去触发中…

Java 设计模式

1.单例设计模式 对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 1.1 饿汉式 构造器私有化 --> 防止直接new类的内部创建对象提供一个static的public方法 getInstance class GirlFriend {private String name;private static GirlFri…

MySQL第二次

作业要求: 作业代码实现: create database db_04 default charsetutf8mb4;use db_04;create table if not exists t_hero(id int primary key auto_increment,name varchar(20) not null unique,nickname varchar(50) not null unique,address varchar…

【Python机器学习系列】建立KNN模型预测心脏疾病(完整实现过程)

这是Python程序开发系列原创文章,我的第198篇原创文章。 一、问题 对于表格数据,一套完整的机器学习建模流程如下: 针对不同的数据集,有些步骤不适用即不需要做,其中橘红色框为必要步骤,由于数据质量较高&…

4点优势,昂首资本使用浮动差价不使用固定差价的原因

在交易中,很多投资者和昂首资本一样,会使用浮动点差而不使用固定点差,那是因为投资者和昂首资本一样认为,使用浮动差价交易会比使用固定价差交易更有优势。 首先在大部分交易时段,价差缩小。正如投资者和昂首资本所知…

6. 逻辑删除

逻辑删除对应的是物理删除,分别介绍一下这两个概念: 物理删除 :指的是真正的删除,即:当执行删除操作时,将数据表中的数据进行删除,之后将无法再查询到该数据逻辑删除 :并不是真正意…

JavaScript常用事件详解

一、用于form(表单)的事件 在网页中经常会遇到一些表单的验证,是通过事件进行处理的,比如用户输入用户名之后,及时显示用户是否被注册 用于form(表单)的事件 事件名功能 onblur 当元素失…

数据挖掘实战-基于机器学习的电商文本分类模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

数据结构学习之顺序栈应用的案例(有效的括号)

实例要求: 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效; 有效字符串需满足的条件: 1、左括号必须用相同类型的右括号闭合; 2、左括号必须…

【面试合集】1.说说你对微信小程序的理解?优缺点?

面试官:说说你对微信小程序的理解?优缺点? 一、是什么 2017年,微信正式推出了小程序,允许外部开发者在微信内部运行自己的代码,开展业务 截至目前,小程序已经成为国内前端的一个重要业务&…