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 | ⭐⭐ | 依赖库经常缺胳膊少腿,不推荐 |
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 知识体系总览
下面这张图把整个环境搭建的流程串起来了。我每次带新人时都会先让他们看这张图,心里有个全局概念再动手。
这张图把整个流程分成了四个阶段。每个阶段都有明确的输入输出。我特别加了右侧的说明框,把容易忽略的细节都标出来了。你照着这个流程走,基本不会出大问题。
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% 的优化工作才能事半功倍。别嫌麻烦,别跳步骤,这是我对你最真诚的建议。