4、编译工具链:安装gcc-arm-none-eabi编译器、配置MAVProxy、安装必要的Python库
好,咱们进入第四章。说实话,这一章是整个环境搭建里最「磨人」的一步。为什么?因为工具链版本不对、Python 库冲突、MAVProxy 死活连不上——这些坑我几乎都踩过一遍。今天我把这些经验掰开揉碎了讲,你跟着走,能省下至少半天调试时间。
4.1 安装 gcc-arm-none-eabi 编译器
这个编译器是干嘛的?说白了,它负责把咱们写的 C/C++ 代码,编译成 ARM Cortex-M 系列芯片能跑的机器码。SITL 虽然跑在 PC 上,但底层还是模拟了真实的 ARM 指令集,所以这个工具链是刚需。
核心要点:版本必须选对。我见过太多人装了最新版 gcc-arm-none-eabi,结果编译 PX4 固件时报一堆莫名其妙的链接错误。目前最稳的是 gcc-arm-none-eabi-9-2020-q2-update 这个版本。
4.1.1 Linux 下的安装(以 Ubuntu 20.04/22.04 为例)
我个人习惯用 apt 安装,但要注意——Ubuntu 官方源里的版本通常太老。我建议手动下载 ARM 官方提供的预编译包。
# 下载指定版本
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/9-2020q2/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2
# 解压到 /opt 目录
sudo tar -xjf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -C /opt/
# 添加环境变量
echo 'export PATH=$PATH:/opt/gcc-arm-none-eabi-9-2020-q2-update/bin' >> ~/.bashrc
source ~/.bashrc
# 验证安装
arm-none-eabi-gcc --version
嗯,这里要注意:如果你用的是 macOS,建议用 Homebrew 安装,命令是 brew install gcc-arm-none-eabi。Windows 用户嘛,直接下载 ARM 官网的 .exe 安装包,一路 Next 就行,记得勾选「Add to PATH」。
我曾经踩过的坑:有次在 Ubuntu 22.04 上装了系统自带的 gcc-arm-none-eabi(版本 15.x),编译 ArduPilot 时死活报 __aeabi_uldivmod 未定义。折腾了两小时,换成 9-2020-q2-update 版本后一次通过。所以,别偷懒,版本一定要锁死。
4.1.2 验证编译器是否正常工作
装完别急着走,写个最简单的测试程序跑一下:
# 创建一个测试文件
echo 'int main() { return 0; }' > test.c
# 编译成 ARM 目标文件
arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb test.c -o test.o
# 查看目标文件信息
arm-none-eabi-objdump -h test.o
如果能正常输出段信息(.text、.data 等),说明工具链已经就绪。如果报错,多半是 PATH 没配好,或者下载的包不完整。
4.2 配置 MAVProxy
MAVProxy 是咱们和 SITL 之间的「翻译官」。它负责把地面站发来的 MAVLink 协议数据,转发给仿真器,同时把仿真器的状态反馈回去。你想想看,没有它,QGroundControl 和 SITL 就是两个哑巴。
4.2.1 安装 MAVProxy
MAVProxy 是 Python 写的,所以安装很简单:
pip install mavproxy
但这里有个坑——MAVProxy 依赖 pyserial 和 numpy,如果系统里同时有 Python 2 和 Python 3,很容易装错环境。我建议用虚拟环境隔离:
# 创建虚拟环境
python3 -m venv sitl_env
# 激活环境
source sitl_env/bin/activate
# 安装 MAVProxy
pip install mavproxy
# 验证安装
mavproxy.py --version
小技巧:如果你在 macOS 上遇到 libxml2 相关的编译错误,先执行 brew install libxml2 再重试 pip 安装。这是 MAVProxy 里 pymavlink 模块的依赖,我当年卡在这步半小时。
4.2.2 配置 MAVProxy 启动参数
MAVProxy 启动时需要指定几个关键参数。我个人习惯写一个启动脚本,省得每次敲一长串命令:
#!/bin/bash
# sitl_mavproxy.sh
# 启动 MAVProxy,连接到本地 SITL 的 UDP 端口
mavproxy.py --master=tcp:127.0.0.1:5760 \
--sitl 127.0.0.1:5501 \
--out udp:127.0.0.1:14550 \
--out udp:127.0.0.1:14551 \
--console \
--map
解释一下这些参数:
| 参数 | 含义 | 我的建议 |
|---|---|---|
--master |
指定与 SITL 通信的端口 | TCP 比 UDP 更稳定,推荐用 TCP |
--sitl |
SITL 仿真器的 UDP 端口 | 默认 5501,一般不用改 |
--out |
转发给地面站的端口 | 14550 是 QGC 默认端口,14551 留给备用 |
--console |
打开 MAVProxy 控制台 | 调试时很有用,能看到实时消息流 |
--map |
显示简易地图窗口 | 不必须,但直观看到飞机位置很方便 |
注意:如果你同时启动多个地面站(比如 QGC 和 Mission Planner 一起开),记得为每个地面站单独配一个 --out 端口。端口冲突会导致其中一个连不上,我调试多机协同时就吃过这个亏。
4.3 安装必要的 Python 库
SITL 仿真环境依赖一堆 Python 库。别怕,咱们一个一个来。我按「必须装」和「建议装」分了两类:
4.3.1 核心依赖库
这些库不装,SITL 根本跑不起来:
# 基础科学计算
pip install numpy scipy
# MAVLink 协议解析
pip install pymavlink
# 图形界面(用于 SITL 的 3D 视图)
pip install pygame
# 串口通信
pip install pyserial
# 网络通信
pip install netifaces
4.3.2 辅助工具库
这些是我在实际项目中觉得特别好用的,建议顺手装上:
# 用于记录和分析飞行日志
pip install matplotlib pandas
# 用于自动化测试
pip install pytest
# 用于参数调优时的数据可视化
pip install seaborn
版本锁定建议:我整理了一份经过验证的 requirements.txt,你可以直接拿来用:
numpy==1.24.3
scipy==1.10.1
pymavlink==2.4.41
pygame==2.5.2
pyserial==3.5
netifaces==0.11.0
matplotlib==3.7.1
pandas==2.0.3
pytest==7.4.0
seaborn==0.12.2
安装命令:pip install -r requirements.txt
4.4 本章知识体系总览
说了这么多,咱们用一张图把整个工具链的脉络理清楚:
4.5 验证整体环境
所有东西装完后,咱们跑一个快速验证脚本,确保整个链路是通的:
#!/usr/bin/env python3
"""
环境验证脚本:检查工具链和库是否就绪
"""
import sys
import subprocess
def check_toolchain():
"""检查 gcc-arm-none-eabi"""
try:
result = subprocess.run(['arm-none-eabi-gcc', '--version'],
capture_output=True, text=True)
print(f"[OK] gcc-arm-none-eabi: {result.stdout.split()[2]}")
return True
except FileNotFoundError:
print("[FAIL] gcc-arm-none-eabi 未找到")
return False
def check_mavproxy():
"""检查 MAVProxy"""
try:
import mavproxy
print(f"[OK] MAVProxy: {mavproxy.__version__}")
return True
except ImportError:
print("[FAIL] MAVProxy 未安装")
return False
def check_python_libs():
"""检查核心 Python 库"""
libs = ['numpy', 'pymavlink', 'pygame', 'pyserial', 'matplotlib']
all_ok = True
for lib in libs:
try:
__import__(lib)
print(f"[OK] {lib}")
except ImportError:
print(f"[FAIL] {lib} 未安装")
all_ok = False
return all_ok
if __name__ == '__main__':
print("=" * 40)
print("SITL 环境验证工具")
print("=" * 40)
tc_ok = check_toolchain()
mp_ok = check_mavproxy()
lib_ok = check_python_libs()
print("=" * 40)
if tc_ok and mp_ok and lib_ok:
print("✅ 所有组件就绪,可以进入下一章!")
else:
print("❌ 存在缺失组件,请根据提示安装")
print("=" * 40)
把这个脚本保存为 check_env.py,然后运行 python3 check_env.py。如果所有项都显示 [OK],恭喜你,工具链环境已经搭建完毕。如果某一步报错,别慌——回到对应的小节重新检查安装步骤,多半是版本或路径的问题。
我的经验:第一次搭建环境时,建议把每一步的输出都截图保存。这样以后换电脑或者帮同事搭环境时,可以直接对照排查。我就在团队内部维护了一份「环境搭建检查清单」,每次新成员入职,照着清单走一遍,半小时内必搞定。