2. 开发环境搭建
PX4 uORB 消息与 ROS2 接口开发的第一步,是搭建一个可复现、可调试、可扩展的 Linux 开发环境。本节围绕 Ubuntu 系统、ROS2 发行版、PX4 源码、Gazebo 仿真工具链以及 VS Code/QGroundControl 调试工具,给出从零到可运行 SITL 仿真的完整路径。环境搭建不是简单“装软件”,而是建立一条从源码到仿真、从仿真到 ROS2 话题的稳定数据链路。
一、核心原理:环境分层与数据链路
整个开发环境可以理解为四层:操作系统层、ROS2 中间件层、PX4 飞控软件层、仿真与调试层。Ubuntu 提供内核与驱动基础;ROS2 提供 DDS 通信与节点生态;PX4 源码编译出可执行固件与 uORB 消息定义;Gazebo 与 QGroundControl 则提供虚拟传感器、物理引擎和地面站监控。四层之间的依赖关系决定了安装顺序:先系统、再 ROS2、再 PX4、最后仿真与工具。
需要特别理解的是,PX4 与 ROS2 之间通过 microRTPS 桥接,uORB 消息在桥接层被转换为 ROS2 话题。因此环境搭建时必须保证 PX4 源码中的消息定义与 ROS2 工作空间中的接口包版本一致,否则会出现话题类型不匹配、字段缺失等隐蔽问题。
二、方法流程:从系统到仿真的五步安装
- 安装 Ubuntu 22.04 LTS:推荐物理机或 VMware/VirtualBox 虚拟机,分配至少 4 核 CPU、8GB 内存、50GB 磁盘。安装后执行系统更新并安装基础工具链。
- 安装 ROS2 Humble:配置软件源、安装
ros-humble-desktop,并设置环境变量自动 source。 - 获取并编译 PX4 源码:使用
git clone --recursive拉取子模块,运行ubuntu.sh安装依赖,再编译 SITL 目标。 - 配置 Gazebo 仿真工具链:安装 Gazebo Classic 或 Gazebo Sim,验证
make px4_sitl gazebo能启动无人机模型。 - 准备开发与调试工具:安装 VS Code、QGroundControl、
px4_ros_com与px4_msgs工作空间,验证 ROS2 话题输出。
# 1. 系统基础依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y git cmake build-essential python3-pip
# 2. 安装 ROS2 Humble
sudo apt install -y ros-humble-desktop
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
# 3. 获取 PX4 源码
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
bash ./Tools/setup/ubuntu.sh
# 4. 编译 SITL 并启动 Gazebo
make px4_sitl gazebo
# 5. 构建 ROS2 接口工作空间
mkdir -p ~/ws_px4/src && cd ~/ws_px4/src
git clone https://github.com/PX4/px4_msgs.git
git clone https://github.com/PX4/px4_ros_com.git
cd ~/ws_px4 && colcon build
source install/setup.bash
三、案例场景:验证 uORB 到 ROS2 的完整链路
环境搭建完成后,必须做一次端到端验证,否则无法确认后续 uORB 消息开发是否可靠。典型验证流程如下:
- 终端 A 启动 PX4 SITL:
make px4_sitl gazebo,等待 Gazebo 出现无人机模型。 - 终端 B 启动 microRTPS 桥接:
ros2 run px4_ros_com micrortps_agent。 - 终端 C 查看话题:
ros2 topic list,应出现/fmu/out/vehicle_attitude、/fmu/out/sensor_combined等。 - 终端 C 回显数据:
ros2 topic echo /fmu/out/vehicle_attitude,观察四元数与角速度字段是否持续更新。
如果
ros2 topic list 看不到 /fmu/out/ 话题,优先检查 microRTPS 桥接是否启动、PX4 是否已进入 SITL 模式、以及 px4_msgs 是否已正确 source。四、常见误区与复盘
| 误区 | 现象 | 正确做法 |
|---|---|---|
| PX4 源码未拉取子模块 | 编译报错缺少 mavlink、uORB 头文件 | 使用 git clone --recursive 或 git submodule update --init --recursive |
| ROS2 与 PX4 消息版本不一致 | 话题类型不匹配、字段缺失 | 保持 px4_msgs 与 PX4 源码同一分支/提交 |
| 未 source 工作空间 | 找不到 px4_msgs 包或节点 |
每次新终端执行 source install/setup.bash |
| Gazebo 启动黑屏或卡死 | 虚拟机 3D 加速不足 | 启用 3D 加速、分配足够显存,或改用 Gazebo Sim |
| 串口权限不足 | QGC 无法连接飞控 | 将用户加入 dialout 组并重新登录 |
环境搭建中最容易被忽略的是“版本一致性”。PX4 主分支更新频繁,
px4_msgs 与 px4_ros_com 必须与 PX4 源码版本匹配。建议在项目初期固定一个 release 标签,例如 v1.14.0,避免后续因消息字段变化导致接口失效。