【状态估计】【卡尔曼-加权最小二乘(KEWLS)和KEWLS-KF(KKF)】采用低维线性卡尔曼滤波器将单个传感器测量外推/预测到单个估计瞬间,用于WLS多点定位方法的新方法(Matlab代码实现)

2024-01-21

???????????????? 欢迎来到本博客 ❤️❤️????????

????博主优势: ???????????? 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️ 座右铭: 行百里者,半于九十。

???????????? 本文目录如下: ????????????

目录

????1 概述

????2 运行结果

????3 参考文献

????4 Matlab代码实现


????1 概述

KEWLS和KEWLS-KF是一种新的状态估计方法,它们采用低维线性卡尔曼滤波器将单个传感器的测量外推/预测到单个估计瞬间。这些方法主要用于WLS多点定位方法,可以提高定位的精度和鲁棒性。

KEWLS和KEWLS-KF方法的核心是卡尔曼滤波器,它可以通过对系统动态模型和测量模型进行有效的状态估计。通过将单个传感器的测量外推/预测到单个估计瞬间,KEWLS和KEWLS-KF可以有效地处理传感器测量中的噪声和不确定性,从而提高定位的精度和鲁棒性。

与传统的WLS多点定位方法相比,KEWLS和KEWLS-KF方法具有更好的性能,尤其是在复杂环境和噪声干扰下。这些方法可以应用于各种领域,如室内定位、车辆定位和机器人定位等,为实时定位和导航提供了新的可能性。因此,KEWLS和KEWLS-KF方法在状态估计领域具有重要的研究意义和实际应用前景。

摘要
本文代码运行了一个变量定位模拟,其中四个独立的传感器测量它们与动态目标的各自距离。然而,这些测量是按顺序接收的。这些测量之间的时间差是恒定的,并被称为测量间延迟(IML)。这自然会导致定位估计的误差。

模拟了可变位置服务,以确定IML的影响,并提出了用于顺序异步定位的方法(KEWLS/KKF)。

该模型作为批量模拟运行,其中每个传感器提供其嘈杂的测量估计,并采用各种位置技术来提供最终的估计。

关键变量
首先,该模型被构建为跟踪一个对象在直线或圆形路径上的运动。可以调整变量以改变轨迹、动力学、噪声水平、速度等。

d_t = IML(秒)
r_z = 单个传感器测量噪声标准差
q = KEWLS卡尔曼外推过程Q的标准差/预测D
qt = CV模型中过程Q加速度的标准差
ang = 0.2;%圆形路径的角度

其他模拟设置变量
bl = 传感器之间的基线距离(米)
Lim = 旅行限制的基线倍增器
xV = 目标x轴速度(米/秒)
yV = 目标y轴速度(米/秒)
move_noise = 目标移动噪声标准差(米)
s_pos = 目标起始位置
delay = 1;%将d_t延迟测量(如果不需要延迟,则设为0)

模型
该模型生成了与各种定位方法的准确性和运行时间相关的各种图表。
结构
可以选择一个变量通过一系列循环进行变化,在这些循环中,所选择的变量将在“Var”的下一个数组值中循环,可以使用lin/log或手动设置来改变“Var”:
Var = linspace(0.001,0.1,No_loops); %从第二个值开始
Var = logspace(-2,3,No_loops); %从第二个值开始
Var = [0.001,.002,.003,.004,.005,.006,.007,.008,.009,...
.01,.02,.03,.04,.05,.06,.07,.08,.09,...
.1,.2,.3,.4,.5,.6,.7,.8,.9,1];
一定要在这里更改数值!
r_z = Var(loop);
ChangingVar = 'r_z';
设置^^这将允许在最后进行自动标记

No_loops = 28;%变量循环次数(如果手动设置了Var的值,应该等于length(Var))
通过每个变量,模拟将重复“No_it”次,以计算平均值。
No_it = 100;%迭代次数
鉴于tic/toc函数在10毫秒以下的不准确性,可以进一步重复“No_times”次,以给出各个定位方法的可用时间估计。
No_times = 1;%重复进行tic/toc函数的次数
建议将其保留为1,除非需要专门测量计算时间。

