摘要:本文详细介绍如何在 Ubuntu 22.04 上搭建 ROS2、PX4 与 AirSim 的联合仿真环境。文章从系统框图入手,梳理飞控、主机系统与仿真环境三者的协作关系,随后依次讲解前置依赖安装、Micro-XRCE-DDS-Agent 安装、ROS2 安装、PX4 固件安装、AirSim 安装与配置,以及 ROS2 与 PX4 的桥接方法。最后给出联合仿真启动步骤、验证测试方法和常见问题排查表,帮助读者从零开始构建完整的无人机开发与验证闭环。
一、系统框图
ROS2、PX4 与 AirSim 的联合仿真环境由多个组件协同工作,整体架构如下图所示:

整个系统可以划分为三个主要部分:
1. PX4:飞行控制系统
PX4 负责无人机底层飞行控制,包括:
- 姿态估计
- 位置估计
- 姿态控制
- 位置控制
- 飞行模式管理
- Offboard 控制
- 故障保护
- 执行器输出
在真实无人机中,PX4 通常运行在 Pixhawk 等飞控硬件上;在本文仿真环境中,则使用 PX4 SITL(Software In The Loop)直接运行在 WSL2 Ubuntu 中。
2. ROS2:上层算法系统
ROS2 运行在主机侧,负责:
- 路径规划
- 目标识别
- 视觉算法
- 自主导航
- 任务规划
- 多机协同
- 上层控制逻辑
ROS2 与 PX4 之间不需要通过 MAVLink 进行核心 Topic 通信,而是使用:
PX4 uORB
↕
uXRCE-DDS Client
↕
Micro-XRCE-DDS-Agent
↕
DDS
↕
ROS2
3. AirSim:物理与传感器仿真环境
AirSim 运行在 Windows 中,用于提供:
- 无人机动力学模型
- IMU
- GPS
- 气压计
- 相机
- 深度图
- 碰撞
- Unreal Engine 场景
PX4 与 AirSim 之间通过 MAVLink / Simulator 接口形成仿真闭环。
二、通信关系说明
整套环境中最容易混淆的是 MAVLink 与 uXRCE-DDS。它们不是同一个东西,也不是互相替代关系。
1. PX4 ↔ ROS2
使用 uXRCE-DDS + DDS,通信路径:
ROS2
↕
DDS
↕
Micro-XRCE-DDS-Agent
↕
uXRCE-DDS Client
↕
PX4 uORB
Micro-XRCE-DDS-Agent 的作用是把 PX4 中的 uORB 数据带入 DDS 数据空间,从而让 ROS2 可以通过 Topic 与 PX4 交换数据。
2. PX4 ↔ AirSim
使用 MAVLink / PX4 Simulator Interface,主要传输:
- 仿真 IMU
- GPS
- 气压计
- 飞行状态
- 电机/执行器控制量
形成:
PX4
↓ 控制输出
AirSim
↓ 物理仿真
传感器数据
↓
PX4
3. PX4 ↔ QGroundControl
同样主要使用 MAVLink。QGC 用于:
- 飞行状态监控
- 参数配置
- 飞行模式切换
- 航点任务规划
- 解锁/上锁
- 日志与调试
因此本文的核心关系可以记为:
ROS2 ←── uXRCE-DDS ──→ PX4 ←── MAVLink ──→ AirSim
↕
MAVLink
↕
QGC
二、环境概述
本文采用「Windows + WSL2」双环境架构:
- Windows 11:运行 Unreal Engine 4.27、AirSim 与 QGroundControl;
- WSL2 Ubuntu 22.04:运行 PX4 SITL、ROS2 Humble、Micro-XRCE-DDS-Agent 以及自定义 ROS2 节点。
这样划分的原因是 AirSim/Unreal Engine 在 Windows 下图形与驱动支持更成熟,而 PX4 与 ROS2 的 Linux 工具链更适合运行在 Ubuntu 中。
需要特别注意:WSL2 本质上运行在独立虚拟机网络中,Windows 与 WSL2 拥有不同 IP,因此 PX4 与 AirSim 不能直接依赖 127.0.0.1 通信,必须显式配置 Windows 主机 IP、WSL2 IP 和防火墙端口。
下面梳理一下这套双环境架构下的网络拓扑与数据流向:
┌───────────────────────────── Windows 11 ─────────────────────────────┐
│ │
│ AirSim (UE4.27) QGroundControl │
│ ───────────── ───────────── │
│ TcpPort: 4560 MAVLink: 14550 │
│ │ │ │
│ │ MAVLink │ MAVLink │
└────────┼────────────────────────┼────────────────────────────────────┘
│ │
│ vEthernet (WSL) │
│ (Windows 主机 IP) │
▼ ▼
┌───────────────────────────── WSL2 Ubuntu 22.04 ──────────────────────┐
│ │
│ PX4 SITL (none_iris) │
│ ├── MAVLink ←── 连接 AirSim 4560 端口 │
│ └── uXRCE-DDS Client ←── 连接 Agent 8888 端口 │
│ │
│ Micro-XRCE-DDS-Agent (udp4 -p 8888) │
│ │ │
│ │ DDS │
│ ▼ │
│ ROS2 Humble │
│ ├── px4_msgs │
│ ├── ROS2 DDS │
│ └── 自定义 ROS2 Node │
└──────────────────────────────────────────────────────────────────────┘

