4. 编译环境配置(一):安装Python依赖库、配置ArduPilot的Python工具链、验证环境

好,咱们进入正题。编译环境配置这块,说白了就是给电脑装上能“听懂”ArduPilot代码的工具。很多新手卡在这一步,不是装错版本,就是漏了某个包。我当年第一次编译Pixhawk固件时,就因为少装了一个future库,折腾了整整一个下午。嗯,咱们今天就把这事彻底搞定。

4.1 为什么需要Python依赖库?

ArduPilot的构建系统(也就是编译脚本)是用Python写的。你想想看,C++代码的编译过程,需要解析参数、生成头文件、处理MAVLink消息……这些脏活累活,都靠Python脚本在背后调度。

具体来说,这几个库各司其职:

  • future:让Python 2和Python 3的代码能互相兼容。虽然现在主流是Python 3,但ArduPilot有些老模块还留着Python 2的写法。装上它,编译时就不会报“语法错误”。
  • pyserial:串口通信库。烧录固件时,电脑通过USB转串口跟飞控板通信,全靠它。
  • empy:模板引擎。编译过程中,它会根据模板生成一堆C++头文件。比如AP_Param的参数定义,就是empy生成的。
  • 其他常用库numpypyparsingsetuptools等,视具体功能而定。

核心原则:不要用系统自带的pip直接装,容易跟其他项目冲突。我建议用虚拟环境,或者至少用--user参数安装。

4.2 安装Python依赖库(实操)

打开终端,咱们一步步来。我假设你已经装好了Python 3.6以上版本(推荐3.8或3.10)。

4.2.1 更新pip和setuptools

python3 -m pip install --upgrade pip setuptools wheel

这一步很重要。老版本的pip有时候会装错依赖版本。我曾经遇到过pip 9.0装empy时卡死,升级到21.0后就秒过。

4.2.2 安装核心依赖

python3 -m pip install --user future pyserial empy

加上--user参数,意思是只给当前用户装,不影响系统其他用户。我个人习惯用这个,万一装坏了,删掉~/.local目录下的对应文件夹就行,不用重装系统。

4.2.3 安装其他常用依赖(可选但推荐)

python3 -m pip install --user numpy pyparsing lxml

这些库在编译某些板子(比如CubeOrange)时会用到。不装的话,编译到一半会报错,然后你又要回头装。嗯,一次性搞定省心。

小技巧:如果你用的是Windows,记得把python3换成py -3,或者直接python。Linux和macOS用户一般用python3

4.3 配置ArduPilot的Python工具链

依赖装好了,接下来要告诉系统“ArduPilot的Python脚本在哪里”。说白了就是设置环境变量和路径。

4.3.1 克隆ArduPilot仓库(如果还没做)

git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

注意:不要用--depth=1浅克隆,因为后面编译时需要完整的git历史来生成版本号。我吃过这个亏,编译出来的固件版本号全是unknown

4.3.2 安装子模块和Python工具链

git submodule update --init --recursive
python3 -m pip install --user -r requirements.txt

requirements.txt文件里列出了所有必需的Python包。运行上面这条命令,它会自动检查并安装缺失的库。我个人建议先手动装futurepyserialempy这三个,再跑requirements.txt,这样能避免某些依赖冲突。

4.3.3 验证工具链路径

ArduPilot的编译脚本会调用Tools/autotest/目录下的Python脚本。确保你的终端能直接运行这些脚本:

export PATH=$PATH:~/ardupilot/Tools/autotest
echo $PATH

如果你不想每次打开终端都设置一遍,可以把上面这行加到~/.bashrc~/.zshrc里。我习惯在.bashrc里加一行注释,方便以后查找。

注意:不要用sudo pip安装!这会把包装到系统目录,容易跟系统自带的Python包冲突。我曾经手贱用了sudo pip install pyserial,结果系统自带的modemmanager服务崩溃了,串口设备都认不出来。

4.4 验证环境是否配置成功

光装完不算完,得跑个测试确认一下。我一般用三步验证法:

4.4.1 验证Python库是否可导入

python3 -c "import future; print('future OK')"
python3 -c "import serial; print('pyserial OK')"
python3 -c "import empy; print('empy OK')"

如果每个都打印出“OK”,说明库装好了。如果报ModuleNotFoundError,那就是没装上,或者装到了别的Python版本里。检查一下python3 --versionpip3 --version是否对应。

4.4.2 验证ArduPilot的Python工具链

cd ardupilot
python3 Tools/autotest/param_metadata/param_parse.py --help

这个脚本是用来解析参数元数据的。如果它能正常打印帮助信息,说明工具链路径没问题。如果报错No module named 'future',那就是future没装对,重新装一遍。

4.4.3 快速编译测试(可选)

如果你时间充裕,可以跑一个最简单的编译测试:

./waf configure --board sitl
./waf build --target tests

这个命令会编译SITL(软件在环仿真)的测试目标。编译过程大概需要5-10分钟。如果顺利通过,说明整个环境完全OK。我第一次配置成功时,看到终端里刷出Build commands: 0 failed,心里那叫一个踏实。

验证清单总结

  • ✅ Python 3.6+ 已安装
  • ✅ future、pyserial、empy 可导入
  • ✅ requirements.txt 已安装
  • ✅ 工具链路径已配置
  • ✅ waf configure 无报错

4.5 知识体系图

下面这张图帮你理清整个配置流程的逻辑关系:

编译环境配置核心流程 Python 3.6+ pip & setuptools 核心依赖库 future / pyserial / empy ArduPilot工具链 requirements.txt 验证:import 测试 python3 -c "import ..." 验证:工具链测试 param_parse.py --help ✅ 环境配置完成 可进行下一步:编译固件

这张图展示了从Python基础环境到最终验证的完整链路。你跟着箭头走,每一步都验证通过,就不会出问题。

4.6 常见问题与避坑

我整理了几个新手最容易踩的坑:

问题现象 原因 解决方法
import serial 报错 pyserial没装,或者装到了Python 2里 python3 -m pip install pyserial重装
empy报语法错误 empy版本太旧(< 3.3) pip install --upgrade empy
waf configure 找不到Python 系统默认Python是2.7 设置export PYTHON=python3
编译时提示缺少lxml requirements.txt没装全 重新跑pip install -r requirements.txt

特别提醒:如果你用的是macOS,千万别用系统自带的Python(/usr/bin/python3)。那个版本太老,而且权限受限。我建议用Homebrew装一个:brew install python@3.10

好了,环境配置的第一步就到这里。你按照上面的步骤走,应该不会出大问题。如果卡住了,回头检查一下pip版本和Python版本是否匹配。嗯,这些基础打牢了,后面编译固件就是水到渠成的事。


公众号:蓝海资料掘金营,微信deep3321