iEKF的二维应用实例

news2025/6/2 8:15:27

如果熟悉 EKF 与卡尔曼的推导的话,iEKF 就比较容易理解,关于卡尔曼滤波的推导以及EKF,可以参考以前的文章:

卡尔曼滤波原理:https://blog.csdn.net/a_xiaoning/article/details/130564473?spm=1001.2014.3001.5502

EKF:https://blog.csdn.net/a_xiaoning/article/details/132786569?spm=1001.2014.3001.5502

iEKF 简单理解就是在状态更新之后,多次迭代更新雅可比矩阵,状态估计,以及协方差矩阵,设定收敛条件与最大迭代次数,满足条件再退出迭代。

二维例子

假设有以下的一个二维运动模型:

其中 w 为过程噪声,过程噪声 w 与协方差矩阵 Q 满足:

量测模型为:

其中 v 为量测噪声,量测噪声 v 与协方差矩阵 R 满足:

进而求解 F 与 H 矩阵:

然后就可以编写python的测试代码:

import numpy as np
import matplotlib.pyplot as plt
"""    运动模型:    
x(k) = x(k-1) + x_dot(k-1) * dt + w(k, 0)    
y(k) = y(k-1) + y_dot(k-1) * dt + w(k, 1)    
x_dot(k) = x_dot(k-1) + ax * dt + w(k, 2)    
y_dot(k) = y_dot(k-1) + ay * dt + w(k, 3)    
w -- 过程噪声        
观测模型:    
z(k) = [x(k)  y(k)]' + v   
v--量测噪声"""
# F 为先验对 x 的偏导    H 为量测对 x 的偏导
# 系统参数
N = 100  # 采样个数
dt = 0.1  # 时间步长
# 初始状态 [x, y, x_dot, y_dot]
x_init = np.array([0.0, 0.0, 1.0, 1.0])
a_x = 0.1  # 加速度
a_y = 0.2  # 加速度
Q = np.diag([0.1, 0.1, 0.1, 0.1])   # 过程噪声
w = np.random.multivariate_normal(np.zeros(4), Q, N).T  # 生成过程噪声
R = np.diag([0.5, 0.5])
v = np.random.multivariate_normal(np.zeros(2), R, N).T  # 量测噪声
# 生成真实轨迹和观测数据
def generate_data(x_init, N, dt, a_x, a_y, w, v):
    x_real = np.zeros((N, 4))  # 真实状态 [x, y, dx, dy]    
    z = np.zeros((N, 2))  # 观测数据 [z_x, z_y]    
    x_real[0] = x_init
    for k in range(1, N):
        # 真实状态更新        
        x_real[k, 0] = x_real[k-1, 0] + x_real[k-1, 2] * dt + w[0, k]
        x_real[k, 1] = x_real[k-1, 1] + x_real[k-1, 3] * dt + w[1, k]
        x_real[k, 2] = x_real[k-1, 2] + a_x * dt + w[2, k]
        x_real[k, 3] = x_real[k-1, 3] + a_y * dt + w[3, k]
        # 观测模型        
        z[k, 0] = x_real[k, 0] + v[0, k]
        z[k, 1] = x_real[k, 1] + v[1, k]
    return x_real, z
# iEKF迭代
def iekf_step(x_hat, P, z, dt, Q, R, max_iter=10, epsilon=10):
    for k in range(1, N):
        # 时间更新        
        F = np.array([[1, 0, dt, 0],
                      [0, 1, 0, dt],
                      [0, 0, 1, 0],
                      [0, 0, 0, 1]])
        x_hat[k] = F @ x_hat[k-1]
        P_ = F @ P @ F.T + Q
        # 测量更新       
        for _ in range(max_iter):
            H = np.array([[1, 0, 0, 0],
                          [0, 1, 0, 0]])
            z_pred = H @ x_hat[k]
            y = z[k] - z_pred
            K = P_ @ H.T @ np.linalg.inv(H @ P_ @ H.T + R)
            x_hat_new = x_hat[k] + K @ y
            P_new = (np.eye(4) - K @ H) @ P_
            # 检查收敛            
            if np.linalg.norm(x_hat_new - x_hat[k]) < epsilon:
                x_hat[k] = x_hat_new
                P = P_new
                break            
                x_hat[k] = x_hat_new
                P = P_new
    return x_hat
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    # 生成真实轨迹与量测数据    
    x_real, z = generate_data(x_init, N, dt, a_x, a_y, w, v)
    # iEKF 估计    
    x_hat = np.zeros((N, 4))  # 估计状态    
    P = np.eye(4)  # 初始协方差矩阵    
    x_hat[0] = x_init
    x_hat = iekf_step(x_hat, P, z, dt, Q, R)
    # 绘制结果    
    plt.figure(figsize=(10, 6))
    plt.plot(x_real[:, 0], x_real[:, 1], label='True Trajectory', color='blue')
    plt.plot(x_hat[:, 0], x_hat[:, 1], label='Estimated Trajectory', color='red', linestyle='--')
    plt.scatter(z[:, 0], z[:, 1], label='Measurements', color='green', marker='o')
    plt.legend()
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.title('iEKF')
    plt.grid(True)
    plt.show()

