提示:
- 本文用到的系统及相关软件版本为,ubuntu版本为 24.04,,ROS2版本为ROS2 Jazzy,PX4版本为PX4 v1.15.3,XRCE-DDS版本为v3.0.1。参考使用教程时请务必关注版本适配性。
- 本文红色字体部分由AI辅助生成,未经过作者实际验证,请注意甄别。其他部分已经过实际验证。
目录
[1.1 SITL(Software In The Loop,软件在环仿真)](#1.1 SITL(Software In The Loop,软件在环仿真))
[2.2 uORB消息](#2.2 uORB消息)
[2.3 DDS](#2.3 DDS)
[2.4 offboard模式](#2.4 offboard模式)
[2.5 px4_msgs](#2.5 px4_msgs)
[2.1 PX4与ROS2间通信的中间件-uXRCE-DDS](#2.1 PX4与ROS2间通信的中间件-uXRCE-DDS)
[2.2 uXRCE-DDS的架构](#2.2 uXRCE-DDS的架构)
[2.3 数据流全景图](#2.3 数据流全景图)
[4.1 安装ROS2 Jazzy](#4.1 安装ROS2 Jazzy)
[4.2 搭建PX4开发环境](#4.2 搭建PX4开发环境)
[4.3 编译并测试SITL](#4.3 编译并测试SITL)
[4.4 安装uXRCE-DDS Agent(本小节中代码由DS生成,未经作者验证,故标记红色,如有问题清留言。)](#4.4 安装uXRCE-DDS Agent(本小节中代码由DS生成,未经作者验证,故标记红色,如有问题清留言。))
[4.5 构建ROS2工作空间](#4.5 构建ROS2工作空间)
[4.6 启动联调验证](#4.6 启动联调验证)
前言
本文从通信原理讲起,手把手带你完成PX4+ROS2仿真环境的搭建全过程,并通过Offboard模式完成 PX4 官方四旋翼仿真历程。
本文用到的系统及相关软件版本为,ubuntu版本为 24.04,,ROS2版本为ROS2 Jazzy,PX4版本为PX4 v1.15.3,XRCE-DDS版本为v3.0.1。参考使用教程时请务必关注版本适配性。
一、基本概念介绍
在介绍通信原理和仿真环境搭建之前,先介绍几个基本概念,这样到相关章节时能快速了解掌握文章内容。
1.1 SITL(Software In The Loop,软件在环仿真)
SITL(Software-In-the-Loop)是在普通计算机上完整运行PX4飞控软件(无需连接真实飞控硬件),并通过物理引擎模拟无人机动力学、传感器响应与环境交互的开发范式。简单说------你的电脑同时扮演飞控和飞机两个角色。对于无人机开发而言,直接在真实硬件上调试控制逻辑不仅存在安全风险,更会因环境变量复杂、调试周期长而显著降低开发效率。
1.2 uORB消息
uORB是PX4内部的异步消息总线系统。飞控中的所有数据------姿态、位置、传感器读数、遥控器输入------都以uORB消息的形式发布。你可以把它想象成PX4内部的"微信群",各个模块在里面发消息和收消息。
1.3 DDS
ROS2的底层通信依赖DDS协议。DDS是一个成熟的工业级数据分发标准,支持去中心化的发布/订阅模式。当你看到一个ROS2话题时,背后实际上是一个DDS话题在网络上流转。
1.4 offboard模式
Offboard 模式 是PX4飞控的一种特殊飞行模式,允许飞控外部的计算机(如机载电脑、ROS节点)直接控制飞行器的运动。简单说,就是把飞控当成一个"执行器",而决策和规划算法都在外部计算机上运行。
🔄 与普通模式的区别
| 对比项 | 普通模式(Position/Altitude) | Offboard 模式 |
|---|---|---|
| 控制源 | 飞控内部算法(PID控制器) | 外部计算机(ROS节点、机载电脑) |
| 典型应用 | 手动飞行、自主航线任务 | 视觉追踪、AI避障、编队飞行 |
| 决策层级 | 飞控自己决定怎么飞 | 外部告诉飞控"往哪飞" |
1.5 px4_msgs
📖 定义:它是PX4的"语言包"
px4_msgs 是一个 ROS 2 软件包,全称是"PX4 ROS 2 消息定义包"。它的本质是一系列 .msg 文件的集合。这些文件定义了在 PX4 飞控与 ROS 2 节点之间交换的各种数据的格式,例如:
-
传感器数据 :
SensorCombined.msg -
位置姿态估计 :
VehicleLocalPosition.msg
它把 PX4 飞控内部用于进程间通信的 uORB 消息格式,转化成了 ROS 2 生态能理解的接口定义语言(IDL)文件。
二、PX4与ROS2通信原理
2.1 PX4与ROS2间通信的中间件-uXRCE-DDS
PX4飞控内部使用一套自己的消息系统------uORB (micro Object Request Broker),所有传感器数据、状态估计、控制指令都以uORB消息的形式在飞控内部流通。而ROS2使用的是DDS(Data Distribution Service)作为通信底层。这两套消息体系是无法直接对话的,需要一座桥梁来翻译和转发。
在PX4 v1.13时代,这座桥梁叫Fast-RTPS Bridge 。从PX4 v1.14开始,它被一套更先进、更轻量的方案所取代------uXRCE-DDS(micro XRCE-DDS)。uXRCE-DDS使用eProsima Micro XRCE-DDS实现,专门为资源受限设备设计,非常适合飞控与机载计算机之间的通信场景

2.2 uXRCE-DDS的架构
uXRCE-DDS中间件采用经典的Client-Agent架构:
-
Client(客户端):运行在PX4飞控端,直接内建于PX4固件中。它负责将PX4内部的uORB消息打包,通过串口或UDP链路发送出去;同时接收外部发来的消息并转换为uORB消息写入飞控。
-
Agent(代理端):运行在机载计算机(你的电脑)上,充当Client在DDS全局数据空间中的代理。它接收Client的消息,并将其发布为ROS2话题;同时订阅ROS2话题,转发给Client。
通俗理解:Client是PX4的"翻译官",Agent是ROS2世界的"接线员"。二者之间通过UDP或串口建立双向数据通道,让你的ROS2节点能够像访问原生话题一样读写PX4的飞行数据。
连接建立后,PX4内部的uORB消息会自动映射为ROS2话题,你可以用ros2 topic list直接查看飞行状态。这种设计非常高效------ROS2工作空间中的任何节点都能直接访问PX4的uORB话题,而不需要额外的协议转换层。
2.3 数据流全景图
在实际仿真环境中,完整的数据链路是这样的:
PX4 SITL ⇄ Gazebo仿真器(传感器/物理引擎)
↕(uXRCE-DDS Client,UDP 8888)
Micro XRCE-DDS Agent(代理端)
↕(DDS协议)
ROS 2 节点(你的控制程序)
PX4 SITL负责飞行状态估计与控制律计算,Gazebo提供物理仿真与传感器仿真,uXRCE-DDS作为通信桥梁,ROS2运行高层逻辑与算法验证。
三、推荐安装顺序
仿真环境搭建建议严格按照以下顺序安装,可以避免90%的依赖冲突问题:
-
✅ 安装ROS 2 → 确认
ros2 run可用 -
✅ 搭建PX4开发环境 → 获取源码、安装依赖、验证SITL启动
-
✅ 安装uXRCE-DDS Agent → 通信桥梁
-
✅ 构建ROS 2工作空间 → 导入PX4消息定义
-
✅ 启动联调验证 → 确认
/fmu话题可见,通信正常
四、仿真环境搭建步骤
4.1 安装ROS2 Jazzy
ROS2 Jazzy的安装建议参考鱼香ROS的一键式安装,点我跳转文章连接。
4.2 搭建PX4开发环境
采用如下命令克隆PX4源码
bash
cd ~
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
**Tips:**如果你在国内网络不畅,这条命令极有可能失败。作者尝试了N多种方式,最终还是通过科学上网+上述命令,成功解决。
4.3 编译并测试SITL
验证PX4能否正常编译和启动仿真:
bash
bash
cd ~/PX4-Autopilot
make px4_sitl gz_x500
首次编译时间较长(视机器配置约10-30分钟)。编译成功后Gazebo会自动启动,并出现一个X500四旋翼模型,终端窗口会显示Ready for takeoff!

在PX4终端输入commander takeoff可以测试无人机是否正常起飞,效果如下。


至此,PX4与gazebo均已能正常运行,但PX4和ROS2之间尚未建立通信。
4.4 安装uXRCE-DDS Agent(本小节中代码由DS生成,未经作者验证,故标记红色,如有问题清留言。)
这是整个工具链最关键的一环。uXRCE-DDS Agent是PX4和ROS2之间的通信代理,需要从源码编译安装。
步骤1:克隆Micro XRCE-DDS Agent源码
bash
cd ~
git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
cd Micro-XRCE-DDS-Agent
git checkout v3.0.1
步骤2:编译安装
bash
mkdir build && cd build
cmake .. -DUAGENT_P2P_PROFILE=OFF
make
sudo make install
sudo ldconfig /usr/local/lib/
完成以上步骤后,uXRCE-DDS Agent就安装好了。
4.5 构建ROS2工作空间
步骤1:创建工作空间并克隆PX4消息包
bash
mkdir -p ~/ws_ros2/src
cd ~/ws_ros2/src
git clone https://github.com/PX4/px4_msgs.git
步骤2:检查版本是否一致,重要!
首先检查 px4_msgs 的分支:
bash
cd ~/ws_ros2/src/px4_msgs && git branch
如果不在 release/1.15(本文使用的PX4版本为1.15.X,读者可根据自己使用PX4版本进行自行匹配),需要切换。
bash
git fetch origin
git checkout release/1.15
步骤3:编译工作空间
bash
cd ~/ws_ros2
colcon build
echo "source ~/ws_ros2/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
步骤4:安装PX4 ROS2接口库(此为DS推荐,非必须,作者尚未尝试。)
这个C++库提供了更高层的控制接口,可以大大简化ROS2控制PX4的代码编写:
cd ~/ws_px4/src
git clone --recursive https://github.com/Auterion/px4-ros2-interface-lib.git
cd ~/ws_px4
colcon build --packages-up-to px4_ros2_interface_lib
4.6 启动联调验证
打开3个终端,依次执行:
终端1:启动PX4 SITL + Gazebo仿真
bash
cd ~/PX4-Autopilot
make px4_sitl gz_x500
等待PX4终端出现INFO [commander] Ready for takeoff!提示后,进入下一步,在前文中已经实现此步骤。
终端2:启动uXRCE-DDS Agent
bash
MicroXRCEAgent udp4 -p 8888
在PX4终端出现
INFO [uxrce_dds_client] successfully created rt/fmu/out/vehicle_status data writer, topic id: 266
INFO [uxrce_dds_client] time sync converged
等信息,证明agent启动成功,如下。

终端3:验证ROS2话题
bash
bash
source ~/ws_ros2/install/setup.bash
ros2 topic list | grep fmu
如果看到如下输出,说明PX4与ROS2通信已建立成功:

再进一步验证数据内容:
bash
ros2 topic echo /fmu/out/vehicle_attitude
能看到实时刷新的四元数姿态数据,就说明一切正常。
至此,仿真环境搭建完成。
五、仿真实例:ROS2控制PX4无人机起飞
确保PX4仿真,XRCE_DDS连接均已启动。新开终端,运行如下命令:
bash
ros2 run px4_ros_com offboard_control
执行后,无人机将自动解锁,旋转 90° 并上升至 5 米高度悬停。

六、经验技巧
建议优先参考PX4 ROS2官方教程和成熟社区的教程,不要完全依赖deepseek 豆包都智能体,作者在这上边就浪费了很多时间,事实证明官方教程和社区大佬写的教程相对智能体写的要可靠的多。智能体在解决单个BUG或者问题上还可以,体系性的解决问题时逻辑太差。
以下一些使用技巧,来自deepseek
-
快速启动命令 :每次仿真都开三个终端很麻烦?创建一个启动脚本
~/px4_sitl_start.sh一键搞定 -
端口冲突 :如果8888端口被占用,Agent启动时会报错,用
lsof -i :8888查看并杀掉占用进程 -
日志查看:PX4终端输出非常有用,遇到问题时先看终端日志,大部分错误都有明确提示
-
环境变量 :每次新开终端都要
source,建议写入~/.bashrc但注意只写一次,避免重复追加
七、小结
通过本文,你应该已经完成了一套完整的PX4+ROS2仿真环境搭建,并且理解了背后的通信原理。如果在搭建过程中遇到本文未覆盖的问题,欢迎在评论区留言交流,我们一起探讨解决。