过程
模型最初运行并使用“DelayedLaterationFunc”或“DelayedLaterationFunc_circ”(如果ang~=0)收集完整的嘈杂测量数据。

然后,这些数据被分别输入到各种定位方法中,以提供它们各自的估计。

对于每个变量值的每次迭代,都会重复这一过程,利用平均值来确定RMSE、路径和一般跟踪性能。

KEWLS和KKF
这些是采用低维线性卡尔曼滤波器将单个传感器测量外推/预测到单个估计瞬间,用于WLS多点定位方法的新方法。

结果
在“Results”目录下已经给出了多种场景的结果。

???? 2 运行结果

主函数部分代码:

clear all
clc

%%run variable loop
%%/
%here we will change a variable and run it through the 'loop'
No_loops = 28;  %number of variable loops
No_it = 100;     %number of iterations
No_times = 1;   %number of times a process is repeated for tic/toc func

%loop storage
LS_RMSE     = zeros(1,No_loops); %classic least squares
UKF_RMSE    = zeros(1,No_loops); %classic Unscented Kalman filter
KEWLS_RMSE   = zeros(1,No_loops); %proposed = Sequential extrapolation / batch estimation
KKF_RMSE = zeros(1,No_loops); %proposed but with an additional KF
SUKF_RMSE   = zeros(1,No_loops); %sequential Unscented Kalman filter

LS_mean     = cell(1,No_loops); %classic least squares
UKF_mean    = cell(1,No_loops); %classic Unscented Kalman filter
KEWLS_mean   = cell(1,No_loops); %proposed = Sequential extrapolation / batch estimation
KKF_mean = cell(1,No_loops); %proposed but with an additional KF
SUKF_mean   = cell(1,No_loops); %sequential Unscented Kalman filter

LS_t    = zeros(1,No_loops);
UKF_t   = zeros(1,No_loops);
KEWLS_t  = zeros(1,No_loops);
KKF_t= zeros(1,No_loops);
SUKF_t  = zeros(1,No_loops);

%%// VARIABLES

bl = 10; %baseline
Lim = 1; %basline multiplier for travel limits
xV = 1;
yV = 1;

move_noise = 0; %Movement noise StD
s_pos = [0 ; 0]; %target start Position
delay = 1; % LEAVE AS 1 to delay the measurements by d_t or not
R = RRLH2D_positions(bl);   %generate pos of rx's

.....

%% storage in cells for each variable iteration
posX = cell(1,250);
posY = cell(1,250);
M_posX = cell(1,250);
M_posY = cell(1,250);
Measurments = cell(1,250); % noisy measurments
True_distances = cell(1,250); % actual distances
True_dis_atEstPos = cell(1,250); % actual distances at the estimation point

%% Least squares and two step least squares
LS_estX = cell(1,250);
LS_estY = cell(1,250);
LS_Errors =  cell(1,250);
LS_time = zeros(1,100);

%% Classic Unscented Kalman filter
UKF_estX = cell(1,250);
UKF_estY = cell(1,250);
UKF_Errors =  cell(1,250);
UKF_time = zeros(1,100);

%% KEWLS
KEWLS_estX = cell(1,250);
KEWLS_estY = cell(1,250);
KEWLS_Errors = cell(1,250);
KEWLS_time = zeros(1,100);

%% KEWLS-KF (KKF)
KKF_estX = cell(1,250);
KKF_estY = cell(1,250);
KKF_Errors = cell(1,250);
KKF_time = zeros(1,100);

%% SUKF solution
SUKF_estX = cell(1,250);
SUKF_estY = cell(1,250);
SUKF_Errors = cell(1,250);
SUKF_time = zeros(1,100);

%%/// RUN ITERATIONS //

%% ITERATIONS

