4、环境搭建:安装PX4固件、ROS2(Humble/Iron)、Micro XRCE-DDS Agent与Client,以及MAVROS的步骤

PX4与ROS2的桥接环境搭建是整个开发链路中最容易出问题、也最考验系统理解能力的环节。很多初学者在编译固件或启动Agent时遇到“通信超时”“话题不刷新”“DDS端点不匹配”等问题,根源往往不是代码逻辑,而是环境版本错配、DDS实现选择不当或固件配置缺少对应扩展。本章将围绕PX4固件编译、ROS2发行版安装、Micro XRCE-DDS Agent/Client部署以及MAVROS安装四个核心模块,给出可复现的操作流程、版本匹配矩阵和排障方法论。

PX4 固件侧 DDS 桥接层 ROS2 应用侧 uORB 消息 PX4-Autopilot uxrce_dds_client MAVLink 模块 Micro XRCE-DDS Agent (UDP 8888) Fast DDS / Cyclone MAVROS MAVLink 路由 ros2 topic list px4_ros_com Nav2 / 规划 Rviz2 可视化 UDP/Serial 桥接 DDS 域 ID 匹配 QoS 策略对齐

上图展示了PX4+ROS2桥接环境的整体架构:PX4固件内部通过uORB消息总线维护状态与指令,Micro XRCE-DDS Client作为固件内的一个模块,将uORB消息映射为DDS话题;Micro XRCE-DDS Agent运行在机载计算机或地面站上,通过UDP或串口与Client通信,并将数据桥接到完整的DDS总线;ROS2节点(如px4_ros_com、Nav2)通过DDS实现与PX4的双向通信。MAVROS则作为另一条独立通道,通过MAVLink协议与PX4交互,常用于参数读写、任务上传和日志获取。理解这条链路中各组件的位置和职责,是后续环境搭建和排障的基础。

4.1 核心原理:PX4与ROS2桥接的两种通道

PX4与ROS2之间的通信并非单一通道,而是存在两条并行且互补的路径。第一条是DDS通道,基于Micro XRCE-DDS协议,PX4固件内置Client端,机载计算机运行Agent端,二者通过UDP(默认端口8888)或串口连接。这条通道传输的是PX4的uORB消息与ROS2话题之间的映射数据,例如/fmu/out/vehicle_attitude对应ROS2的/px4_ros/vehicle_attitude。DDS通道的优势在于低延迟、支持QoS策略、与ROS2原生集成,适合实时控制和高频状态反馈。

第二条是MAVLink通道,通过MAVROS节点实现。MAVROS将MAVLink协议转换为ROS2话题和服务,常用于任务上传(如航点文件)、参数读写、飞行模式切换和日志下载。MAVLink通道的延迟略高,但功能覆盖面广,且不依赖DDS实现,兼容性更强。在实际工程中,通常同时启用两条通道:DDS用于高频控制与状态反馈,MAVLink用于任务管理和调试。

关键理解:DDS通道是“数据面”,负责高频、实时的状态与控制流;MAVLink通道是“管理面”,负责低频、指令性的任务与参数操作。两者互补,不能互相替代。在环境搭建时,需要分别配置和验证,不能只装其一。

4.2 操作流程:PX4固件编译与ROS2安装

环境搭建的第一步是准备PX4固件和ROS2发行版。本节以Ubuntu 22.04 + ROS2 Humble和Ubuntu 24.04 + ROS2 Iron为例,给出完整步骤。

4.2.1 PX4固件编译

PX4固件需要从源码编译,并启用Micro XRCE-DDS Client模块。推荐使用v1.14.x或v1.15.x稳定分支,这两个版本对ROS2支持最成熟。

# 1. 克隆PX4固件源码
git clone --recursive https://github.com/PX4/PX4-Autopilot.git
cd PX4-Autopilot
git checkout v1.15.0
git submodule update --init --recursive

# 2. 安装依赖(Ubuntu 22.04)
bash ./Tools/setup/ubuntu.sh

# 3. 编译固件(以px4_sitl为例,仿真环境)
make px4_sitl px4

# 4. 编译真实硬件固件(以Pixhawk 6X为例)
make px4_fmu-v6x_default

编译完成后,需要确认固件中是否包含uxrce_dds_client模块。在编译输出中搜索“uxrce”关键字,或通过list_modules命令检查。如果未包含,需要在boards/px4/fmu-v6x/default.px4board中启用CONFIG_MODULES_UXRCE_DDS_CLIENT=y。

4.2.2 ROS2 Humble/Iron安装

ROS2的安装相对标准化,但需要注意与PX4的版本匹配。Humble对应Ubuntu 22.04,Iron对应Ubuntu 24.04。以下以Humble为例:

# 1. 设置软件源
sudo apt update && sudo apt install -y curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 2. 安装ROS2 Humble桌面版
sudo apt update
sudo apt install -y ros-humble-desktop python3-argcomplete

# 3. 安装开发工具
sudo apt install -y ros-dev-tools

# 4. 环境变量配置
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

安装完成后,验证ROS2是否正常工作:

ros2 run demo_nodes_cpp talker

如果终端输出“Publishing: 'Hello World'”等字样,说明ROS2安装成功。

4.2.3 版本匹配矩阵

