【状态估计】【卡尔曼-加权最小二乘(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 cellfun 上的函数 strfind

    我想用cellfun功能于strfind函数在另一个字符串元胞数组中查找字符串元胞数组中每个字符串的索引 以将它们排除在外 strings aaa bbb ccc ddd eee fff ggg hhh iii jjj excludedSt
  • 从 Excel 读取字符串到 Matlab 中?

    我想从 Excel 文件中将字符串读入 Matlab ID xlsread data xlsx 1 D2 D4 D2 D4 范围内的单元格中包含字符串 当我尝试将字符串导入 Matlab 时 我得到的只是一个空列表 我能做什么来解决这个问题
  • 改变眼睛图像中特定区域的颜色[Matlab]

    I am trying to change the pupil of the following image This is not a feature extraction or eye detection task I want to
  • 将 3D 矩阵与 2D 矩阵相乘

    假设我有一个AxBxC matrix X and a BxD matrix Y 是否有一种非循环方法可以将每个C AxB矩阵与Y 作为个人喜好 我希望我的代码尽可能简洁和可读 这是我会做的 尽管它不符合您的 无循环 要求 for m 1 C
  • Matlab多核

    我正在运行一种占用大量资源并最大化 CPU 的算法 问题是它只使用一个CPU 我怎样才能使MATLAB多线程计算并使用超过1个CPU 除非您专门使用并行结构 即使用显式并行性 或使用已经为您并行化的内置函数 否则 Matlab 将不会在多核
  • 使用 MATLAB 读取 CSV 文件?

    我正在尝试使用 MATLAB 读取 csv 文件 这是我的代码 csvread out2 csv out2 csv 如下所示 03 09 2013 23 55 12 129 32 129 33 03 09 2013 23 55 52 129
  • 在 MATLAB 中将数组拆分为多个部分

    我想将数组分成相等的部分 如下所示 a 1 2 3 4 5 6 7 8 9 10 n 2 b split a n b 1 2 3 4 5 6 7 8 9 10 哪个函数可以做到这一点 尝试这个 a 1 2 3 4 5 6 reshape a
  • 隐藏图中某些图形对象的 MATLAB 图例条目

    MATLAB 图例列出了绘图中的所有内容 包括您在绘图上放置的指南 绕过这个问题的软糖就是要做的 Plot Add legend Add guidelines 然而 MATLAB 将最新的行放在前面 这意味着指南将位于显示的数据之上 丑陋且
  • MatLab 中的输出有小数点的上限 [重复]

    这个问题在这里已经有答案了 我修改了 MatLab 中的一些代码 以便它可以给出函数 cos x 3 x 的根 当我运行代码并要求它返回 xnew 的值 因为 xnew 应该等于函数的根 时 它仅将 xnew 返回到小数点后 4 位 我希望
  • 在python中访问包含matlab类的.mat文件

    我有一个从 matlab 2012b 生成的 mat 文件 它包含一个带有用户定义的 matlab 类的变量 在 python 3 3 中使用 scipy io loadmat 加载文件时 我得到以下信息 mat scipy io load
  • ND 输入的 im2col 算法

    我正在尝试为输入维度 gt 2D 编写自己的 im2col 算法 目前我正在研究 Matlab im2col 的实现 但是 我找不到任何有关二维以上输入的情况的文档 如果我将 3D 张量输入到函数中 我确实会得到输出 不过我不太明白你是如何
  • matlab中的分箱

    我一直无法在 matlab 或 Octave 中找到函数来完成我想要的操作 我有一个两列的矩阵 m x 和 y 值 我知道我可以通过执行 m 1 或 m 2 来提取列 我想将其分成 可能 大小相等的较小矩阵 并绘制这些矩阵的平均值 换句话说
  • SPMD 与 Parfor

    我对 matlab 中的并行计算很陌生 我有一个创建分类器 SVM 的函数 我想用几个数据集来测试它 我有一个 2 核工作站 所以我想并行运行测试 有人可以向我解释一下以下之间的区别 dataset array dataset1 datas
  • 使用 sprintf 打印元素数量可变的向量

    在下面的代码中 我可以打印向量中的所有元素item用空格分隔为 item 123 456 789 sprintf d d d item ans 123 456 789 我怎样才能做到这一点而不必输入那么多 d作为元素的数量item 最简单的
  • 如何从矩阵的每一行中减去一个向量? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将矩阵的每一行除以固定行 https stackoverflow com questions 4723824 how can i divide each row of a matrix by a
  • 使用二进制遮罩遮罩 RGB 图像

    我在 MATLAB 中读入了一个 RGB 图像 M x N x 3 矩阵 我还有一个图像的二进制掩码 M x N 矩阵 对于某些感兴趣的区域来说它只是 0 而其他地方都是 1 我正在尝试找出如何使用该二进制掩码来掩蔽 RGB 图像 我尝试过
  • 同时使用两个数组中的元素的过滤器

    假设我们有两个大小相同的数组 A and B 现在 我们需要一个过滤器 对于给定的掩码大小 从以下位置选择元素A 但删除掩码的中心元素 并在其中插入相应的元素B 所以 3x3 伪掩码 看起来类似于 A A A A B A A A A 对平均
  • MATLAB 黑洞变量

    MATLAB 是否有 黑洞 或丢弃变量 假设我正在做类似的事情 rows cols size A 但我不想存储行 是否有一个 黑洞 变量可以让我发送值去死 所以任务就像 BLACKHOLE cols size A 其中 BLACKHOLE
  • 我的 matlab 图中需要不同的颜色

    这是我的情节代码 问题是我的图中的两条线具有相同的颜色 我需要为图中的每条线 总共 4 条线 分配一个特殊的颜色 for i 1 nFolderContents data hdrload folderContents i if size f
  • 有没有办法在 MATLAB 中执行函数内联?

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

随机推荐