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
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,说明安装成功了。
3.4 本章知识体系
下面这张图帮你理清三个组件的关系:
从图上可以看得很清楚:你的控制程序通过 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 协议串联