组件推荐版本兼容性说明
PX4-Autopilotv1.15.0支持Humble/Iron,内置uxrce_dds_client
ROS2 HumbleHumble HawksbillUbuntu 22.04,LTS版本,社区支持最好
ROS2 IronIron IrwiniUbuntu 24.04,较新,需注意Fast DDS版本
Micro XRCE-DDS Agentv2.4.x与PX4 v1.15配套,支持UDP/Serial
MAVROS2.9.0ROS2版本,需源码编译
版本陷阱:PX4 v1.13及更早版本使用fastrtps作为DDS实现,而v1.14+默认切换到Micro XRCE-DDS。如果混用旧版Agent或错误配置RMW_IMPLEMENTATION,会导致话题无法发现。务必保持PX4、Agent和ROS2的DDS实现一致。

4.3 案例拆解:Micro XRCE-DDS Agent与Client部署

Micro XRCE-DDS Agent是桥接层的核心进程,负责将PX4固件内的Client数据转发到DDS总线。Agent可以运行在机载计算机(如树莓派、NUC)或地面站上,通过UDP与飞控通信。

4.3.1 Agent安装与启动

# 1. 克隆Agent源码
git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
cd Micro-XRCE-DDS-Agent
mkdir build && cd build

# 2. 编译安装
cmake ..
make
sudo make install

# 3. 启动Agent(UDP模式,监听8888端口)
MicroXRCEAgent udp4 -p 8888

启动后,Agent会监听UDP 8888端口,等待PX4 Client连接。如果使用串口连接(如Pixhawk的TELEM2口),则使用以下命令:

MicroXRCEAgent serial --dev /dev/ttyS0 -b 921600

4.3.2 PX4 Client配置

PX4固件内的Client模块需要在启动时指定Agent的IP和端口。在SITL仿真中,通过环境变量配置:

# 启动SITL并指定Agent地址
export PX4_UXRCE_DDS_IP=127.0.0.1
export PX4_UXRCE_DDS_PORT=8888
make px4_sitl px4

在真实飞控上,可以通过QGroundControl的MAVLink控制台或直接修改启动脚本,在rc.txt中添加:

uxrce_dds_client start -t udp -p 8888 -s 192.168.1.100

其中192.168.1.100是Agent所在主机的IP地址。

4.3.3 验证桥接是否成功

启动Agent和PX4后,在ROS2环境中检查话题列表:

ros2 topic list

如果看到/fmu/out/vehicle_attitude、/fmu/out/vehicle_odometry等话题,说明桥接成功。还可以通过ros2 topic echo /fmu/out/vehicle_attitude查看具体数据。

实战经验:在SITL仿真中,如果话题不出现,首先检查Agent是否打印了“Client connected”日志。如果没有,说明PX4的Client未正确启动。此时可以尝试在PX4 shell中手动执行uxrce_dds_client start -t udp -p 8888 -s 127.0.0.1,观察是否有错误输出。

4.4 操作流程:MAVROS安装与配置

MAVROS是PX4与ROS2之间的MAVLink桥接节点,用于任务管理、参数读写和日志获取。MAVROS的ROS2版本需要从源码编译,不能直接使用apt安装。

# 1. 创建ROS2工作空间
mkdir -p ~/mavros_ws/src
cd ~/mavros_ws/src

# 2. 克隆MAVROS源码
git clone https://github.com/mavlink/mavros.git
git clone https://github.com/mavlink/mavlink.git

# 3. 安装依赖
cd ~/mavros_ws
rosdep install --from-paths src --ignore-src -r -y

# 4. 编译
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release

# 5. 环境变量
echo "source ~/mavros_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

编译完成后,启动MAVROS连接PX4(以SITL为例):

# 启动PX4 SITL(另开终端)
make px4_sitl px4

# 启动MAVROS连接
ros2 launch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"

连接成功后,可以通过MAVROS的话题和服务进行任务操作:

# 查看飞控状态
ros2 topic echo /mavros/state

# 切换飞行模式
ros2 service call /mavros/set_mode mavros_msgs/srv/SetMode "{custom_mode: 'OFFBOARD'}"

4.5 常见误区与总结复盘

在环境搭建过程中,以下误区最容易导致失败:

  • DDS实现不匹配:PX4 v1.14+默认使用Micro XRCE-DDS,但ROS2可能配置了Fast DDS或Cyclone DDS。需要确保Agent与ROS2使用相同的RMW实现,否则话题无法互通。可以通过export RMW_IMPLEMENTATION=rmw_fastrtps_cpp统一。
  • IP与端口配置错误:在真实飞控上,Client的IP地址必须指向Agent所在主机的实际IP,不能使用127.0.0.1。同时,防火墙需要放行UDP 8888端口。
  • 固件未启用Client模块:某些定制固件可能裁剪了uxrce_dds_client模块,导致Agent永远等不到连接。编译前务必检查.px4board配置。
  • MAVROS与DDS通道冲突:同时使用MAVROS和DDS时,两者都会订阅PX4的状态话题,可能导致重复数据或资源竞争。建议在MAVROS中只启用任务管理相关功能,避免高频状态订阅。
排障方法论:当桥接失败时,按以下顺序排查:① 确认Agent是否启动并监听端口;② 确认PX4 Client是否启动(在PX4 shell中执行uxrce_dds_client status);③ 确认ROS2话题列表是否出现/fmu/out/前缀话题;④ 检查RMW实现是否一致;⑤ 使用ros2 doctor检查网络发现是否正常。

环境搭建是PX4+ROS2开发的基础,也是后续所有功能实现的先决条件。通过本章的步骤,读者可以搭建一套完整的开发环境,并理解DDS与MAVLink两条通道的协作关系。在实际项目中,建议将环境搭建过程脚本化、文档化,便于团队协作和快速复现。