主要内容

正确的

使用扩展或无气味卡尔曼滤波或粒子滤波和测量纠正状态和状态估计误差协方差

描述

正确的命令更新对象的状态和状态估计误差协方差extendedKalmanFilterunscentedKalmanFilterparticleFilter对象使用测量的系统输出。要实现扩展或无味卡尔曼滤波器或粒子滤波器,请使用正确的而且预测命令在一起。如果当前输出测量存在,则可以使用正确的而且预测.如果缺少测量,则只能使用预测.有关命令使用顺序的信息,请参见使用预测和正确的命令

例子

CorrectedStateCorrectedStateCovariance=正确的(objy修正了扩展或无味卡尔曼滤波器或粒子滤波对象的状态估计和状态估计误差协方差obj使用测量输出y

您创建obj使用extendedKalmanFilterunscentedKalmanFilterparticleFilter命令。指定非线性系统的状态转移函数和测量函数obj.您还可以指定过程和测量噪声项在这些函数中是加性的还是非加性的。的状态对象的属性存储最新的估计状态值。假设在时间步长kobj。状态 x k | k 1 .这个值是对时间的状态估计k,估计使用测量输出直到时间k - 1.当你使用正确的命令具有测量的系统输出y [k],软件返回修正后的状态估计 x k | k CorrectedState输出。在哪里 x k | k 国家是在估计时间吗k,估计使用测量输出直到时间k.的状态估计误差协方差 x k | k CorrectedStateCovariance输出。该软件还更新状态而且StateCovariance的属性obj用这些修正的值。

如果是测量函数,则使用此语法h你在obj。米easurementFcn有下列其中一种形式:

  • Y (k) = h(x(k)-用于附加测量噪声。

  • Y (k) = h(x(k) v(k))-用于非加性测量噪声。

在哪里y (k)x (k),v (k)系统的测量输出、状态和测量噪声是否在时间步长k.唯一的输入h是状态和测量噪声。

例子

CorrectedStateCorrectedStateCovariance=正确的(objy听Um1,…,学院如果系统的测量功能需要这些输入,则指定额外的输入参数。可以指定多个参数。

如果是测量函数,则使用此语法h有下列其中一种形式:

  • y(k) = h(x(k),Um1,…,Umn)-用于附加测量噪声。

  • y(k) = h(x(k),v(k),Um1,…,Umn)-用于非加性测量噪声。

正确的命令将这些输入传递给度量函数以计算估计的输出。

例子

全部折叠

利用扩展卡尔曼滤波算法和测量输出数据估计范德堡尔振荡器的状态。振荡器有两个状态和一个输出。

为振荡器创建一个扩展的卡尔曼滤波器对象。使用以前写的和保存的状态转换和测量功能,vdpStateFcn.m而且vdpMeasurementFcn.m.这些函数描述了具有非线性参数的范德堡尔振荡器的离散近似 μ 等于1。该函数假定系统中存在附加的过程噪声和测量噪声。将两个状态的初始状态值指定为[1;0]。这是初始时刻状态值的猜测k,基于知识的系统输出直到时间k - 1 x ˆ k | k - 1

obj = extendedKalmanFilter(@vdpStateFcn,@vdpMeasurementFcn,[1;0]);

加载测量输出数据y从振荡器。在本例中,使用模拟静态数据进行说明。数据存储在vdp_data.mat文件。

负载vdp_data.maty

指定振荡器的过程噪声和测量噪声协方差。

obj。ProcessNoise = 0.01;obj。米easurementNoise = 0.16;

初始化数组以捕获估计的结果。

residBuf = [];xcorBuf = [];xpredBuf = [];

实现了扩展的卡尔曼滤波算法来估计振荡器的状态正确的而且预测命令。你首先纠正 x ˆ k | k - 1 及时使用测量k得到 x ˆ k | k .然后,预测下一个时间步的状态值 x ˆ k + 1 | k 使用 x ˆ k | k ,时间步长的状态估计k这是估计使用测量直到时间k

要模拟实时数据测量,请每次一步使用测量数据。计算预测值和实际测量值之间的残差,以评估滤波器的性能和收敛程度。计算残差是一个可选步骤。当你使用剩余时,将命令放在正确的命令。如果预测值与测量值相匹配,则残差为零。

执行时间步骤的实时命令后,缓冲结果,以便在运行完成后绘制它们。

k = 1:大小(y)[残差,残差方差]=残差(obj,y(k));[CorrectedState,CorrectedStateCovariance] = correct(obj,y(k));[PredictedState,PredictedStateCovariance] = predict(obj);residBuf(k,:) =残差;xcorBuf(k,:) = CorrectedState';xpredBuf(k,:) = PredictedState';结束

当你使用正确的命令,obj。状态而且obj。StateCovariance更新与修正的状态和状态估计误差协方差值的时间步长kCorrectedState而且CorrectedStateCovariance.当你使用预测命令,obj。状态而且obj。StateCovariance是否用时间步长的预测值进行更新k + 1PredictedState而且PredictedStateCovariance.当你使用剩余命令时,不进行任何修改obj属性。

在本例中,您使用了正确的之前预测因为初始状态值是 x ˆ k | k - 1 ,初始时刻状态值的猜测k根据系统输出直到时间k - 1.如果初始状态值为 x ˆ k - 1 | k - 1 为前一时刻的值k - 1基于测量直到k - 1,然后使用预测命令。有关使用顺序的更多信息预测而且正确的,请参阅使用预测和正确的命令

使用后校正值绘制估计状态。

plot(xcorBuf(:,1), xcorBuf(:,2))“估计状态”

图中包含一个轴对象。标题为Estimated States的axes对象包含一个类型为line的对象。

画出实际测量值、修正后的估计测量值和残差。的测量函数vdpMeasurementFcn,测量为第一状态。

M = [y,xcorBuf(:,1),residBuf];情节(M)网格标题('实际和估计测量,剩余')传说(“测量”“估计”“残留”

图中包含一个轴对象。标题为Actual和Estimated Measurements, Residual的坐标轴对象包含3个类型为line的对象。这些对象代表测量的、估计的、剩余的。

估算密切跟踪测量结果。在初始瞬态之后,残余量在整个运行过程中保持相对较小。

加载范德波尔ODE数据,并指定采样时间。

vdpODEdata.mat包含了具有初始条件的非线性参数mu=1的van der Pol ODE的模拟,使用ode45(2, 0).真实状态随采样时间的变化而变化Dt = 0.05

目录(fullfile (matlabroot,“例子”“控制”“主要”))添加示例数据负载(“vdpODEdata.mat”“xTrue”“dt”) tSpan = 0:dt:5;

测量尺寸。对于本例,传感器测量带有标准偏差的高斯噪声的第一个状态0.04

sqrtR = 0.04;yMeas = xTrue(:,1) + sqrtR*randn(nummel (tSpan),1);

创建一个粒子滤波器,并设置状态转换和测量似然函数。

myPF = particleFilter(@vdpParticleFilterStateFcn,@ vdpmeasurementlikehoodfcn);

初始化粒子过滤器状态[2;0]用单位协方差,和使用1000粒子。

初始化(myPF, 1000,(2, 0),眼(2));

选择的意思是状态估计和系统的重采样方法。

myPF。StateEstimationMethod =“的意思是”;myPF。ResamplingMethod =“系统”

估计状态使用正确的而且预测命令,并存储估计的状态。

xEst = 0 (size(xTrue));k=1:size(xTrue,1) xEst(k,:) =正确的(myPF,yMeas(k));预测(myPF);结束

绘制结果,并比较估计状态和真实状态。

图(1)情节(xTrue (: 1), xTrue (:, 2),“x”x (: 1) x (:, 2),“罗”)传说(“真正的”“估计”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象表示True、Estimated。

rmpath (fullfile (matlabroot,“例子”“控制”“主要”))删除示例数据

考虑一个有输入的非线性系统u的状态x和测量y根据以下状态转换和测量方程演化:

x k x k - 1 + u k - 1 + w k - 1

y k x k + 2 u k + v k 2

过程噪声w系统的噪声是可加性的,而测量噪声是可加性的v非相加。

为系统创建状态转换函数和测量函数。使用附加输入指定函数u

F = @(x,u)(根号(x+u));H = @(x,v,u)(x+2*u+v^2);

f而且h是匿名函数的函数句柄,分别存储状态转换和测量函数。在测量函数中,由于测量噪声是非加性的,v也指定为输入。请注意,v是否在附加输入之前指定为输入u

创建一个扩展的卡尔曼滤波器对象,用于使用指定的函数估计非线性系统的状态。指定状态的初始值为1,测量噪声为非可加性。

obj = extendedKalmanFilter(f,h,1,“HasAdditiveMeasurementNoise”、假);

指定测量噪声协方差。

obj。米easurementNoise = 0.01;

方法可以估计系统的状态预测而且正确的命令。传递的值u预测而且正确的,然后分别将它们传递给状态转换函数和测量函数。

用测量纠正状态估计yk] =0.8和输入uk] =0.2时间步长k

正确的(obj, 0.8, 0.2)

预测给定的下一个时间步的状态uk] =0.2

预测(obj, 0.2)

检索错误,或者剩余在预测和测量之间。

[Residual, ResidualCovariance] = Residual (obj,0.8,0.2);

输入参数

全部折叠

用于在线状态估计的扩展或无味卡尔曼滤波器或粒子滤波器对象,使用以下命令之一创建:

在当前时间步长的测量系统输出,指定为N-element vector,其中N是测量的次数。

系统测量函数的附加输入参数,指定为任何类型的输入参数。测量函数,h属性中指定MeasurementFcnMeasurementLikelihoodFcn的属性obj.如果函数除了状态和测量噪声值外,还需要输入参数,则可以在正确的命令语法。正确的命令将这些输入传递给测量或测量似然函数,以计算估计的输出。可以指定多个参数。

例如,假设您的测量或测量似然函数计算估计的系统输出y使用系统输入u和当前时间k,除了国家x

Y (k) = h(x(k) u(k) k)

然后在时间步上进行在线状态估计k属性中指定这些额外的输入正确的命令语法:

[CorrectedState,CorrectedStateCovariance] = correct(obj,y,u(k),k);

输出参数

全部折叠

修正的状态估计,作为大小向量返回,在那里是系统的状态数。如果你指定初始状态obj作为一个列向量作为列向量返回,否则作为行向量返回。

有关如何指定对象的初始状态的信息,请参见extendedKalmanFilterunscentedKalmanFilter而且particleFilter参考页面。

修正的状态估计误差协方差,返回为——- - - - - -矩阵,是系统的状态数。

更多关于

全部折叠

使用预测而且正确的命令

在创建了扩展或无味卡尔曼滤波器或粒子滤波对象后,obj,来实现估计算法,使用正确的而且预测命令在一起。

时间步长k正确的命令使用测量的系统输出返回状态的修正值和状态估计误差协方差y [k]同时步进。如果您的测量函数有额外的输入参数U属性的输入正确的命令。该命令将这些值传递给度量函数。

[CorrectedState, correctedco方差]=正确(obj,y,Um)

正确的命令更新状态而且StateCovariance具有估计值的对象的属性,CorrectedState而且CorrectedCovariance

预测命令返回下一个时间步骤的状态预测和状态估计误差协方差。如果状态转换函数有额外的输入参数U年代属性的输入预测命令。该命令将这些值传递给状态转换函数。

[PredictedState, predictedco方差]= predict(obj,Us)

预测命令更新状态而且StateCovariance具有预测值的对象的属性,PredictedState而且PredictedCovariance

如果当前输出测量存在于给定的时间步长,则可以使用正确的而且预测.如果缺少测量,则只能使用预测.这些命令的算法实现方法请参见在线状态估计的扩展和Unscented卡尔曼滤波算法

执行命令的顺序取决于测量数据的可用性yU年代,U针对您的系统:

  • 正确的然后预测-假设在时间步长k的值。obj。状态 x k | k 1 .这个值是系统当时的状态k,估计使用测量输出直到时间k - 1.你也有测量输出y [k]和输入U年代[k]而且U[k]同时步进。

    然后首先执行正确的命令与测量系统数据y [k]以及额外的投入U[k].更新的值obj。状态 x k | k ,状态估计时间k,利用测量到的输出进行估计k.然后执行预测带输入的命令U年代[k]obj。状态现在商店 x k + 1 | k .的状态值作为输入正确的命令。

  • 预测然后正确的-假设在时间步长k的值。obj。状态 x k 1 | k 1 .你也有测量输出y [k]和输入U[k]在同一时间步但你有U年代(k - 1)从之前的时间步长。

    然后首先执行预测带输入的命令U年代(k - 1).更新的值obj。状态 x k | k 1 .然后执行正确的带有输入参数的命令y [k]而且U[k]obj。状态更新为 x k | k .的状态值作为输入预测命令。

因此,虽然在这两种情况下的状态估计时间k x k | k 是一样的,如果在时间k您无法访问当前状态转换函数输入U年代[k],取而代之的是U年代(k - 1),然后使用预测首先,然后正确的

属性估计状态的示例预测而且正确的命令,看到用扩展卡尔曼滤波器在线估计状态使用粒子滤波在线估计状态

在R2016b中引入