离散卡尔曼滤波实现

news2024/12/24 8:35:49

离散卡尔曼滤波基本理论

卡尔曼预报器、平滑器可以参考之前的博客:(2条消息) 卡尔曼滤波器_KPer_Yang的博客-CSDN博客

下面贴上一张图1,很直观:分成时间更新和测量更新两步,其中的 K K K P P P有可能随着时间推移变成常数,但是多数情况是变化的,如果是常数,可以离线计算在线使用,可以减少很多在线计算量。 K K K代表着观测值和状态空间计算值的不同比重,得到一个估计值作为输出。初始化观测噪声协方差矩阵 R R R可以使用离线数据。初始化过程噪声矩阵 Q Q Q比较困难。可以使用另一个卡尔曼滤波器离线进行估计,再实际使用。

陀螺仪的卡尔曼滤波参数初始化可以参考这种(其中q和r参数尤为重要,一般得通过实验测试得到):2

  1. init_x:待测量的初始值,如有中值一般设成中值
  2. init_p:后验状态估计值误差的方差的初始值
  3. q:预测(过程)噪声方差
  4. r:测量(观测)噪声方差。以陀螺仪为例,测试方法是:保持陀螺仪不动,统计一段时间内的陀螺仪输出数据。数据会近似正态分布,按3σ原则,取正态分布的(3σ)^2作为r的初始化值。

在这里插入图片描述

numpy实现

import numpy as np


class DiscreteSystem:
    """
    离散系统
    """

    def __int__(self,
                A: np.array, B: np.array, Q: np.array,
                H: np.array, R: np.array, X: np.array,
                Z: np.array, U: np.array):
        self.A = A  # 状态转移矩阵 nxn
        self.B = B  # 输入矩阵 nxl,只有加入控制量才有用到,一般滤波没有用到
        self.Q = Q  # 过程噪声 p(w)~N(0, Q),Q难估算,离散数据需要另一个卡尔曼滤波进行估算
        self.H = H  # 观测矩阵 mxn
        self.R = R  # 测量噪声 p(v)~N(0, R),R可以通过离线数据计算
        self.X = X  # 状态变量 nx1
        self.Z = Z  # 观测值 mx1
        self.U = U  # 控制量 lx1


class Kalman_Filter:
    """
    卡尔曼滤波
    """

    def __init__(self, discrete_system: DiscreteSystem, estimation_init: np.array, P_init: np.array):
        """
        初始化
        :param discrete_system: 离散系统
        :param estimation_init: 估计值初始化
        :param P_init: P初始化
        """
        self.discrete_system = discrete_system
        self.estimation = estimation_init
        self.P = P_init  # P会趋向于稳定

    def forward(self, Z: np.array) -> np.array:
        """
        一步卡尔曼滤波
        :param Z:观测值
        :return:估计值
        """
        self.estimation = Z
        self.discrete_system.Z = Z
        X_right_top_hat_ = self.discrete_system.A @ self.estimation + self.discrete_system.B @ self.discrete_system.U
        P_right_top_ = self.discrete_system.A @ self.P @ np.transpose(self.discrete_system.A) + self.discrete_system.Q
        # 计算增益
        K = P_right_top_ @ np.transpose(self.discrete_system.H) \
            @ np.linalg.inv(self.discrete_system.H @ P_right_top_ @ np.transpose(self.discrete_system.H) + self.discrete_system.R)
        self.estimation = X_right_top_hat_ + K @ (Z - self.discrete_system.H @ X_right_top_hat_)
        # 计算误差协方差矩阵,会随着不断迭代趋于稳定
        self.P = P_right_top_ - K @ self.discrete_system.H @ P_right_top_
        return self.estimation


if __name__ == '__main__':
    # 1、初始化离散系统DiscreteSystem
    # 2、初始化卡尔曼滤波 Kalman_Filter
    # 3、使用观测值循环调用 卡尔曼滤波step
    ...

参考:


  1. An Introduction to the Kalman Filter ↩︎

  2. Kalman滤波器从原理到实现 - 莫水千流 - 博客园 (cnblogs.com) ↩︎

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

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

相关文章

STM32实战总结:HAL之RTC

RTC基础知识参考: 51单片机内部外设:实时时钟(SPI)_路溪非溪的博客-CSDN博客 STM32中的RTC 51单片机通常是外置的RTC芯片如DS1302,那么STM32的RTC是什么情况呢? STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。 先…

年末盘点Android 过去一年与未来的一个走势~

随着Android的发展,有些人对Android未来感到茫然,不少人可能会产生这样的疑惑:“从事Android是不是没有前途,Android开发还有什么值得学?“这类话题一直让大家争论不休,它并没有一个确切、唯一的标准答案&a…

中介者模式

思考中介者模式 当多个类(对象)耦合严重时,通过中介者模式创建一个中介者,多个类不直接交互了,变成和中介者进行交互,松散耦合 1.中介者模式的本质 中介者模式的本质:封装交互。 中介者模式的目的&#xff…

关于无感刷新Token,我是这样子做的

本文正在参加「金石计划 . 瓜分6万现金大奖」 什么是JWT JWT是全称是JSON WEB TOKEN,是一个开放标准,用于将各方数据信息作为JSON格式进行对象传递,可以对数据进行可选的数字加密,可使用RSA或ECDSA进行公钥/私钥签名。 使用场景…

