2. 仿真环境搭建:操作系统选择、依赖库安装、源码编译与配置

搭建一个稳定的 SITL 环境,是后续所有性能优化的基础。这一步要是没走稳,后面跑仿真时各种玄学问题都会冒出来。我这些年踩过的坑,十有八九都能追溯到环境搭建阶段。

说白了,环境搭建就三件事:选对系统、装对库、编译配置别偷懒。咱们一个一个来。

2.1 操作系统选择:Ubuntu 还是其他?

我个人习惯用 Ubuntu 20.04 LTS 或 22.04 LTS。为什么?因为 ArduPilot 和 PX4 的官方 CI 都在 Ubuntu 上跑,社区支持最全,遇到问题搜一下基本都有答案。

操作系统 推荐度 说明
Ubuntu 20.04 LTS ⭐⭐⭐⭐⭐ 最稳定,依赖库兼容性好,我主力用这个
Ubuntu 22.04 LTS ⭐⭐⭐⭐ 新特性多,但部分旧库需要手动处理
Windows + WSL2 ⭐⭐⭐ 能用,但性能有损耗,调试不方便
macOS ⭐⭐ 依赖库经常缺胳膊少腿,不推荐
注意: 别用 Ubuntu 24.04 或更新的版本。我在项目中遇到过 GCC 版本过高导致编译失败的情况,折腾了两天才找到原因——新编译器对某些旧代码的语法检查更严格了。

2.2 依赖库安装:一步都不能少

SITL 的依赖库看着多,其实就几大类。我习惯用官方脚本一次性装完,省心。

先更新系统包:

sudo apt update
sudo apt upgrade -y

然后安装基础编译工具:

sudo apt install -y \
    git \
    cmake \
    build-essential \
    python3-dev \
    python3-pip \
    python3-venv

接下来是 SITL 核心依赖。以 ArduPilot 为例:

sudo apt install -y \
    libtool \
    libxml2-dev \
    libxslt1-dev \
    libssl-dev \
    libcurl4-openssl-dev \
    libudev-dev \
    libgstreamer-plugins-base1.0-dev \
    libgstreamer1.0-dev \
    libsdl2-dev \
    libsdl2-image-dev \
    libsdl2-ttf-dev \
    libsdl2-gfx-dev \
    libsdl2-net-dev \
    libsdl2-mixer-dev \
    freeglut3-dev \
    libglib2.0-dev \
    libboost-all-dev \
    liblttng-ust-dev \
    libzmq3-dev
小技巧: 我习惯把上面的命令存成一个 install_deps.sh 脚本。每次重装系统直接跑一遍,不用再一个个敲。你想想看,省了多少时间。

Python 依赖也别忘:

pip3 install --user \
    pyserial \
    empy \
    pyparsing \
    numpy \
    matplotlib \
    dronekit \
    MAVProxy

2.3 源码编译:从 Git 到可执行文件

依赖装好了,接下来就是拉源码、编译。这一步我踩过不少坑,尤其是网络问题和版本匹配问题。

先克隆 ArduPilot 源码:

git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive
注意: git submodule update --init --recursive 这一步千万别跳过。我刚开始做的时候嫌慢,跳过了,结果编译到一半报错说缺头文件。老老实实等它下载完,大概 5-10 分钟。

然后更新子模块:

./Tools/environment_install/install-prereqs-ubuntu.sh -y

这个脚本会检查并安装所有缺失的依赖。跑完后重启一下终端,让环境变量生效。

接下来编译 SITL 目标。以 Copter 为例:

./waf configure --board sitl
./waf copter

第一次编译会比较慢,大概 10-20 分钟。后面改代码再编译就快多了,因为 waf 会增量编译。

核心要点:

  • --board sitl 指定编译为 SITL 目标,不是真实硬件
  • ./waf copter 只编译 Copter 固件,其他机型同理
  • 编译产物在 build/sitl/bin/ 目录下

2.4 配置与验证:跑起来才算数

编译成功后,先别急着跑复杂的仿真。我习惯先验证一下基础功能。

启动 SITL:

cd ardupilot
sim_vehicle.py -v ArduCopter --map --console

这个命令会启动 SITL 实例,同时打开 MAVProxy 控制台和地图界面。如果一切正常,你会看到控制台输出类似:

Ready to fly
AP: ArduCopter V4.5.0-dev (e1f2c3d4)
AP: Frame: QUAD
GPS: 0 satellites

嗯,这里要注意:GPS 显示 0 颗卫星是正常的,因为 SITL 默认用仿真 GPS,需要手动设置原点。

设置仿真原点:

param set SIM_LAT 40.7128
param set SIM_LON -74.0060
param set SIM_ALT 10.0

然后重启 SITL,GPS 就会显示有信号了。

验证清单:
  • ✅ SITL 能正常启动,无报错
  • ✅ MAVProxy 控制台能接收心跳包
  • ✅ 地图界面能显示飞行器位置
  • ✅ 可以通过 arm throttle 解锁电机
  • ✅ 可以通过 mode guided 切换模式

2.5 知识体系总览

下面这张图把整个环境搭建的流程串起来了。我每次带新人时都会先让他们看这张图,心里有个全局概念再动手。

SITL 环境搭建流程 SITL 环境搭建核心流程 操作系统选择 依赖库安装 源码编译 配置与验证 各阶段关键点 ① Ubuntu 20.04/22.04 ② 官方脚本一键安装 ③ git submodule 不能跳 ④ --board sitl 指定目标 ⑤ 首次编译约 10-20 分钟 ⑥ 验证 5 项基础功能 ⑦ GPS 0 卫星是正常的 ⑧ 设置仿真原点才可用 环境搭建完成标志 SITL 无报错启动 → MAVProxy 心跳正常 → 地图显示位置 → 可解锁/切换模式 验证失败 → 返回检查

这张图把整个流程分成了四个阶段。每个阶段都有明确的输入输出。我特别加了右侧的说明框,把容易忽略的细节都标出来了。你照着这个流程走,基本不会出大问题。

2.6 常见问题与避坑

最后分享几个我实际遇到过的问题,希望能帮你少走弯路。

  • 编译报错 "fatal error: xxx.h: No such file or directory" —— 多半是子模块没更新全。重新跑 git submodule update --init --recursive 试试。
  • SITL 启动后闪退 —— 检查一下是不是端口被占用了。默认 5760 端口,用 lsof -i :5760 看看。
  • MAVProxy 连不上 SITL —— 我曾经遇到过防火墙把 UDP 包拦了的情况。关掉防火墙或者加规则放行就好。
  • 仿真跑起来特别卡 —— 先别急着优化代码,看看是不是虚拟机资源分配不够。我给虚拟机分配 4 核 8G 内存,基本流畅。

一句话总结: 环境搭建就像盖楼打地基。你花 80% 的精力把这一步做扎实了,后面 20% 的优化工作才能事半功倍。别嫌麻烦,别跳步骤,这是我对你最真诚的建议。