ROS2+PX4+AirSim环境搭建

简介: 本文详解在Ubuntu 22.04(WSL2)上搭建ROS2 Humble、PX4 SITL与Windows AirSim的联合仿真环境,涵盖Micro-XRCE-DDS-Agent配置、双系统网络互通、MAVLink/uXRCE-DDS双链路通信及完整验证流程,助力无人机算法闭环开发。(239字)

摘要:本文详细介绍如何在 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 连接失败或话题为空:

  1. Windows 启动 AirSim 仿真环境,加载无人机场景。
  2. WSL2 设置 Windows 主机地址(PX4_SIM_HOST_ADDR)。
  3. WSL2 启动 Micro-XRCE-DDS-Agent,监听 8888 端口。
  4. WSL2 启动 PX4 SITL,连接 AirSim 的 MAVLink 端口。
  5. WSL2 验证 ROS2 话题,确认数据流通。
  6. 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 编写更复杂的航点任务、接入视觉传感器进行目标检测与避障、将仿真中验证通过的算法迁移到真实无人机等。希望本文能帮助你顺利搭建起属于自己的无人机仿真开发环境。

相关文章
|
16天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8240 19
|
15天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
2589 14
|
14天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
1878 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
13天前
|
人工智能 编解码 并行计算
MiniMax-H3 一键整合包技术文档:8G 显存运行 AI 漫剧制作 —— 角色替换 / 动作迁移 / 文图生视频部署与调参指南
MiniMax H3 是 MiniMax 开源的全模态视频生成模型,支持文/图/音/视多条件输入,输出最高2K、15秒带双声道音频视频。本文档详述其Int8量化版在8GB显存下的本地一键部署、三段式工作流(EDIT/REPLACE/CONTINUE)、参数调优及常见问题排查。(239字)
|
9天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
9天前
|
人工智能 JSON 编解码
【2026最新版】ComfyUI本地部署教程,新手也能看懂!
ComfyUI是本地运行的AI绘画工具,采用节点式工作流设计:通过拖拽连接“加载模型”“提示词编码”“采样”“解码”等模块,实现高度可控的文生图。新手推荐使用秋叶整合包,一键启动、内置模型管理与插件安装器,轻松上手。(239字)
|
23天前
|
缓存 IDE Java
【保姆级】Android Studio下载、安装和汉化教程(2026最新)
Android Studio 是 Google 官方推出的免费 Android 应用开发集成环境,基于 IntelliJ IDEA,内置模拟器、调试器、性能分析及 Compose 界面工具,功能全面,文档丰富,是安卓开发首选工具。(239字)
2480 1

热门文章

最新文章