- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用卡尔曼滤波器来融合多传感器位置以进行高斯测量(例如4个位置作为滤波器的输入,1个位置作为输出)。可以帮助我提供一些示例或教程吗,因为我找到的所有示例都与位置估计有关?
最佳答案
选项 1
加权平均
在这种情况下,您不需要实现真正的卡尔曼滤波器。您只需使用信号方差来计算权重,然后计算输入的加权平均值。权重可以作为方差的倒数找到。
因此,如果您有两个信号 S1 和 S2,其方差为 V1 和 V2,那么融合结果将为
下一个图中可以看到融合示例。
我模拟了两个信号。第二信号的方差随时间变化。只要它小于第一个信号的方差,融合结果就接近第二个信号。当第二个信号的方差太高时,情况并非如此。
选项 2
具有多个更新步骤的卡尔曼滤波器
经典卡尔曼滤波器在循环中使用预测
和更新
步骤:
prediction
update
prediction
update
...
在您的情况下,您有 4 个独立的测量值,因此您可以在单独的更新
步骤中依次使用这些读数:
prediction
update 1
update 2
update 3
update 4
prediction
update 1
...
非常好的一点是这些更新的顺序并不重要!您可以使用更新 1、2、3、4 或 3、2、4、1。在这两种情况下,您应该获得相同的融合输出。
与第一个选项相比,您有以下优点:
这是我的 matlab 代码:
function [] = main()
% time step
dt = 0.01;
t=(0:dt:2)';
n = numel(t);
%ground truth
signal = sin(t)+t;
% state matrix
X = zeros(2,1);
% covariance matrix
P = zeros(2,2);
% kalman filter output through the whole time
X_arr = zeros(n, 2);
% system noise
Q = [0.04 0;
0 1];
% transition matrix
F = [1 dt;
0 1];
% observation matrix
H = [1 0];
% variance of signal 1
s1_var = 0.08*ones(size(t));
s1 = generate_signal(signal, s1_var);
% variance of signal 2
s2_var = 0.01*(cos(8*t)+10*t);
s2 = generate_signal(signal, s2_var);
% variance of signal 3
s3_var = 0.02*(sin(2*t)+2);
s3 = generate_signal(signal, s3_var);
% variance of signal 4
s4_var = 0.06*ones(size(t));
s4 = generate_signal(signal, s4_var);
% fusion
for i = 1:n
if (i == 1)
[X, P] = init_kalman(X, s1(i, 1)); % initialize the state using the 1st sensor
else
[X, P] = prediction(X, P, Q, F);
[X, P] = update(X, P, s1(i, 1), s1(i, 2), H);
[X, P] = update(X, P, s2(i, 1), s2(i, 2), H);
[X, P] = update(X, P, s3(i, 1), s3(i, 2), H);
[X, P] = update(X, P, s4(i, 1), s4(i, 2), H);
end
X_arr(i, :) = X;
end
plot(t, signal, 'LineWidth', 4);
hold on;
plot(t, s1(:, 1), '--', 'LineWidth', 1);
plot(t, s2(:, 1), '--', 'LineWidth', 1);
plot(t, s3(:, 1), '--', 'LineWidth', 1);
plot(t, s4(:, 1), '--', 'LineWidth', 1);
plot(t, X_arr(:, 1), 'LineWidth', 4);
hold off;
grid on;
legend('Ground Truth', 'Sensor Input 1', 'Sensor Input 2', 'Sensor Input 3', 'Sensor Input 4', 'Fused Output');
end
function [s] = generate_signal(signal, var)
noise = randn(size(signal)).*sqrt(var);
s(:, 1) = signal + noise;
s(:, 2) = var;
end
function [X, P] = init_kalman(X, y)
X(1,1) = y;
X(2,1) = 0;
P = [100 0;
0 300];
end
function [X, P] = prediction(X, P, Q, F)
X = F*X;
P = F*P*F' + Q;
end
function [X, P] = update(X, P, y, R, H)
Inn = y - H*X;
S = H*P*H' + R;
K = P*H'/S;
X = X + K*Inn;
P = P - K*H*P;
end
结果如下:
关于kalman-filter - 使用卡尔曼滤波器的多传感器融合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55813719/
我正在尝试编写一个卡尔曼滤波器,但我被困在 H 矩阵上。现在我正在尝试获取位置和速度数据,并提供位置、速度和加速度数据。你如何为此设置一个 H 矩阵,或者一般情况下如何设置? 最佳答案 有 2 篇关于
我正在努力向应用程序添加一个简单的一维卡尔曼滤波器,以处理一些嘈杂的输入数据并输出经过清理的结果。 我使用的示例代码来自 this tutorial 的单变量示例部分和 this python cod
我正在使用扩展卡尔曼滤波器来融合加速度计、陀螺仪和磁力计数据。我使用加速度计来校正俯仰和滚转数据,并使用磁力计来校正偏航。俯仰和滚转运行良好,但即使我使用了磁力计,我的偏航漂移也非常严重。我用来在 E
我只是在学习卡尔曼滤波器。在卡尔曼滤波器术语中,我在处理过程噪声方面遇到了一些困难。在许多具体示例中似乎忽略了过程噪声(大多数集中在测量噪声上)。如果有人能给我指出一些介绍性的链接,用例子很好地描述了
我需要使用卡尔曼滤波器来融合多传感器位置以进行高斯测量(例如4个位置作为滤波器的输入,1个位置作为输出)。可以帮助我提供一些示例或教程吗,因为我找到的所有示例都与位置估计有关? 最佳答案 选项 1 加
我正在尝试使用间接卡尔曼滤波器 实现惯性导航系统。我发现了很多关于这个主题的出版物和论文,但没有太多的代码作为例子。对于我的实现,我使用以下链接提供的硕士论文: https://fenix.tecni
本文整理了Java中us.ihmc.kalman.YoKalmanFilter类的一些代码示例,展示了YoKalmanFilter类的具体用法。这些代码示例主要来源于Github/Stackoverf
我有一个简单的问题。我正在跟踪一个对象并以非均匀的时间间隔获取其位置。 物体的速度和加速度不是恒定的。 data_=[time x,y,z] 要设计卡尔曼滤波器,我需要定义 z=[x;y;z] % o
我实现了一个EKF。该算法运行良好,但我需要一个标准来检测初始化后滤波器何时收敛。什么是最好/最常见的方法来做到这一点。我有两个想法: 1.) 当创新达到预先定义的极限时。 2.) 当估计方差达到预先
我正在尝试跟踪在空间中移动的物体。物体的实际运动通常应该是相当笔直的,即使不是笔直的,也应该是平滑的。 我的测量值包括对象的 3D 坐标、时间戳以及 3x3 协方差矩阵,仅此而已。我没有速度或加速度(
我正在使用 Python 进行人脸识别。 我有以下代码: from sklearn.externals import joblib clf = joblib.load('model/svm.pkl')
本文整理了Java中us.ihmc.kalman.YoKalmanFilter.updateAPosterioriState()方法的一些代码示例,展示了YoKalmanFilter.updateAP
本文整理了Java中us.ihmc.kalman.YoKalmanFilter.setMeasurementNoiseCovariance()方法的一些代码示例,展示了YoKalmanFilter.s
本文整理了Java中us.ihmc.kalman.YoKalmanFilter.checkForNaN()方法的一些代码示例,展示了YoKalmanFilter.checkForNaN()的具体用法。
本文整理了Java中us.ihmc.kalman.YoKalmanFilter.configure()方法的一些代码示例,展示了YoKalmanFilter.configure()的具体用法。这些代码
本文整理了Java中us.ihmc.kalman.YoKalmanFilter.predict()方法的一些代码示例,展示了YoKalmanFilter.predict()的具体用法。这些代码示例主要
本文整理了Java中us.ihmc.kalman.YoKalmanFilter.()方法的一些代码示例,展示了YoKalmanFilter.()的具体用法。这些代码示例主要来源于Github/Stac
背景:为了给大家一些背景知识,我正在尝试使用卡尔曼滤波器(Apache 共同实现)。我应该包含什么样的动态噪声 在我关于矩阵 P0、Q 和 R 的实现中,知道 除了位置(X 和 Y)之外,我唯一的输入
我是一名优秀的程序员,十分优秀!