主要内容

本页采用了机器翻译。点击此处可查看英文原文。

Kalman Filter

估计离散时间或连续时间线性系统的状态

  • Kalman Filter block

库:
Control System Toolbox / State Estimation
System Identification Toolbox / Estimators

描述

使用 Kalman Filter 模块,根据给定的过程噪声和测量噪声协方差数据,对状态空间被控对象模型的状态进行估计。状态空间模型可以是时变的。如果状态空间模型和噪声协方差矩阵均为时不变的,则采用稳态卡尔曼滤波器;否则,则采用时变卡尔曼滤波器。

卡尔曼滤波器为连续时间估计离散时间估计中的连续或离散估计问题提供了最优解。

Kalman Filter 模块与 kalman (Control System Toolbox) 命令的区别如下:

  • 调用 kalman(sys,...) 时,系统会默认 sys 包含 GH 矩阵。具体来说,sys.B 的形式为 [B G],而 sys.D 的形式为 [D H]。当您向 Kalman Filter 模块提供一个 LTI 变量时,该模块不会默认认为所提供的 LTI 变量中包含 GH。它们是选项,且相互独立。

  • kalman 命令创建的过滤器默认输出 [yhat;xhat]。该模块默认仅输出 xhat

  • 对于离散时间系统,Kalman 命令可以同时输出 PZ 协方差矩阵。对于此类系统,该模块只能输出 PZ

示例

限制

  • 被控对象和噪声数据必须满足以下约束条件:

    • (C,A) 可以被检测到。

    • R¯>0Q¯N¯R¯1N¯T0

    • (AN¯R¯1C,Q¯N¯R¯1N¯T) 在虚轴(或离散时间下的单位圆)上不存在失控模式,其中

      Q¯=GQGTR¯=R+HN+NTHT+HQHTN¯=G(QHT+N)

  • 连续时间卡尔曼滤波器不能用于函数调用子系统或触发子系统。

端口

输入

全部展开

已知的输入为 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 是一个由 NwNw 组成的对角矩阵,其对角线上为标量。Nw 是模型中过程噪声输入的个数。

  • 实数非负标量向量。Q 是一个 Nw×Nw 的对角矩阵,其对角线上包含向量 Q 的元素。

  • Nw×Nw 半正定矩阵。

依赖关系

要启用此端口,请取消选中 Time-invariant Q 参数。

测量噪声协方差矩阵,指定为以下选项之一:

  • 实数正标量。R 是一个由 NyNy 组成的对角矩阵,其对角线上为标量。Ny 是模型中测量输出的个数。

  • 实正标量向量。R 是一个 Ny×Ny 的对角矩阵,其对角线上包含向量 R 的元素。

  • Ny×Ny 正定矩阵。

依赖关系

要启用此端口,请取消选中 Time-invariant R 参数。

过程噪声与测量噪声的交叉协方差矩阵,指定为一个 NwNy 列的矩阵。矩阵 [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] 参数。

注意

  • EnableReset 之外的所有输入端口必须具有相同的数据类型(单精度或双精度)。

  • EnableReset 端口支持 singledoubleint8uint8int16uint16int32uint32 以及布尔数据类型。

参数

全部展开

过滤设置

  • 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 domainDiscrete-Time,且 Model sourceIndividual A, B, C, D matricesInput 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 - 在模块参数中指定 ABCD

  • Input port - 将 ABCD 矩阵指定为 Kalman Filter 模块的输入信号。如果选择此选项,该模块将包含额外的输入端口 ABCD。此外,您还必须在模块参数中指定 Number of statesNumber of inputsNumber 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。当使用时变卡尔曼滤波器时,会增加第二个附加端口 P0X0P0 必须分别满足与初始状态 x[0] 和状态估计误差协方差矩阵 P[0] 相同的条件。

编程用法

模块参数:InitialEstimateSource
类型: 字符串、字符向量
值:"Dialog" | "Input port"
默认值:"Dialog"

将初始状态估计值指定为实数标量或向量。如果指定了一个标量,则所有初始状态估计值都将设置为该标量。如果指定了一个向量,则该向量的长度必须与模型中的状态数相匹配。默认值为 0

依赖关系

要启用此端口,请将 Source 参数设置为 Dialog

编程用法

模块参数:X0
类型: 字符串、字符向量
值:"0" | scalar | vector
默认值:"0"