%% generate a circular path
C_path = 0;
if ang ~= 0
%distance per simulation time interval = time interval to mainatin 1m/s
Radius = 1/ang;
No_steps = (2*pi*Radius)/0.0001; %circumfrence distance/simulation time
C_path = circle_move(Radius,bl,No_steps);
end
%run through iterations
for it = 1:No_it

%Run the simulation to collect measurment data
if ang == 0
[True_est_pos, measurment_pos, measurments, true_distances, true_dis_atEstPos] =...
DelayedLaterationFunc_Str(R, delay, bl, Lim, xV, yV, d_t, s_pos, r_z, move_noise);
else
[True_est_pos, measurment_pos, measurments, true_distances, true_dis_atEstPos] =...
DelayedLaterationFunc_circ(R, delay, bl, Lim, xV, yV, d_t, s_pos, C_path, r_z, move_noise);
end

% store data
%legendCell{it} = append(num2str(d_t),'s'); %convert d_t to string for legend
posX{it} = True_est_pos(1,:);
posY{it} = True_est_pos(2,:);
M_posX{it} = measurment_pos(1,:);
M_posY{it} = measurment_pos(2,:);
Measurments{it} = measurments;
True_distances{it} = true_distances;
True_dis_atEstPos{it} = true_dis_atEstPos;

%% perform standard LS on the measurments - (currently TS is turned off for fair timing)

可视化部分代码:

%% RMSE error %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure(1)
hold on
plot(Var,LS_RMSE,'-.')
plot(Var,UKF_RMSE,'-.')
plot(Var,SUKF_RMSE, '--')
plot(Var,KEWLS_RMSE)
plot(Var,KKF_RMSE)
legend('LS','UKF','SUKF','KEWLS', 'K-KF')
ylabel('RMSE/m')
xlabel(label)
T = append('System RMSE with varied ', ChangingVar);
title(T)
hold off
%% execution time %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure(2)
hold on
plot(Var,LS_t,'-.')
plot(Var,UKF_t,'-.')
plot(Var,SUKF_t, '--')
plot(Var,KEWLS_t)
plot(Var,KKF_t)
legend('LS','UKF','SUKF','KEWLS', 'K-KF')
ylabel('Time taken to compute all points/s')
xlabel(label)
T = append('Execution Time with varied ', ChangingVar);
title(T)
hold off
%% Last Loop avererage errors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure(3)
hold on
plot(LS_me,'-.')
plot(UKF_me,'-.')
plot(SUKF_me,'--')
plot(KEWLS_me)
plot(KKF_me)
legend('LS','UKF','SUKF','KEWLS','K-KF')
xlabel('Iteration')
T = append('Average Error with varied ', ChangingVar);
title(T)
hold off
%% Last Loop, last iteration, errors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure(4)
hold on
for i = 1:1%it
plot(LS_Errors{i}(1,3:end),'-.')
plot(UKF_Errors{i}(1,3:end),'-.')
plot(SUKF_Errors{i}(1,3:end),'--')
plot(KEWLS_Errors{i})
plot(KKF_Errors{i})
end
legend('LS','UKF','SUKF','KEWLS','K-KF')
ylabel('Error /m')
xlabel('Iteration')
T = append('Last iteration error with varied ', ChangingVar);
title(T)
hold off

%% Path Plot & Estimate points %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(5)
hold on
%plot user positions
for i = 1:1%iteration-1
plot(posX{i},posY{i},'+')
end

%plot LS estimates
for i = 1:1%iteration-1
plot(LS_estX{i},LS_estY{i},'*')
end

%plot proposed estimates
for i = 1:1%iteration-1
plot(KEWLS_estX{i},KEWLS_estY{i}, 'p')
end

%plot UKF estimates
for i = 1:1%iteration-1
plot(UKF_estX{i},UKF_estY{i}, 'x')
end

%plot UKF estimates
for i = 1:1%iteration-1
plot(SUKF_estX{i},SUKF_estY{i}, 'o')
end

