从 PX4 到 ROS2 再到 CSV:打通底层通信与高频 IMU 数据采集
本文详细介绍了如何从Pixhawk 6C飞控获取高频IMU数据并转换为CSV格式的完整流程。首先通过Micro XRCE-DDS架构打通飞控与ROS2的通信链路,使用USB-TTL模块连接TELEM2接口避免端口冲突。然后编写ROS2节点订阅/fmu/out/sensor_combined话题,匹配PX4的BestEffort QoS策略获取原始数据。利用rosbag2录制数据后,通过自定义C++
从 PX4 到 ROS2 再到 CSV:打通底层通信与高频 IMU 数据采集
在迈向无卫星(GPS-denied)环境下的视觉避障与定位算法开发时,第一步往往不是急于让无人机飞上天,而是扎扎实实地打通底层硬件通信,获取高质量的原始传感器数据。
本文将完整记录如何利用 Micro XRCE-DDS 架构,将 Pixhawk 6C 飞控的底层 IMU 数据高频推送到 ROS2 (Humble) 中,并通过 rosbag2 录制,最终转化为极其适合在 Matlab 中进行离线算法验证(如 IMU 预积分、ESKF 融合)的 CSV 格式文件。
1. 硬件连接与通信链路打通
在 PX4 v1.14 及以后的版本中,官方全面拥抱了 Micro XRCE-DDS。为了避免与 QGroundControl (QGC) 的 MAVLink 发生端口冲突,强烈建议不要直接使用飞控上的 Type-C 接口跑 DDS。
最佳实践:
使用一个 USB 转 TTL 模块(如常见的 CH340),将电脑与 Pixhawk 6C 的 TELEM 2 接口相连(TX接RX,RX接TX,GND接GND)。并在 QGC 中将 UXRCE_DDS_CFG 参数配置为 TELEM 2。
在虚拟机(如 VMware + Ubuntu 22.04)中映射好 USB 设备后,启动 Micro XRCE-DDS Agent:
MicroXRCEAgent serial --dev /dev/ttyUSB0 -b 921600

当看到终端满屏刷出 create_publisher、create_datawriter 等绿色日志时,意味着电脑与飞控已经成功握手,高速公路正式通车!
图 :Agent 成功运行,飞控正在疯狂注册 ROS2 话题
2. 编写 ROS2 节点订阅高频数据
通信底层跑通后,我们需要在 ROS2 工作空间(依赖 px4_msgs 包)中编写一个 C++ 节点,用来订阅飞控发布的高频 IMU 话题:/fmu/out/sensor_combined。
注意,PX4 默认使用 BestEffort 的 QoS 策略发布传感器数据,因此我们在代码中也必须匹配相应的 QoS 设置。编译并运行节点后,可以直观地看到陀螺仪 X 轴的数据随飞控位姿变化而实时跳动。
图 :ROS2 节点成功订阅并打印飞控陀螺仪数据
3. 使用 rosbag 录制原始数据集
真机调试算法不仅危险且难以复现 Bug。利用 6C 飞控内部高精度的传感器,我们可以把它当作一个“数据采集盒”,记录一段包含起伏、旋转等模拟飞行姿态的原始数据。
使用 ROS2 自带的 rosbag2 工具即可轻松实现抓包:
ros2 bag record -o imu_test_data /fmu/out/sensor_combined
录制完成后,会在当前目录下生成一个 imu_test_data 文件夹,里面包含了以 SQLite3 (.db3) 格式存储的数据。
图:使用 rosbag 成功抓取 /fmu/out/sensor_combined 话题数据
4. 跨越格式壁垒:提取数据至 CSV
虽然 ROS2 的 .db3 格式非常适合系统回放,但对于算法工程师来说,将数据导入 Matlab 进行纯惯性解算或对齐分析时,.db3 并不友好。
最稳妥的解法是:写一个转换器。
我们在之前订阅节点的代码基础上,利用 C++ 的 <fstream> 库,直接将接收到的时间戳、三轴角速度(rad/s)和三轴加速度(m/s²)写入 .csv 文件。
核心代码逻辑如下:
// 核心写入逻辑片段
csv_file_ << msg->timestamp << ","
<< msg->gyro_rad[0] << "," << msg->gyro_rad[1] << "," << msg->gyro_rad[2] << ","
<< msg->accelerometer_m_s2[0] << "," << msg->accelerometer_m_s2[1] << "," << msg->accelerometer_m_s2[2]
<< "\n";
提取魔法:
重新编译该节点并运行它。随后,在另一个终端播放刚才录制的 bag 包:ros2 bag play imu_test_data。
节点在“浑然不觉”中接收着回放的录像数据,并将其整整齐齐地写入 imu_data.csv 中。
总结与下一步
至此,我们已经成功打通了从硬件底层到高级算法验证平台的完整数据流。这看起来只是基建工作,但却是后续一切组合导航算法的基石。
拿到了这份干净的 CSV 文件,下一步就可以直接转战 Matlab,开始动手编写纯 IMU 积分代码,直观感受传感器的零偏与漂移,并准备将其与 RGB-D 相机提取的视觉里程计(如 ORB 特征测距)进行深度融合!
更多推荐



所有评论(0)