扩展卡尔曼滤波技术(Extended Kalman Filter,EKF)

一、概念介绍

卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全包含噪声的测量中,估计动态系统的状态,然而简单的卡尔曼滤波必须应用在符合高斯分布的系统中。

扩展卡尔曼滤波就是为了解决非线性问题,普通卡尔曼滤波只能应用于线性空间的问题。当系统为线性高斯模型时,滤波器能给出最优的估计,但是实际系统总是存在不同程度的非线性,如平方、三角关系、开方等。对于非线性系统,可以采用的一种方法是通过线性化方法将非线性系统转换为近似的线性系统,即为EKF,核心思想是:围绕滤波值将非线性函数展开成泰勒级数并略去二阶及以上项,得到一个近似的线性化模型,然后应用卡尔曼滤波完成状态估计。

卡尔曼滤波是贝叶斯滤波的一个特例。(当贝叶斯滤波中系统状态的置信度分布符合高斯分布时,贝叶斯滤波=卡尔曼滤波)

二、数学表达

系统定义为:

  • 线性运动方程: $x_k=Ax_{k-1}+Bv_k+Gw_k,k=1,\ldots,K$
  • 非线性运动方程:$x_k=f(x_{k-1},v_k)+w_k$
  • 线性观测方程: $y_k=C_kx_k+n_k,k=1,\ldots,K$
  • 非线性观测方程:$y_k=h(x_k)+n_k$
  • 初始条件: $x_0\sim N(\check{x_0},\check{P_0}),w_k\sim N(0,Q),n_k\sim N(0,R)$

并使用\check{\left ( \cdot \right )}表示先验,\hat{\left ( \cdot \right )}表示后验(即最佳估计值)。

1、线性卡尔曼滤波

预测

  • 先验状态估计:

\check{x}=A\hat{x_{k-1}}+Bv_k

  • 先验误差协方差:

\check{P_k}=\hat{AP_{k-1}A^T}+GQG^T

校正

  • 卡尔曼增益:

K_k=\check{P}_kC_k^T(C_k\check{P}_kC_k^T+R)^{-1}

更新

  • 更新后验状态估计:

\hat{x_k}=\check{x_k}+K_k(y_k-C_k\check{x_k})

  • 更新后验误差协方差:

\hat{P_k}=(I-K_kC_k)\check{P_k}

2、扩展卡尔曼滤波

非线性方程线性化

非线性的状态方程和观测方程表示为如上所示,符合正态分布的噪声数据在经过非线性转换后不再是正态分布的随机变量了,此处使用近似处理: 假设噪声符合上述正态分布,而且它们为相互独立、正态分布的白噪声(即把噪声从非线性函数中拿出来)。在后续的线性化过程中,这部分因为以上近似而产生的偏差会得到恢复 (近似地恢复) 。

对以上非线性方程(状态方程和观测方程)进行线性化,具体方法为一阶泰勒展开,忽略高阶项:

$ x_k\approx\check{x}_k+A_{k}(x_{k-1}-\hat{x}_{k-1})+W_kw_k $
$y_k\approx\check{y}_k+H_k(x_k-\check{x}_k)+V_kv_k$

其中:
$A_k$$k$时刻$f$$x$的雅克比矩阵;

$H_k$$k$时刻$h$$x$的雅克比矩阵;

$W_k$$k$时刻$f$$w$的雅克比矩阵;

$V_k$$k$时刻$h$$\upsilon$的雅克比矩阵。

\begin{aligned}&A_{k}=\frac{\partial f(x_{k-1},v_k,w_k)}{\partial x_{k-1}}|_{\hat{x_{k-1}},v_k,0} \\&H_k=\frac{\partial h(x_k,n_k)}{\partial x_k}|_{\check{x_k},0} \\&W_{k}=\frac{\partial f(x_{k-1},v_k,w_k)}{\partial w_{k-1}}|_{\hat{x_{k-1}},v_k,0} \\&V_k=\frac{\partial h(x_k,n_k)}{\partial v_k}|_{\check{x_k},0} \end{aligned}

预测

  • 先验状态估计:

\check{x}=f(\hat{x_{k-1}},v_k,0)

  • 先验误差协方差:

\check{P_k}=A_{k}\hat{P_{k-1}}A_{k}^T+W_{k}QW_{k}^T

校正

  • 卡尔曼增益:

K_k=\check{P}_kH_k^T(H_k\check{P}_kH_k^T+V_{k}RV_{k}^T)^{-1}

更新

  • 更新后验状态估计:

