2. 开发环境搭建:Ubuntu环境配置、交叉编译工具链、ArduPilot源码编译、SITL软件在环仿真环境搭建

说实话,很多初学者在ArduPilot上栽的第一个跟头,不是代码看不懂,而是环境没搭好。我见过太多人花了一周时间折腾编译,最后发现是工具链版本不对。这一章,咱们就把这些坑一个个填平。

本章核心目标:从零搭建一套完整的ArduPilot开发环境,涵盖Ubuntu配置、交叉编译、源码编译和SITL仿真。完成后,你可以在自己的电脑上编译固件并运行软件在环仿真。

2.1 Ubuntu环境配置

我个人习惯用Ubuntu 20.04 LTS或22.04 LTS。为什么?因为ArduPilot官方CI(持续集成)主要在这两个版本上跑,兼容性最好。你非要用18.04也行,但有些依赖包得手动降级,麻烦。

2.1.1 基础依赖安装

打开终端,先更新包列表:

sudo apt update
sudo apt upgrade -y

然后安装编译ArduPilot所需的基础工具:

sudo apt install -y git wget python3 python3-pip python3-dev
sudo apt install -y build-essential gcc g++ cmake
sudo apt install -y libtool libtool-bin autoconf automake
sudo apt install -y pkg-config libusb-1.0-0-dev
sudo apt install -y libxml2-dev libxslt1-dev
sudo apt install -y libssl-dev libffi-dev
sudo apt install -y libncurses5-dev libncursesw5-dev

嗯,这里要注意,不同Ubuntu版本下某些包的名称可能略有差异。比如在22.04上,libncurses5-dev可能被libncurses-dev替代。如果安装时报错,把包名复制到搜索引擎里查一下就行。

2.1.2 Python环境配置

ArduPilot的构建系统大量依赖Python脚本。我建议用虚拟环境,避免污染系统Python:

sudo apt install -y python3-venv python3-virtualenv
mkdir -p ~/ardupilot_env
cd ~/ardupilot_env
python3 -m venv ardupilot_venv
source ardupilot_venv/bin/activate

激活虚拟环境后,安装必要的Python包:

pip install --upgrade pip
pip install future pyserial empy
pip install dronecan
pip install MAVProxy

小技巧:每次打开新终端要编译ArduPilot时,记得先执行 source ~/ardupilot_env/ardupilot_venv/bin/activate。我习惯在 ~/.bashrc 里加个别名:alias ardupilot_env='source ~/ardupilot_env/ardupilot_venv/bin/activate',省事。

2.2 交叉编译工具链

交叉编译,说白了就是在一台电脑上编译出能在另一台不同架构的硬件上运行的程序。ArduPilot要跑在STM32、Pixhawk这些ARM Cortex-M系列芯片上,而你的开发机是x86架构,所以必须用交叉编译工具链。

2.2.1 ARM交叉编译器安装

ArduPilot官方推荐使用ARM的GNU工具链。我踩过坑——用Ubuntu源里自带的 gcc-arm-none-eabi 版本太旧,编译出来的固件在Pixhawk上跑着跑着就死机。后来老老实实从ARM官网下载。

下载并安装最新稳定版:

cd ~
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
tar -xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
sudo mv gcc-arm-none-eabi-10.3-2021.10 /opt/
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin' >> ~/.bashrc
source ~/.bashrc

验证安装:

arm-none-eabi-gcc --version

如果输出版本号,说明安装成功。

2.2.2 工具链版本对照

不同版本的ArduPilot对工具链版本有要求。我整理了一张表,方便你对照:

ArduPilot版本 推荐GCC版本 备注
Copter 4.0.x 及更早 7-2018-q2-update 较老,但稳定
Copter 4.1.x - 4.2.x 9-2019-q4-major 中间过渡版本
Copter 4.3.x 及更新 10.3-2021.10 当前主流

警告:千万不要用Ubuntu源里自带的 gcc-arm-none-eabi 包来编译ArduPilot固件。我曾经在4.2版本上试过,编译能通过,但生成的固件在飞控板上无法正常启动。浪费了我整整两天时间排查。

2.3 ArduPilot源码编译

环境搭好了,咱们来拉代码、编译固件。

2.3.1 克隆源码

cd ~
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive

这一步会下载所有子模块,包括MAVLink协议库、DroneCAN库等。网络不好的话可能会卡住,建议用代理或者多试几次。

2.3.2 编译Copter固件

