2. SITL基础概念
说实话,很多同学学无人机仿真,第一步就卡在环境搭建上。
我见过太多人花了两三天装环境,结果依赖冲突、版本不对、Gazebo 死活打不开。最后连一行代码都没跑起来,心态直接崩了。
这一章,我们就来解决这个问题。我会带你从零搭建一套完整的开发环境,再给出一套 Docker 一键部署方案。你以后换电脑、重装系统,都能在 10 分钟内恢复战斗力。
2.1 整体架构:这些组件到底怎么配合?
先搞清楚一件事:我们装的这些东西,各自扮演什么角色?
核心逻辑链:
ROS2 (Humble) 是通信总线 → Gazebo (Ignition) 是物理仿真引擎 → PX4/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 验证环境:跑一个最简单的例子
环境装好了,怎么确认所有组件能正常协作?
我一般用这个「三句话验证法」:
- 验证 ROS2: 开两个终端,一个跑
ros2 run demo_nodes_cpp talker,另一个跑ros2 run demo_nodes_cpp listener,能看到「Hello World」就对了。 - 验证 Gazebo: 跑
ign gazebo,能看到空白世界窗口。 - 验证 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,看到一架无人机静静地停在草坪上。
下一件事?让它飞起来。但那是后面章节的事了。现在,先确认你的环境是健康的,跑一遍上面的「三句话验证法」。如果都通过,恭喜你,你已经迈过了最劝退的一关。