Kalman Filter
估计离散时间或连续时间线性系统的状态
库:
Control System Toolbox /
State Estimation
System Identification Toolbox /
Estimators
描述
使用 Kalman Filter 模块,根据给定的过程噪声和测量噪声协方差数据,对状态空间被控对象模型的状态进行估计。状态空间模型可以是时变的。如果状态空间模型和噪声协方差矩阵均为时不变的,则采用稳态卡尔曼滤波器;否则,则采用时变卡尔曼滤波器。
Kalman Filter 模块与 kalman (Control System Toolbox) 命令的区别如下:
调用
kalman(sys,...)时,系统会默认sys包含G和H矩阵。具体来说,sys.B的形式为[B G],而sys.D的形式为[D H]。当您向 Kalman Filter 模块提供一个 LTI 变量时,该模块不会默认认为所提供的 LTI 变量中包含G和H。它们是选项,且相互独立。由
kalman命令创建的过滤器默认输出[yhat;xhat]。该模块默认仅输出xhat。对于离散时间系统,
Kalman命令可以同时输出P和Z协方差矩阵。对于此类系统,该模块只能输出P或Z。
示例
State Estimation Using Time-Varying Kalman Filter
Estimate states of linear systems using time-varying Kalman filters in Simulink®.
限制
被控对象和噪声数据必须满足以下约束条件:
(C,A) 可以被检测到。
且 。
在虚轴(或离散时间下的单位圆)上不存在失控模式,其中
连续时间卡尔曼滤波器不能用于函数调用子系统或触发子系统。
端口
输入
已知的输入为 u(t) 或 u[k]。
依赖关系
要启用此端口,请选择 Add input port u 参数。该参数默认处于选中状态。
测量输出 y[n] 以更新估计状态。
n×n 状态(或系统)矩阵。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input Port。
n×p 输入矩阵。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input Port,并选择 Add input port u 参数。
q×p 输出矩阵。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input Port。
q×p 馈通(或前馈)矩阵。如果系统模型中没有直接馈通项,则 D 即为零矩阵。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input Port,并选择 Add input port u 参数。
状态空间方程中的噪声变换。
依赖关系
要启用此端口,请选择 Use G and H matrices (default G=I and H=0) 参数。
状态空间方程中的噪声变换。
依赖关系
要启用此端口,请选择 Use G and H matrices (default G=I and H=0) 参数。
过程噪声协方差矩阵,指定为以下选项之一:
实数非负标量。Q 是一个由 Nw 和 Nw 组成的对角矩阵,其对角线上为标量。Nw 是模型中过程噪声输入的个数。
实数非负标量向量。Q 是一个 Nw×Nw 的对角矩阵,其对角线上包含向量 Q 的元素。
Nw×Nw 半正定矩阵。
依赖关系
要启用此端口,请取消选中 Time-invariant Q 参数。
测量噪声协方差矩阵,指定为以下选项之一:
实数正标量。R 是一个由 Ny 和 Ny 组成的对角矩阵,其对角线上为标量。Ny 是模型中测量输出的个数。
实正标量向量。R 是一个 Ny×Ny 的对角矩阵,其对角线上包含向量 R 的元素。
Ny×Ny 正定矩阵。
依赖关系
要启用此端口,请取消选中 Time-invariant R 参数。
过程噪声与测量噪声的交叉协方差矩阵,指定为一个 Nw 行 Ny 列的矩阵。矩阵 [Q N; NT R] 必须是正定矩阵。
依赖关系
要启用此端口,请取消选中 Time-invariant N 参数。
初始时刻的 P 矩阵。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input Port,并将 Source 参数设置为 Input Port。
初始时刻的估计状态。
依赖关系
要启用此端口,请将 Source 参数设置为 Input Port。
该端口控制测量值的更新,并接收一个标量信号。
依赖关系
要启用此端口,请选择 Add input port Enable to control measurement updates 参数。
用于将估计状态和参数协方差矩阵重置为指定初始值的控制信号。有关何时触发重置的信息,请参阅External Reset。
依赖关系
要启用此端口,请将 External reset 参数设置为除 None 以外的任意值。
输出
线性系统的估计状态。
线性系统的估计输出。
依赖关系
要启用此端口,请选择 Output estimated model output y 参数。
将 Z 输出端口添加到该模块中。
要启用此端口,请选择 Output state estimation error covariance Z 参数。
依赖关系
要启用此端口,请将 Time domain 参数设置为 Discrete-Time,并选择 Use the current measurement y[n] to improve xhat[n] 参数。
将 P 输出端口添加到该模块中。
要启用此端口,请选择 Output state estimation error covariance P 参数。
依赖关系
要启用此端口,请将 Time domain 参数设置为 Continuous-Time,或者将 Time domain 参数设置为 Discrete-Time,并取消选中 Use the current measurement y[n] to improve xhat[n] 参数。
注意
除 Enable 和 Reset 之外的所有输入端口必须具有相同的数据类型(单精度或双精度)。
Enable 和 Reset 端口支持
single、double、int8、uint8、int16、uint16、int32、uint32以及布尔数据类型。
参数
过滤设置
Discrete-Time(默认)- 模块估计离散时间状态。
Continuous-Time - 该模块对连续时间状态进行估计。
当 Kalman Filter 模块位于具有同步状态控制的模型中时(请参阅 State Control (HDL Coder) 模块),您无法选择 Continuous-Time。
编程用法
模块参数:TimeDomain |
| 类型: 字符串、字符向量 |
值:"Discrete-Time" | "Continuous-Time" |
默认值:"Discrete-Time" |
使用离散时间卡尔曼滤波器的当前估计器变体。如果未选中此参数,则使用延迟估计量(变体)。
只有当 Time domain 等于 Discrete-Time 时,此参数才可用。
编程用法
模块参数:UseCurrentEstimator |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"on" |
模块采样时间,指定为 -1 或一个正标量。
默认值为 -1,这意味着该模块会根据其在模型中的上下文来继承采样时间。所有模块的输入端口必须具有相同的采样时间。
依赖关系
只有当 Time domain 为 Discrete-Time,且 Model source 为 Individual A, B, C, D matrices 或 Input port 时,此参数才可用。当 Model source 等于 LTI State-Space Variable 时,该模块从 LTI 状态空间变量中获取采样时间。
编程用法
模块参数:Ts |
| 类型: 字符串、字符向量 |
值: "-1" | 标量 |
默认值:"-1" |
模型参数
系统模型
LTI State-Space Variable - 使用 Variable 中指定的模型。默认值为
ss(0.95,1,1,0)。模型的采样时间必须与 Time domain 参数一致;也就是说,如果 Time domain 是离散时间的,则该模型也必须是离散时间的。Individual A, B, C, D matrices - 在模块参数中指定 A、B、C 和 D。
Input port - 将 A、B、C、D 矩阵指定为 Kalman Filter 模块的输入信号。如果选择此选项,该模块将包含额外的输入端口 A、B、C 和 D。此外,您还必须在模块参数中指定 Number of states、Number of inputs 和 Number of outputs。
编程用法
模块参数:ModelSource |
| 类型: 字符串、字符向量 |
值:"LTI State-Space Variable" | "Individual A, B, C, D matrices" | "Input port" |
默认值:"LTI State-Space Variable" |
指定 A 矩阵。它必须是实矩阵,且为方阵。默认值为 0.95。
依赖关系
要启用此端口,请将 Model source 参数设置为 Individual A, B, C, D matrices。
编程用法
模块参数:A |
| 类型: 字符串、字符向量 |
值:"real matrix" |
默认值:"0.95" |
指定 B 矩阵。它必须是真实的,且行数应与 A 矩阵相同。默认值为 1。
依赖关系
要启用此端口,请将 Model source 参数设置为 Individual A, B, C, D matrices。
编程用法
模块参数:B |
| 类型: 字符串、字符向量 |
值:"real matrix" |
默认值:"1" |
指定 C 矩阵。它必须是真实的,并且列数应与 A 矩阵相同。默认值为 1。
依赖关系
要启用此端口,请将 Model source 参数设置为 Individual A, B, C, D matrices。
编程用法
模块参数:C |
| 类型: 字符串、字符向量 |
值:"real matrix" |
默认值:"1" |
指定 D 矩阵。该矩阵必须为实数矩阵,且其行数应与 C 矩阵相同,列数应与 B 矩阵相同。默认值为 0。
依赖关系
要启用此端口,请将 Model source 参数设置为 Individual A, B, C, D matrices。
编程用法
模块参数:D |
| 类型: 字符串、字符向量 |
值:"real matrix" |
默认值:"0" |
待估计的状态数,指定为一个正整数。默认值为 1。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input port。
编程用法
模块参数:NumberOfStates |
| 类型: 字符串、字符向量 |
值:"1" | scalar |
默认值:"1" |
模型中已知的输入数量,指定为一个正整数。默认值为 1。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input port。
编程用法
模块参数:NumberOfInputs |
| 类型: 字符串、字符向量 |
值:"1" | scalar |
默认值:"1" |
模型中的测量输出数量,指定为一个正整数。默认值为 1。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input port。
编程用法
模块参数:NumberOfOutputs |
| 类型: 字符串、字符向量 |
值:"1" | scalar |
默认值:"1" |
初步估计
Dialog - 直接在对话框中指定值。
Input port - 继承自输入端口的值。默认值为
10。该模块还包含一个额外的输入端口 X0。当使用时变卡尔曼滤波器时,会增加第二个附加端口 P0。X0 和 P0 必须分别满足与初始状态 x[0] 和状态估计误差协方差矩阵 P[0] 相同的条件。
编程用法
模块参数:InitialEstimateSource |
| 类型: 字符串、字符向量 |
值:"Dialog" | "Input port" |
默认值:"Dialog" |
将初始状态估计值指定为实数标量或向量。如果指定了一个标量,则所有初始状态估计值都将设置为该标量。如果指定了一个向量,则该向量的长度必须与模型中的状态数相匹配。默认值为 0。
依赖关系
要启用此端口,请将 Source 参数设置为 Dialog。
编程用法
模块参数:X0 |
| 类型: 字符串、字符向量 |
值:"0" | scalar | vector |
默认值:"0" |
指定离散时间卡尔曼滤波器的初始状态估计误差协方差矩阵 P[0],或连续时间卡尔曼滤波器的 P(0)。此参数必须指定为以下选项之一:
实数非负标量。P 是一个由 Ns 和 Ns 组成的对角矩阵,其对角线上为标量。Ns 是该模型中的状态数。
实数非负标量向量。P 是一个 Ns×Ns 的对角矩阵,其对角线上包含向量 P 的元素。
Ns×Ns 半正定矩阵。
依赖关系
要启用此端口,请将 Model source 参数设置为 Input port,并将 Source 参数设置为 Dialog。
编程用法
模块参数:P0 |
| 类型: 字符串、字符向量 |
值:"10" | scalar | vector | matrix |
默认值:"10" |
噪声特性
指定是否使用由 Variable 指定的状态空间模型中已预先确定的卡尔曼增益。
依赖关系
要启用此参数,必须满足以下条件:
Model source 被设置为 LTI State-Space Variable,而 Variable 是一个辨识模型 (
idss),其 K 矩阵不为零。选择 Time Invariant Q、Time Invariant R 和 Time Invariant N 参数。
如果选择了 Use G and H matrices (default G=I and H=0) 参数,则必须同时选择 Time Invariant G 和 Time Invariant H 参数。
编程用法
模块参数:UseK |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"off" |
默认情况下为 G=I,H=0。如果选择此选项,则必须指定 G 和 H 参数。
编程用法
模块参数:UseGH |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"off" |
它必须是一个真实矩阵,且行数与 A 矩阵相同。默认值为 1。
依赖关系
要启用此参数,请选择 Use G and H matrices (default G=I and H=0) 参数。
编程用法
模块参数:G |
| 类型: 字符串、字符向量 |
| 值: 标量 | 向量 | 矩阵 |
默认值:"1" |
如果取消选中此选项,该模块将包含一个额外的输入端口 G。
编程用法
模块参数:TimeInvariantG |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"on" |
它必须是一个真实矩阵,其行数与 C 矩阵相同,列数与 G 矩阵相同。默认值为 0。
依赖关系
要启用此参数,请选择 Use G and H matrices (default G=I and H=0) 参数。
编程用法
模块参数:H |
| 类型: 字符串、字符向量 |
| 值: 标量 | 向量 | 矩阵 |
默认值:"0" |
如果取消选中此选项,该模块将包含一个额外的输入端口 H。
编程用法
模块参数:TimeInvariantH |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"on" |
指定模型中的过程噪声输入数量。默认值为 1。
依赖关系
只有在未选中 Time-invariant G 和 Time-invariant H 时,此参数才可用。否则,该信息将从 G 或 H 矩阵中推导出来。
编程用法
模块参数:NumberOfProcessNoiseInputs |
| 类型: 字符串、字符向量 |
| 值:标量 |
默认值:"1" |
请从以下选项中选择一项:
实数非负标量。Q 是一个由 Nw 和 Nw 组成的对角矩阵,其对角线上为标量。Nw 是模型中过程噪声输入的个数。
实数非负标量向量。Q 是一个 Nw×Nw 的对角矩阵,其对角线上包含向量 Q 的元素。
Nw×Nw 半正定矩阵。
依赖关系
要启用此参数,请选择 Time-invariant Q 参数。
编程用法
模块参数:Q |
| 类型: 字符串、字符向量 |
| 值: 标量 | 向量 | 矩阵 |
默认值:"0.05" |
如果取消选中此参数,该模块将包含一个额外的输入端口 Q。
编程用法
模块参数:TimeInvariantQ |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"on" |
请从以下选项中选择一项:
实数正标量。R 是一个由 Ny 和 Ny 组成的对角矩阵,其对角线上为标量。Ny 是模型中测量输出的个数。
实正标量向量。R 是一个 Ny×Ny 的对角矩阵,其对角线上包含向量 R 的元素。
Ny×Ny 正定矩阵。
依赖关系
要启用此参数,请选择 Time-invariant R 参数。
编程用法
模块参数:R |
| 类型: 字符串、字符向量 |
| 值: 标量 | 向量 | 矩阵 |
默认值:"1" |
如果取消选中此参数,该模块将包含一个额外的输入端口 R。
编程用法
模块参数:TimeInvariantR |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"on" |
请将此参数指定为 Nw×Ny 矩阵。矩阵 [Q N; NT R] 必须是正定矩阵。
依赖关系
要启用此参数,请选择 Time-invariant N 参数。
编程用法
模块参数:N |
| 类型: 字符串、字符向量 |
| 值: 标量 | 向量 | 矩阵 |
默认值:"0" |
如果取消选中此参数,该模块将包含一个额外的输入端口 N。
编程用法
模块参数:TimeInvariantN |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"on" |
选项
其他输入端口
如果您的模型中包含已知的输入 u(t) 或 u[k],请选择此选项。该参数默认处于选中状态。取消选中此参数将从模块中移除输入端口 u,并从模块对话框中移除 B、D 和 Number of inputs 参数。
编程用法
模块参数:AddInputPort |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"on" |
如果您想控制测量数据的更新,请选择此选项。该模块还包含一个额外的输入端口 Enable。Enable 输入端口接收一个标量信号。该参数默认未被选中。
默认情况下,该模块会在每个时间步长执行测量更新,以根据测量到的输出值改进状态和输出估计值 和 。当 Enable 端口的信号为 0 时,将跳过当前采样时间的测量更新。具体来说,状态估计的方程对于连续时间卡尔曼滤波器为 ,对于离散时间卡尔曼滤波器为 。
注意
启用 Enable 端口可控制测量数据的更新。默认情况下,Kalman Filter 负责更新测量数据。
编程用法
模块参数:AddEnablePort |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"off" |
该参数用于控制模块何时重置。假设您在某个时间步长处重置了该模块,t。如果模块在 t 处被启用,软件将使用在模块对话框中或输入端口 P0 和 X0 中指定的初始参数值来估计状态。换句话说,在 t 处,该模块会在复位后执行时间更新,如果该功能已启用,还会执行测量值更新。该模块输出这些更新后的估计值。
指定以下选项之一:
None(默认)- 估计状态 和状态估计误差协方差矩阵 P 的值不会被重置。
Rising - 当控制信号从负值或零值上升到正值时,触发复位。如果初始值是负数,则当值上升至零时会触发重置。
Falling - 当控制信号从正值或零值降至负值时,触发复位。如果初始值是正的,则降至零时将触发重置。
Either - 当控制信号处于上升沿或下降沿时,触发复位。
Level - 在以下任一情况下触发重置:
在当前时间步长处,控制信号不为零。
控制信号从上一时间步的非零值变为当前时间步的零值。
Level hold - 当控制信号在当前时间步长处不为零时,触发器将复位。
当您选择除 None 以外的选项时,该模块会添加一个 Reset 输入端口,用于提供复位控制输入信号。
编程用法
模块参数:ExternalReset |
| 类型: 字符串、字符向量 |
值: "None" | "Rising" | "Falling" | "Either" | "Level" | "Level hold" |
默认值:"None" |
其他输出端口
在模块中添加一个 输出端口,用于输出模型的估计结果。该参数默认未被选中。
编程用法
模块参数:OutputEstimatedY |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"off" |
向该模块添加一个名为 Z 的输出端口。只有当 Time domain 为 Discrete-Time 且选择了 Use the current measurement y[n] to improve xhat[n] 参数时,才会提供 Z 矩阵。否则,将提供 P 矩阵,具体说明请参阅算法一节。
该参数默认未被选中。
编程用法
模块参数:OutputZ |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"off" |
向该模块添加一个名为 P 的输出端口。该参数默认未被选中。
依赖关系
要启用此端口,请将 Time domain 参数设置为 Continuous-Time,或者将 Time domain 参数设置为 Discrete-Time,并取消选中 Use the current measurement y[n] to improve xhat[n] 参数。
编程用法
模块参数:OutputP |
| 类型: 字符串、字符向量 |
值:"off" | "on" |
默认值:"off" |
算法
给定一个连续被控对象
已知输入 u、白过程噪声 w 和白测量噪声 v 满足
构建一个状态估计值 ,使其状态估计误差协方差 最小。
最优解是卡尔曼滤波器,其方程为
其中
卡尔曼滤波器利用已知的输入 u 和测量值 y 来生成状态估计值 。如果需要,该模块还可以输出真实过程输出 的估计值。

