从 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_publishercreate_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 特征测距)进行深度融合!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