WPSpell将拼写检查添加到VCL应用程序

WPSpell将拼写检查添加到VCL应用程序 WPSpell包括键入功能时的拼写。拼写错误的单词带有下划线,可以使用上下文菜单进行更正。它还包括一个传统的拼写检查对话框,并支持多个词典。WPSpell特别适合与WPTools一起使用。 WPSpell功能 键入时进行拼写检查。 …

1-FreeRTOS入门指南

本专栏是根据官方提供的文档进行FreeRTOS的各个功能函数的说明,以及函数的使用 本专栏不涉及动手操作,只是对原理进行说明,FreeRTOS基础知识篇更新完成会对如何在开发板上进行上手实战操作。 这里不会对比其他RTOS的优缺点,因为每…

2、Redis中简单动态字符串的简介,也就是Redis中的键和值的字符串底层表达

简介 首先在Redis中,没有直接使用C语言传统字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型(可以简单的理解为Java中的String 类),并且将SDS用作Redis的默…

动态规划算法(1)

认识动态规划 动态规划的求解思路: 1. 把一个问题分解成若干个子问题 2. 将中间结果保存以避免重复计算 基本步骤: 1. 找出最优解的性质,然后刻画结构特征 (找规律) 2. 最优解(最好的解决方案 定义) 循环(递归) 3. 以…

我与梅西粉丝们的世界杯观球日常

世界杯 ⚽️ 期间,我与其他的梅西粉丝在某 APP 里建了个梅粉聊天群,群内人数上万人,大家一起讨论赛事热点,可谓热火朝天,此起彼伏,这是四年一度的狂欢,虽值冬季,但热情不减。 “阿根…

配置设备远程管理—eNSP

案例:给路由器配置远程管理,使一台路由器远程管理另一台。 所需设备:两台路由器,一根网线 图示 一、给两台设备配置IP地址 AR1(以下命令) a. sy b. int g0/0/0 c. ip add 1.1.1.1 24AR2 a. sy b. int g0/0…

十分钟学完简单工厂,普通工厂,抽象工厂

快速学习简单工厂,普通工厂,抽象工厂前言:产品等级和产品族工厂模式作用简单工厂模式uml代码优缺点普通工厂模式uml代码优缺点抽象工厂模式uml代码优缺点前言:产品等级和产品族 在学习工厂模式之前,先得了解一下产品等…

Redis实践

一、持久化 Redis 的数据 全部存储 在 内存 中,如果 突然宕机,数据就会全部丢失,因此必须有一套机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的 持久化机制,它会将内存中的数据库状态 保存到磁盘 …

Spring——AOP原理及流程详解

AOP原理及流程详解一、AOP结构介绍Pointcut通知原理连接点拦截器二、Bean介入点EnableAspectJAutoProxyAspectJAutoProxyRegistrarAnnotationAwareAspectJAutoProxyCreatorAbstractAutoProxyCreator实例前执行初始化后执行循环依赖会调用总结三、处理切面获取所有切面其下通知方…

国内饮料行业数据浅析

大家好,这里是小安说网控。 饮料一直深得年轻人的宠爱,主要消费品类为饮用水、碳酸饮料、奶制品、气泡水等。刚刚过去的十月份,我国饮料产量当期值1199.6万吨,同比下降6.1%;今年1-10月份,饮料产量累计值157…

这几个点让我买了Watch Ultra

01.凑够Apple 全家桶 MacBook ProiPhoneAirPodsiPad 02.可以解锁iPhone手机,MacBook,iPad 03.当iPhone 来电话,不方便接听,可以使用Watch接听(虽然这种情况挺少) 04.可以连接AirPods 听音乐 05.花10元钱开卡,iPhone和Watch 可以…

前端ES6-ES11新特性

ES6新特性 变量声明 let a; let b,c,d; let e 100; let f 521, g iloveyou, h [];块级作用域 {let girl 周扬青; }console.log(girl); //这里会报错,变量不在作用域内,用var声明就可以常量声明 const NAME tom; //必须赋予初始值,变量名大写&am…

3-7数据链路层-设备

文章目录一.网桥1.基本原理2.透明网桥(1)工作原理(2)自学习算法3.源路由网桥二.局域网交换机1.局域网交换机2.原理3.特点4.两种交换模式5.交换机的自学习算法一.网桥 网桥根据MAC帧的目的地址对帧进行转发和过滤。当网桥收到一个…

Java中数组、集合初始化及遍历方式

一、数组 1. 一维数组 一维数组两种初始化方式 静态初始化 int[] array {1,2,3};int[] array new int[]{1,2,3};动态初始化 int[] array new int[3]; array[0]1; array[1]2; array[2]3;一维数组两种遍历方式 普通for循环for (int i 0; i < array.length; i) {System.ou…

全家桶Spring、HikariCP、Mybatis和Oracle配置,你想要的都在这里

目录1、HikariCP配置说明2、spring配置文件里&#xff0c;配置HikariCP数据库连接池3、注意连接池大小设置&#xff0c;重点推荐官方说明文档4、HikariCP配置5、数据库配置文件1、HikariCP配置说明 HikariCP: https://github.com/brettwooldridge/HikariCP 2、spring配置文件…

毕业设计-机器学习人眼检测活体检测-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…