%plots lines between each estimate and position.
for i = 1:1%iteration-1
for j = 1:length(LS_estX{i})
x = [LS_estX{i}(j) , posX{i}(j)];
y = [LS_estY{i}(j) , posY{i}(j)];
plot(x,y,'--','LineWidth',2)
end
end

%plots lines between each estimate and position.
for i = 1:1%iteration-1
for j = 1:length(KEWLS_estX{i}(1,1:end-2))
x = [KEWLS_estX{i}(j) , posX{i}(j+2)];
y = [KEWLS_estY{i}(j) , posY{i}(j+2)];
plot(x,y,'LineWidth',2)
end
end

%plots lines between each estimate and position.
for i = 1:1%iteration-1
for j = 1:length(SUKF_estX{i})
x = [SUKF_estX{i}(j) , posX{i}(j)];
y = [SUKF_estY{i}(j) , posY{i}(j)];
plot(x,y,'-.','LineWidth',2)
end
end

%plots lines between each estimate and position.
for i = 1:1%iteration-1
for j = 1:length(UKF_estX{i})
x = [UKF_estX{i}(j) , posX{i}(j)];
y = [UKF_estY{i}(j) , posY{i}(j)];
plot(x,y,'-.','LineWidth',2)
end
end

axis equal
scatter(R(1,:),R(2,:),100,'^','LineWidth',2) %show the RRLHs
%legend(legendCell)
legend('UT position','LS est', 'KEWLS', 'UKF' , 'SUKF')
T = append('Path plot with varied ', ChangingVar);
title(T)
xlabel('X position /m')
ylabel('Y position /m)')
hold off
%% Path Plot

figure(6)
hold on
plot(posX{1},posY{1})
plot(LS_estX{1},LS_estY{1})
plot(UKF_estX{1},UKF_estY{1})
plot(SUKF_estX{1},SUKF_estY{1})
plot(KEWLS_estX{1},KEWLS_estY{1})
plot(KKF_estX{1},KKF_estY{1})
axis equal
scatter(R(1,:),R(2,:),100,'^','LineWidth',2) %show the RRLHs
legend('Target Position','LS','UKF','SUKF','KEWLS','K-KF')
T = append('Path plot with varied ', ChangingVar);
title(T)
xlabel('X position /m')
ylabel('Y position /m)')
hold off


figure(10)
loglog(Var,LS_RMSE,'-.')
hold on
loglog(Var,UKF_RMSE,'-.')
loglog(Var,SUKF_RMSE, '--')
loglog(Var,KEWLS_RMSE)
loglog(Var,KKF_RMSE)
legend('LS','UKF','SUKF','KEWLS','K-KF')
ylabel('RMSE/m')
xlabel(label)
T = append('System RMSE with varied ', ChangingVar);
title(T)
hold off

????3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]陈鹏,钱徽,朱淼良.基于加权最小二乘的卡尔曼滤波算法[J].计算机科学, 2009.DOI:JournalArticle/5af37a83c095d718d80ccec5.

[2]张肖雄.基于卡尔曼滤波的系统状态和荷载识别方法研究[D].湖南大学,2019.

[3]陈鹏,钱徽,朱淼良.基于加权最小二乘的卡尔曼滤波算法[J].计算机科学, 2009(11):236-237+263.DOI:CNKI:SUN:JSJA.0.2009-11-059.