\hat{x_k}=\check{x_k}+K_k(y_k-h(\check{x_k},0))

  • 更新后验误差协方差:

\hat{P_k}=(1-K_kH_k)\check{P_k}

三、应用总结

滤波器针对的问题是如何通过数据来估计自身状态。因此,可以有很多应用场景。

与线性不同,扩展卡尔曼滤波器通常不是最佳估计器(如果测量和状态转换模型都是线性的,则它是最佳的,因为在这种情况下,扩展卡尔曼滤波器与常规滤波器相同)。此外,如果状态的初始估计是错误的,或者如果过程建模不正确,则由于其线性化,滤波器可能会很快发散。扩展卡尔曼滤波器的另一个问题是估计的协方差矩阵往往会低估真实的协方差矩阵,因此在不添加“稳定噪声”的情况下可能会在统计意义上 变得不一致 。更一般地,我们应该考虑非线性滤波问题的无限维性质以及简单均值和方差-协方差估计器不足以完全表示最优滤波器。还应该注意的是,即使对于非常简单的一维系统,扩展卡尔曼滤波器也可能表现不佳。在这种情况下,可以考虑 其他一般的非线性滤波方法。

EKF 方法是解决 SLAM 问题的一种经典方法,其应用依赖于运动模型和观测模型的高斯噪声假设。EFK在数据融合上有很广泛的应用,相对于优化的方法,基于EKF的方法精度虽然较低但是计算效率更高。

四、代码实践

参考资料[2][3]中都含有二维平面小车状态估计的仿真,非常值得看。这里放一下扩展卡尔曼滤波的C++实现,参考[4]。

kalman_filter.cpp

#include <iostream>
#include "kalman_filter.h"#define PI 3.14159265using namespace std;
using Eigen::MatrixXd;
using Eigen::VectorXd;KalmanFilter::KalmanFilter() {}KalmanFilter::~KalmanFilter() {}void KalmanFilter::Init(VectorXd &x_in, MatrixXd &P_in, MatrixXd &F_in,MatrixXd &H_in, MatrixXd &R_in, MatrixXd &Q_in) {x_ = x_in;P_ = P_in;F_ = F_in;H_ = H_in;R_ = R_in;Q_ = Q_in;
}void KalmanFilter::Predict() {//Use the state using the state transition matrixx_ = F_ * x_;//Update the covariance matrix using the process noise and state transition matrixMatrixXd Ft = F_.transpose();P_ = F_ * P_ * Ft + Q_;}void KalmanFilter::Update(const VectorXd &z) {MatrixXd Ht = H_.transpose();MatrixXd PHt = P_ * Ht;VectorXd y = z - H_ * x_;MatrixXd S = H_ * PHt + R_;MatrixXd K = PHt * S.inverse();//Update Statex_ = x_ + (K * y);//Update covariance matrixlong x_size = x_.size();MatrixXd I = MatrixXd::Identity(x_size, x_size);  P_ = (I - K*H_) * P_;}void KalmanFilter::UpdateEKF(const VectorXd &z) {float px = x_(0);float py = x_(1);float vx = x_(2);float vy = x_(3);//Convert the predictions into polar coordinatesfloat rho_p = sqrt(px*px + py*py);float theta_p = atan2(py,px);if (rho_p < 0.0001){cout << "Small prediction value - reassigning Rho_p to 0.0005 to avoid division by zero";rho_p = 0.0001;}float rho_dot_p = (px*vx + py*vy)/rho_p;VectorXd z_pred = VectorXd(3);z_pred << rho_p, theta_p, rho_dot_p;VectorXd y = z - z_pred;//Adjust the value of theta if it is outside of [-PI, PI]if (y(1) > PI){y(1) = y(1) - 2*PI;}else if (y(1) < -PI){y(1) = y(1) + 2*PI;}MatrixXd Ht = H_.transpose();MatrixXd PHt = P_ * Ht;MatrixXd S = H_ * PHt + R_;MatrixXd K = PHt * S.inverse();//Update Statex_ = x_ + (K * y);//Update covariance matrixlong x_size = x_.size();MatrixXd I = MatrixXd::Identity(x_size, x_size);  P_ = (I - K*H_) * P_;
}

kalman_filter.h