指定离散时间卡尔曼滤波器的初始状态估计误差协方差矩阵 P[0],或连续时间卡尔曼滤波器的 P(0)。此参数必须指定为以下选项之一:

  • 实数非负标量。P 是一个由 NsNs 组成的对角矩阵,其对角线上为标量。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 QTime Invariant RTime Invariant N 参数。

  • 如果选择了 Use G and H matrices (default G=I and H=0) 参数,则必须同时选择 Time Invariant GTime Invariant H 参数。

编程用法

模块参数:UseK
类型: 字符串、字符向量
值:"off" | "on"
默认值:"off"

默认情况下为 G=IH=0。如果选择此选项,则必须指定 GH 参数。

编程用法

模块参数: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 GTime-invariant H 时,此参数才可用。否则,该信息将从 GH 矩阵中推导出来。

编程用法

模块参数:NumberOfProcessNoiseInputs
类型: 字符串、字符向量
值:标量
默认值:"1"

请从以下选项中选择一项:

  • 实数非负标量。Q 是一个由 NwNw 组成的对角矩阵,其对角线上为标量。Nw 是模型中过程噪声输入的个数。

  • 实数非负标量向量。Q 是一个 Nw×Nw 的对角矩阵,其对角线上包含向量 Q 的元素。

  • Nw×Nw 半正定矩阵。

依赖关系

要启用此参数,请选择 Time-invariant Q 参数。

编程用法

模块参数:Q
类型: 字符串、字符向量
值: 标量 | 向量 | 矩阵
默认值:"0.05"

如果取消选中此参数,该模块将包含一个额外的输入端口 Q

编程用法

模块参数:TimeInvariantQ
类型: 字符串、字符向量
值:"off" | "on"
默认值:"on"

请从以下选项中选择一项:

  • 实数正标量。R 是一个由 NyNy 组成的对角矩阵,其对角线上为标量。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,并从模块对话框中移除 BDNumber of inputs 参数。

编程用法

模块参数:AddInputPort
类型: 字符串、字符向量
值:"off" | "on"
默认值:"on"

如果您想控制测量数据的更新,请选择此选项。该模块还包含一个额外的输入端口 EnableEnable 输入端口接收一个标量信号。该参数默认未被选中。

默认情况下,该模块会在每个时间步长执行测量更新,以根据测量到的输出值改进状态和输出估计值 x^y^。当 Enable 端口的信号为 0 时,将跳过当前采样时间的测量更新。具体来说,状态估计的方程对于连续时间卡尔曼滤波器为 x^˙(t)=A(t)x^(t)+B(t)u(t),对于离散时间卡尔曼滤波器为 x^[n+1|n]=A[n]x^[n|n1]+B[n]u[n]

注意

启用 Enable 端口可控制测量数据的更新。默认情况下,Kalman Filter 负责更新测量数据。

编程用法

模块参数:AddEnablePort
类型: 字符串、字符向量
值:"off" | "on"
默认值:"off"

该参数用于控制模块何时重置。假设您在某个时间步长处重置了该模块,t。如果模块在 t 处被启用,软件将使用在模块对话框中或输入端口 P0X0 中指定的初始参数值来估计状态。换句话说,在 t 处,该模块会在复位后执行时间更新,如果该功能已启用,还会执行测量值更新。该模块输出这些更新后的估计值。

指定以下选项之一:

  • None(默认)- 估计状态 x^ 和状态估计误差协方差矩阵 P 的值不会被重置。

  • Rising - 当控制信号从负值或零值上升到正值时,触发复位。如果初始值是负数,则当值上升至零时会触发重置。

  • Falling - 当控制信号从正值或零值降至负值时,触发复位。如果初始值是正的,则降至零时将触发重置。

  • Either - 当控制信号处于上升沿或下降沿时,触发复位。

  • Level - 在以下任一情况下触发重置:

    • 在当前时间步长处,控制信号不为零。

    • 控制信号从上一时间步的非零值变为当前时间步的零值。

  • Level hold - 当控制信号在当前时间步长处不为零时,触发器将复位。

当您选择除 None 以外的选项时,该模块会添加一个 Reset 输入端口,用于提供复位控制输入信号。

编程用法

模块参数:ExternalReset
类型: 字符串、字符向量
值: "None" | "Rising" | "Falling" | "Either" | "Level" | "Level hold"
默认值:"None"

其他输出端口

在模块中添加一个 y^ 输出端口,用于输出模型的估计结果。该参数默认未被选中。

编程用法

模块参数:OutputEstimatedY
类型: 字符串、字符向量
值:"off" | "on"
默认值:"off"

向该模块添加一个名为 Z 的输出端口。只有当 Time domainDiscrete-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"

算法

全部展开

参考

[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 中推出

全部展开