卡尔曼滤波器设计及实例

news2024/11/19 18:40:00

1 卡尔曼滤波器基本原理

卡尔曼滤波常用于动态多变化系统中的状态估计,是一种通用性强的自回归滤波器。它的由来和NASA登月有关。其发明者鲁道夫.E.卡尔曼在一次访问NASA的时候,发现阿波罗计划中一个难点是轨道预测问题,因而提出了一种滤波器,可以帮助高效预测轨迹,辅助导航。NASA最终使用了这个滤波器,然后成功实现人类第一次登月计划。卡尔曼滤波器由此得名。

卡尔曼滤波器可以用来估计不确定信息,并给出状态量下一时刻的情况。即便在有噪声干扰的情况下,也可以较好的预测下一状态的情况,并找出多变量间不易察觉的相关性。因而卡尔曼滤波器可以很好适应不断变化的系统,并且内存占用量低,推理速度快,比较适合资源受限制的场景。

对于一个离散系统,其离散状态方程描述为:

其中u(k)是系统控制输入,w(k)是系统随机噪声。假设输出y(k)其测量值为z(k)。

则实施卡尔曼滤波器的步骤为:

1 初始化矩阵P,Q,R

其中P和Q是与转移矩阵A同秩的协方差方阵,R是1X1维的常量。

2 对于观测的每一拍k执行预测和更新操作:

Step1:按照状态方程计算新的状态变量X(k+1)

Step2:更新协方差矩阵P(k)

Step3:计算卡尔曼增益K(k+1)

Step4:利用测量值z(k)来更新状态变量X(k+1)

Step5:更新协方差矩阵P(k+1)

2 卡尔曼实例

假设有一辆小车,装有加速度传感器,可以测量小车的加速度a。并装有超声光学传感器,可以实时测量光从光源到达小车的时间Zt。采样时间间隔Ts,光速为c。请估计小车的速度和位置。

 对于这个例子,设状态变量为位置s和速度v。设控制变量u为加速度a。输出变量设置为观测时间Zt。根据关系式:

则可以写出如下状态方程:

用Ts采样时间离散化后状态方程为:

3 Python程序实现及仿真结果

 

import numpy as np
from matplotlib import pyplot as plt


C = 100  # velocity of light, just a simulation value
# generate perfect acceleration and corresponding velocity and distance
# 生成没有噪声的加速度信号,并用积分计算出对应的速度和距离 ---------------------------------
N_steps = 1000  # 1000 steps to estimate
Ts = 0.05  # time interval is 0.05s
timeline = np.arange(N_steps) * Ts  # \Delta t = 0.05s
accs_gt = np.sin(timeline)  # set accelerator as a log shape
vels_gt = np.cumsum(accs_gt*Ts)  # get the ground truth velocity;速度是加速度的积分
dists_gt = np.cumsum(vels_gt*Ts)  # get the ground truth distance; 距离是速度的积分
zs_gt = dists_gt/C
#----------------------------------

# add noise to acceleration signals and calculate the velocity and distance with simple integral
# 往加速度信号添加噪声模拟真实传感器信号,并用简单的积分计算速度和距离
accs_noise_var = 0.005  # set acceleration noise variation as 0.5
accs_noise = np.random.rand(N_steps) * accs_noise_var  # 注意,这里使用均匀分布模拟噪声,以模拟不知道真实噪声分布情况
accs_w_noise = accs_gt + accs_noise
vels_w_noise = np.cumsum(accs_w_noise*Ts)
# vels_w_noise = np.cumsum(accs_noise * Delta_t)
dists_w_noise = np.cumsum(vels_w_noise*Ts)
zs_noise_var = 0.001
zs_noise = np.random.rand(N_steps) * zs_noise_var  # 注意,这里使用均匀分布模拟噪声,以模拟不知道真实噪声分布情况
zs_w_noise = zs_gt + zs_noise
#---------------------------------
VIS_DATA = True
if VIS_DATA:
    fig = plt.figure()
    ax11 = fig.add_subplot(421)
    ax11.plot(timeline, accs_gt)
    ax11.set_title("Acceleration Ground Truth")

    ax12 = fig.add_subplot(422)
    ax12.plot(timeline, accs_w_noise)
    ax12.set_title("Acceleration With Noise")



    ax21 = fig.add_subplot(423)
    ax21.plot(timeline, vels_gt)
    ax21.set_title("Velocity Ground Truth")

    ax22 = fig.add_subplot(424)
    ax22.plot(timeline, vels_w_noise)
    ax22.set_title("Velocity With Noise")


    ax31 = fig.add_subplot(425)
    ax31.plot(timeline, dists_gt)
    ax31.set_title("Distance Ground Truth")

    ax32 = fig.add_subplot(426)
    ax32.plot(timeline, dists_w_noise)
    ax32.set_title("Distance With Noise")

    ax41 = fig.add_subplot(427)
    ax41.plot(timeline, zs_gt)
    ax41.set_title("Measurment Ground Truth")

    ax42 = fig.add_subplot(428)
    ax42.plot(timeline, zs_w_noise)
    ax42.set_title("Measurment With Noise")
    # plt.show()
    plt.subplots_adjust(wspace =0, hspace =0.5)#调整子图间距