#ifndef KALMAN_FILTER_H_
#define KALMAN_FILTER_H_
#include "Eigen/Dense"class KalmanFilter {
public:// state vectorEigen::VectorXd x_;// state covariance matrixEigen::MatrixXd P_;// state transition matrixEigen::MatrixXd F_;// process covariance matrixEigen::MatrixXd Q_;// measurement matrixEigen::MatrixXd H_;// measurement covariance matrixEigen::MatrixXd R_;/*** Constructor*/KalmanFilter();/*** Destructor*/virtual ~KalmanFilter();/*** Init Initializes Kalman filter* @param x_in Initial state* @param P_in Initial state covariance* @param F_in Transition matrix* @param H_in Measurement matrix* @param R_in Measurement covariance matrix* @param Q_in Process covariance matrix*/void Init(Eigen::VectorXd &x_in, Eigen::MatrixXd &P_in, Eigen::MatrixXd &F_in,Eigen::MatrixXd &H_in, Eigen::MatrixXd &R_in, Eigen::MatrixXd &Q_in);/*** Prediction Predicts the state and the state covariance* using the process model* @param delta_T Time between k and k+1 in s*/void Predict();/*** Updates the state by using standard Kalman Filter equations* @param z The measurement at k+1*/void Update(const Eigen::VectorXd &z);/*** Updates the state by using Extended Kalman Filter equations* @param z The measurement at k+1*/void UpdateEKF(const Eigen::VectorXd &z);};#endif /* KALMAN_FILTER_H_ */

参考资料

[1]扩展卡尔曼滤波(EKF)代码实战 - 小小市民的文章 - 知乎
https://zhuanlan.zhihu.com/p/161886906

[2]扩展卡尔曼滤波器实例与推导 - 西湖大学无人系统的文章 - 知乎
https://zhuanlan.zhihu.com/p/550160197

[3]扩展卡尔曼滤波算法及仿真实例_扩展卡尔曼滤波示例-CSDN博客

[4]GitHub - shazraz/Extended-Kalman-Filter: Implementation of an EKF in C++

[5]网络资料

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

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

相关文章

SpringMVC修炼之旅(3)REST风格与拦截器

一、概述 1.1简介 Restful就是一个资源定位及资源操作的风格。不是标准也不是协议&#xff0c;只是一种风格。基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。 1.2功能 资源&#xff1a;互联网所有的事物都可以被抽象为资源 资源操作…

基于SpringBoot+Thymeleaf+Mybatis实现大学生创新创业管理系统(源码+数据库+项目运行指导文档)

一、项目简介 本项目是一套基于SpringBoot实现大学生创新创业管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#…

STM32CubeMx+MATLAB Simulink串口输出实验

STM32CubeMxMATLAB Simulink串口输出实验 &#x1f4cc;《STM32CubeMxMATLAB Simulink点灯程序》&#x1f4cd;相关篇《MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试》&#x1f516;需要的软件支持包&#xff1a;Embedded Coder Support Package fo…

Java 实现 图片 添加 文字水印、图片水印 工具类

一、话不多说&#xff0c;直接上代码 1.1&#xff0c;水印类型枚举 import lombok.AllArgsConstructor; import lombok.Getter;/*** author: wangjing* createTime: 2023-12-05 15:01* version: 1.0.0* Description: 水印类型枚举*/ Getter AllArgsConstructor SuppressWarni…

「Verilog学习笔记」状态机-重叠序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 读入数据移位寄存&#xff0c;寄存后的数据与序列数做对比&#xff0c;相等则flag为1&#xff0c;不等则为0 timescale 1ns/1nsmodule sequence_test2(input wire clk ,in…

java单人聊天

服务端 package 单人聊天;import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import…

拼多多商品详情API:构建高效电子商务解决方案

一、引言 随着互联网的快速发展&#xff0c;电子商务行业正在迅速崛起&#xff0c;其中拼多多以其独特的商业模式和创新的商品详情API&#xff0c;成为了行业内的佼佼者。本文将深入探讨拼多多商品详情API的技术特点、实现方式及其在电子商务解决方案中的应用。 二、拼多多商…

【PyTorch】模型选择、欠拟合和过拟合

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 完整代码2.2.2. 输出结果 1. 理论介绍 将模型在训练数据上拟合的比在潜在分布中更接近的现象称为过拟合&#xff0c; 用于对抗过拟合的技术称为正则化。训练误差和验证误差都很严重&#xff0c; 但它们之间差…

计算两个结构的差

平面上有6个点&#xff0c;以6a1的方式运动 1 1 1 1 - - - 1 - - - 1 现在有一个点逃逸&#xff0c;剩下的5个点将如何运动&#xff1f; 2 2 2 3 - - - 3 - - - 3 将6a1的6个点减去1个点&#xff0c;只有两种可能&#xff0c;或者变成5a2&#xff0c…

SpringBoot的配置加载优先级