运行结果:

可以调整一下迭代收敛的阈值,阈值越小的话,就会越相信量测值,例如把阈值调到很小,波形就会变成:

后续在实际项目中实践算法的优劣。

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

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

相关文章

【通关文件操作(下)】--文件的顺序读写(续),sprintf和sscanf函数,文件的随机读写,文件缓冲区,更新文件

目录 四.文件的顺序读写(续) 4.8--fwrite函数 4.9--fread函数 五.sprintf函数和sscanf函数 5.1--函数对比 5.2--sprintf函数 5.3--sscanf函数 六.文件的随机读写 6.1--fseek函数 6.2--ftell函数 6.3--rewind函数 七.文件缓冲区 7.1--fflush函数 八.更新文件 &…

mysql的Memory引擎的深入了解

目录 1、Memory引擎介绍 2、Memory内存结构 3、内存表的锁 4、持久化 5、优缺点 6、应用 前言 Memory 存储引擎 是 MySQL 中一种高性能但非持久化的存储方案&#xff0c;适合临时数据存储和缓存场景。其核心优势在于极快的读写速度&#xff0c;需注意数据丢失风险和内存占…

【数据结构】——二叉树堆(下)

一、堆中两个重要的算法 我们前面学习了树的概念和结构&#xff0c;还要树的一种特殊树--二叉树&#xff0c;然后我们学习了堆&#xff0c;知道了堆分为大堆和小堆&#xff0c;接下来我们就使用堆来进行一个排序。 在学习我们的堆排序前&#xff0c;我们先详细学习一下我们堆…

t009-线上代驾管理系统

项目演示地址 摘 要 使用旧方法对线上代驾管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在线上代驾管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题…

目标检测预测框置信度(Confidence Score)计算方式

预测框的置信度&#xff08;Confidence Score&#xff09;是目标检测模型输出的一个关键部分&#xff0c;它衡量了模型对一个预测框中包含特定类别对象的确定程度。 不同的目标检测模型&#xff08;如Faster R-CNN、SSD、YOLO、DETR等&#xff09;在计算置信度时有其特有的机制…

【题解-洛谷】B4295 [蓝桥杯青少年组国赛 2022] 报数游戏

题目&#xff1a;B4295 [蓝桥杯青少年组国赛 2022] 报数游戏 题目描述 某班级男生人数为 X X X 人&#xff0c;女生人数为 Y Y Y 人&#xff0c;现全班同学围成一个圆圈&#xff0c;并按照顺时针方向为每名同学编号&#xff08;从 1 1 1 到 X Y XY XY&#xff09;。现给…

Bootstrap项目 - 个人作品与成就展示网站

文章目录 前言一、项目整体概述1. 项目功能介绍1.1 导航栏1.2 首页模块1.3 关于我模块1.4 技能模块1.5 作品模块1.6 成就模块1.7 博客模块1.8 联系我模块 2. 技术选型说明 二、项目成果展示1. PC端展示1.1 首页1.2 关于我1.3 技能1.4 作品1.5 成就1.6 博客1.7 联系我 2. 移动端…

新能源汽车霍尔线束介绍

新能源汽车作为传统燃油车的重要替代方案&#xff0c;其核心驱动系统依赖于高效、精准的电子控制技术。在这一体系中&#xff0c;霍尔线束作为关键传感器组件&#xff0c;承担着电机转速、位置信号的实时采集与传输任务&#xff0c;其性能直接影响整车动力输出的稳定性和能量利…

气镇阀是什么?

01、阀门介绍&#xff1a; 油封机械真空泵的压缩室上开一小孔&#xff0c;并装上调节阀&#xff0c;当打开阀并调节入气量&#xff0c;转子转到某一位置&#xff0c;空气就通过此孔掺入压缩室以降低压缩比&#xff0c;从而使大部分蒸汽不致凝结而和掺入的气体一起被排除泵外起此…

SmolVLM2: The Smollest Video Model Ever(七)

