2. SITL基础概念

说实话,很多同学学无人机仿真,第一步就卡在环境搭建上。

我见过太多人花了两三天装环境,结果依赖冲突、版本不对、Gazebo 死活打不开。最后连一行代码都没跑起来,心态直接崩了。

这一章,我们就来解决这个问题。我会带你从零搭建一套完整的开发环境,再给出一套 Docker 一键部署方案。你以后换电脑、重装系统,都能在 10 分钟内恢复战斗力。

2.1 整体架构:这些组件到底怎么配合?

先搞清楚一件事:我们装的这些东西,各自扮演什么角色?

核心逻辑链:

ROS2 (Humble) 是通信总线 → Gazebo (Ignition) 是物理仿真引擎 → PX4/ArduPilot SITL 是飞控软件在环 → 你的算法节点订阅/发布话题,控制虚拟无人机。

说白了,Gazebo 负责「假装这是真实世界」,SITL 负责「假装这是真实飞控」,ROS2 负责「让它们俩和你写的代码能聊天」。

开发环境全家桶架构图 你的算法节点 ROS2 (Humble) 通信总线 PX4 SITL ArduPilot SITL Gazebo (Ignition) 说明: 你可以选择 PX4 SITL 或 ArduPilot SITL 之一,也可以两者都装。 Gazebo 负责渲染和物理仿真,SITL 负责飞控逻辑,ROS2 负责数据交换。

2.2 手动搭建:一步一步来

我建议你先手动搭一遍。为什么?因为 Docker 虽然方便,但出了问题你完全不知道底层怎么回事。手动搭一遍,你才知道每个组件装在哪个目录、配置文件在哪、日志怎么查。

2.2.1 安装 Ubuntu 22.04

ROS2 Humble 官方只支持 Ubuntu 22.04 (Jammy)。别用 20.04 或 24.04,会有一堆兼容问题。

我个人习惯用双系统,虚拟机跑仿真性能损失太大,尤其是 Gazebo 的 GPU 渲染。

小技巧: 如果你用 Windows,可以用 WSL2 + Ubuntu 22.04,但记得启用 GUI 支持和 GPU 加速。我试过,跑简单四旋翼仿真没问题,但复杂场景还是建议双系统。

2.2.2 安装 ROS2 Humble

官方教程其实写得很清楚,但有几个坑我帮你踩过了。

# 1. 设置 locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 2. 添加 ROS2 源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
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 $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 3. 安装桌面版(包含 rviz2、demo 等)
sudo apt update
sudo apt install ros-humble-desktop

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

注意: 安装过程中如果提示「无法定位软件包」,八成是源没加对。检查 /etc/apt/sources.list.d/ros2.list 文件是否存在,内容是否正确。

我曾经在 Ubuntu 22.04 刚发布时踩过这个坑,折腾了两小时才发现是 codename 写成了 focal。

2.2.3 安装 Gazebo (Ignition) Fortress

ROS2 Humble 官方推荐的是 Gazebo Fortress(即 Ignition Fortress)。别装 Garden 或 Harmonic,版本对不上。

# 安装 Gazebo Fortress
sudo apt install ros-humble-ros-gz
sudo apt install ignition-fortress

# 验证安装
ign gazebo --version

装完后跑一下 ign gazebo,如果能看到一个空白世界窗口,说明成功了。

避坑: 如果你在虚拟机里跑,Gazebo 可能黑屏。这是因为虚拟机没有 GPU 直通。解决方案:要么用双系统,要么在启动时加上 --render-engine ogre 参数,用 CPU 渲染。

2.2.4 安装 PX4 SITL

PX4 的 SITL 其实不需要「安装」,它是一套 Python 脚本 + 固件源码。

# 克隆 PX4 固件
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

# 安装依赖
bash ./Tools/setup/ubuntu.sh

# 编译并启动 SITL
make px4_sitl gazebo

第一次编译大概要 20-30 分钟,取决于你的网络和 CPU。编译完成后会自动启动 Gazebo 和 SITL,你会看到一架四旋翼出现在草坪上。

关键点: PX4 SITL 默认使用 UDP 端口 14540 与地面站通信,使用 18570 与 ROS2 通信。后面我们写 ROS2 节点时,需要连接这些端口。

2.2.5 安装 ArduPilot SITL

如果你更习惯 ArduPilot,流程也类似。

