IMU数据滤波

本文最后更新于:May 7, 2023 pm

[TOC]

一阶低通滤波

一阶低通滤波,又叫 一阶惯性滤波,其算法公式为:

\[ Y_k = \alpha X_k + (1-\alpha) Y_{k-1} \]

根据安卓开发者文档中提供的低通滤波算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// https://developer.android.com/guide/topics/sensors/sensors_motion#java
public void onSensorChanged(SensorEvent event){
// In this example, alpha is calculated as t / (t + dT),
// where t is the low-pass filter's time-constant and
// dT is the event delivery rate.

final float alpha = 0.8;

// Isolate the force of gravity with the low-pass filter.
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

// Remove the gravity contribution with the high-pass filter.
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}

我实现了加速度的一阶低通滤波算法:

1
2
3
4
5
6
7
8
9
# https://github.com/cggos/sensor_imu/blob/master/script/sensor_imu.py#L285-L293
alpha = 0.8
self.AccTmp[0] = alpha * self.AccTmp[0] + (1-alpha) * msg.linear_acceleration.x
self.AccTmp[1] = alpha * self.AccTmp[1] + (1-alpha) * msg.linear_acceleration.y
self.AccTmp[2] = alpha * self.AccTmp[2] + (1-alpha) * msg.linear_acceleration.z
msg.linear_acceleration.x = self.AccTmp[0]
msg.linear_acceleration.y = self.AccTmp[1]
msg.linear_acceleration.z = self.AccTmp[2]
self.imu_pub_filter.publish(msg)

效果如图所示:

可以看到滤波效果明显,并且具有滞后性。


IMU数据滤波
https://cgabc.xyz/posts/a1780026/
Author
Gavin Gao
Posted on
March 28, 2021
Licensed under