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+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用于任务管理和调试。
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-Autopilot | v1.15.0 | 支持Humble/Iron,内置uxrce_dds_client |
| ROS2 Humble | Humble Hawksbill | Ubuntu 22.04,LTS版本,社区支持最好 |
| ROS2 Iron | Iron Irwini | Ubuntu 24.04,较新,需注意Fast DDS版本 |
| Micro XRCE-DDS Agent | v2.4.x | 与PX4 v1.15配套,支持UDP/Serial |
| MAVROS | 2.9.0 | ROS2版本,需源码编译 |
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查看具体数据。
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中只启用任务管理相关功能,避免高频状态订阅。
uxrce_dds_client status);③ 确认ROS2话题列表是否出现/fmu/out/前缀话题;④ 检查RMW实现是否一致;⑤ 使用ros2 doctor检查网络发现是否正常。
环境搭建是PX4+ROS2开发的基础,也是后续所有功能实现的先决条件。通过本章的步骤,读者可以搭建一套完整的开发环境,并理解DDS与MAVLink两条通道的协作关系。在实际项目中,建议将环境搭建过程脚本化、文档化,便于团队协作和快速复现。