# 克隆 ArduPilot 源码
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 安装依赖
git submodule update --init --recursive
bash Tools/environment_install/install-prereqs-ubuntu.sh -y

# 编译并启动 SITL(以四旋翼为例)
sim_vehicle.py -v ArduCopter -w --console --map

-w 参数会擦除并重新创建虚拟 EEPROM,第一次运行建议加上。后面就不用加了。

我的习惯: 我一般同时装 PX4 和 ArduPilot,因为不同项目需求不同。PX4 更适合学术研究和定制化开发,ArduPilot 在工业应用和成熟度上更有优势。你想想看,两个都会,以后接项目不挑食。

2.3 Docker 一键部署:10 分钟从零到跑起来

手动搭一遍是为了理解原理。但实际工作中,你不可能每次换电脑都重来一遍。Docker 就是你的「环境快照」。

我维护了一个 Docker 镜像,包含了上面所有组件。你只需要装好 Docker 和 NVIDIA Container Toolkit(如果你有 GPU),然后拉取镜像就行。

2.3.1 安装 Docker

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 将当前用户加入 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER
# 重新登录终端生效

2.3.2 拉取并运行全家桶镜像

# 拉取镜像(约 4GB)
docker pull your-registry/ros2-humble-gazebo-sitl:latest

# 运行容器(启用 GPU 加速和网络共享)
docker run -it --rm \
  --gpus all \
  --network host \
  --env DISPLAY=$DISPLAY \
  --volume /tmp/.X11-unix:/tmp/.X11-unix \
  your-registry/ros2-humble-gazebo-sitl:latest

进入容器后,直接运行:

# 启动 PX4 SITL + Gazebo
cd /px4/PX4-Autopilot
make px4_sitl gazebo

# 或者启动 ArduPilot SITL
cd /ardupilot
sim_vehicle.py -v ArduCopter --console

Docker 方案的优势:

  • 环境隔离:不会污染你的宿主机
  • 版本锁定:镜像里的依赖版本都是测试过的
  • 快速恢复:换电脑只需拉取镜像,10 分钟搞定
  • 团队协作:大家用同一个镜像,避免「我这边能跑啊」的尴尬

2.4 验证环境:跑一个最简单的例子

环境装好了,怎么确认所有组件能正常协作?

我一般用这个「三句话验证法」:

  1. 验证 ROS2: 开两个终端,一个跑 ros2 run demo_nodes_cpp talker,另一个跑 ros2 run demo_nodes_cpp listener,能看到「Hello World」就对了。
  2. 验证 Gazebo: 跑 ign gazebo,能看到空白世界窗口。
  3. 验证 SITL + ROS2 通信: 启动 PX4 SITL 后,在另一个终端跑 ros2 topic list,能看到 /fmu/out/vehicle_attitude 等话题。

常见问题:

  • 如果 ros2 topic list 看不到 PX4 话题,检查 ros2 run px4_ros_com sensor_combined 是否在运行。这个节点负责桥接 PX4 的 uORB 消息和 ROS2 话题。
  • 如果 Gazebo 启动后黑屏,试试 export LIBGL_ALWAYS_SOFTWARE=1 强制软渲染。
  • 如果 Docker 容器内无法显示 GUI,检查 DISPLAY 环境变量和 xhost + 权限。

2.5 环境对比总结

组件 版本 安装方式 配置文件位置 日志位置
Ubuntu 22.04 (Jammy) ISO 安装 / WSL2 /etc/os-release /var/log/syslog
ROS2 Humble apt 或 Docker /opt/ros/humble/ ~/.ros/log/
Gazebo Ignition Fortress apt 或 Docker ~/.ignition/ ~/.ignition/gazebo/log/
PX4 SITL v1.14+ 源码编译 PX4-Autopilot/ PX4-Autopilot/log/
ArduPilot SITL Copter 4.5+ 源码编译 ardupilot/ ardupilot/logs/

嗯,到这里,你的开发环境就彻底搭好了。不管是手动搭还是用 Docker,你现在都应该能打开 Gazebo,看到一架无人机静静地停在草坪上。

下一件事?让它飞起来。但那是后面章节的事了。现在,先确认你的环境是健康的,跑一遍上面的「三句话验证法」。如果都通过,恭喜你,你已经迈过了最劝退的一关。