图片缩略图

学习扩展卡尔曼滤波器

version 1.0.0.0 (2.1 KB) by 曹奕
一种用于非线性状态估计的扩展卡尔曼滤波器的实现。
4.0
46评级

112下载

更新2008年1月23日

查看许可协议

编者按:这个文件被选为MATLAB中心本周精选

这是一个关于非线性扩展卡尔曼滤波器(EKF)的教程。它使用标准EKF公式来实现非线性状态估计。内部采用复杂阶跃雅可比矩阵对非线性动力学系统进行线性化处理。然后将线性化后的矩阵用于卡尔曼滤波计算。

复杂的步长微分似乎改善了EKF的性能,特别是在精度上,通过EKF的优化和神经网络训练比通过UKF (unscented Kalman filter, UKF)更好。//www.tatmou.com/matlabcentral/fileexchange/loadFile.do?objectId=18217&objectType=FILE).其他复杂的步骤区分工具包括CSD Hessian//www.tatmou.com/matlabcentral/fileexchange/loadFile.do?objectId=18177&objectType=FILE

引用作为

曹毅(2021)。学习扩展卡尔曼滤波器(//www.tatmou.com/matlabcentral/fileexchange/18189-learning-the-extended-kalman-filter), MATLAB中央文件交换。检索

意见及评分(97

杰桑卡南达

我在运行这段代码时遇到了一个问题
错误就像最大递归极限达到500。使用set(0,'RecursionLimit',N)更改限制。要意识到超过你的
可用的堆栈空间可以崩溃MATLAB和/或您的计算机。

卡尔曼滤波器误差> create@ (x) [x (2), (3); 0.05 * x (1) * x (x (2) + (3)))

有人能帮忙解决这个问题吗

长尾维罗妮卡

亲爱的曹。非常感谢你的精彩解释。我有一个关于测量映射矩阵的问题。
我的系统是-k梯度(T)=q,我想研究热导率作为温度变化的函数。因此,我用有限差分法离散我的系统,得到10个温度节点+变量“k”,我也想预测它。如果我测量所有离散化的节点,但我不测量k,因为它在物理上是不可行的,那么我怎么做映射函数h()?

yw刘

世界环境学会

穆沙希德。侯赛因

你好,先生,我在理解JASSCAD功能上有困难,你能解释一下吗?

诺曼·阿里·拉里克

wenlong

Zihao周

很好的代码,谢谢。
然而,我只是修改了状态方程,加入了函数F(t,x),其中F是霍奇金-赫胥黎模型函数
即。
f=@(x) x + f (k,x)+ B*I;非线性状态方程
h=@(x) C * x;%测量方程
S =[-54.3 rand rand]';

然后我总是有以下错误通知:
错误使用胆固醇
矩阵必须是正定的。

ekf错误(第60行)
R =胆固醇(H * P12 + R);%柯列斯基分解

请问我该如何解决这个问题,并绘制结果?

米格尔Budag贝克

嘿,内森·埃利斯

我研究了你的问题,发现两个方程都是对的,因为P是对称的。所以P = P',然后P12'=HP'=HP。

弗兰克·奥乌苏

想要在时间序列数据上实现EKF…但我真的在与错误斗争,只是试图运行这个函数..有人能给我指点一下吗?这是非常紧急的

穆罕默德·扎希德

穆罕默德·扎希德

如何使用EKF估算高速公路交通密度?请谁来指导我

凯西·曼森

你为什么不用EKF simulink函数块呢?金宝app

Fajar Pratama

泰勒级数在哪里?这个ekf函数不需要泰勒级数吗?因为在我读到的另一篇论文中需要泰勒回归。请帮帮我。谢谢

于6月

卡朱·布班贾

法布里奇奥Schiano

有这方面的教程吗?我在哪里可以找到它?谢谢

Zhiwen陈

奥马尔Aljanaideh

对于那些在==>elf中51处出错的人
只要确保MATLAB目录与文件位置相同即可。

内森·埃利斯

我认为在注释掉的替代协方差更新方程中可能有一个错误:
% p = p - k * p12 ';

P12之前被定义为P12=PH'
更新公式应为:
P = P- kh或P = (I-KH)P

据我所知:
P12'= /= HP (P12'=HP')
等等;
% p = p - k * p12 ';是不正确的?

拉贾·塞哈尔·班达鲁

穆罕默德·霍克

我正在尝试使用扩展卡尔曼滤波器(EKF)实时估计标称电压为3.7V_,额定电压为15.5Ah的锂离子电池的SOC。我面临的问题是如何用噪声协方差和其他测量和观测噪声项为EKF编写MATLAB代码。如何在估算锂离子电池的SOC时解决这个问题。我使用的是MatlabR2014A。

胡力平

嗨,阿里,

请看一下测量公式。它只测量第一个状态。

纳吉布·瓦利夫

嗨,我还是得到了最大递归极限500。使用
set(0,'RecursionLimit',N)更改限制。是
注意超出可用堆栈空间
可以使MATLAB和/或你的计算机崩溃。

错误
ekf > create@ (x) [x (2), (3); 0.05 * x (1) * x (x (2) + (3)))

消息。请帮助我已经尝试了下面提到的一切,包括复制和粘贴到命令窗口

ailu王

西蒙·利维

干得好,屹操!我使用了您的代码来理解EKF,并在一个交互式在线教程中链接到它:

http://home.wlu.edu/~levys/kalman_教程

我想学习如何使用EKF

usdb usdb1

你好;我要用Matlab/simulink来做EKF,有人能帮我金宝app吗?

阿里

不知何故,只有第一个状态被正确跟踪。无论我如何改变模型,x(2)和x(3)的估计总是几乎为零。显然有个漏洞…

阿娴

大家好!
我真的还没有理解这个代码。在我的案例中,我也研究了我想要应用EKF的GPS数据的EKF,因为GPS数据中存在噪声和缺失数据。我有一个长度超过2000的GPS数据列。谁能教我怎么做?
非常感谢您的款待

艾哈迈德Smati

塞尔古特!

维克多

第51和53行由:

(x1,] = jaccsd (fstate x);
(z1, H) = jaccsd (hmeas x1);

为什么x1=fstate(x)用作计算测量方程雅可比矩阵的输入?如果测量方程的雅可比矩阵也在当前状态x下计算,则更有意义。我对那部分的理解有误吗?

usdb usdb1

当我高亮变量和它的估计之间的误差(通过添加一个新的变量err=x-xestimate),我绘制err。一个周期极限(振荡)在这个图中。变量与其估计值之间出现了差距。
这是一个解释和解决方案。

大家好,
关于扩展卡尔曼滤波器的使用,我有一个更一般的问题。我不清楚为什么EKF使用非线性函数f和h进行状态预测和估计,而在其他地方使用这些函数的雅可比矩阵。
为什么下面的句子从未被使用过?
首先使用雅可比矩阵计算先前估计点处的线性化状态和测量模型。在该特定迭代中,处处使用线性化状态转换和测量矩阵,而不是非线性矩阵。
我将非常感谢你的帮助
非常感谢。

mn

伟大的提交,谢谢!
但有一个问题:在参数解释中,您将输入x和P定义为“先验”状态估计和“先验”估计状态协方差。在我的理解中,这是不对的,因为“先验”值仅在过滤器的预测步骤之后可用。

所以,在我看来,x和P是前一个时间步长的“后验”值。当前时间步长的x和P的“先验”值在滤波器的预测步骤之后可用(在第51和52行中val x1和P)。
你同意吗?

Aliko

错误! !

输入参数“wstate”未定义。

错误在==> ekf在51
(x1,] = jaccsd (wstate x);%非线性更新和线性化在当前状态

Chinedum

嗨,伙计们,我需要帮助。我使用Matlab R2012b来尝试运行代码/示例。我通常复制整个代码,放置一个新的编辑器,突出例子,右键,左键点击'评估选择'(因为我没有看到任何'运行')。但在Matlab的命令窗口中,它显示了突出显示的示例,并说“未定义函数'ekf'输入参数的类型为'function_handle'”。谁知道会出什么问题呢?我做错了什么?谢谢你!约翰

usdb usdb1

你好
利用EKF可以很好地估计状态,但如果在模拟过程中扩展状态变量发生变化,则EKF总是收敛到初始值1。
请给我解释一下。

Masiyang伊斯兰教

你好

只有一个问题:

为什么第51行的非线性更新没有进行数值积分,而只是使新的x_k=f(x_k-1)?

w .庄

默罕默德

请有人解释一下从第51行到第78行这些行是做什么的

f是非线性微分ecuation被集成,这就是为什么@卡尔曼滤波器函数可以调用它,一个在卡尔曼滤波器解决这个ecuation第一估计,h是测量方程,也是处理函数(@),这样它可以被称为ekf计算卡尔曼增益。

Tanmay

有人能解释一下这些台词的作用吗:

f = @ (x) [x (2), (3); 0.05 * x (1) * x (x (2) + (3)));
h = @ (x) x (1);

谢谢!

tehreem

第二和第三状态的图像在这里表示什么

tehreem

请检查你的电子邮件

汗954

第51行中的Fstate表示非线性状态方程,是x的函数
在这个例子中,fstate是f,在第26行

tehreem

第51行fstate是什么?

汗954

@tehreem
这个程序运行良好
将程序从第21行复制到第46行,并运行它,它可以工作

tehreem

您好,我在第51行遇到一个错误,因此程序无法运行
你能在这方面提供指导吗

奥拉夫Gerritse

dab483

在命令窗口中运行如下代码:

n = 3


结束

有一个错误:
???未定义的函数或方法'ekf'作为类型输入参数
“function_handle”。
如何运行这些代码?

西蒙Omekanda

西蒙Omekanda

你能检查一下步骤来正确运行这个功能吗?!我仍然得到的错误已经在上面的一些评论中提到,主要是:
???已达到最大递归极限500。使用组(0 ' RecursionLimit ' N)
改变极限。请注意,超过可用堆栈空间可能会
使MATLAB和/或您的计算机崩溃。

错误= = > ekf > create@ (x) [x (2), (3); 0.05 * x (1) * x (x (2) + (3)))

谢谢:)

Prithwiraj

我下载了这个文件并在R2006b上运行。得到以下错误。谁能告诉我哪里做错了?我想我不得不取消一些注释,并按某些顺序运行,但无法找出是什么

???输入参数“fstate”未定义。

错误在==> ekf在51
(x1,] = jaccsd (fstate x);当前状态下的在线更新和线性化

Elke

你好
我得到错误消息“??”未定义函数或方法'ekf'的输入参数类型为'function_handle'"

你这么

谢谢

莫伊塞斯

这就跟你问声好!

有没有可能在我有不同的预测和校正步骤的情况下使用代码。(例如,我是否可以在做出一次修正之前进行10次预测……)在当前版本的代码中这样做容易吗?

林乔治

这就跟你问声好!这是一个很好的EKF代码。我有一个问题:在你的例子中,如果我们假设值0.05是未知参数,我们想同时估计状态和参数,我们是否可以用参数来增加状态:
n = 4;%的国家
q = 0.1;%性病的过程
r = 0.1;%性病的测量
Q=Q^2*眼睛(n);%过程协方差
% or Q=diag[Q 0];%,如果参数中不包含进程噪声
R=R^2;%测量协方差
f = @ (x) [x (2), (3), (4) * x (1) * x (x (2) + (3)); x (4)];非线性状态方程
h = @ (x) x (1);%测量方程
s = (0, 0, 1, 0.1);%初始状态
x = s + q * randn (4,1);带有噪声的初始状态
P =眼睛(n);初始状态协方差%
N = 20;总动态步长%
xV=零(n,n);%estmate%分配内存
sV=零(n,n);%真实的
zV = 0 (1, N);
k = 1: N
Z = h(s) + r*randn;%测量
sV (:, k) = s;%保存实际状态
zV (k) = z;%保存测量
[x,P]=ekf(f,x,P,h,z,Q,R);%ekf
十五(:,k) = x;%保存估计
S = f(S) + q*randn(3,1);%更新过程
终止

曹奕

玛丽亚,

是的,这是可能的。请看提交的意见书:

//www.tatmou.com/matlabcentral/fileexchange/18289

您好,是否可以使用您的代码进行参数识别?

Krzysztof

嗨,易
你能给出一个关于函数f和初始状态s的定义例子吗?这将帮助我和其他没有经验的人更好地理解这个例子。先谢谢你。

大安迪

克里斯蒂

.hii . .
运行此程序时,在命令窗口显示如下错误:
“? ?输入参数“fstate”未定义。

错误在==> ekf在51
(x1,] = jaccsd (fstate x);%当前状态下的非线性更新和线性化

请尽快纠正我的问题。
还建议我如何实现这段代码的多传感器数据融合,其中输入是来自n个不同传感器的信号的形式..

丹尼尔

嗨,我应该如何修改m文件,如果我想改变测量和处理噪声:
w ~ N (u,问)
v ~ N (e, R)

马修·科尔曼

马修·科尔曼

祝贺你。这是第一个EKF图书馆,我设法在所有工作。

该示例采用s矩阵中的测量值,而不是x矩阵。现在一切都好了。

我很久没有做过卡尔曼或Matlab了。你们这些聪明的家伙低估了让我们这些新手开始你的评论需要多么愚蠢。

若昂戴安娜

曹奕

有限的

是的,这是可能的。例如,请参见

//www.tatmou.com/matlabcentral/fileexchange/18286

彝族

Aeimit Lakdawala

有可能用EKF进行约束非线性优化吗?

iasri icar

hi yi,我想知道用EKF来预测农业产量是否合适,比如鱼、大米等。我正计划用EXPAR和EKF来解决上面提到的问题,你能否就同样的问题给出一些你的想法。谢谢你,毕肖尔。

maheswaran Rathinasamy

蒂姆

我写了一个非常简单的复摆代码,了解了ekf算法如何不适用于这一点。我对该示例文件所做的唯一更改是将状态更改为2和rest
f = @ (x) [x (2); - (g / l) * sin (x (1)));
这应该给我一个正弦波形,但它没有。
你能给我指出哪里出错了吗?

蒂姆的高度

如果在EKF中,我必须添加状态噪声补偿,这里有任何好的示例或指导。我怎样才能补充曹奕给出的例子呢。
其次,任何人也可以推荐一些关于它的书。

曹奕

对于连续时间EKF,请查看//www.tatmou.com/matlabcentral/fileexchange/18485

罗希特·希帕加孔卡

嗨,我正在寻找一个例子,EKF是应用于一个连续时间非线性系统与非零输入(说测量是通过一个非线性(甚至线性会做)测量过程在常规时间采样。我在标准文本中寻找了这类例子,但没有找到。还有一个很好的来源显示了EKF的实现,其中我们线性化了单个工作点(而不是每次线性化预测状态),这将非常有帮助!提前谢谢!罗希特

Dapat Chawah

很抱歉,此评论将出现在unscented kalman filter文件讨论中

Dapat Chawah

这段代码在N<=150时工作正常
但当N超过这个极限时,就会发生一种无稽之谈
考虑这个错误的代码有什么改进吗?

诉穷

曹奕

发生此错误的原因是您错误地运行了示例,因此ekf调用自身的次数超过了500次。要运行该示例,您需要在“{”和“%}”之间复制内容,然后在matlab命令窗口上通过它来执行该示例。

这也可能是因为您的MATLAB版本太老了,无法支持块注释。金宝app如果是这种情况,您可以在每行的开头在“%{”和“%}”之间添加“%”来注释掉所有行,以解决问题。

陈忠杰

嗨,我还是会得到错误

???已达到最大递归极限500。使用组(0 ' RecursionLimit ' N)
改变极限。注意超出可用堆栈空间
可以
使MATLAB和/或您的计算机崩溃。

错误= = > ekf > create@ (x) [x (2), (3); 0.05 * x (1) * x (x (2) + (3)))

请按照您的指示做。如何正确运行代码?

莫林clerc

注意:函数ekf改变了测量协方差矩阵r的值。不应该是这样。否则,代码就会很好,很高效。

音)王

代码不错。但是,如果在状态上存在负载扰动,为什么EKF的估计几乎忽略了负载扰动?

蒂姆·戴维斯

太好了!很好地使用了CHOL而不是INV(可以在文件交换的另外两个卡尔曼滤波代码中看到)。很高兴看到数学在起作用。

我看到“K=P12*inv(…)”被注释掉了;这是完美的。它给出了CHOL和反斜杠操作背后的数学原理。

Saroj Pandey

它对我的项目很有帮助。

Neric刘

非常有助于学习卡尔曼滤波器的实现。

德米特里•Sh

做得很好,如果你知道线性卡尔曼滤波器是怎么工作的就很直观了。然而,我发现数值求解雅可比矩阵并不总是线性化的最佳形式,特别是在简单的情况下,解析雅可比矩阵可以手工计算。
在我的实验中(使用简单的非线性模型),解析雅可比矩阵通常比数值型雅可比矩阵的拟合度有显著提高。也许你可以增加一个选项来决定该如何解决

胡唐爱军

冯余

孟小君

很好。

Reza Baghaei

Taher DERBEL

曹奕

亲爱的埃德温,

正如我所预料的,这个错误是由于您运行示例的方式造成的,因为错误消息显示错误发生在第19行,这是示例开头的注释行。

为了正确运行示例,您可以执行以下步骤:

1.正确选择示例行
2.按control-t取消对所选内容的注释
3.右键单击以运行选择
4.单击“取消”恢复文件。(不要点击保存按钮。)

为了方便您和其他用户,我使用示例的块注释行更新了文件。现在,您只需要选择并右键单击运行示例,而不需要更改文件。更新将在几小时后出现。

希望这个有帮助。

埃德温•德•弗里斯

???错误:文件:卡尔曼滤波器。行:19列:10
表达式或语句不完整或不正确。

???已达到最大递归极限500。使用组(0 ' RecursionLimit ' N)
改变极限。请注意,超过可用堆栈空间可能会
使MATLAB和/或您的计算机崩溃。

错误= = > ekf > create@ (x) [x (2), (3); 0.05 * x (1) * x (x(2) +(3)))在25
f = @ (x) [x (2), (3); 0.05 * x (1) * x (x (2) + (3)));非线性状态方程

赛义德穆罕默德穆萨维加扎弗鲁迪

MATLAB版本兼容性
创建R2007a
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!