纯惯性导航推算

一、获取IMU六轴数据

1.1获取gazebo中传感器的数据

bash 复制代码
rostopic echo -b liw_gazebo.bag -p /imu/data>imu_data.csv

这条命令用于从ROS的bag包文件中提取指定话题的数据,并保存为CSV格式。下面是对各部分的详细解释:

rostopic echo

ROS的核心命令之一,用于在终端中显示指定ROS话题上发布的消息内容。

-b liw_gazebo.bag

-b​ 选项指定从名为 liw_gazebo.bag的bag包文件中读取数据,而不是从当前运行的ROS系统中实时订阅话题。

-p

-p​ 选项表示以"适合绘图"的格式输出消息。它会将消息的各个字段(如时间戳、坐标值等)整理成表格形式,每个字段作为一列,非常适合导入到MATLAB、Octave或Excel等工具进行分析和可视化。

/imu/data

这是要提取的话题名称。一个包含惯性测量单元数据的话题

> imu_data.csv

这是Shell的重定向操作符。它将 rostopic echo命令在终端中的输出内容,从屏幕重定向到名为 imu_data.csv的文件中。如果文件不存在则会创建它。

1.2提取六轴数据

数据解析

使用matlab提取数据

Matlab 复制代码
function get_6axis_imu_data()
    % 读取CSV文件,保留原始列标题
    data = readtable('imu_data.csv', 'VariableNamingRule', 'preserve');
    
    % 查看实际的列名
    disp('表格列名:');
    disp(data.Properties.VariableNames);
    
    % 提取时间戳(第一列)
    timestamps = data{:, 1};
    
    % 按新顺序提取六轴数据:先加速度计,后陀螺仪
    six_axis_data = [data{:, 'field.linear_acceleration.x'}, ... % 线加速度 X
                     data{:, 'field.linear_acceleration.y'}, ... % 线加速度 Y
                     data{:, 'field.linear_acceleration.z'}, ... % 线加速度 Z
                     data{:, 'field.angular_velocity.x'}, ...   % 角速度 X
                     data{:, 'field.angular_velocity.y'}, ...   % 角速度 Y
                     data{:, 'field.angular_velocity.z'}];      % 角速度 Z
    
    % 为六轴数据添加标签(按新顺序)
    six_axis_labels = {'accel_x', 'accel_y', 'accel_z', 'gyro_x', 'gyro_y', 'gyro_z'};
    
    % 创建包含时间戳和六轴数据的完整表格(时间戳在最后一列)
    imu_table = array2table([six_axis_data, timestamps], ...
        'VariableNames', [six_axis_labels, 'timestamp']);
    
    % 保存为.mat文件(直接保存表格变量)
    save('extracted_imu_data.mat', 'imu_table');
    
    % 显示成功信息
    disp('六轴数据已成功提取并保存为 extracted_imu_data.mat');
    disp('文件包含变量: imu_table');
    disp('数据列:');
    disp(imu_table.Properties.VariableNames);
    disp(['数据大小: ', num2str(size(imu_table))]);
end

二、姿态解析与航迹推算