从上图可以看出,整个系统存在两条独立的通信链路:
- MAVLink 链路:PX4 SITL 与 AirSim 之间通过 4560 端口进行仿真数据交换,QGroundControl 通过 14550 端口接入同一 MAVLink 网络,用于监控与调试。
- uXRCE-DDS 链路:PX4 内部的 uORB 消息通过 uXRCE-DDS Client 发送到 Micro-XRCE-DDS-Agent(8888 端口),再由 Agent 桥接到 DDS 数据空间,最终被 ROS2 节点订阅或发布。
两条链路相互独立、互不干扰,这也是为什么 ROS2 与 PX4 的核心 Topic 通信不需要经过 MAVLink 的原因。
本文采用 PX4 内置的 uXRCE-DDS Client 与 Micro-XRCE-DDS-Agent 建立 PX4 与 ROS2 之间的通信。px4_ros_com 不是当前通信链路中必须运行的桥接节点,主要可用于示例代码和辅助开发。
三、版本矩阵与网络端口
在开始搭建之前,需要先明确各组件版本与网络端口,这是 Windows + WSL2 跨主机方案能否跑通的关键。版本不匹配是联合仿真环境搭建中最常见的失败原因之一,因此建议严格按照下表选择版本。
3.1 版本矩阵
- 操作系统:Windows 11 + WSL2 Ubuntu 22.04 LTS
- ROS2:Humble Hawksbill(安装在 WSL2 Ubuntu 22.04 中)
- PX4:固定一个稳定 tag/commit(建议固定你实际验证通过的版本,不要写宽泛范围)
- Micro XRCE-DDS Agent:v2.4.2(对应 ROS2 Humble / Fast DDS 2.6.x)
- AirSim:Windows 原生安装,与 UE4.27 兼容版本
- Unreal Engine:4.27
- Visual Studio:2022
- QGroundControl:稳定版本(推荐放 Windows)
- MAVSDK:可选开发工具(主链路不依赖)
关于版本选择,有几点需要特别说明:
- ROS2 与 Agent 的对应关系:ROS2 Humble 默认使用 Fast DDS 2.6.x,PX4 官方兼容表明确要求 Micro-XRCE-DDS-Agent 使用 v2.4.2。如果 Agent 版本过高或过低,可能导致 uORB Topic 无法正确映射到 DDS 数据空间。
- PX4 版本固定:PX4 主分支更新频繁,不同版本对 uXRCE-DDS 的支持和默认配置可能存在差异。建议在验证通过后,使用
git checkout <tag>固定版本,避免后续升级引入未知问题。 - UE 与 AirSim 的兼容性:AirSim 对 Unreal Engine 版本有严格要求,UE4.27 是当前验证最充分的组合。使用其他 UE 版本时,需要确认 AirSim 是否支持对应的引擎版本。
3.2 网络端口表
| 端口 | 协议 | 用途 |
|---|---|---|
| 4560 | TCP | PX4 simulator 与 AirSim 通信 |
| 14540 | UDP | AirSim/PX4 控制链路 |
| 14580 | UDP | AirSim/PX4 控制链路(远端) |
| 8888 | UDP | PX4 uXRCE-DDS Client 与 Agent 通信 |
| 14550 | UDP | QGroundControl MAVLink 端口 |
| 41451 | TCP | AirSim API Server(可选,WSL2 直接访问时) |
端口配置时需要注意以下几点:
- 4560 端口:这是 PX4 与 AirSim 之间 MAVLink 通信的核心端口,对应 AirSim settings.json 中的 TcpPort 配置。PX4 启动时会主动连接该端口,因此 AirSim 必须先于 PX4 启动。
- 8888 端口:这是 PX4 的 uXRCE-DDS Client 与 Micro-XRCE-DDS-Agent 之间的通信端口。Agent 启动时使用
MicroXRCEAgent udp4 -p 8888监听该端口,PX4 启动后会自动建立连接。 - 防火墙放行:在 Windows 防火墙中,需要放行 4560、14540、14580、14550 等端口,否则 WSL2 中的 PX4 无法访问 Windows 中的 AirSim 和 QGroundControl。
飞控部分基础环境安装教程:Windows11下WSL+PX4+Gazebo+ QGroundContro安装_linkgroundcontrol-CSDN博客
四、Micro-XRCE-DDS-Agent 安装
Micro-XRCE-DDS-Agent 是 PX4 与 ROS2 之间通信的关键桥梁。PX4 内部使用 uORB 消息机制,而 ROS2 使用 DDS 通信协议,两者无法直接互通。Micro-XRCE-DDS-Agent 作为 DDS 代理,负责将 PX4 的 uORB Topic 映射为 ROS2 的 Topic,从而实现飞控与上层算法框架之间的数据交换。
ROS2 Humble 对应 Fast DDS 2.6.x,PX4 官方兼容表要求 Micro-XRCE-DDS-Agent 2.4.2。Agent 可以独立编译,也可以放到 ROS2 工作空间中。为了目录清晰,这里采用独立安装:
# 进入用户主目录
cd ~
# 克隆指定版本 v2.4.2 的 Agent 源码
git clone -b v2.4.2 https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
# 进入源码目录
cd Micro-XRCE-DDS-Agent
# 创建编译目录并进入
mkdir -p build && cd build
# 配置 CMake 构建
cmake ..
# 使用多核并行编译
make -j$(nproc)
# 安装到系统目录
sudo make install
# 刷新动态链接库缓存
sudo ldconfig /usr/local/lib/
编译安装完成后,可通过以下命令验证 Micro-XRCE-DDS-Agent 是否安装成功:
# 查看 Micro-XRCE-DDS-Agent 的帮助信息,确认命令可用
MicroXRCEAgent --help