# ------------------------------------------------------------------------------------------

A = np.array([
    [1, Ts],
    [0, 1]
])  # 状态转移矩阵
B = np.array([
    [Ts**2*0.5],
    [Ts]
])  # 控制转移矩阵
Q_var = 0.005
Q = np.array([
    [Q_var, 0],
    [0, Q_var]
])  # 预测噪声协方差矩阵
P0 = np.array([
    [0.0, 0],
    [0.0, 0]
])  # 状态向量协方差初始值
H = np.array([
1/C, 0
]).reshape((1,2))  # 测量转换矩阵
R_var = 0.001 
R = R_var  # 测量协方差矩阵,此时只有一个测量变量,因此只有一个值

x0 = np.array([
    [0],
    [0]
])  # 系统状态向量初始化,速度和距离均初始化为0

x_t_ = None  # predicted system state vector
x_t = None  # corrected system state vector
P_t_ = None  # covariance matrix of predicted state vector
P_t = None  # covariance matrix of corrected state vector
K = None

est_vel = [0]
est_dist = [0]
for i in range(N_steps):
    if i == 0:
        x_t = x0
        P_t = P0
        continue
    u = np.array([accs_w_noise[i]])
    x_t_ = A@x_t + B*u  # 预测方程
    P_t_ = A@P_t@(A.T) + Q  # 预测状态向量的协方差矩阵
    

    K = P_t_@H.T / (H@P_t_@H.T + R)  # 卡尔曼增益
    x_t = x_t_ + K*(zs_w_noise[i] - H@x_t_)  # 更新方程
    P_t = P_t_ - K@H@P_t_  # 更新状态向量协方差矩阵

    est_vel.append(x_t[1][0])
    est_dist.append(x_t[0][0])

est_vel = np.array(est_vel).reshape(-1)
est_dist = np.array(est_dist).reshape(-1)
diff_vel_est = est_vel - vels_gt
diff_dist_est = est_dist - dists_gt
diff_vel_sum = vels_w_noise - vels_gt
diff_dist_sum = dists_w_noise - dists_gt


# print(est_vel)
fig2 = plt.figure()
ax2_11 = fig2.add_subplot(231)
ax2_11.plot(timeline, est_vel)
ax2_11.set_title("Estimated velocity")

ax2_12 = fig2.add_subplot(232)
ax2_12.plot(timeline, diff_vel_est)
ax2_12.set_title("Error - Vel - KalmanFilter")

ax2_13 = fig2.add_subplot(233)
ax2_13.plot(timeline, diff_vel_sum)
ax2_13.set_title("Error - Vel - Simple integration")

ax2_21 = fig2.add_subplot(234)
ax2_21.plot(timeline, est_dist)
ax2_21.set_title("Estimated distance")

ax2_22 = fig2.add_subplot(235)
ax2_22.plot(timeline, diff_dist_est)
ax2_22.set_title("Error - Dist - KalmanFilter")

ax2_23 = fig2.add_subplot(236)
ax2_23.plot(timeline, diff_dist_sum)
ax2_23.set_title("Error - Dist - Simple integration")


plt.show()

参考:


卡尔曼滤波实战 | 形象化理解卡尔曼滤波(附源码)

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

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

相关文章

揭开黑客的神秘面纱:黑客文化、技术手段与防御策略

目录 1. 引言1.1 黑客的定义与起源1.2 黑客文化的形成与传承 2. 黑客的分类与目标2.1 道德黑客与恶意黑客2.2 黑客攻击的目标与动机解析 3. 黑客的技术手段3.1 网络入侵与渗透测试3.2 社会工程学与钓鱼攻击3.3 恶意软件与病毒传播3.4 数据泄露与身份盗窃 4. 防御黑客攻击的策略…

微信公众号怎么变更认证主体?

公众号迁移有什么作用?只能变更主体吗?公众号迁移是将原公众号的粉丝、违规记录、文章和素材库(可选)迁移至一个新的公众号。整体流程较为复杂,需花费7-10天。通过公众号迁移功能可以将A账号的粉丝、文章素材&#xff…

Bridge Champ助力我国桥牌阔步亚运, Web3游戏为传统项目注入创新活力

本届杭州亚运会,中国桥牌队表现杰出,共斩获1金1银1铜佳绩,其中女子团体夺得冠军,混合团体获得亚军。这充分展现了我国桥牌的实力,也彰显了桥牌作为亚运会体育竞技项目的影响力。与此同时,Web3游戏Bridge Champ为传统桥牌项目带来创新模式,将有望推动桥牌运动在亚运舞台上焕发新…

Node.js操作MySQL8.0数据库无法连接

Node.js操作MySQL8.0数据库无法连接 原创:丶无殇  2023-10-07 报错内容 使用node.js连接数据库MySQL 8时候,报错ER_NOT_SUPPORTED_AUTH_MODE,并且提示Client does not support authentication protocol requested by server; consider upg…

