先上理论,然后再一步一步通俗的讲解。
FKF的结构如下图所示,共有两层滤波结构,分别为主滤波器和子滤波器,子滤波器解算出来的最优估计值经过全局融合后,可以获得最终的最优估计值。
假设系统的状态空间模型如下:
其中,的协方差矩阵为
,
的协方差矩阵为
。
各个子系统的状态空间模型如下:
其中,的协方差矩阵为
,
的协方差矩阵为
。
那么FKF的解算过程包括以下五个步骤:
1、设置初值:
2、预测:
3、更新:主滤波器不存在对应的量测信息,所以主滤波器不需要进行量测更新。
4、融合:将子滤波器的局部最优解进行融合,获得融合后的全局最优解。
5、信息反馈和分配
通俗的讲:
定义:
(可能用不到)
(子滤波器的个数)
(每个滤波器分配相同的权重)
定义并初始化一个二维位置状态变量
定义并初始化系统的状态变量噪声的协方差
定义并初始化系统的状态变量的协方差
定义并初始化三个子系统的观测噪声方差为
设每个子滤波器的,状态转移方程
,观测源位置
。
系统和各子滤波器的初始位置都是[0,500],主滤波器和子滤波器的状态转移方程和状态变量都是一致的。
开始子滤波器1的预测步骤:
观测方程,非线性方程需要用EKF,对其求导得
,那么更新步骤为:
注意这里对状态变量协方差矩阵的更新和传统的相比是取逆的。其它两个子滤波器的更新过程同上。
现在对主滤波器进行预测:
融合:
更新子滤波器和主滤波器的协方差和位置进行下一轮:
用matlab实现这个联邦卡尔曼滤波器:
%%
clc
clear all;
close all;
%1.建一个匀速圆周运动的模型
r = 500;
x = -r:0.01:r;
y = sqrt(r.^2 - x.^2); %运动的轨迹
plot(x,[y;-y],'LineWidth',2);
grid on;axis equal;title('质点轨迹','FontSize',16)
xlabel('x/m','FontSize',16)
ylabel('y/m','FontSize',16)
xlim([-2000 2000])
ylim([-2000 2000])
text(750,750,'o','color','g')
text(750,750,'雷达1','FontSize',10)
text(-750,750,'o','color','g')
text(-750,750,'雷达2','FontSize',10)
text(0,-1000,'o','color','g')
text(0,-1000,'雷达3','FontSize',10)
%%
%目标的移动
Observation_time = 0.5;
v = 10;
w = v/r;%角速度
t = 0:Observation_time:2*pi/w;%刚好转一圈
Q = 2;%过程噪声
x_w=sqrt(Q)*randn(1,size(t,2));
y_w=sqrt(Q)*randn(1,size(t,2));
x_traj = r * sin(w*t);%实现刚好走完一圈
y_traj = r * cos(w*t);
s_traj = [x_traj;y_traj];
x_ture_traj = r * sin(w*t)+x_w;%实现刚好走完一圈
y_ture_traj = r * cos(w*t)+y_w;
ture_traj = [x_ture_traj;y_ture_traj];
%雷达的位置
radar_1 = [750 750];
radar_2 = [-750 750];
radar_3 = [0 -1000];
radar1_noise = 3;
radar2_noise = 1;
radar3_noise = 4;
%真实的测量信号
radar1_ture_measuremnet = sqrt((radar_1(1)-x_ture_traj).^2 + (radar_1(2)-y_ture_traj).^2 );
radar2_ture_measuremnet = sqrt((radar_2(1)-x_ture_traj).^2 + (radar_2(2)-y_ture_traj).^2 );
radar3_ture_measuremnet = sqrt((radar_3(1)-x_ture_traj).^2 + (radar_3(2)-y_ture_traj).^2 );
%加噪声的测量
radar1_noise_measuremnet = radar1_ture_measuremnet + radar1_noise * randn(1,size(radar1_ture_measuremnet,2));
radar2_noise_measuremnet = radar2_ture_measuremnet + radar2_noise * randn(1,size(radar2_ture_measuremnet,2));
radar3_noise_measuremnet = radar3_ture_measuremnet + radar3_noise * randn(1,size(radar3_ture_measuremnet,2));
%%
%FR结构的联邦滤波器(融合重置结构)
%联邦滤波器 三个子滤波器 一个主滤波器
beta_M = 0;
N = 3;
beta_i = 1/N;%每个传感器分配的权值是一样的
Q_process_noise_system = diag([2 2]);%系统的过程噪声
P_cov_system = diag([1000 1000 ]);%初始的系统协方差,随便给定的
X_init_state = [0;500];%初始目标的位置
%%%%%%%%%%%%%%%%%%%%%%%%%%%%1.信息分配与重置%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Q_process_noise_radar = 1/(beta_i) * Q_process_noise_system;
system_init_pos = X_init_state;
object1_init_pos = X_init_state;
object2_init_pos = X_init_state;
object3_init_pos = X_init_state;
object1_correct_pos = X_init_state;
object2_correct_pos = X_init_state;
object3_correct_pos = X_init_state;
fusion_pos = X_init_state;
object1_init_cov = 1/(beta_i) * P_cov_system;
object2_init_cov = 1/(beta_i) * P_cov_system;
object3_init_cov = 1/(beta_i) * P_cov_system;
for i = 1:size(radar1_ture_measuremnet,2)-1 %第一个观测值扔掉
%%%%%%%%%%%%%%%%%%%%%%%%%%%%2.传感器时间量测更新%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%由于是匀速圆周运动,所以可以用旋转矩阵来做预测 R = [cos(theta) -sin(theta) ; sin(theta) cos(theta)]
%由于旋转矩阵本身的方向是逆时针方向的,而本题物体的运动是顺时针的,所以需要用到旋转矩阵的逆 = 旋转矩阵的转置
theta = w * Observation_time * 1;
R = [cos(theta) -sin(theta);
sin(theta) cos(theta)]'; %对于每个传感器都是一样的
%%
%传感器1
%radar1的卡尔曼子滤波器
%预测
F = R;
object1_estimate_pos(:,i+1) = F * object1_init_pos;
P_object1_estimate = F * object1_init_cov * F' + Q_process_noise_radar;
%更新
%因为观测并不是线性的,所以这里需要用到拓展卡尔曼滤波,对观测方程进行求导
%观测矩阵也是不断变化的,因为是在均值处进行展开
dec = sqrt((radar_1(1)-object1_estimate_pos(1,i+1)).^2 + (radar_1(2)-object1_estimate_pos(2,i+1)).^2);
H = [ -(radar_1(1)-object1_estimate_pos(1,i+1))/dec -(radar_1(2)-object1_estimate_pos(2,i+1))/dec];
K = P_object1_estimate * H' * inv(H * P_object1_estimate * H' + radar1_noise) ;
object1_correct_pos(:,i+1) = object1_estimate_pos(:,i+1) + K * ( radar1_noise_measuremnet(i+1) - sqrt((radar_1(1)-object1_estimate_pos(1,i+1)).^2 + (radar_1(2)-object1_estimate_pos(2,i+1)).^2));
inform_object1_correct = inv((eye(2) - K * H)*P_object1_estimate);
%radar2的卡尔曼子滤波器
object2_estimate_pos(:,i+1) = F * object2_init_pos;
P_object2_estimate = F * object2_init_cov * F' + Q_process_noise_radar;
%更新
dec = sqrt((radar_2(1)-object2_estimate_pos(1,i+1)).^2 + (radar_2(2)-object2_estimate_pos(2,i+1)).^2);
H = [ -(radar_2(1)-object2_estimate_pos(1,i+1))/dec -(radar_2(2)-object2_estimate_pos(2,i+1))/dec];
K = P_object2_estimate * H' * inv(H * P_object2_estimate * H' + radar2_noise) ;
object2_correct_pos(:,i+1) = object2_estimate_pos(:,i+1) + K * ( radar2_noise_measuremnet(i+1) - sqrt((radar_2(1)-object2_estimate_pos(1,i+1)).^2 + (radar_2(2)-object2_estimate_pos(2,i+1)).^2));
inform_object2_correct = inv((eye(2) - K * H)*P_object2_estimate);
%%
%radar3的卡尔曼子滤波器
%object3_init_pos
object3_estimate_pos(:,i+1) = F * object3_init_pos;
P_object3_estimate = F * object3_init_cov * F' + Q_process_noise_radar;
%更新
dec = sqrt((radar_3(1)-object3_estimate_pos(1,i+1)).^2 + (radar_3(2)-object3_estimate_pos(2,i+1)).^2);
H = [ -(radar_3(1)-object3_estimate_pos(1,i+1))/dec -(radar_3(2)-object3_estimate_pos(2,i+1))/dec];
K = P_object3_estimate * H' * inv(H * P_object3_estimate * H' + radar3_noise) ;
object3_correct_pos(:,i+1) = object3_estimate_pos(:,i+1) + K * ( radar3_noise_measuremnet(i+1) - sqrt( (radar_3(1)-object3_estimate_pos(1,i+1)).^2 + (radar_3(2)-object3_estimate_pos(2,i+1)).^2) );
inform_object3_correct = inv((eye(2) - K * H)*P_object3_estimate);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%3.主滤波器时间更新%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%主滤波器 有3种模式,NR,ZR,FS
system_estimate_pos = F * system_init_pos;
system_estimate_cov = F * P_cov_system * F' + Q_process_noise_system;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%4.最后的融合处理%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fusion_cov = inv( inform_object1_correct + inform_object2_correct + inform_object3_correct + inv(system_estimate_cov));
fusion_pos(:,i+1) = fusion_cov* (inform_object1_correct *object1_correct_pos(:,i+1) + inform_object2_correct * object2_correct_pos(:,i+1) + inform_object3_correct *object3_correct_pos(:,i+1) + inv(system_estimate_cov) * system_estimate_pos );
object1_init_pos = fusion_pos(:,i+1);
object1_init_cov = 1/(beta_i) * fusion_cov;
object2_init_pos = fusion_pos(:,i+1);
object2_init_cov = 1/(beta_i) * fusion_cov;
object3_init_pos = fusion_pos(:,i+1);
object3_init_cov = 1/(beta_i) * fusion_cov;
system_init_pos = fusion_pos(:,i+1);
P_cov_system = fusion_cov ;
end
plot(x,[y;-y],'LineWidth',2);
grid on;axis equal;title('质点轨迹','FontSize',16)
xlabel('x/m','FontSize',16)
ylabel('y/m','FontSize',16)
xlim([-2000 2000])
ylim([-2000 2000])
text(750,750,'o','color','g')
text(750,750,'雷达1','FontSize',10)
text(-750,750,'o','color','g')
text(-750,750,'雷达2','FontSize',10)
text(0,-1000,'o','color','g')
text(0,-1000,'雷达3','FontSize',10)
hold on
comet(fusion_pos(1,:),fusion_pos(2,:))
for i=1:size(radar1_ture_measuremnet,2)-1
% Err_S(i)=Dist(ture_traj(:,i),s_traj(:,i));%滤波前的误差
Err_FF(i)=Dist(fusion_pos(:,i),ture_traj(:,i));%滤波前的误差
% Err_UKF(i)=RMS(X(:,i),Xukf(:,i));%滤波后的误差
end
% mean_S=mean(Err_S);
mean_FF=mean(Err_FF);
% mean_UKF=mean(Err_UKF);
% mean_PF=mean(Err_PF);
t=1:size(radar1_ture_measuremnet,2)-1;
figure
hold on;box on;
% plot(t,Err_Obs,'-');
% plot(t,Err_UKF,'--');
% plot(t,Err_S,'-.');
plot(t,Err_FF,'-.');
% legend('滤波前误差',num2str(mean_Observation),'基本滤波后误差','固定增益滤波后误差');
legend(sprintf('FF滤波后误差%.03f',mean_FF));
xlabel('观测时间/s');
ylabel('误差值');
function d=Dist(X1,X2)
if length(X2)<=2
d=sqrt((X1(1,1)-X2(1,1))^2+(X1(2,1)-X2(2,1))^2);
else
% d=sqrt((X1(1)-X2(1))^2+(X1(3)-X2(3))^2);
end
end
主要参考:Changjing-Liu (Changjing Liu) · GitHub