Imu数据均值滤波分析

来源:互联网 发布:win10禁用windows键 编辑:程序博客网 时间:2024/05/21 02:19

Imu数据均值滤波分析

GitHub仓库:https://github.com/XinLiGitHub/ImuMeanFilter

PS:博文不再更新,后续更新会在GitHub仓库进行。


1,前言

       Imu数据分析中常用均值滤波,均值滤波后的数据可以直观的看出,传感器的零偏稳定性、零偏和温度的关系、传感器数据和时间的关系。虽然得不到具体的数据指标,但是可以的感觉到传感器的好坏,传感器测试非常有必要。


2,MATLAB程序

       filter_mean.m文件

function [ y ] = filter_mean( x, n )% filter_mean 均值滤波函数% x:数据% n:参数% 注意:当数据为二维数组时,按列求均值if (n == floor(n)) && (n > 0)    if n > 1        [line, row] = size(x);        if line > 1            if line >= n               for i = 1 : floor(line / n)                   y(i, :) = mean(x((((i - 1) * n) + 1) : (i * n), :));               end            else                error('“filter_mean”函数调用错误!');            end        else            if row >= n                for i = 1 : floor(row / n)                   y(:, i) = mean(x(:, (((i - 1) * n) + 1) : (i * n)));               end            else                error('“filter_mean”函数调用错误!');            end        end    else        y = x;    endelse    error('“filter_mean”函数调用错误!');end

       imu_data.m文件

clc;    %清空命令行窗口clear;  %清空工作区data = dlmread('data.dat');     %从文本中读取数据,速率:100Hzgyro_original = data(:, 3:5);   %陀螺原始数据,单位:deg/sacc_original  = data(:, 7:9);   %加计原始数据,单位:ggyro_mean_1s = filter_mean(gyro_original, 100);     %陀螺1s均值滤波acc_mean_1s  = filter_mean(acc_original, 100);      %加计1s均值滤波gyro_mean_10s = filter_mean(gyro_original, 1000);   %陀螺10s均值滤波acc_mean_10s  = filter_mean(acc_original, 1000);    %加计10s均值滤波time_original = 0:0.01:(length(gyro_original) - 1) * 0.01;  %生成时间数据,间隔0.01stime_mean_1s  = 0:1:(length(gyro_mean_1s) - 1) * 1;         %生成时间数据,间隔1stime_mean_10s = 0:10:(length(gyro_mean_10s) - 1) * 10;      %生成时间数据,间隔10sfigure('name', '原始数据'); %新建绘图窗口subplot(2, 3, 1);                           %第一幅子图plot(time_original, gyro_original(:, 1));   %绘图title('陀螺 X轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_x(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 2);                           %第二幅子图plot(time_original, gyro_original(:, 2));   %绘图title('陀螺 Y轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_y(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 3);                           %第三幅子图plot(time_original, gyro_original(:, 3));   %绘图title('陀螺 Z轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_z(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 4);                           %第四幅子图plot(time_original, acc_original(:, 1));    %绘图title('加计 X轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_x(g)');                         %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 5);                           %第五幅子图plot(time_original, acc_original(:, 2));    %绘图title('加计 Y轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_y(g)');                         %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 6);                           %第六幅子图plot(time_original, acc_original(:, 3));    %绘图title('加计 Z轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_z(g)');                         %添加y轴标签grid on;                                    %添加网格线figure('name', '1s均值'); %新建绘图窗口subplot(2, 3, 1);                           %第一幅子图plot(time_mean_1s, gyro_mean_1s(:, 1));     %绘图title('陀螺 X轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_x(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 2);                           %第二幅子图plot(time_mean_1s, gyro_mean_1s(:, 2));     %绘图title('陀螺 Y轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_y(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 3);                           %第三幅子图plot(time_mean_1s, gyro_mean_1s(:, 3));     %绘图title('陀螺 Z轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_z(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 4);                           %第四幅子图plot(time_mean_1s, acc_mean_1s(:, 1));      %绘图title('加计 X轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_x(g)');                         %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 5);                           %第五幅子图plot(time_mean_1s, acc_mean_1s(:, 2));      %绘图title('加计 Y轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_y(g)');                         %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 6);                           %第六幅子图plot(time_mean_1s, acc_mean_1s(:, 3));      %绘图title('加计 Z轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_z(g)');                         %添加y轴标签grid on;                                    %添加网格线figure('name', '10s均值'); %新建绘图窗口subplot(2, 3, 1);                           %第一幅子图plot(time_mean_10s, gyro_mean_10s(:, 1));   %绘图title('陀螺 X轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_x(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 2);                           %第二幅子图plot(time_mean_10s, gyro_mean_10s(:, 2));   %绘图title('陀螺 Y轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_y(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 3);                           %第三幅子图plot(time_mean_10s, gyro_mean_10s(:, 3));   %绘图title('陀螺 Z轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('gyro_z(deg/s)');                    %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 4);                           %第四幅子图plot(time_mean_10s, acc_mean_10s(:, 1));    %绘图title('加计 X轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_x(g)');                         %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 5);                           %第五幅子图plot(time_mean_10s, acc_mean_10s(:, 2));    %绘图title('加计 Y轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_y(g)');                         %添加y轴标签grid on;                                    %添加网格线subplot(2, 3, 6);                           %第六幅子图plot(time_mean_10s, acc_mean_10s(:, 3));    %绘图title('加计 Z轴');                          %添加标题xlabel('time(sec)');                        %添加x轴标签ylabel('acc_z(g)');                         %添加y轴标签grid on;                                    %添加网格线

3,运行结果

      100Hz原始数据


       1s均值数据



       10s均值数据