明白,你想做一个 基于协方差交叉(Covariance Intersection, CI)的多传感器融合算法仿真,并与 单传感器结果和 SCC(Sensor Cross Covariance, 假设这里是标准传感器协方差融合)融合 进行对比。下面我给你一个 完整 MATLAB 仿真示例框架,包括生成多传感器数据、CI融合、SCC融合和对比绘图。
MATLAB 仿真示例
clc; clear; close all;
%% 参数设置
dt = 1; % 采样时间
T = 50; % 仿真步数
x0 = [0; 0]; % 初始状态 [位置; 速度]
F = [1 dt; 0 1]; % 状态转移矩阵
Q = 0.01*[dt^3/3 dt^2/2; dt^2/2 dt]; % 系统噪声协方差
% 多传感器设置
R1 = 0.5^2; % 传感器1测量噪声方差
R2 = 1^2; % 传感器2测量噪声方差
H = [1 0]; % 测量矩阵
%% 初始化
x_true = zeros(2,T);
x_true(:,1) = x0;
z1 = zeros(1,T); z2 = zeros(1,T);
% 单传感器卡尔曼滤波初始化
x1_hat = zeros(2,T); P1 = eye(2);
x2_hat = zeros(2,T); P2 = eye(2);
% SCC初始化(假设传感器协方差已知)
x_scc = zeros(2,T); Pscc = eye(2);
% CI融合初始化
x_ci = zeros(2,T); Pci = eye(2);
%% 生成真实轨迹和测量
rng(0);
for k = 2:T
x_true(:,k) = F*x_true(:,k-1) + mvnrnd([0;0], Q)';
z1(k) = H*x_true(:,k) + sqrt(R1)*randn;
z2(k) = H*x_true(:,k) + sqrt(R2)*randn;
end
%% 仿真循环
for k = 2:T
%% 单传感器卡尔曼滤波器
% 传感器1
% 预测
x1_pred = F*x1_hat(:,k-1);
P1_pred = F*P1*F' + Q;
% 更新
K1 = P1_pred*H'/(H*P1_pred*H' + R1);
x1_hat(:,k) = x1_pred + K1*(z1(k) - H*x1_pred);
P1 = (eye(2) - K1*H)*P1_pred;
% 传感器2
x2_pred = F*x2_hat(:,k-1);
P2_pred = F*P2*F' + Q;
K2 = P2_pred*H'/(H*P2_pred*H' + R2);
x2_hat(:,k) = x2_pred + K2*(z2(k) - H*x2_pred);
P2 = (eye(2) - K2*H)*P2_pred;
%% SCC融合(简单加权融合)
% 假设协方差已知,使用最小方差加权
P_scc_inv = inv(P1) + inv(P2);
Pscc = inv(P_scc_inv);
x_scc(:,k) = Pscc * (inv(P1)*x1_hat(:,k) + inv(P2)*x2_hat(:,k));
%% CI融合
% CI算法
% 计算最优权重w,简单用0.5示例,也可优化
w = 0.5;
Pci = inv(w*inv(P1) + (1-w)*inv(P2));
x_ci(:,k) = Pci * (w*inv(P1)*x1_hat(:,k) + (1-w)*inv(P2)*x2_hat(:,k));
end
%% 绘图对比
figure;
plot(1:T, x_true(1,:), 'k', 'LineWidth',2); hold on;
plot(1:T, x1_hat(1,:), 'r--','LineWidth',1.5);
plot(1:T, x2_hat(1,:), 'b--','LineWidth',1.5);
plot(1:T, x_scc(1,:), 'g-.','LineWidth',1.5);
plot(1:T, x_ci(1,:), 'm','LineWidth',1.5);
legend('真实轨迹','传感器1','传感器2','SCC融合','CI融合');
xlabel('时间步'); ylabel('位置');
title('多传感器融合对比');
grid on;
说明
- 系统模型
- 二维状态
[位置; 速度]
,使用线性动态模型。 - 测量矩阵 H 只测位置。
- 二维状态
- 单传感器滤波
- 对每个传感器单独运行卡尔曼滤波。
- SCC融合
- 这里假设已知传感器协方差,使用最小方差加权。
- CI融合
- 协方差交叉融合公式:
- 权重 w 可通过优化选择。
- 结果可视化
- 绘制真实轨迹、单传感器估计、SCC融合、CI融合进行对比。
明白,我帮你把 CI 融合权重自适应优化加到 MATLAB 仿真中,并生成 均方误差(MSE)对比曲线,直观显示 CI 融合相比单传感器和 SCC 的优势。
自适应 CI 权重 MATLAB 仿真示例
clc; clear; close all;
%% 参数设置
dt = 1; T = 50; x0 = [0; 0];
F = [1 dt; 0 1];
Q = 0.01*[dt^3/3 dt^2/2; dt^2/2 dt];
% 传感器噪声
R1 = 0.5^2; R2 = 1^2;
H = [1 0];
%% 初始化
x_true = zeros(2,T); x_true(:,1) = x0;
z1 = zeros(1,T); z2 = zeros(1,T);
x1_hat = zeros(2,T); P1 = eye(2);
x2_hat = zeros(2,T); P2 = eye(2);
x_scc = zeros(2,T); Pscc = eye(2);
x_ci = zeros(2,T); Pci = eye(2);
%% 生成真实轨迹和测量
rng(0);
for k = 2:T
x_true(:,k) = F*x_true(:,k-1) + mvnrnd([0;0], Q)';
z1(k) = H*x_true(:,k) + sqrt(R1)*randn;
z2(k) = H*x_true(:,k) + sqrt(R2)*randn;
end
%% 仿真循环
for k = 2:T
%% 单传感器卡尔曼滤波
x1_pred = F*x1_hat(:,k-1); P1_pred = F*P1*F' + Q;
K1 = P1_pred*H'/(H*P1_pred*H' + R1);
x1_hat(:,k) = x1_pred + K1*(z1(k)-H*x1_pred);
P1 = (eye(2)-K1*H)*P1_pred;
x2_pred = F*x2_hat(:,k-1); P2_pred = F*P2*F' + Q;
K2 = P2_pred*H'/(H*P2_pred*H' + R2);
x2_hat(:,k) = x2_pred + K2*(z2(k)-H*x2_pred);
P2 = (eye(2)-K2*H)*P2_pred;
%% SCC融合
P_scc_inv = inv(P1) + inv(P2);
Pscc = inv(P_scc_inv);
x_scc(:,k) = Pscc * (inv(P1)*x1_hat(:,k) + inv(P2)*x2_hat(:,k));
%% CI融合(自适应权重)
% 权重 w 优化(最小迹)
w_candidates = 0:0.01:1;
min_trace = Inf; best_w = 0.5;
for w = w_candidates
P_temp = inv(w*inv(P1) + (1-w)*inv(P2));
if trace(P_temp) < min_trace
min_trace = trace(P_temp);
best_w = w;
end
end
% CI融合
w = best_w;
Pci = inv(w*inv(P1) + (1-w)*inv(P2));
x_ci(:,k) = Pci * (w*inv(P1)*x1_hat(:,k) + (1-w)*inv(P2)*x2_hat(:,k));
end
%% 均方误差计算
mse1 = mean((x1_hat(1,:)-x_true(1,:)).^2);
mse2 = mean((x2_hat(1,:)-x_true(1,:)).^2);
mse_scc = mean((x_scc(1,:)-x_true(1,:)).^2);
mse_ci = mean((x_ci(1,:)-x_true(1,:)).^2);
fprintf('MSE: Sensor1=%.4f, Sensor2=%.4f, SCC=%.4f, CI=%.4f\n', mse1, mse2, mse_scc, mse_ci);
%% 绘图
figure;
plot(1:T, x_true(1,:), 'k', 'LineWidth',2); hold on;
plot(1:T, x1_hat(1,:), 'r--','LineWidth',1.5);
plot(1:T, x2_hat(1,:), 'b--','LineWidth',1.5);
plot(1:T, x_scc(1,:), 'g-.','LineWidth',1.5);
plot(1:T, x_ci(1,:), 'm','LineWidth',1.5);
legend('真实轨迹','传感器1','传感器2','SCC融合','CI融合');
xlabel('时间步'); ylabel('位置');
title('多传感器融合对比(自适应CI)');
grid on;
%% MSE对比柱状图
figure;
bar([mse1 mse2 mse_scc mse_ci]);
set(gca,'xticklabel',{'Sensor1','Sensor2','SCC','CI'});
ylabel('均方误差(MSE)');
title('各方法MSE对比');
grid on;
说明
- 自适应权重 w
- CI 融合的权重通过 最小化协方差迹 (trace(P)) 来选取最佳 w。
- 避免了手动选择 w,提升融合精度。
- MSE对比
- 仿真计算各方法位置误差均方值,柱状图直观展示融合优势。
- CI 融合通常比单传感器和 SCC 更优。
- 可扩展
- 支持更多传感器,只需扩展 CI 融合权重搜索和 SCC 加权。
- 可改为非线性模型,配合 EKF 或 UKF 处理。
发表回复