3、环境搭建(下):ArduPilot源码编译、PX4源码编译、MAVSDK安装

上一节我们把基础工具链都装好了,系统也配干净了。这一节咱们来点真格的——把 ArduPilot 和 PX4 的源码拉下来编译通过,再把 MAVSDK 装好。

说实话,编译这两个大家伙是新手最容易卡住的地方。我当年第一次编译 ArduPilot,等了快一个小时,结果最后报了个莫名其妙的错,气得我差点砸电脑。后来才发现是 Python 依赖版本没对齐。

嗯,咱们一步步来,别急。

3.1 编译 ArduPilot 源码

ArduPilot 的编译系统用的是 waf,一个 Python 写的构建工具。你不需要懂它内部怎么工作的,只要记住几个常用命令就行。

3.1.1 拉取源码

先找个干净的目录,我习惯放在 ~/workspace 下:

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

这里有个坑——submodule update 这一步会下载很多第三方库,网络不好的话容易超时。我建议你找个网络稳定的时段,或者用代理。我曾经在公司内网搞了一下午没拉下来,最后回家用家里宽带十分钟搞定。

3.1.2 安装 Python 依赖

ArduPilot 的编译脚本依赖一些 Python 包,直接装:

pip install -r requirements.txt

如果提示权限问题,记得加 --user 或者用虚拟环境。我个人习惯用 venv,干净又卫生。

3.1.3 选择飞控板并编译

我们做 SITL 仿真,目标板选 sitl 就行:

./waf configure --board sitl
./waf build --target bin/arducopter

第一次编译会比较慢,我的机器大概跑了 15 分钟。你可以去泡杯咖啡,或者刷刷手机。编译成功后,你会看到类似这样的输出:

Waf: Leaving directory `/home/user/workspace/ardupilot/build/sitl'
Build commands: 1 executed, 0 optimized
'build' finished successfully (892.3s)
小技巧: 如果只想编译特定机型,比如四旋翼,用 --target bin/arducopter。全量编译所有机型的话去掉 --target 参数,但时间会翻倍。

3.1.4 验证编译结果

编译完的可执行文件在 build/sitl/bin/ 目录下。试试能不能跑起来:

cd build/sitl/bin/
./arducopter --help

能看到一大串参数说明,说明编译成功了。嗯,到这里 ArduPilot 就搞定了。

3.2 编译 PX4 源码

PX4 的编译方式和 ArduPilot 不太一样。它用的是 CMake,而且依赖一个叫 px4-dev 的工具链。

3.2.1 拉取源码

cd ~/workspace
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot

注意 --recursive 参数,它会自动拉子模块。如果你忘了加,后面再 git submodule update --init --recursive 也行,就是多等一会儿。

3.2.2 自动安装依赖

PX4 官方提供了一个自动化脚本,帮你装好所有编译依赖:

bash ./Tools/setup/ubuntu.sh

这个脚本会检测你的 Ubuntu 版本,然后装对应的包。我建议你跑一遍,省得后面缺这缺那。不过要注意,它可能会改你系统的 Python 版本,如果你有其他项目在用特定版本,最好先备份一下。

3.2.3 编译 SITL 目标

PX4 的 SITL 编译命令很简洁:

make px4_sitl gazebo

这条命令会编译 PX4 固件,同时生成 Gazebo 仿真插件。第一次编译同样很慢,大概 20-30 分钟。编译过程中你会看到很多 [XX%] 的进度提示,别慌,正常现象。

编译成功后,终端会显示:

[100%] Linking CXX executable px4
Built target px4_sitl
注意: 如果你用的是 Ubuntu 22.04 或更新版本,可能会遇到 GCC 版本不兼容的问题。我遇到过好几次,解决方案是安装 GCC-10 并切换默认版本:
sudo apt install gcc-10 g++-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100

3.2.4 快速测试

编译完成后,试试能不能启动 PX4 SITL:

make px4_sitl gazebo

如果一切正常,Gazebo 窗口会弹出来,里面有一架四旋翼。你可以用键盘控制它起飞。我第一次看到那个画面时,还挺激动的——虽然只是个仿真,但毕竟是自己编译出来的。

3.3 安装 MAVSDK

MAVSDK 是连接你的控制程序和飞控的桥梁。它提供了一套 C++ 库,让你能通过 MAVLink 协议和 ArduPilot 或 PX4 通信。

3.3.1 为什么需要 MAVSDK?

你想想看,如果你要写一个地面站程序,直接操作 MAVLink 协议的话,得自己解析心跳、处理消息、管理连接状态……太累了。MAVSDK 把这些都封装好了,你只需要调用几个 API 就行。

我在做无人机物流项目时,一开始自己手写 MAVLink 通信,结果 bug 一堆。后来换成 MAVSDK,代码量减少了一半,稳定性还提高了不少。

3.3.2 安装方式

MAVSDK 支持多种安装方式,我推荐用源码编译,因为这样能保证和你的系统兼容:

cd ~/workspace
git clone https://github.com/mavlink/MAVSDK.git
cd MAVSDK
cmake -B build/default -DCMAKE_BUILD_TYPE=Release
cmake --build build/default
sudo cmake --install build/default

编译过程大概 5-10 分钟,比飞控源码快多了。安装完成后,MAVSDK 的头文件和库文件会被放到系统目录下。

3.3.3 验证安装

写一个简单的测试程序,看看能不能编译通过:

#include <iostream>
#include <mavsdk/mavsdk.h>

int main() {
    mavsdk::Mavsdk mavsdk;
    std::cout << "MAVSDK version: " << mavsdk.version() << std::endl;
    return 0;
}

编译命令:

g++ -o test_mavsdk test_mavsdk.cpp -lmavsdk
./test_mavsdk

如果输出类似 MAVSDK version: 2.x.x,说明安装成功了。

避坑指南: 如果你用的是 MAVSDK v2.x,注意它和 v1.x 的 API 变化很大。我刚开始从 v1 迁移到 v2 时,发现很多函数名都改了,花了一下午才适配完。建议你直接学 v2,别走弯路。

3.4 本章知识体系

下面这张图帮你理清三个组件的关系:

SITL 仿真环境组件关系图 你的控制程序 MAVSDK MAVLink 协议 ArduPilot SITL PX4 SITL Gazebo / 其他仿真器 数据流向 控制程序 → MAVSDK → MAVLink → 飞控 → 仿真

从图上可以看得很清楚:你的控制程序通过 MAVSDK 发送指令,MAVSDK 把指令转成 MAVLink 消息,然后发给 ArduPilot 或 PX4 的 SITL 实例,最后在 Gazebo 里看到仿真效果。

3.5 常见问题与排查

问题 可能原因 解决方案
ArduPilot 编译报错 Python not found Python 路径未配置 检查 which python3,确保 Python 3.8+ 已安装
PX4 编译卡在 Fetching submodules 网络问题或子模块缺失 手动执行 git submodule update --init --recursive
MAVSDK 安装后找不到头文件 安装路径未加入系统搜索路径 设置 CMAKE_PREFIX_PATH 或手动指定路径
Gazebo 启动后黑屏 显卡驱动或 OpenGL 问题 尝试 export SVGA_VGPU10=0 后重启

核心要点:

  • ArduPilot 用 waf 编译,目标板选 sitl
  • PX4 用 make 编译,命令是 make px4_sitl gazebo
  • MAVSDK 是通信中间件,建议源码编译安装
  • 三个组件独立工作,通过 MAVLink 协议串联