目录 一、背景分析 二、学习资源 三、具体使用 四、一些小技巧 方式一 方式二 一、背景分析 SpringBoot项目在打包之后&#xff0c;其配置文件就在jar包内&#xff0c;如果没有<配置文件优先级>这个机制&#xff0c;那么项目打成jar包之后&#xff0c;如果启动项目…

视频监控管理平台/智能监测/检测系统EasyCVR智能地铁监控方案,助力地铁高效运营

近日&#xff0c;关于全国44座城市开通地铁&#xff0c;却只有5座城市赚钱的新闻冲上热搜。地铁作为城市交通的重要枢纽&#xff0c;是人们出行必不可少的一种方式&#xff0c;但随着此篇新闻的爆出&#xff0c;大家也逐渐了解到城市运营的不易&#xff0c;那么&#xff0c;如何…

目标检测——SPPNet算法解读

论文&#xff1a;Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 作者&#xff1a;Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun 链接&#xff1a;https://arxiv.org/abs/1406.4729 目录 1、算法概述2、Deep Networks with Spatia…

适用于 Windows 的 10 个顶级分区管理器软件

您想要对硬盘驱动器或 USB 驱动器进行分区的原因可能有多种。许多用户希望对其外部和内部硬盘驱动器进行分区以有效地管理数据。为了处理分区&#xff0c;Windows为用户提供了一个内置的分区管理工具。 Windows 用户可以通过磁盘管理面板对任何驱动器进行分区。然而&#xff0…

哪种超声波清洗眼镜不伤镜片?超声波什么牌子好?眼镜清洗机推荐

戴眼镜的朋友就能够感同身受&#xff0c;眼镜佩戴一天真的特别容易脏&#xff0c;灰尘或者是脸部出汗出油等&#xff0c;让耳机惨不忍睹&#xff01;对于眼镜清洗的方式也有很多种&#xff0c;那么到底哪种清洗方式才是真正有效果并且不伤眼镜的呢&#xff1f;跟随笔者的脚步来…

安装Kuboard管理K8S集群

目录 第一章.安装Kuboard管理K8S集群 1.安装kuboard 2.绑定K8S集群&#xff0c;完成信息设定 3.内网安装 第二章.kuboard-spray安装K8S 2.1.先拉镜像下来 2.2.之后打开后&#xff0c;先熟悉功能&#xff0c;注意版本 2.3.打开资源包管理&#xff0c;选择符合自己服务器…

Python-Opencv图像处理的小坑

1.背景 最近在做一点图像处理的事情&#xff0c;在做处理时的cv2遇到一些小坑&#xff0c;希望大家遇到的相关的问题可以注意&#xff01;&#xff01; 2. cv2.imwrite保存图像 cv2.imwrite(filename, img, [params]) filename&#xff1a;需要写入的文件名&#xff0c;包括路…

快速排序并不难

快速排序的核心框架是“二叉树的前序遍历对撞型双指针”。我们在《一维数组》一章提到过”双指针思路“&#xff1a;在处理奇偶等情况时会使用两个游标&#xff0c;一个从前向后&#xff0c;一个是从后向前来比较&#xff0c;根据结果来决定继续移动还是停止等待。快速排序的每…

医院信息系统源码,采用JAVA编程,支持跨平台部署应用,满足一级综合医院(专科二级及以下医院500床)的日常业务应用

医院HIS系统源码&#xff0c;HIS系统全套源码&#xff0c;支持电子病历4级&#xff0c;自主版权 his医院信息系统内设门诊/住院医生工作站、门诊/住院护士工作站。各工作站主要功能依据职能要求进行研发。如医生工作站主要功能为编辑电子病历、打印、处理医嘱&#xff1b;护士工…

总结|哪些平台有大模型知识库的Web API服务

截止2023/12/6 笔者个人的调研&#xff0c;有三家有大模型知识库的web api服务&#xff1a; 平台类型文档数量文档上传并解析的结构api情况返回页码文心一言插件版多文档有问答api&#xff0c;文档上传是通过网页进行上传有&#xff0c;而且是具体的chunk id&#xff0c;需要设…

“消费增值:改变你的购物方式,让每一笔消费都变得更有价值“

你是否厌倦了仅仅购买物品或享受服务后便一无所有的消费方式&#xff1f;现在&#xff0c;消费增值的概念将彻底改变你的消费观念&#xff01;通过参与消费增值&#xff0c;你的每一笔消费都将变得更有价值&#xff01; 消费增值是一种全新的消费理念&#xff0c;它让你在购物的…