乐趣区

关于算法:matlab实现扩展卡尔曼滤波EKF进行故障检测

原文链接:http://tecdat.cn/?p=22467 

本文展现了如何应用扩大卡尔曼滤波器进行故障检测。本文应用扩大的卡尔曼滤波器对一个简略的直流电机的摩擦力进行在线预计。预计的摩擦力的重大变动被检测进去,并表明存在故障。

电机模型

电机被模仿成具备阻尼系数 c,_转动惯量_J,由一个扭矩 u 驱动。电机的角速度 w 和加速度˙w 是测量输入。

为了应用扩大卡尔曼滤波器预计阻尼系数 c,为阻尼系数引入一个辅助状态,并将其导数设为零。

因而,模型状态,x = [w;c],和测量,y,方程式为:

应用近似值˙x=xn+1-xnTs 将间断工夫方程转换为离散工夫,其中 Ts 为离散采样周期。这就失去了离散工夫模型方程。

指定电机参数

J  = 10;    % 惯性
Ts = 0.01;  % 采样工夫

指定初始状态。

x = \[...
 0; ... % 角速度 
    1\]; % 摩擦力
% 以摩擦为状态的电机的状态更新方程
% 状态更新方程式
x1 = \[...
    x0(1)+Ts/J*(u-x0(1)*x0(2)); ...
    x0(2)\];
% 以摩擦为状态的电机的测量方程

% 输入。% y - 电机测量元素 \[角速度;角加速度 \]。y = \[...
    x(1); ...
    (u-x(1)*x(2))/J\];

电机经验状态(过程)噪声烦扰,q,和测量噪声烦扰,r。噪声项是相加的。

过程和测量噪声的平均值为零,E[q]=E[r]=0,协方差 Q =E[qq’]和 R =E[rr’]。摩擦状态有很高的过程噪声烦扰。这反映了咱们心愿摩擦力在电机失常运行期间会有变动,并且滤波器能跟踪这种变动。减速和速度状态的噪声很低,但速度和加速度测量的噪声绝对较大。

指定过程噪声协方差。

\[...
    1e-6 0; ...   % 角速度

    0 1e-2\];      % 摩擦力

指定测量噪声协方差。

\[...
    1e-4 0; ...  % 速度测量
    0 1e-4\];     % 加速度测量

创立一个扩大的卡尔曼过滤器

创立一个扩大的卡尔曼滤波器来预计模型的状态。咱们特地关注阻尼状态,因为这个状态值的急剧变动表明存在故障事件。
创立一个扩大卡尔曼滤波器对象,并指定状态转换和测量函数的雅各布系数。

扩大卡尔曼滤波器的输出参数是之前定义的状态转换和测量函数。初始状态值 x0、初始状态协方差、过程和测量噪声协方差也是扩大卡尔曼滤波器的输出。在这个例子中,准确的雅各布函数能够从状态转换函数 f 和测量函数 h 中失去。

% 输入
Jac - 在 x 处计算出的状态雅各布系数


% 雅各布系数
Jac = \[1-Ts/J\*x(2) -Ts/J\*x(1); ...
    0 1\];

% 电机模型测量方程的雅各布系数

% 输入
Jac - 在 x 处计算的测量雅各布系数


% 雅各布系数
J = \[ ...
    1 0;
    -x(2)/J -x(1)/J\];

Simulation 仿真

为了模仿工厂,创立一个环路,在电机中引入一个故障(虚构的电机激烈变动)。在模仿回路中,应用扩大的卡尔曼滤波器来预计电机状态,并特地跟踪摩擦状态,检测摩擦力何时产生统计意义上的变动。

电机被模仿成一个脉冲序列,重复减速和加速。这种类型的电机操作对于生产线上的采摘机器人来说是典型的。

在模仿电机时,退出与构建扩大卡尔曼滤波器时应用的 Q 和 R 噪声协方差值类似的过程和测量噪声。对于摩擦,应用一个小得多的噪声值,因为除了故障产生时,摩擦大多是恒定的。在模仿过程中人为地诱发故障。

Qv = chol(Q); % 过程噪声的标准偏差
Qv(end) = 1e-2; % 较小的摩擦噪声
Rv = chol(R); % 测量噪声的标准偏差

应用状态更新方程对模型进行仿真,并在模型状态中退出过程噪声。仿真十秒钟后,强制扭转电机的摩擦力。应用模型测量性能来模仿电机传感器,并在模型输入中退出测量噪声。