编写测试代码与评价指标 现在的数据集里面只涉及tool的分类和手术phase的分类&#xff0c;所以编写的评价指标还是那些通用的&#xff0c;但是&#xff1a; predicted_labels:[The current surgical phase is CalotTriangleDissection, Grasper, Hook tool exists., The curre…

RFID综合项目实训 | 基于C#的一卡通管理系统

目录 基于C#的一卡通管理系统 【实验目的】 【实验设备】 【实验内容】 【实验步骤】 实验准备 第一部分 界面布局设计 ​第二部分 添加串口通讯函数及高频标签操作功能函数(部分代码&#xff09; 第五部分 实验运行效果 基于C#的一卡通管理系统 【实验目的】 熟悉 …

mysql如何设置update时间字段自动更新?

之前在给网站做表设计的时候时间字段都是用的datetime类型&#xff0c;初始值都是设置的CURRENT_TIMESTAMP。 由于给文章表设计的有创建时间和更新时间两个字段&#xff0c;但是更新时间字段需要在更新文章后再次更新&#xff0c;当时由于不了解mysql还可以设置自动更新时间戳…

【第4章 图像与视频】4.5 操作图像的像素

文章目录 前言示例-获取和修改图像数据图像数据的遍历方式图像滤镜负片滤镜黑白滤镜浮雕滤镜filter滤镜属性 前言 getImageData() 与 putImageData() 这两个方法分别用来获取图像的像素信息&#xff0c;以及向图像中插入像素。与此同时&#xff0c;如果有需要&#xff0c;也可…

Science Advances 上海理工大学与美国杜克大学(Duke University)共同开发了一种仿生复眼相机

编辑丨%科学家开发了一种 AI 辅助的仿生复眼相机。炎炎夏日&#xff0c;相信各位读者都有被蚊子骚扰过的恼火记忆。但往往想要清剿蚊子的时候&#xff0c;却被它灵巧地躲开&#xff0c;再难找到。诸如蚊子这种节肢动物的视觉系统已经进化了 5 亿多年&#xff0c;从寒武纪一直到…

正点原子Z20 ZYNQ ​​​开发板​​发布!板载FMC LPC、LVDS LCD和WIFI蓝牙等接口,资料丰富!

正点原子Z20 ZYNQ ​​​开发板​​发布&#xff01;板载FMC LPC、LVDS LCD和WIFI&蓝牙等接口&#xff0c;资料丰富&#xff01; 正点原子新品Z20 ZYNQ开发板来啦&#xff01;核心板全工业级设计&#xff0c;主控芯片型号是XC7Z020CLG484-2I。开发板由核心板底板组成&…

软件测评中心如何确保软件品质?需求分析与测试计划很关键

软件测评中心承担着对软件进行评估、测试和审查的任务&#xff0c;它有一套规范的流程来确保软件的品质&#xff0c;并且能够向客户和开发者提供详实的软件状况分析报告。 需求分析环节 这一环节至关重要&#xff0c;必须与客户和开发团队保持密切交流。我们需要从他们那里精…

2025LitCTF 复现

easy_file 登录界面 尝试admin 和密码1 没成功 结果尝试了弱口令 admin 用户和 password 密码就登录成功了 文件上传 新建一个空的 新建木马.txt 文件发现上传成功 然后写入一句话木马 <?php eval($_POST[a]); ?> 上传失败 说明可能是有字符被过滤了&#xff0c;猜…

使用C# 快速删除Excel表格中的重复行数据-详解

目录 简介 使用工具 C# 删除Excel工作表中的重复行 C# 删除指定Excel单元格区域中的重复行 C# 基于特定列删除重复行 RemoveDuplicates 方法快速比较 简介 重复行是指在Excel表格中完全相同的多行数据。这些冗余行的存在可能源于多种原因&#xff0c;例如&#xff1a; …

WPF-Prism学习笔记之 “导航功能和依赖注入“

新建空白模板(Prism) 新建好后会有自动创建ViewModels和Views 在"MainWindow.xaml"文件里面标题去绑定了一个属性"Title"&#xff0c;而"MainWindowViewModel.cs"里面继承一个非常重要的"BindbleBase"(prism框架里面非常重要的)。所以…

中国城市间地理距离矩阵(2024)

1825 中国城市间地理距离矩阵(2024) 数据简介 中国城市间地理距离矩阵数据集&#xff0c;通过审图号GS(2024)0650的中国城市地图在Albers投影坐标系中进行计算得出矩阵表格&#xff0c;单位为KM&#xff0c;方便大家研究使用。 中国城市地理距离矩阵数据通过计算城市中心距离…