扩展卡尔曼滤波技术(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.hqwc.cn/news/256710.html

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

相关文章

Redis生产实战-Redis集群故障探测以及降级方案设计

Redis 集群故障探测 在生产环境中&#xff0c;如果 Redis 集群崩溃了&#xff0c;那么会导致大量的请求打到数据库中&#xff0c;会导致整个系统都崩溃&#xff0c;所以系统需要可以识别缓存故障&#xff0c;限流保护数据库&#xff0c;并且启动接口的降级机制 降级方案设计 …

教程篇(7.2) 01. 介绍和初始访问 ❀ FortiAnalyzer分析师 ❀ Fortinet 网络安全专家 NSE5

在本课中&#xff0c;你将了解FortiAnalyzer的关键功能和概念&#xff0c;以及如何最初访问FortiAnalyzer。 FortiAnalyzer将日志记录、分析和报告集成到一个系统中&#xff0c;因此你可以快速识别和响应。 在本课中&#xff0c;你将探索上图显示的主题。 通过展示FortiAnalyze…

2分钟带你了解什么是Vsync

了解Vsync&#xff0c;首先我们需要认知如下问题 什么是GPUCPU在渲染之前起到什么作用什么是帧&#xff0c;帧率什么是画面撕裂 什么是GPU GPU为图形处理器&#xff0c;又称显示核心、视觉处理器、显示芯片。 是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑…

Nature Communications 高时空分辨率的机器人传感系统及其在纹理识别方面的应用

前沿速览&#xff1a; 现有的触觉传感器虽然可以精确的检测压力、剪切力和应变等物理刺激&#xff0c;但还难以像人类手指一样通过滑动触摸&#xff0c;同时获取静态压力与高频振动来实现精确的纹理识别。为了解决这一问题&#xff0c;来自南方科技大学的郭传飞团队提出了衔接…

Tomcat主配置文件(server.xml)详解

前言 Tomcat主配置文件&#xff08;server.xml&#xff09;是Tomcat服务器的主要配置文件&#xff0c;文件位置在conf目录下&#xff0c;它包含了Tomcat的全局配置信息&#xff0c;包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…

浅谈基于泛在电力物联网的综合能源管控平台设计及硬件选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;城区内一般都具有错综复杂的能源系统&#xff0c;且大部分能耗都集中于城区的各企、事业单位中。基于泛在电力物联网的综合能源管控平台将城区内从能源产生到能源消耗的整体流动情况采用大屏清晰展示&#xff…

搜索推荐技术-爱奇艺搜索引擎技术

一、爱奇艺的搜索引擎框架示意图 即通过召回系统&#xff0c;即基于文本匹配的matching system&#xff0c;得到大量视频资源的候选集&#xff0c;经过粗排和精排&#xff0c;最后返回给用户。重点在于召回模块和排序模块。 二、召回模块 召回模块比较重要的是基础相关性&am…

使用Notepad++编辑器,安装compare比较差异插件

概述 是一款非常有特色的编辑器&#xff0c;Notepad是开源软件&#xff0c;Notepad中文版可以免费使用。 操作步骤&#xff1a; 1、在工具栏 ->“插件”选项。 2、勾选Compare选项&#xff0c;点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装 6、打…

Linux本地部署1Panel服务器运维管理面板并实现公网访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

阿里云 ACR 制品中心 AI/大数据镜像专场上新推荐榜

今天&#xff0c;AI 领域的快速发展不仅需要算法的突破&#xff0c;也需要工程的创新。随着容器技术和服务在企业的应用程度不断加深&#xff0c;企业对于容器的使用也越来越多地从在线业务逐渐向 AI、大数据类型的工作负载发展。同时&#xff0c;开发人员在考虑如何通过云原生…

分布式搜索引擎03

1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近…

在jupyter notebook中修改其他文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…