以Pixhawk1为例,编译Copter固件:

cd ~/ardupilot
./waf configure --board Pixhawk1
./waf copter

第一次编译会比较慢,因为要编译所有依赖库。之后修改了代码再编译,只会增量编译改动的文件,快很多。

编译完成后,固件在 build/Pixhawk1/bin/ 目录下,文件名是 arducopter.apj。

2.3.3 常用编译选项

我平时常用的几个编译命令:

  • 指定板子:./waf configure --board Pixhawk1
  • 编译特定机型:./waf copter(四旋翼)、./waf plane(固定翼)、./waf rover(地面车)
  • 调试模式:./waf configure --board Pixhawk1 --debug(生成带调试信息的固件)
  • 清理编译:./waf distclean(遇到奇怪错误时,先清一下再重新配置)

避坑指南:如果你改了参数定义或添加了新参数,编译前一定要执行 ./waf configure 重新配置。否则新参数不会被编译进去。我曾经因为这个原因,在飞场调试时发现新加的参数怎么都读不到,尴尬得很。

2.4 SITL软件在环仿真环境搭建

SITL(Software In The Loop)是ArduPilot开发中最强大的调试工具之一。它让你在没有硬件的情况下,在电脑上运行完整的飞控逻辑。说白了,就是用一个软件模拟飞控板,再配合仿真器模拟传感器和物理环境。

2.4.1 安装SITL依赖

除了前面已经安装的依赖,SITL还需要额外的包:

sudo apt install -y libsdl2-dev libsdl2-image-dev
pip install pygame
pip install pymavlink

2.4.2 启动SITL仿真

最简单的启动方式:

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

这条命令会做三件事:

  • 编译Copter的SITL版本(如果还没编译)
  • 启动仿真飞控
  • 打开MAVProxy控制台和地图界面

启动后,你会看到一个命令行界面和一个地图窗口。在命令行输入 arm throttle 解锁,然后 takeoff 10 让飞机起飞到10米高度。如果一切正常,地图上会显示飞机在上升。

2.4.3 常用SITL参数

参数 说明 示例
-v 指定机型 -v ArduCopter
--map 显示地图界面 默认使用Google地图
--console 显示控制台 显示飞控日志
-I 实例编号 -I 1 启动第二个实例
--speedup 仿真加速 --speedup 10 10倍速运行

2.4.4 多机仿真

想测试编队飞行或多机协同?SITL支持同时启动多个实例:

# 终端1:启动第一架飞机
sim_vehicle.py -v ArduCopter -I 0 --map --console

# 终端2:启动第二架飞机(端口自动偏移)
sim_vehicle.py -v ArduCopter -I 1 --map --console

每个实例使用不同的MAVLink端口,互不干扰。我在做多机避障算法验证时,经常同时跑4-5个SITL实例,比买一堆飞控板划算多了。

核心要点:SITL仿真时,飞控代码和真实硬件上跑的是同一套源码。你在SITL上验证通过的逻辑,烧录到飞控板上基本不会有差异。这就是SITL最大的价值——在硬件投入之前,先把软件逻辑跑通。

2.5 本章知识体系

下面这张图总结了本章的核心流程和组件关系:

ArduPilot开发环境搭建知识体系 ArduPilot开发环境搭建流程 Ubuntu基础环境 系统依赖 + Python环境 交叉编译工具链 ARM GCC 10.3-2021.10 ArduPilot源码 git clone + submodule Waf构建系统 ./waf configure + ./waf copter 硬件固件 (.apj) 烧录到Pixhawk等飞控板 SITL仿真 sim_vehicle.py启动 💡 关键路径 源码 → Waf编译 → 固件/SITL 同一套代码,两种输出 先在SITL验证,再烧硬件

从这张图可以看得很清楚:Ubuntu环境是地基,交叉编译工具链和源码是两根柱子,Waf构建系统是核心枢纽,最终输出硬件固件和SITL仿真两种产物。我建议你按照这个流程一步步来,不要跳步。

常见问题:如果你在编译时遇到 ModuleNotFoundError: No module named 'future' 之类的错误,八成是Python环境没配好。检查一下是否在虚拟环境中,以及 pip list 看看包有没有装全。别问我怎么知道的——我每次重装系统都会在这上面栽一次。

好了,环境搭建就到这里。把这一章的内容动手做一遍,你的开发环境就齐活了。后面咱们就可以开始真正啃代码了。