启动 Micro-XRCE-DDS-Agent 服务,默认监听 UDP 端口 8888:
# 启动 Agent,使用 UDP 协议并监听 8888 端口
MicroXRCEAgent udp4 -p 8888
启动成功后,终端会显示 Agent 正在监听指定端口,等待 PX4 通过串口或 UDP 连接。至此,Micro-XRCE-DDS-Agent 安装完成。后续在启动 PX4 时,PX4 的 uXRCE-DDS Client 与 Agent 建立传输连接后,PX4 指定的 uORB 话题才能进入 DDS 数据空间,进而与 ROS2 通信。
这里补充一个关键细节:Agent 与 PX4 的 uXRCE-DDS Client 之间是「先启动 Agent、后启动 PX4」的依赖关系。如果先启动 PX4 再启动 Agent,PX4 的 uXRCE-DDS Client 会因找不到 Agent 而反复重试连接,虽然最终也能连上,但会拖慢启动流程并产生大量重试日志。因此建议严格按照「先 Agent、后 PX4」的顺序启动。
另外,Agent 默认只监听 UDP 8888 端口。如果你的网络环境存在多个网卡(例如 WSL2 的虚拟网卡与 Windows 物理网卡并存),可以显式指定监听地址,避免 Agent 绑定到错误的网卡上:
# 查看本机所有 IP 地址,确认 WSL2 网卡地址
ip addr show
# 显式指定监听地址(示例:监听 172.20.10.5 的 8888 端口)
MicroXRCEAgent udp4 -p 8888 -i 172.20.10.5
如果后续在「九、验证与测试」中发现 ros2 topic echo 无输出,可以优先检查 Agent 是否监听在正确的网卡地址上,以及 PX4 启动日志中是否出现 uXRCE-DDS Client 连接成功的记录。
四、ROS2 安装
ROS2 是上层算法框架的核心,本节介绍在 Ubuntu 22.04 上安装 ROS2 Humble 版本,并初始化工作空间。首先配置 ROS2 软件源并完成安装:
# 更新软件源并安装 curl 工具
sudo apt update && sudo apt install curl
# 下载 ROS2 官方 GPG 密钥并保存到系统密钥环
curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
# 添加 ROS2 软件源到 apt 源列表
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 更新软件源索引
sudo apt update
# 安装 ROS2 Humble 桌面版及 colcon 构建工具
sudo apt install ros-humble-desktop python3-colcon-common-extensions
这里补充一个细节:ros-humble-desktop 是完整桌面版,包含 RViz、rqt 等可视化工具,适合需要调试和观察话题数据的场景。如果只想最小化安装,可以替换为 ros-humble-ros-base,但后续验证阶段缺少 RViz 等工具会不太方便,因此建议直接安装桌面版。
ROS2 安装完成后,需要初始化环境变量并创建工作空间,以便后续编译和运行自定义节点:
# 加载 ROS2 环境变量
source /opt/ros/humble/setup.bash
# 创建工作空间目录并进入
mkdir -p ~/ros2_px4_ws/src && cd ~/ros2_px4_ws
# 编译工作空间
colcon build
编译完成后,工作空间会生成 install 目录,其中包含编译好的包和 setup.bash 环境脚本。后续每次打开新终端时,都需要先执行 source /opt/ros/humble/setup.bash 和 source ~/ros2_px4_ws/install/setup.bash 来加载 ROS2 与工作空间的环境变量,才能正常使用 ros2 命令。
为了验证 ROS2 是否安装成功,可以运行以下命令检查版本信息:
# 检查当前加载的 ROS2 发行版
echo $ROS_DISTRO
# 查看 ROS2 命令帮助,确认 CLI 正常
ros2 --help
# 查看已安装的 ROS2 包数量
ros2 pkg list | wc -l
如果 echo $ROS_DISTRO 输出 humble,说明 ROS2 环境变量已正确加载。此外,还可以通过 printenv | grep ROS 查看完整的 ROS2 环境变量,正常情况下应能看到 ROS_VERSION=2、ROS_PYTHON_VERSION=3 和 ROS_DISTRO=humble。建议在 ~/.bashrc 末尾追加以下两行,让每次打开终端时自动加载 ROS2 与工作空间的环境变量,避免手动 source 的麻烦:
# 追加到 ~/.bashrc 末尾
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "source ~/ros2_px4_ws/install/setup.bash" >> ~/.bashrc
# 使配置立即生效
source ~/.bashrc
注意:如果后续在「七、ROS2 与 PX4 桥接」中编译 px4_ros_com 时提示找不到某些依赖包,可以回到本节确认 ros-humble-desktop 是否完整安装,必要时补充安装 ros-humble-rmw-fastrtps-cpp 等与 Fast DDS 相关的包。
五、PX4 固件安装
克隆 PX4 源码并安装依赖工具链。注意:AirSim 场景下不要使用 make px4_sitl gazebo-classic,因为这会启动 Gazebo Classic 目标,而不是等待 Windows AirSim 连接。AirSim 官方 PX4 SITL 流程使用 make px4_sitl_default none_iris:
# 进入工作目录
cd ~/workspace
# 克隆 PX4 源码(含子模块)
git clone --recursive https://github.com/PX4/PX4-Autopilot.git
# 进入源码目录
cd PX4-Autopilot
# 强烈建议固定你实际验证通过的 tag/commit,例如:
# git checkout <你的固定版本>
# 更新子模块
git submodule update --init --recursive
# 安装 SITL 所需工具链(跳过 NuttX 和仿真工具)
bash ./Tools/setup/ubuntu.sh --no-nuttx --no-sim-tools
这里补充一个细节:PX4 主分支更新频繁,不同版本对 uXRCE-DDS 的支持和默认配置可能存在差异。建议在验证通过后,使用 git checkout <tag> 固定版本,避免后续升级引入未知问题。同时,安装工具链完成后建议重新打开一个 WSL2 终端,确保环境变量生效。
编译完成后,验证固件是否正常启动:
make px4_sitl_default none_iris
启动 PX4 前,需要先设置 PX4_SIM_HOST_ADDR 环境变量,指向 AirSim 所在的 Windows 主机地址(即 WSL2 的默认网关,也就是 Windows 的 vEthernet (WSL) 地址):
# 自动获取 Windows 主机在 WSL2 网络中的地址
export PX4_SIM_HOST_ADDR=$(ip route | awk '/default/ {print $3; exit}')
# 打印确认地址
echo $PX4_SIM_HOST_ADDR
重要:WSL2 重启后虚拟网卡地址可能变化,不要写死某个 172.x.x.x 地址,应每次启动前重新获取实际地址。如果 PX4 一直显示 Waiting for simulator to connect,请优先检查 PX4_SIM_HOST_ADDR 是否与 Windows 的 vEthernet (WSL) IPv4 地址一致,并确认 Windows 防火墙已放行 4560 端口。
六、AirSim 安装与配置
本文的 AirSim 运行在 Windows 中,而不是在 WSL2 Ubuntu 中编译和启动。因此,不再使用 ./setup.sh 和 ./build.sh 这种 Linux 安装方式,而是采用 Windows + Unreal Engine 4.27 + AirSim 的组合。AirSim 原项目已经比较老,建议固定 AirSim commit、Unreal Engine 4.27 和 PX4 tag,避免后续因为版本变化导致无法复现。
Windows 中 AirSim 的配置文件一般位于 Documents\AirSim\settings.json。针对 Windows AirSim + WSL2 PX4 的跨主机方案,可以使用类似配置:
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"ClockType": "SteppableClock",
"Vehicles": {
"PX4": {
"VehicleType": "PX4Multirotor",
"UseSerial": false,
"LockStep": true,
"UseTcp": true,
"TcpPort": 4560,
"ControlIp": "remote",
"ControlPortLocal": 14540,
"ControlPortRemote": 14580,
"LocalHostIp": "172.31.64.1"
}
}
}
其中 172.31.64.1 必须替换为你自己的 Windows vEthernet (WSL) IPv4 地址。获取方法:在 Windows CMD 或 PowerShell 中执行 ipconfig,找到 Ethernet adapter vEthernet (WSL) 对应的 IPv4 地址。注意不同电脑地址不同,且 WSL2 重启之后 IP 可能变化。
配置完成后,启动 Windows 上的 AirSim / Unreal 场景,确保场景已经进入运行状态,再回到 WSL2 中启动 PX4。
七、ROS2 与 PX4 桥接
这里需要先澄清一个容易混淆的点:px4_ros_com 并不是当前 PX4 与 ROS2 通信必须运行的「桥接节点」。核心通信链路实际上是:
PX4 uORB
↓
uXRCE-DDS Client
↓
Micro-XRCE-DDS-Agent
↓
DDS
↓
px4_msgs / ROS2 Node
ROS2 侧需要 px4_msgs 提供与 PX4 对应的 ROS2 消息定义。进入工作空间并克隆:
# 进入工作空间源码目录
cd ~/ros2_px4_ws/src
# 克隆 px4_msgs 消息定义包
git clone https://github.com/PX4/px4_msgs.git
# 进入 px4_msgs 目录
cd px4_msgs
# 建议根据 PX4 版本切换对应分支
# git checkout <与你的PX4版本匹配的分支>
然后重新构建工作空间:
# 回到工作空间根目录
cd ~/ros2_px4_ws
# 加载 ROS2 环境变量
source /opt/ros/humble/setup.bash
# 使用符号链接方式编译,便于后续开发调试
colcon build --symlink-install
# 加载工作空间环境变量
source ~/ros2_px4_ws/install/setup.bash
编译完成后,PX4 的 uORB 消息会通过 uXRCE-DDS Client 进入 DDS 数据空间,ROS2 节点即可通过 px4_msgs 提供的消息类型订阅或发布对应 Topic,无需额外运行桥接节点。
八、联合仿真启动
按以下顺序启动各组件,顺序颠倒会导致 MAVLink 连接失败或话题为空:
- Windows 启动 AirSim 仿真环境,加载无人机场景。
- WSL2 设置 Windows 主机地址(PX4_SIM_HOST_ADDR)。
- WSL2 启动 Micro-XRCE-DDS-Agent,监听 8888 端口。
- WSL2 启动 PX4 SITL,连接 AirSim 的 MAVLink 端口。
- WSL2 验证 ROS2 话题,确认数据流通。
- Windows 启动 QGroundControl,确认 MAVLink 连接。
启动命令示例:
# 终端1(Windows):启动 AirSim / Unreal Engine 场景
# 确保场景已进入运行状态,等待 PX4 连接
终端2(WSL2):设置 Windows 主机地址
export PX4_SIM_HOST_ADDR=$(ip route | awk '/default/ {print $3; exit}')
echo $PX4_SIM_HOST_ADDR
终端3(WSL2):启动 Micro-XRCE-DDS-Agent
source /opt/ros/humble/setup.bash
source ~/ros2_px4_ws/install/setup.bash
MicroXRCEAgent udp4 -p 8888
终端4(WSL2):启动 PX4 SITL
cd ~/PX4-Autopilot
export PX4_SIM_HOST_ADDR=$(ip route | awk '/default/ {print $3; exit}')
make px4_sitl_default none_iris
终端5(WSL2):验证 ROS2 话题
source /opt/ros/humble/setup.bash
source ~/ros2_px4_ws/install/setup.bash
ros2 topic list
注意:PX4 启动命令必须使用 make px4_sitl_default none_iris,不要使用 make px4_sitl gazebo-classic,后者会启动 Gazebo Classic 目标,而不是等待 Windows 上的 AirSim 连接。正常情况下 PX4 会显示 Waiting for simulator to connect ...,连接成功后即可进入 PX4 SITL shell。
九、验证与测试
保持 AirSim 与 PX4 正常运行,另外打开一个 WSL2 终端进行验证。首先确认 Micro-XRCE-DDS-Agent 已启动:
# 加载 ROS2 与工作空间环境变量
source /opt/ros/humble/setup.bash
source ~/ros2_px4_ws/install/setup.bash
# 启动 Agent,监听 8888 端口
MicroXRCEAgent udp4 -p 8888
进入 PX4 shell 后,可以检查 uXRCE-DDS Client 是否正常运行:
# 在 PX4 SITL shell 中检查 uXRCE-DDS Client 状态
uxrce_dds_client status
新开一个 WSL2 终端,查看当前所有 ROS2 话题:
# 加载环境变量
source /opt/ros/humble/setup.bash
source ~/ros2_px4_ws/install/setup.bash
# 查看当前所有 ROS2 话题
ros2 topic list
如果通信成功,应该能够看到类似 /fmu/in/... 和 /fmu/out/... 的话题,例如:
/fmu/out/vehicle_status
/fmu/out/vehicle_odometry
/fmu/out/vehicle_local_position
读取状态和里程计数据:
# 读取 PX4 状态话题的实时消息
ros2 topic echo /fmu/out/vehicle_status
# 读取里程计话题的实时消息
ros2 topic echo /fmu/out/vehicle_odometry
如果能够正常接收到 PX4 的状态消息,说明 ROS2、PX4 与 AirSim 的联合仿真环境搭建成功。此外,还可以通过以下命令进一步验证:
# 查看话题发布频率,确认数据持续流动
ros2 topic hz /fmu/out/vehicle_status
# 查看节点列表,确认相关节点正常运行
ros2 node list
在 QGroundControl 中,如果能看到无人机模型并实时显示姿态、高度等状态信息,说明 AirSim 与 PX4 的 MAVLink 链路也已打通。需要注意:PX4 并不会自动把所有 uORB Topic 都暴露到 ROS2,实际发布和订阅的 Topic 由 PX4 对应版本中的 DDS Topic 配置决定。
十、常见问题排查
搭建过程中难免遇到各种问题,下面汇总了最常见的几类故障及其排查思路:
| 问题 | 可能原因 | 解决方案 | |
|---|---|---|---|
| AirSim 无法启动 | Unreal Engine 版本不匹配 | 确认使用 UE4.27 构建 AirSim | |
| PX4 连接失败 | MAVLink 端口配置错误 | 检查 settings.json 中的 TcpPort 设置 | |
| ROS2 话题为空 | Agent 未连接 / PX4 uXRCE-DDS Client 未运行 / ROS2 工作空间未加载 | 检查 Agent、PX4 Client 状态和 ROS2 环境 | |
| PX4 无法连接 AirSim | PX4_SIM_HOST_ADDR 未设置或地址错误 | 启动前执行 export PX4_SIM_HOST_ADDR=$(ip route | awk '/default/ {print $3; exit}') 重新获取地址 |
| Micro-XRCE-DDS-Agent 启动失败 | 端口 8888 被占用 | 使用 lsof -i:8888 查看占用进程,或更换端口并同步修改 PX4 配置 | |
| WSL2 重启后无法通信 | 虚拟网卡 IP 地址发生变化 | 不要写死 IP,每次启动前重新获取 PX4_SIM_HOST_ADDR 并检查防火墙规则 | |
| PX4 启动后立即退出 | AirSim 尚未启动或端口未就绪 | 先启动 AirSim 并确认 4560 端口可访问,再启动 PX4 SITL | |
| ros2 topic echo 无输出 | Agent 未连接 / PX4 uXRCE-DDS Client 未运行 / ROS2 工作空间未加载 | 检查 Agent、PX4 Client 状态和 ROS2 环境 |
如果遇到上述表格之外的问题,建议按以下顺序排查:先确认各组件版本与版本矩阵一致,再检查网络端口是否被占用,最后查看终端日志中的错误提示,通常能快速定位问题根源。
此外,建议在搭建过程中养成记录日志的习惯。每个组件启动时都会输出关键信息,例如 PX4 启动日志中的 MAVLink 连接状态、Agent 日志中的 Client 连接记录、ROS2 节点的话题发布频率等。遇到问题时,先对照日志定位是哪个环节出错,再结合上表针对性解决,往往能事半功倍。
十一、总结
本文详细介绍了 ROS2、PX4 与 AirSim 联合仿真环境的搭建流程,从依赖安装、组件编译到联合启动与验证,覆盖了完整的开发链路。该环境可用于无人机算法验证、路径规划测试和视觉感知研究,为后续开发提供了可靠的仿真基础。
回顾整个搭建过程,核心要点可以归纳为以下四点:
- 版本固定:ROS2 Humble、PX4 固定 tag、Micro-XRCE-DDS-Agent v2.4.2、UE4.27 与 AirSim 之间必须保持兼容,建议将实际验证通过的版本记录下来,避免升级引入未知问题。
- 网络打通:Windows + WSL2 跨主机方案的关键在于 IP 与端口。PX4 与 AirSim 通过 4560 端口通信,PX4 与 Agent 通过 8888 端口通信,每次启动前都要重新获取 PX4_SIM_HOST_ADDR,并确保防火墙放行相关端口。
- 启动顺序:先在 Windows 中启动 AirSim,然后在 WSL2 中启动 Micro-XRCE-DDS-Agent,再启动 PX4 SITL。PX4 与 Agent 建立连接后,加载 ROS2 工作空间,并通过
/fmu/in/...与/fmu/out/...Topic 验证 PX4 与 ROS2 的通信是否正常。最后可以启动 QGroundControl 对 PX4 飞行状态进行监控。其中 ROS2 与 PX4 的通信并不依赖单独启动px4_ros_com桥接节点,而是由 PX4 内置的 uXRCE-DDS Client 与 Micro-XRCE-DDS-Agent 完成 DDS 数据交换。 - 日志排查:搭建过程中养成查看日志的习惯,PX4 启动日志中的 MAVLink 连接状态、Agent 日志中的 Client 连接记录、ROS2 节点的话题发布频率都是定位问题的关键线索。
后续可以在此基础上继续深入的方向包括:使用 MAVSDK 编写更复杂的航点任务、接入视觉传感器进行目标检测与避障、将仿真中验证通过的算法迁移到真实无人机等。希望本文能帮助你顺利搭建起属于自己的无人机仿真开发环境。