使用递归神经网络进行传感器融合:获得平滑输出

数据挖掘 rnn lstm
2022-02-21 02:15:34

我正在尝试使用循环神经网络为惯性测量单元执行传感器融合。IMU 通常与卡尔曼滤波器 (KF) 结合使用,该滤波器执行加速度计和陀螺仪数据的融合以及“平滑”,从而产生经过过滤的最终方向输出(如果需要,还可以输出位置)。出于好奇,我试图使用包含 LSTM 单元的神经网络来复制此功能:即,让网络计算卡尔曼滤波器使用训练数据估计的隐藏表示。为了让网络复制卡尔曼滤波器融合算法的工作,我的第一步是在原始传感器数据的输入和来自 KF 的输出上对其进行训练。

该网络接受6x10 + 6 = 66输入(来自陀螺仪的 3 个速度,来自当前时刻的加速度计的 3 个加速度以及来自过去 10 个时刻的加速度)并旨在提供 4 个输出(方向的四元数表示)。网络结构是

Input -> LSTM units (128) -> Dense layer (128) -> Dense layer (64) -> Output(4)

我的初始训练数据包括输入中来自陀螺仪和加速度计的噪声传感器数据以及作为输出的平滑 KF 方向数据,我期望网络从中尝试学习传感器和方向之间的非线性映射。然而,尽管我正在训练的输出是干净的,但网络的预测中有很多噪音,即使是在训练数据上也是如此。例如:

卡尔曼滤波器输出(用作训练数据的输出):

在此处输入图像描述

来自神经网络的相应预测:

在此处输入图像描述

我在预测中看到的噪声并非不自然,因为输入传感器数据也很嘈杂,输出中的噪声量与输入的噪声量相对应:但期望神经网络“学习平滑以及融合?有什么方法可以降低噪音并使网络的性能更接近 KF 的方式吗?

2个回答

为了消除噪声,我建议您使用傅立叶变换来获取信号的频谱。然后,您可以应用阈值来去除主要是噪声的高频信号分量。

据我了解,您正在使用 python。下面的代码创建了一个人工噪声信号,并使用 FFT(快速傅里叶变换)算法将其移除。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 0.01)

y = np.sin(x)
y_noisy = y + np.random.uniform(low=0, high=0.5, size=len(y))

fft_values = np.fft.fft(y_noisy)

mean_value = np.mean(np.abs(fft_values))

threshold = 10 * mean_value  # Fine-tune this

fft_values[np.abs(fft_values) < threshold] = 0

filtered_samples = np.fft.ifft(fft_values)

plt.plot(x, filtered_samples)
plt.show()

祝你好运!

我建议你看看编码器解码器网络。AFAIK 它被用于图像中以消除噪音。看看这篇论文一次