???? 4 Matlab代码 实现

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【状态估计】【卡尔曼-加权最小二乘(KEWLS)和KEWLS-KF(KKF)】采用低维线性卡尔曼滤波器将单个传感器测量外推/预测到单个估计瞬间,用于WLS多点定位方法的新方法(Matlab代码实现) 的相关文章

  • 在 MATLAB 中分析 wav 文件

    所以我有这个钢琴录音 wav 格式 我能够做一个FFT整体记录并识别频率 然而 根据我读过的一些文章 最好将 wav 文件分解为多个窗口 其中每个窗口都包含一个特定的音符 为此 我需要首先绘制时域信号的 功率包络 考虑音符平均能量概念 因此
  • 计算向量中连续 1 和 0 的数量

    在 Matlab 中我有一个如下所示的向量 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 我现在要做的是统计这个向量中1的个数 连续的 1 算作 1 此外 我还想计算 1 之间 0 的平均值和中
  • Matlab,如何获取imagesc生成的结果?

    我读过一些类似的文章 但它们不是我想要的 得到imagesc之后的矩阵 https stackoverflow com questions 14364239 get the matrix after imagesc 14364434 143
  • 如何在matlab中显示图像上的点?

    我有一些像素点 比如 p1 1 1 和 p2 1 10 等等 我想以任何颜色在图像上显示这些点 这个怎么做 MATLAB plot http www mathworks com help techdoc ref plot html文档非常全
  • MATLAB 引擎函数的输入参数

    我正在尝试使用 MATLAB 引擎在 Python 中调用 MATLAB 函数 但遇到一些问题 在设法将 NumPy 数组作为函数的输入处理后 现在 MATLAB 出现一些错误 MatlabExecutionError 未定义输入函数 si
  • 在 Matlab、VB6 和 VB.NET 程序之间发送消息的最简单方法

    我们正在将一套数据采集和分析例程从 VB6 程序升级为 VB NET VB6 和 Matlab 程序的混合体 我们希望保持系统模块化 单独的 EXE 以便我们可以轻松创建专门的独立分析程序 而无需不断升级大型应用程序 当所有程序都是用 VB
  • 有没有办法在 MATLAB 中执行函数内联?

    我可以使用什么语言功能或开箱即用的技巧来完成 MATLAB 中的函数内联 令人烦恼的是 Google 搜索 matlab 内联函数 http www google com search q matlab inline function揭示了
  • MATLAB:生成给定三种颜色的颜色图

    我正在尝试在 MATLAB 中生成给定三种颜色 最高值 零值和最低值 的颜色图 我的思维过程是从最高端到中间循环 并将每个步骤存储到一个 3xN 第一列是 R 第二列是 G 第三列是 B 矩阵 所以我正在使用 fade from high
  • 比较元胞数组中的字符串

    我试图在单词列表中找到最常见的单词 到目前为止 这是我的代码 uniWords unique lower words for i 1 length words for j 1 length uniWords if uniWords j lo
  • 使用 libsvm 交叉验证后重新训练

    我知道交叉验证用于选择好的参数 找到它们后 我需要在不使用 v 选项的情况下重新训练整个数据 但我面临的问题是 在使用 v 选项训练后 我得到了交叉验证精度 例如 85 没有模型 我看不到 C 和 gamma 的值 在这种情况下我该如何重新
  • 将 Matlab MEX 文件中的函数直接嵌入到 Python 中

    我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些仿真结果 当然没有可用的源代码 Matlab 的接口实际上非常简单 因为只有一个函数 返回一个 Matlab 结构体 我想知道是否有任何方法可以直接从Python调用M
  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • 如何将Matlab代码库与Android集成?

    我有一个算法和 MATLAB 中的一些其他代码 我想在我的 Android 应用程序中使用它 我怎样才能做到这一点 我可以从 MATLAB 制作 jar 文件以便与 Android 一起使用吗 我必须做点别的事吗 如果您还有其他产品 适用于
  • Matlab 的快速 JSON 解析器

    您知道 Matlab 中有一个非常快速的 JSON 解析器吗 目前我正在使用JSONlab http www mathworks com matlabcentral fileexchange 33381 jsonlab a toolbox
  • 如何使用Matlab提高PSD的分辨率

    我有音频信号 我用 Matlab 读取该信号 并使用 pwelch 获取其 PSD 这是我正在使用的代码 x Fs audioread audioFile wav x x 1 mono xPSD f pwelch x hamming 512
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以

随机推荐