2、开发环境搭建:搭建PX4固件编译环境、配置Eclipse/VSCode调试环境、安装QGroundControl地面站
好,咱们正式开始动手。这一章说白了就是「把家伙事儿备齐」。我见过太多人卡在环境搭建这一步,一卡就是一整天。其实没那么玄乎,跟着我一步步来,半小时内你就能把PX4固件编译出来。
2.1 搭建PX4固件编译环境
PX4的编译环境,我推荐直接用Ubuntu 20.04 LTS。为什么?因为官方支持最稳,踩坑最少。我自己试过22.04,也能跑,但有些依赖包需要手动处理,麻烦。
2.1.1 安装基础依赖
打开终端,先更新一下包列表:
sudo apt update
sudo apt upgrade -y
然后安装PX4官方推荐的依赖包。嗯,这里有个坑——千万别漏掉python3-pip和ninja-build,少了它们后面编译会报一些莫名其妙的错。
sudo apt install -y \
git zip cmake build-essential \
ninja-build \
python3-pip python3-dev python3-venv \
libxml2-dev libxslt1-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libqt5gui5 libqt5core5a libqt5widgets5 \
libsdl2-dev \
ccache
ccache -s 检查缓存是否启用。ccache能让你第二次编译快3倍以上,尤其是改了一点点代码后重新编译,体验差距巨大。
2.1.2 安装ARM交叉编译工具链
PX4飞控的芯片大多是ARM Cortex-M或Cortex-R系列,所以我们需要ARM的gcc编译器。官方推荐的是gcc-arm-none-eabi。
sudo apt install -y gcc-arm-none-eabi
装完后验证一下:
arm-none-eabi-gcc --version
你应该能看到类似 arm-none-eabi-gcc (GNU Arm Embedded Toolchain) 10.3-2021.10 这样的输出。如果版本太低,我建议去ARM官网手动下载最新版。我在项目中遇到过因为编译器版本太旧,导致某些C++17特性编译不过的情况。
2.1.3 克隆PX4源码并编译
找个你喜欢的目录,比如 ~/workspace:
cd ~/workspace
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
注意 --recursive 参数,它会一并拉取所有子模块。如果你忘了加,后面编译时会报 Firmware 目录缺失的错误。我曾经因为这个浪费了半小时。
拉完后,先试试编译一个固件看看环境通不通:
make px4_fmu-v5_default
第一次编译会比较慢,大概10-20分钟,取决于你的机器。如果一切顺利,你会看到类似这样的输出:
-- Build files have been written to: /home/user/workspace/PX4-Autopilot/build/px4_fmu-v5_default
[100%] Linking CXX executable px4_fmu-v5_default.elf
2.2 配置VSCode调试环境
我个人更偏爱VSCode,轻量、插件生态好。Eclipse我也用过,但说实话,配置起来太啰嗦了。咱们这里重点讲VSCode。
2.2.1 安装必要插件
打开VSCode,在扩展市场里搜这几个插件,装上:
- C/C++(微软官方)—— 提供代码补全和调试支持
- CMake Tools —— 方便管理CMake构建
- Python —— PX4的一些工具脚本用Python写的
- GitLens —— 看代码历史很方便
2.2.2 配置launch.json
在VSCode中打开PX4源码目录,按 Ctrl+Shift+D 进入调试面板,点击「创建launch.json」。选C++ (GDB/LLDB)。然后把下面这段配置贴进去:
{
"version": "0.2.0",
"configurations": [
{
"name": "PX4 Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/px4_fmu-v5_default/src/firmware/px4_fmu-v5_default.elf",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/arm-none-eabi-gdb",
"setupCommands": [
{
"description": "Enable pretty printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build"
}
]
}
miDebuggerPath 要指向你实际的arm-none-eabi-gdb路径。如果你是用apt安装的,一般就在 /usr/bin/arm-none-eabi-gdb。如果你手动装了别的版本,记得改路径。
2.2.3 配置tasks.json
为了让调试前自动编译,我们还需要一个构建任务。按 Ctrl+Shift+P,搜「Tasks: Configure Task」,选「Create tasks.json file from template」,然后选「Others」。把下面内容贴进去:
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "make px4_fmu-v5_default",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}
]
}
好了,现在你按 F5,VSCode会自动编译固件,然后启动GDB调试。我第一次配通的时候,心里那个爽啊——终于不用在终端和编辑器之间来回切了。
2.3 安装QGroundControl地面站
QGC是PX4最常用的地面站,用来调参、看日志、刷固件。安装其实很简单。
2.3.1 下载并安装
去QGC的GitHub Releases页面下载最新的AppImage文件。或者直接用命令行:
wget https://github.com/mavlink/qgroundcontrol/releases/latest/download/QGroundControl.AppImage
chmod +x QGroundControl.AppImage
./QGroundControl.AppImage
第一次启动时,它会提示你安装一些依赖。按提示装就行。如果你用的是Ubuntu 20.04,可能需要装这个:
sudo apt install libfuse2
.bashrc 里:alias qgc='~/workspace/QGroundControl.AppImage'。这样每次启动只要敲 qgc 就行。
2.3.2 连接飞控
用USB线把飞控连到电脑上。QGC会自动识别串口设备。如果没识别到,点右上角的「齿轮」图标 -> 「Comm Links」,手动添加一个串口连接。波特率一般选115200或921600,具体看你的飞控固件配置。
连接成功后,你会看到飞控的姿态数据在3D视图里实时更新。嗯,看到那个小飞机动起来的时候,还是挺有成就感的。
2.4 本章知识体系总览
下面这张图帮你理清整个开发环境的逻辑关系:
2.5 常见问题与避坑
环境搭建过程中,有几个地方特别容易出问题。我把自己踩过的坑列出来,你遇到了直接对照着看。
| 问题现象 | 原因 | 解决办法 |
|---|---|---|
make 报错找不到 px4_fmu-v5_default |
子模块未拉取完整 | 执行 git submodule update --init --recursive |
编译时提示 Python module not found |
缺少 numpy 或 jinja2 |
pip3 install numpy jinja2 |
| QGC无法识别飞控串口 | 用户不在 dialout 组 |
sudo usermod -a -G dialout $USER 然后注销重登 |
| VSCode调试时GDB连接失败 | miDebuggerPath 路径不对 |
用 which arm-none-eabi-gdb 确认路径 |
make 后面的目标名称对不对。
好了,环境搭好了,下一章咱们就开始写第一个PX4驱动模块。到时候你会看到,代码写起来其实比搭环境还简单。