blender UV展开

快捷键:选面可以一点,选线或点变形,g 移动,l 孤岛化 a全选 在Shading视图下,给mesh建立一个栅格图的纹理 变成这个样子 UV实时展开: 在UV editing模式下,打开左右实时同步 焊接shift选中左边两个…

张量-形状变换相关函数

tf.shape(input,name None)它有两个参数,input和name,input可以是一个张量,也可以是一个数组和list。该函数返回的是input的形状(shape),而且一个类型为int32的张量。 示例代码如下: import tensorflow.compat.v1 as tf tf.disable_v2_behavior()array [[[1,1,1],[2,2,2]],…

第三课-软件升级-Stable Diffusion教程

前言: 虽然第二课已经安装好了 SD,但你可能在其它地方课程中,会发现很多人用的和你的界面差距很大。这篇文章会讲一些容易忽略或者常常需要做的操作,不一定要完全照做,以后再回过头看看也可以。 1.控制类型 问题:为什么别人有“控制类型”部分,而我没有?如下红色方框…

微软AD身份增强方案,让IT运维省心更高效

Windows AD域为企业数字化办公提供了强有力的支撑,但由于互联网技术的飞速发展,AD域在现代企业办公场景中也面临了一些挑战。 某企业使用AD域控管理工具,在对接邮箱、电脑、网络时均会用到AD域账号。出于安全考虑,公司要求每三个月…

3D模型格式转换工具HOOPS Exchange助力Halocline开发VR

挑战: 支持客户群使用各种CAD系统和CAD文件格式。快速准确的加载可视化硬件数据。提供访问模型详细信息,同时确保高帧频性能。 结果: 确保支持标准文件格式和来自领先工程软件包的CAD数据。 通过查看简化模型或根据需要访问高层次的细节&am…

第五课 树与图

文章目录 第五课 树与图lc94.二叉树的中序遍历--简单题目描述代码展示 lc589.N叉树的层序遍历--中等题目描述代码展示 lc297.二叉树的序列化和反序列化--困难题目描述代码展示 lc105.从前序与中序遍历序列构造二叉树--中等题目描述代码展示 lc106.从中序与后序遍历序列构造二叉…

JavaScript入门——基础知识(3)

一、运算符 1.1 赋值运算符 目标:能够通过使用赋值运算符简化代码 赋值运算符:对变量进行赋值的运算符 将等号右边的值赋予给左边,要求左边必须是一个容器其他赋值运算符: -*/%使用这些运算符可以在对变量赋值时进行快速操作 例…

基于vue的MOBA类游戏攻略分享平台springboot23

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

PHP 个人愿望众筹网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 个人愿望众筹网站系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php 个人愿望众筹网站 代码 https://download.csdn.net/download/qq_41221322/8…

从一坨代码说起

一、前言 下图所示这一坨代码是为了生成HTML格式邮件正文内容,如果邮件内容要稍微调整一下,这种代码怎么维护? 好吧,其实这是一篇与邮件有关的文章,SMTP发送邮件 介绍了邮件发送各种方式及SMTP各种端口,从…

回顾C++

大一的时候学过C,当时学得也不深,考试也是糊弄过去的,最近刷力扣的时候,决定一边刷题,一边复习和学习C,在此记录一些C的知识点。反正遇到一点就记录一点,会一直更新。

如何清理C盘

当前最棘手的问题是C盘满了,如何清理成了一个大问题,在本篇文章中我将记录我在清理c盘空间过程中的探索。 2023-10-06探索无果,记录于此。

浪涌保护器的P数是什么,选型浪涌保护器注意事项

浪涌保护器是一种用于保护电气设备免受雷电或其他瞬态过电压影响的装置,它可以将过高的电压限制在安全的范围内,并将多余的电流导入地线,从而避免设备损坏。浪涌保护器的P数是指它的保护模式,也就是它可以在哪些线路之间提供保护。…

xxl-job使用(小白也看得懂)

分布式任务调度 在微服务架构体系中,服务之间通过网络交互来完成业务处理的,在分布式架构下,一个服务往往会部署多个实例来运行我们的业务,如果在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度。 在当体…

FFmpeg 命令:从入门到精通 | 命令行环境搭建

FFmpeg 命令:从入门到精通 | 命令行环境搭建 FFmpeg 命令:从入门到精通 | 命令行环境搭建安装 FFmpeg验证 FFmpeg 是否安装成功 FFmpeg 命令:从入门到精通 | 命令行环境搭建 安装 FFmpeg 进入 FFmpeg 官网: 点击 Download&#…

河北吉力宝:国内顶尖资源荣誉共筑全景融合新商业生态

随着科技的不断发展和社会的进步,新兴企业纷纷崭露头角,展现出令人瞩目的商业潜力。随着科技的不断演进和社会的持续进步,新兴企业正崭露头角,显露出巨大的商机。在这个时代,合作和资源整合变得至关重要。河北吉力宝智…