强跟踪卡尔曼滤波STF估算车辆质量——matab simulink仿真

85 篇文章 15 订阅
56 篇文章 20 订阅


链接: https://pan.baidu.com/s/1VxxBkJqBI8nfrTJaNi2uKw
提取码:1234

目录

参考资料

强跟踪滤波器理论参考:
https://www.docin.com/p-1465349030.html基于强跟踪滤波器的故障诊断方法研究

matab simulink仿真参考:
卡尔曼滤波估算车辆质量——matab simulink仿真

强跟踪滤波器算法

在卡尔曼滤波器基础上引入渐消因子(自适应卡尔曼滤波),通过选取适当的增益K使残差系列正交。
在这里插入图片描述
强跟踪滤波器计算过程:
在这里插入图片描述
在这里插入图片描述

解决的问题

当车辆的质量出现突变时,对变化的质量进行跟踪。

Simulink模型

在这里插入图片描述
假设开始质量为60T,5s后突变为20T,比较卡尔曼滤波与强跟踪卡尔曼滤波的效果。

仿真步长为0.1s,卡尔曼滤波估算的车速和质量见下图,3s左右达到稳态,当质量在5s发生突变后,卡尔曼滤波对车速和质量的跟踪比较慢。
在这里插入图片描述
采用强跟踪卡尔曼滤波器估算的车速与质量如下图,当质量在5s发生突变后,强跟踪卡尔曼滤波对车速和质量的跟踪比较快。正确地估算出了结果。
在这里插入图片描述

车辆运动状态仿真代码

%kalman_sim.m
%Plant
function [u]=kalman_sim(u1,u2,u3,u4)
%u1:输入Ttq
Ttq=u1;
%u2:系统噪声W
W=u2;
%u3:测量噪声V
V=u3;
%u4:时间t
t=u4;

persistent v m i Ts ig i0 nn g f r CD A rou qq
if t==0
    Ts=0.1;
    ig=1.0;
    i0=6.83;
    nn=0.95*0.96;
    g=9.8;
    f=0.011;
    r=0.502;
    CD=0.8;%%%%%卡车取0.8 客车0.65
    A=1.92*3.09;
    rou=1.2258;
    qq=1.027+0.000331*i0^2.*ig.^2;%%汽车质量转换系数
    
    v=0.0;
    m=60000.0;
    i=0.0;
    z=v+V;
end
if t>5
    m=20000.0;%假设5秒后质量出现突变2020
end
if t>0
    dv=1/qq*(Ttq*ig*i0*nn/(m*r)-g*f-CD*A*rou*v^2/(2*m)-g*i);
    v=v+Ts*dv+Ts*W;
    z=v+V;
end

u(1)=v;
u(2)=m;
u(3)=i;
u(4)=z;

强跟踪卡尔曼滤波代码

%kalman_m_i.m
%Plant
function [u]=kalman_sim(u1,u2,u3)
%u1:输入Ttq
Ttq=u1;
%u2:系统噪声W
z=u2;
%u3:时间t
t=u3;

