2401_87299053 2025-02-18 09:55 采纳率: 0%
浏览 96

陀螺仪读数、零漂、滤波问题

我在静止时读到的陀螺仪三轴原始数据都在0左右跳变(dps单位下是正负8°以内) ,这对我去零漂做成了很大的困扰 我没有办法简单对零漂值进行累加然后求均值 将其看做零漂。
后续我试图使用滤波对数据进行处理,发现三轴数据经过滤波后(无视实际情况地)趋同,单独分析三轴发现平滑效果很差,但平滑后数据趋于相同。我分别选用滑动平均滤波法和一阶低通滤波均如此。我使用的传感器是bmi088,数据读取方式是软件iic,想知道大家是否有遇见过这个问题 如果有的话是如何解决的呢
需要任何代码我都可以提供。
下图是我用vofa看到的数据图像(p1),红 绿 蓝 橙 四个颜色分别表示绕x轴的原始角速度值,经过平滑的绕x轴角速度值,绕y轴原始角速度值,经过平滑的绕y轴角速度值。

img


下图是只有x轴原始数据和平滑后数据的图像

img

同理下图是只有y轴原始数据和平滑后数据的图像

img

当下图为只有未平滑的xy轴数据时 可以看到两轴数据相差较大

img

但是当下图表示只有xy轴平滑后数据的时候 两图线几乎重合

img

滑动平均滤波的代码如下:

#define FILTER_WINDOW_SIZE 20 // 窗口大小
float gyro_data[FILTER_WINDOW_SIZE]; // 存储最近的 窗口个数据
int pos = 0;
float filtered_value = 0; // 滤波后的输出

// 更新滤波器函数
fp32 update_filter(float new_value) {
// 将新的陀螺仪读数存入数组
gyro_data[pos] = new_value;

pos = (pos + 1) % FILTER_WINDOW_SIZE;

filtered_value = 0;
for (int i = 0; i < FILTER_WINDOW_SIZE; i++) {
filtered_value += gyro_data[i];
}
filtered_value /= FILTER_WINDOW_SIZE;
return filtered_value;

}

以下是调用部分的代码:


```c

void BMI088_GyroData_in_degree(int16_t *gyro_int16)
{
gyro_degree_speed[0]=(fp32)gyro_int16[0]/32768 *1000;
gyro_degree_speed[1]=(fp32)gyro_int16[1]/32768 *1000;
gyro_degree_speed[2]=(fp32)gyro_int16[2]/32768 *1000;


// 更新滤波器函数
gyro_degree_speed_smooth[0]=update_filter(gyro_degree_speed[0]) ;
gyro_degree_speed_smooth[1]=update_filter(gyro_degree_speed[1]) ;
gyro_degree_speed_smooth[2]=update_filter(gyro_degree_speed[2]) ;

}

```

  • 写回答

7条回答 默认 最新

  • hatzjas 2025-03-02 17:22
    关注

    交流一下,联系我

    评论

报告相同问题?

问题事件

  • 创建了问题 2月18日