2、PX4飞控固件编译:从GitHub拉取PX4源码,配置交叉编译环境,编译SITL目标固件
好,咱们正式开始动手。这一章是整个仿真联调的基础——你得先把飞控固件编译出来。别觉得这是纯体力活,我见过太多人在这一步栽跟头,一卡就是半天。说白了,编译环境配好了,后面所有测试才有根。
咱们的目标很明确:从GitHub拉下PX4源码,配好交叉编译工具链,然后编译出SITL(Software In The Loop)目标固件。SITL固件跑在你的电脑上,模拟一个完整的飞控,地面站可以直接连上去。
2.1 从GitHub拉取PX4源码
我个人习惯把PX4源码放在 ~/src 目录下。先确保你装了git,然后执行:
cd ~
mkdir -p src
cd src
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
注意这个 --recursive 参数。PX4依赖很多子模块,比如uORB、drivers、mavlink等等。不加这个参数,你拉下来的代码会缺胳膊少腿。我曾经有一次急着演示,忘了加 --recursive,结果编译到一半报错,找了好久才发现是子模块没拉全。
拉完以后,建议你切到一个稳定的发行版。master分支太新,可能不稳定。我一般用 v1.13.3 或 v1.14.0:
cd PX4-Autopilot
git checkout v1.14.0
git submodule update --init --recursive
为什么要切版本?你想想看,PX4社区更新很快,master分支可能今天还能编译,明天就报错了。用稳定版,至少保证你这一周内不会因为代码变动而头疼。
git clone --depth=1 只拉最新一次提交,减少下载量。但记得后续要补全子模块。
2.2 配置交叉编译环境
编译SITL固件,其实不需要真正的交叉编译链——因为SITL是跑在x86_64 Linux上的。但PX4的构建系统统一用了 cmake,所以环境配置还是得走一遍。
PX4官方推荐用Ubuntu 20.04或22.04。我自己的机器是Ubuntu 22.04,下面以它为例。
首先安装基础依赖:
sudo apt update
sudo apt install -y \
git zip cmake build-essential genromfs ninja-build \
libncurses5-dev libncursesw5-dev libssl-dev \
libxml2-dev libxslt1-dev zlib1g-dev \
python3-pip python3-dev python3-venv \
astyle clang-tidy
然后安装PX4的Python工具链:
pip3 install --user -r ~/src/PX4-Autopilot/requirements.txt
这里有个坑。如果你系统里同时有Python 2和Python 3,一定要用 pip3 而不是 pip。我刚开始就踩过这个坑——用 pip 装了一堆包,结果编译时Python脚本报错,说找不到模块。折腾了半天才发现是装到了Python 2的环境里。
最后,安装gcc-arm-none-eabi交叉编译器。虽然SITL用不到,但PX4的构建脚本会检查它:
sudo apt install -y gcc-arm-none-eabi
验证一下:
arm-none-eabi-gcc --version
如果输出版本号,说明环境基本就绪。
2.3 编译SITL目标固件
环境配好了,咱们开始编译。SITL的编译目标叫 px4_sitl_default。执行:
cd ~/src/PX4-Autopilot
make px4_sitl_default
第一次编译会比较慢,因为要下载一些依赖、编译所有模块。我的机器(i7-12700H,32GB内存)大概需要5-8分钟。你可以去泡杯咖啡。
编译成功后,终端会输出类似这样的信息:
-- Build type: RelWithDebInfo
-- PX4 version: v1.14.0
-- Firmware target: px4_sitl_default
-- ...
[100%] Linking CXX executable px4
最后一行会告诉你可执行文件的位置:
px4: /home/yourname/src/PX4-Autopilot/build/px4_sitl_default/bin/px4
这个 px4 就是SITL固件本体。你可以直接运行它:
./build/px4_sitl_default/bin/px4
它会启动一个模拟的飞控,默认监听UDP端口14540(用于MAVLink通信)。这时候你打开QGroundControl,它应该能自动发现这个SITL实例。
2.4 常见编译错误与解决
编译过程中难免遇到问题。我整理了几个高频错误,你遇到了可以直接对照:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
fatal error: mavlink/v2.0/... |
子模块未更新 | 执行 git submodule update --init --recursive |
arm-none-eabi-gcc: not found |
交叉编译器未安装 | 安装 gcc-arm-none-eabi 或手动下载 |
Python module 'xxx' not found |
Python依赖缺失 | 重新执行 pip3 install -r requirements.txt |
CMake Error at cmake/... |
cmake版本过低 | 升级cmake到3.16以上 |
ld: cannot find -lxxx |
系统库缺失 | 安装对应 libxxx-dev 包 |
嗯,这里要特别说一下。如果你遇到 ld: cannot find -lm 这种错误,别慌。这通常意味着你的系统缺少数学库。执行 sudo apt install libc6-dev 就能解决。我刚开始用WSL时遇到过,因为WSL的镜像比较精简。
2.5 知识体系:PX4编译流程全景
为了让你对整个流程有个全局认识,我画了一张图。它展示了从源码到SITL固件的完整链路:
从图上你能看到,整个流程分两条线:左边是源码准备,右边是环境配置,最终在 make 构建阶段汇合。SITL固件生成后,直接运行就能和地面站对接。
2.6 验证编译结果
编译完了,怎么确认固件是好的?我一般做三个快速检查:
- 检查可执行文件是否存在:
ls -lh build/px4_sitl_default/bin/px4,正常大小在30-50MB。 - 运行固件看启动日志:直接执行
./build/px4_sitl_default/bin/px4,看有没有[px4] Startup OK字样。 - 检查UDP端口:启动固件后,另开终端执行
netstat -tuln | grep 14540,应该能看到0.0.0.0:14540在监听。
这三个检查都通过,说明你的SITL固件已经可以正常工作了。接下来就可以用它来联调地面站了。
build/px4_sitl_default/bin/px4 复制到一个固定目录,比如 ~/px4_sitl_latest。这样后面做测试时,不用每次都进到源码目录去找。
好,这一章的内容就到这儿。你只要按步骤走,应该半小时内就能把SITL固件跑起来。如果遇到问题,先对照上面的错误表自查,实在解决不了再问我。