%persistent v m i
persistent x Ts ig i0 nn g f r CD A rou qq Q R P H Jf V0
if t==0
    Ts=0.1;
    ig=1.0;
    i0=6.83;
    nn=0.95*0.96;
    g=9.8;
    f=0.011;
    r=0.502;
    CD=0.8;%%%%%卡车取0.8 客车0.65
    A=1.92*3.09;
    rou=1.2258;
    qq=1.027+0.000331*i0^2.*ig.^2;%%汽车质量转换系数

    %系统方程:
    
    H=[1.0,0.0,0.0];  
      
    %Covariances of w:
    Q=diag([Ts*0.1*Ts',0,0]);

    %Covariances of v:
    R=[0.1];

    %初始估计值:
    x=[0;30000;0.0];

    %初始估计误差协方差:
    P=diag([Ts*0.1*Ts',9000000000,0.000000]); 
    
    u=x;%开始时刻不进行卡尔曼滤波,直接将初始值输出,2020
end

%%卡尔曼滤波::
if t>0
    %先验,Time update:
    %根据系统状态方程计算下一状态预测值:
    %x=A*x+B*u1;
    Jf=eye(3);
    Jf(1,1)=1-CD*A*rou*x(1)*Ts/x(2)/qq;%add /qq 2020
    Jf(1,2)=(CD*A*rou*x(1)^2*r-2*Ttq*ig*i0*nn)/(2*x(2)^2*r)*Ts/qq;%add /qq 2020
    Jf(1,3)=-g*Ts; 

    v=x(1);
    m=x(2);
    i=x(3);
    dv=1/qq*(Ttq*ig*i0*nn/(m*r)-g*f-CD*A*rou*v^2/(2*m)-g*i);
    v=v+Ts*dv;
    x(1)=v;
    x(2)=m;
    x(3)=i;
 
    %************强跟踪滤波器STF核心代码《::*********************************
    %**************************************
    % 可调节参数汇总
    %**************************************
    rho=0.95;                         % 残差方差阵的遗忘因子初始值 (0.95<rho<0.995)
    beta=1;                           % 量测噪声的衰减因子选定值 (beta>=1)
    %beta_upmax=8;                     % 衰减因子选定极限
    %***************************************
    F=Jf;
    r0=z-H*x;
    if t==Ts
        V0=r0*r0';
    else
        V0=(rho*V0+r0*r0')/(1+rho);
    end
    N=V0-beta*R-H*Q*H';
    M=H*F*P*F'*H';
    eta=trace(N)/trace(M);
    if eta>1
        lamda=1;%eta;
    else
        lamda=1;
    end
    
    %预测误差协方差:
    P=lamda*Jf*P*Jf'+Q;  
    %!!!渐消因子lamda=1即为普通卡尔曼滤波!!!
    %************STF核心代码》************************************************
    
    %后验,Measurement update:
    %根据估计误差协方差和测量噪声协方差计算卡尔曼增益:
    Kk=P*H'/(H*P*H'+R);

    %计算最优估计值:    
    %x=A*x+Mn*(yv-C*A*x);
    x=x+Kk*(z-H*x);

    %计算最优估计值和真实值之间的误差协方差矩阵,为下次递推做准备:
    P=(eye(3)-Kk*H)*P;

    %ye=C*x;           %Filtered value
    u=x;    %Filtered signal

    errcov=H*P*H';      %Covariance of estimation error   
    
end
%}
以下是基于渐消因子的跟踪滤波算法的Matlab代码实现: ``` % 基于渐消因子的跟踪滤波算法 % 参考文献:[1] B. J. Kim, et al. “Real-time visual tracking using adaptive correlation filters,” CVPR, 2015. % 输入: % - im: 当前帧图像 % - state: 上一帧目标的状态 [x, y, w, h] % - param: 算法参数结构体,包含以下字段: % - search_area_scale: 搜索区域尺度,相对于目标尺寸的倍数,默认为 4 % - output_sigma_factor: 输出响应图尺度因子,默认为 0.1 % - learning_rate: 模型更新速率,默认为 0.075 % - regularization: 正则化参数,默认为 0.01 % 输出: % - state: 当前帧目标的状态 [x, y, w, h] function state = dsst_tracking(im, state, param) % 参数设置 if ~exist('param', 'var') param = struct(); end if ~isfield(param, 'search_area_scale') param.search_area_scale = 4; end if ~isfield(param, 'output_sigma_factor') param.output_sigma_factor = 0.1; end if ~isfield(param, 'learning_rate') param.learning_rate = 0.075; end if ~isfield(param, 'regularization') param.regularization = 0.01; end % 模板大小 target_sz = [state(4), state(3)]; template_size = floor(target_sz * (1 + param.search_area_scale)); if mod(template_size(1), 2) == 0 template_size(1) = template_size(1) + 1; end if mod(template_size(2), 2) == 0 template_size(2) = template_size(2) + 1; end % 搜索区域 search_area = imcrop(im, [state(1), state(2), template_size(2)-1, template_size(1)-1]); % 特征提取 features = get_features(search_area); % 响应图 response = real(ifft2(sum(conj(param.model) .* fft2(features), 3))); response = circshift(response, floor(size(response)/2)); % 目标位置估计 [row, col] = find(response == max(response(:)), 1); pos = double([col, row]); pos_in_search_area = pos - floor(size(response)/2); state(1) = state(1) + pos_in_search_area(1); state(2) = state(2) + pos_in_search_area(2); % 模板更新 new_features = get_features(imcrop(im, [state(1), state(2), target_sz(2)-1, target_sz(1)-1])); new_model = (1 - param.learning_rate) * param.model + param.learning_rate * new_features; param.model = new_model / norm(new_model(:)); % 输出响应图缩放 output_sz = size(response) * param.output_sigma_factor; y = gaussian_shaped_labels(output_sz); yf = fft2(y); param.model = bsxfun(@rdivide, param.model, sum(param.model .* conj(param.model), 3) + param.regularization); param.model_f = fft2(param.model); state(3) = state(3) + param.learning_rate * (target_sz(2) - state(3)); state(4) = state(4) + param.learning_rate * (target_sz(1) - state(4)); end % 获取特征 function features = get_features(im) % TODO:使用合适的特征提取方法 end % 生成高斯响应图 function y = gaussian_shaped_labels(sz, sigma) if nargin < 2 sigma = 0.5; end [rs, cs] = ndgrid((1:sz(1))-floor(sz(1)/2), (1:sz(2))-floor(sz(2)/2)); y = exp(-0.5 / sigma^2 * (rs.^2 + cs.^2)); y = circshift(y, floor(sz/2)); end ``` 其中,`get_features` 函数需要根据具体应用选择合适的特征提取方法。在实际应用中,可以采用 HOG 特征、颜色直方图等方式进行特征提取。
评论 81
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值