模块实现稳态 Kalman 滤波器时,系统矩阵(A(t)、B(t)、C(t)、D(t)、G(t)、H(t))和噪声协方差矩阵 (Q(t), R(t), N(t)) 为常量(在“模块参数”对话框中指定)时,该模块将实现稳态卡尔曼滤波器。稳态卡尔曼滤波器使用一个常数矩阵 P,该矩阵可使稳态估计误差协方差最小,并求解相关的连续时间代数里卡蒂方程:
考虑以下离散系统
已知输入 u、白过程噪声 w 和白测量噪声 v 满足
该估计量的状态方程如下:
其中,增益 L[n] 是通过离散里卡蒂方程计算得出的:
其中 I 是适当大小的单位矩阵,且
稳态卡尔曼滤波器使用一个常数矩阵 P,该矩阵可使稳态估计误差协方差最小化,并求解相关的离散时间代数里卡蒂方程。
离散时间卡尔曼滤波器有两种变体:
当前估计器利用所有可用的测量值(包括 y[n])生成状态估计值 。该过滤器将 更新为 y[n],并输出:
延迟估计器利用截至 y[n –1] 的观测值生成状态估计值 。该滤波器会输出如前所述的 ,以及选项输出
当前估计量的估计精度优于延迟估计量,这对采样间隔较长的情况尤为重要。然而,它的计算开销较高,因此在控制回路中实现起来较为困难。更具体地说,它具有直接穿透效应,如果将卡尔曼滤波器应用于不包含任何延迟的反馈回路中,就会形成代数环路(该反馈回路本身也具有直接穿透效应)。这种代数循环可能会影响仿真速度,如果模型中包含代数循环,则无法生成代码。
参考
[1] Franklin, Gene F., J. David Powell, and Michael L. Workman. Digital Control of Dynamic Systems. 2nd ed. Reading, Mass: Addison-Wesley, 1990.
[2] Lewis, Frank L. Optimal Estimation: With an Introduction to Stochastic Control Theory. New York: Wiley, 1986.
扩展功能
C/C++ 代码生成
使用 Simulink® Coder™ 生成 C 代码和 C++ 代码。
PLC 代码生成
使用 Simulink® PLC Coder™ 生成结构化文本代码。
版本历史记录
在 R2014b 中推出从 2021a 版本开始,Kalman Filter 模块所用算法的数值改进可能会导致其计算结果与您使用先前版本时获得的结果不同。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
