卡尔曼滤波:理论与代码

卡尔曼滤波:理论与代码

引言

卡尔曼滤波是一种用于估计系统状态的优化技术,特别适用于含有噪声的测量数据和系统动态变化的情况。本文将简单探讨卡尔曼滤波的理论基础、数学公式的推导,并通过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.mfbz.cn/a/316267.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python,序列的切片

序列的切片就是指从一个序列中取出子序列 语法: 序列[起始下标:结束下标:步长] 步长为1表示一个一个的取元素,步长为2表示每次跳过一个元素的取元素,步长为负数表示反向切片,取元素时取到结束下标&#…

养老数据监控大屏:护航金色晚年,打造智慧养老新标杆

随着老龄化社会的加速到来,养老服务的质量和效率成为了社会关注的焦点。如何运用现代科技手段提升养老服务水平,让老年人享受更加舒适、便捷的晚年生活,成为了我们面临的重要课题。在这一背景下,养老数据监控大屏应运而生&#xf…

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

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

API对象上千个,有啥关联性,kubectl-tree一键搞定

关注【云原生百宝箱】公众号,获取更多云原生消息 "kubectl-tree 是一款强大的 kubectl 插件,通过 ownerReferences 实现 Kubernetes 对象之间的所有权关系探索。相较于 kubectl lineage,它不仅更全面理解 API 对象的逻辑关系&#xff0c…

Linux第27步_在虚拟机中安装“设备树编译工具”

设备树英文名字叫做Device tree,用来描述板子硬件信息的,比如开发板上的 CPU有几个核 、每个CPU核主频是多少,IIC、SPI这些外设的寄存器范围是多少,IIC接口下都挂了哪些设备等等。 设备树文件是一种文本格式的文件,方…

超声波眼镜清洗机清洗眼镜会有伤害吗?适合洗眼镜超声波清洗机

眼镜作为日常生活中不可或缺的辅助视力工具,经常需要清洁保养以确保视力清晰和舒适佩戴。随着科技的发展,超声波眼镜清洗机成为越来越受欢迎的清洁方式。然而,很多人可能会担心使用超声波清洗机是否会对眼镜造成损害。但是可以很可以的告诉大…

基于cy7c68013的逻辑分析仪nanoDLA全套软件linux下编译测试

0. 环境 - win10 - ubuntu22 - nanoDLA 提前获取到源码:-> 浏览器打开 https://github.com/wuxx/nanoDLA -> Download as zip. 硬件就直接用taobao买到的,原理图是 1. win10出厂测试 1.1 安装pulseview nanoDLA-master\software\pulseview-0.4.…

深度学习烦人的基础知识(2)---Nvidia-smi功率低,util高---nvidia_smi参数详解

文章目录 问题现象解释解决方案 磨刀不误砍柴工--nvidia-smi参数解读 问题 如下图所示,GPU功率很低,Util占用率高。这个训练时不正常的! 现象解释 Pwr是指GPU运行时耗电情况,如图中GPU满载是300W,目前是86W与GPU2的…

【LeetCode:530. 二叉搜索树的最小绝对差 | 二叉搜索树】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Java--Spring项目生成雪花算法数字(Twitter SnowFlake)

文章目录 前言步骤查看结果 前言 分布式系统常需要全局唯一的数字作为id,且该id要求有序,twitter的SnowFlake解决了这种需求,生成了符合条件的这种数字,本文将提供一个接口获取雪花算法数字。以下为代码。 步骤 SnowFlakeUtils …

1Panel应用推荐:AList开源文件列表工具

1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…

C++力扣题目700--二叉搜索树中的搜索

给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,3], val 2 输出:[2,1,…

131本!2023中科院分区晋升1区期刊名单出炉

2023年12月27日,中科院分区正式发布《2023年中国科学院文献情报中心期刊分区表》。今年期刊分区表包括SCIE、SSCI、A&HCI,以及ESCI中国期刊,共设置了包括自然科学、人文科学和社会科学在内的21个大类。 关注公众号“Unionpub学术”&…

国际版WPS Office 18.6.1

【应用名称】:WPS Office 【适用平台】:#Android 【软件标签】:#WPS 【应用版本】:18.6.1 【应用大小】:160MB 【软件说明】:软件日常更新。WPS Office是使用人数最多的移动办公软件。独有手机阅读模式…

Vim一键配置指南,打造高效率C++开发环境

文章目录 前言安装与卸载功能演示gcc/g升级问题 前言 Vim作为当下最受欢迎的文本编译器之一,不仅具有强大的文本编辑功能,还提供了高度的可定制性。用户可以根据自己的喜好自定义配置,并且通过自己编写插件或者使用现有的插件来扩展Vim的功能…

【MATLAB】 多元变分模态分解MVMD信号分解算法

有意向获取代码,请转文末观看代码获取方式~ 1 基本定义 多元变分模态分解(MVMD)是一种信号分解方法,可以自适应地实现信号的频域剖分及各分量的有效分离。 MVMD算法的具体步骤如下: 假设原始信号S被分解为K个分量μ…

简易机器学习笔记(十一)opencv 简易使用-人脸识别、分类任务

前言 前段时间摸了下机器学习,然后我发现其实openCV还是一个很浩瀚的库的,现在也正在写一篇有关yolo的博客,不过感觉理论偏多,所以在学yolo之前先摸一下opencv,简单先写个项目感受感受opencv。 流程 openCV实际上已…

【机器学习】常见算法详解第2篇:K近邻算法各种距离度量(已分享,附代码)

本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用&#xff0…

个人的感悟观点,即将毕业的应届生的对自己未来方向的思考和认识

目录 复习历程思考 为什么我选择了考研 考完后我的状态 考完后我的做法 我对方向的看法(拙见) 复习历程思考 自我决定考研复习一刻开始。停更半年之久,甚至更长。没有分享自己的学习。在时常半年多的考研复习的过程中。我决定它带给我希…

什么是云服务器?云服务器的工作原理是介绍

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云百科aliyunbai…
最新文章