for ct = 1:numel(t)  
 % 模型输入更新   
   y = y+Rv*randn(2,1); % 增加测量噪声
   % 模型状态更新 
   xSig(:,ct) = x0;
   % 诱发摩擦力的变动
   if t(ct) == 10
       x1(2) = 10; % 步骤变动
 
   x1n = x1+Qv*randn(nx  % 退出过程噪声
Significant friction change at 10.450000

为了从电机测量值中预计电机状态,应用扩大卡尔曼滤波器的预测和纠正命令。


  % 应用扩大卡尔曼滤波器进行状态预计
   x_corr = correct(ekf,y,u(ct),J,Ts); % 依据以后测量后果修改状态预计。predict(ekf,u(ct),J,Ts); % 依据以后状态和输出预测下一个状态。

为了检测摩擦力的变动,应用 4 秒的挪动窗口来计算预计的摩擦力平均值和标准偏差。在最后的 7 秒之后,锁定计算的平均值和标准差。这个最后计算出的平均值是摩擦力的预期无故障平均值。7 秒后,如果预计的摩擦力与预期的无故障平均值相差超过 3 个标准差,这就意味着摩擦力有了显著的变动。为了缩小乐音和预计摩擦力的影响,在与 3 个标准差的界线比拟时,应用预计摩擦力的平均值。

% 计算预计平均值和标准偏差。else
       % 存储计算出的平均数和标准差,不须要
       % 从新计算。fMean(ct) = fMean(ct-1) 
       % 应用预期的摩擦力平均值和标准偏差来检测
       % 摩擦力变动。estFriction = mean(xSigEst(2, 
   if fChanged(ct) && ~fChanged(ct-1) 
       % 检测摩擦变动信号的回升沿 |fChanged|

应用预计的状态来计算预计的输入。计算测量输入和预计输入之间的误差,并计算出误差统计。误差统计可用于检测摩擦力的变动。这一点将在前面具体探讨。

 
       kurtosis(ySigEst(1,idx)-ySig(1,idx));  
       kurtosis(ySigEst(2,idx)-ySig(2,idx))\];

扩大的卡尔曼滤波器性能

请留神,在 10.45 秒时检测到了一个摩擦变动。咱们当初形容一下这个故障检测规定是如何得出的。首先查看仿真后果和过滤器的性能。

figure, 
 plot(t,  Sig(1,:)  Sig(2,:));

模型的输入输出响应表明,很难间接从测量信号中检测出摩擦力的变动。扩大的卡尔曼滤可能预计状态,特地是摩擦状态。比拟实在的模型状态和预计状态。预计的状态显示了对应于 3 个标准差的置信区间。

plot(t, True(1,:), t,  Est(1,:), ...

请留神,滤波器的估计值跟踪了实在值,而且置信区间依然有界。查看预计误差能够更深刻地理解滤波器。

plot(t,True(1,:)-Est(1,:)

误差图显示,滤波器在 10 秒的摩擦力变动后进行了调整,并将预计误差升高到了零。然而,误差图不能用于故障检测,因为它们依赖于对实在状态的理解。将测量的状态值与加速度和速度的预计状态值进行比拟,能够提供一种检测机制。

plot(t,Sig(1,:-Est(1,:)

加速度误差图显示,在引入故障的 10 秒左右,平均误差有渺小的差别。查看误差统计,看看是否能够从计算的误差中检测出故障。加速度和速度误差预计是正态分布的(噪声模型都是高斯的)。因而,加速度误差的峰度可能有助于辨认因为摩擦力的变动和由此产生的误差散布从对称变为不对称的变动状况。

plot(t,Kur(1,:)

疏忽预计器仍在收敛和收集数据的前 4 秒,误差的峰度绝对稳固,在 3(高斯分布的预期峰度值)左近有渺小的变动。因而,在这个利用中,误差统计不能被用来自动检测摩擦力的变动。在这个利用中,应用误差的峰度也是很艰难的,因为过滤器正在适应并一直地将误差推向零,只给出了一个误差散布与零不同的短暂工夫窗口。

因而在这个利用中,应用预计的摩擦力的变动提供了自动检测电机故障的最好办法。来自已知无故障数据的摩擦力估计值(平均值和标准偏差)提供了摩擦力的预期界线,当这些界线被超过时,很容易检测进去。上面的图强调了这种故障检测办法。

plot(t,x,\[nan t\],\[Mean+3\*STD,Mean-3\*STD\]

摘要

这个例子展现了如何应用扩大的卡尔曼滤波器来预计一个简略的直流电动机的摩擦力,并应用摩擦力估计值进行故障检测。


最受欢迎的见解

1.matlab 应用教训模式合成 emd 对信号进行去噪

2.Matlab 应用 Hampel 滤波去除异样值

3.matlab 偏最小二乘回归 (PLSR) 和主成分回归(PCR)

4.matlab 预测 ARMA-GARCH 条件均值和方差模型

5.matlab 中应用 VMD(变分模态合成) 

6.matlab 应用贝叶斯优化的深度学习

7.matlab 贝叶斯隐马尔可夫 hmm 模型

8.matlab 中的隐马尔可夫模型 (HMM) 实现

9.matlab 实现 MCMC 的马尔可夫切换 ARMA – GARCH 模型

退出移动版