PX4与ROS2通信原理与仿真环境搭建教程

提示:

  • 本文用到的系统及相关软件版本为,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)

二、PX4与ROS2通信原理

[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 启动联调验证)

五、仿真实例:ROS2控制PX4无人机起飞

六、经验技巧

七、小结


前言

本文从通信原理讲起,手把手带你完成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%的依赖冲突问题:

  1. ✅ 安装ROS 2 → 确认ros2 run可用

  2. ✅ 搭建PX4开发环境 → 获取源码、安装依赖、验证SITL启动

  3. ✅ 安装uXRCE-DDS Agent → 通信桥梁

  4. ✅ 构建ROS 2工作空间 → 导入PX4消息定义

  5. ✅ 启动联调验证 → 确认/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仿真环境搭建,并且理解了背后的通信原理。如果在搭建过程中遇到本文未覆盖的问题,欢迎在评论区留言交流,我们一起探讨解决。

相关推荐
网络与设备以及操作系统学习使用者10 小时前
豆包情感化,DeepSeek理性化,OpenMAIC系统化
人工智能·学习
patrickpdx10 小时前
2019年中国国家队选拔赛第17题
笔记
lightqjx10 小时前
【前端】前端学习四之JavaScript(Web API -- DOM)
前端·javascript·学习
gjf05_0510 小时前
人该怎样活着呢?版本71.5
学习
小新同学^O^10 小时前
简单学习 --> 限流和熔断
数据库·python·学习
尖枫50810 小时前
EPLAN生成设备符号宏、设备布局宏、设备3D宏及创建部件方法总结
学习
吃好睡好便好10 小时前
用if…elseif…end语句输出成绩等级
开发语言·前端·javascript·数据库·学习·matlab·信息可视化
嫣然细雨红尘路10 小时前
LangChain学习笔记(一)
笔记·学习·langchain
被遗忘的旋律.10 小时前
RK3588笔记(一)——ping通 + imx6ull项目移植
笔记