如果你玩过无人机,大概率听过PX4这个名字。这是一个开源的飞行控制器软件栈,从姿态估计、位置控制到任务规划全都有,配合QGroundControl地面站和Gazebo仿真器,基本就是一套完整的无人机开发平台。但这套东西的搭建过程,说实话,对新手并不友好,资深的开发者换台电脑重新配环境也经常要折腾半天。尤其是Ubuntu 22.04发布之后,Python版本、编译器链、依赖库的坑一个接一个,网上教程大多还停留在20.04时代,照着敲完一堆报错,很容易让人心态崩掉,所以才有了“PX4从放弃到精通”这个梗。
这篇文章我就用Ubuntu 22.04 LTS作为基础系统,从零开始把PX4开发环境完整搭建一遍,包含固件源码拉取、编译工具链安装、Gazebo仿真联调、QGroundControl地面站连接这几个核心环节。我会把每一步背后的原理说清楚,为什么用这个工具、为什么这样配置,以及遇到报错怎么排查,不光是给一串命令让读者复制粘贴。无论你是刚接触嵌入式开发的在校学生,还是想转行无人机/机器人行业的工程师,只要能耐住性子把这套环境跑通,后面PX4的二次开发、算法验证基本就能顺畅进行了。
1. 开发方案选型:为什么是22.04、Gazebo和源码编译
1.1 PX4版本选择:Main分支还是稳定版
PX4的代码更新非常快,主线(main分支)几乎每天都在合并新的PR,今天能编译通过的代码,可能下周就会因为某个依赖变更而出问题。对于开发环境搭建来说,我强烈建议直接拉取稳定发布版本,而不是最新的main分支。
从PX4 v1.13开始,官方对Ubuntu 22.04的支持就非常成熟了,v1.14和v1.15版本更是把编译脚本和依赖处理做了大量优化。实测下来,v1.14.3在22.04上编译整体比较顺畅,遇到问题也容易找到解决方案。不过要注意的是,PX4的版本号演进很快,如果你看到这篇文章的时候已经出了更新的大版本,优先看官方文档推荐的支持组合。
具体操作时,拉取代码之后记得用git checkout切换到对应的发布标签,比如v1.14.3,避免误用默认分支导致后续编译问题。
1.2 Ubuntu 22.04的系统要求
PX4编译对硬件有一定要求,先说结论:8GB内存是底线,16GB才能跑得舒服,磁盘剩余空间至少要有30GB以上。处理器方面,4核起步,8核以上编译速度会明显快很多。如果你只有4GB内存,建议先加内存条再折腾PX4,否则编译过程中内存不足导致编译器被杀进程,排查起来非常痛苦。
我自己的主力开发机是i7-12700H + 32GB内存 + 512GB NVMe固态,从拉取源码到编译出第一个固件包,全套流程大概需要40分钟左右。如果你用老旧的4核笔记本,时间可能会翻倍到两个小时,要有心理准备。
操作系统建议直接安装Ubuntu 22.04 LTS桌面版,不要用服务器版。PX4开发过程中经常需要打开Gazebo仿真器看3D画面,没有图形界面会非常难受。如果你非要折腾WSL2,我只能说社区里确实有人成功了,但USB设备转发、图形显示这些额外的坑太多了,新手不建议走这条路。
1.3 仿真器选择:Gazebo是首选
PX4官方支持的仿真工具有Gazebo、jMAVSim、AirSim等,其中Gazebo是社区最活跃、资料最多、功能最全的选择。jMAVSim更轻量,启动速度快,但只支持多旋翼模型,而且现版本的维护力度不如Gazebo。AirSim偏重高保真视觉仿真,配置复杂,主要给视觉SLAM研究用。
所以这篇文章选用经典的Gazebo,具体来说是Gazebo Classic版本。很多新手分不清Gazebo Classic和新的Ignition Gazebo(现在叫Gazebo),这个后面讲到安装时我会专门说清楚,这里只需要记住:PX4官方对Gazebo Classic支持稳定,这就是我们选择的理由。
2. 基础环境配置:换源、装依赖、调工具链
2.1 系统换源与基础软件安装
Ubuntu 22.04安装完成后,第一步建议换成国内镜像源。因为PX4依赖的软件包量非常大,从官方源下载速度可能只有几十KB每秒,换成清华或者阿里云的镜像源后直接跑满带宽,这一步能节省大量等待时间。操作很简单,备份/etc/apt/sources.list,然后用镜像站提供的新内容替换,执行sudo apt update即可。
接下来安装一些基础工具,包括git、curl、vim、net-tools这些。其中git是最关键的,拉取PX4源码、切换分支全靠它,建议顺手把git的默认分支名设为main,提交时配置好用户名和邮箱,避免后续某些脚本因为git配置不完整而报错。
sudo apt update sudo apt install -y git curl vim net-tools git config --global init.defaultBranch main git config --global user.name "your name" git config --global user.email "your email"2.2 Python环境与pip镜像配置
PX4的构建脚本大量依赖Python,而且对Python版本有要求。Ubuntu 22.04默认自带Python 3.10,满足PX4的要求,不需要额外安装新旧版本。但要注意系统默认的Python命令可能指向Python 2,务必确认一下:
python3 --versionPX4编译过程中需要安装一些Python包,比如empy、jinja2、pyros-genmsg等,这些包在官方脚本里会自动装。国内网络环境下pip下载速度同样感人,提前配置好pip镜像源是个好习惯。创建~/.pip/pip.conf文件,写入清华或者阿里云的镜像地址,后面编译流程会省心很多。
提示:不要把pip镜像配置和系统的软件镜像搞混,这是两个独立的东西,配置方法也不一样。
2.3 编译工具链:gcc-arm-none-eabi的版本陷阱
PX4支持的板载处理器大多是ARM架构,比如高通骁龙Flight、STM32系列、NuttX内核,这些固件需要ARM交叉编译工具链生成目标平台可执行文件。Ubuntu官方源里虽然也有gcc-arm-none-eabi,但版本比较老,而PX4对不同版本有严格要求。
这里我强烈推荐直接使用PX4官方脚本PX4-Autopilot/Tools/setup/ubuntu.sh自动安装工具链,脚本里面会检测系统版本,自动处理依赖和工具链版本。手动装的时候,我发现官方的arm-none-eabi版本列表里,如果选择过新或过旧的版本,编译时都会报莫名其妙的错误,比如找不到某些编译内建函数,或者链接时出现特定的二进制格式错误。
如果你决定手动安装,可以在ARM官方站点下载gcc-arm-none-eabi-9-2019-q4-major版本,解压后把bin目录加入PATH。但说实话,手动配环境变量这件事在大学课程里还可以,实际开发时纯粹浪费时间,直接用官方脚本是性价比最高的选择。
3. PX4固件源码获取与编译——从拉取到第一个固件包
3.1 源码拉取与子模块初始化
PX4的代码托管在GitHub上,仓库地址是https://github.com/PX4/PX4-Autopilot.git,目录体积比较大,加上子模块的话总大小可能有数GB。这里必须要说一句:国内网络环境下,直接clone这个仓库非常容易失败,很多人的搭建流程就卡在这一步。
解决办法是使用国内加速地址。我实测有效的方式是在原仓库地址前加gitclone.com这个加速前缀,例如:
git clone https://gitclone.com/github.com/PX4/PX4-Autopilot.git如果加速地址失效,也可以用中科大、清华等镜像源,以及码云(Gitee)上的同步仓库,具体需要自行搜索可用镜像。拉取完成后进入PX4-Autopilot目录,执行子模块初始化:
cd PX4-Autopilot git submodule update --init --recursive这一步是拉取PX4依赖的第三方库,包括DroneCore、MavLink、NuttX等,总数据量非常大。国内网络下子模块经常拉不完整,如果中途报错,可以反复执行上面的命令,直到完全成功为止。我见过最惨的情况是重复执行十几次才拉全,这时候别怀疑自己操作有问题,是网络太不稳定。
3.2 执行官方配置脚本
PX4官方为Ubuntu/Debian系统准备了自动配置脚本,路径是PX4-Autopilot/Tools/setup/ubuntu.sh。这个脚本会检查并安装构建PX4所需的全部依赖,包括不限于:
- CMake、Ninja等构建工具
- Python相关解析库
- 交叉编译工具链
- rosserial、ROS(按需安装)
- Gazebo仿真器
- QGroundControl地面站
执行脚本前,建议先把系统的包管理器操作完,确保apt update执行过,否则脚本中途可能因为某些包无法定位而中断:
cd PX4-Autopilot bash ./Tools/setup/ubuntu.sh脚本运行期间会输出大量信息,包括正在安装的软件包和下载进度。整个过程大约需要20到40分钟,取决于网速。执行完成后,脚本会提示需要重启终端或注销重新登录,这是为了让PATH环境变量生效。
注意:ubuntu.sh脚本执行时,最好不要使用root用户,部分步骤涉及图形界面组件安装和用户权限设置,用普通用户加sudo的方式更稳妥。
3.3 编译第一个固件
环境配置完成、依赖安装结束后,就可以尝试编译固件了。PX4支持很多编译目标,不同目标对应不同硬件平台或仿真模式。先来一个最容易验证的仿真目标,这个目标会把固件编译成Linux环境下可执行的仿真版:
cd PX4-Autopilot make px4_sitl gazebo-classic第一次编译会下载NuttX工具链、编译很多底层库,耗时非常长。CPU性能差的机器可能要一个多小时,性能好点的也要20分钟以上。编译过程中终端会滚动大量编译日志,看到[100%]字样并且没有报错,说明编译成功。
编译完成后,会弹出Gazebo Classic窗口并加载一个多旋翼模型,同时终端出现pxh>命令行交互界面,这就代表PX4 SITL仿真环境已经跑起来了。
3.4 编译目标选择与场景介绍
PX4的编译目标格式是make <目标平台>_<工具链>,常见的目标平台包括:
| 编译目标 | 平台 | 适用场景 |
|---|---|---|
| px4_sitl | 软件在环仿真 | 无硬件环境下验证控制算法、跑仿真 |
| px4_fmu-v5 | Pixhawk FMUv5硬件 | 编译烧录到Pixhawk 4等飞控板 |
| px4_fmu-v6x | Pixhawk FMUv6X硬件 | 编译烧录到Pixhawk 6X等飞控板 |
| px4_ros | ROS 2集成仿真 | 配合ROS 2编写复杂算法 |
如果你的开发目标只是验证算法,建议优先用SITL仿真,烧硬件前再编译固件。没接硬件的情况下强行编译硬件版本会出现链接错误或找不到设备之类的报错,别被吓到,这只是因为你没接对应的目标板。
3.5 编译产物的存放目录
编译完成后,生成的固件存放在build/<目标名>/目录下,比如build/px4_sitl_default/。具体固件文件根据目标不同有差异,硬件固件一般是.px4文件,仿真固件会生成可执行的px4文件。调试时如果需要查看具体的固件路径,可以用以下命令:
find build -name "*.px4" -o -name "px4"4. 仿真联调实战:Gazebo、QGroundControl与MAVLink通信
4.1 启动PX4 SITL仿真
重新打开一个终端,进入PX4-Autopilot目录,运行:
make px4_sitl gazebo-classic首次运行会再次检查依赖并启动Gazebo窗口,加载默认的IRIS多旋翼模型。你会看到终端里出现pxh>提示符,这就是PX4 Shell。Gazebo窗口显示一个无人机模型,默认放置在原点附近。
此过程中Gazebo可能需要下载一些模型文件,如果网络不好会卡在加载界面,这也是国内用户很常见的问题。解决方法是提前手动下载Gazebo模型库放到~/.gazebo/models目录下,具体模型清单和下载方式,网上有大量现成教程可以参考。
如果一直卡在[INFO] [gazebo] waiting for gazebo to initialize这种提示,说明Gazebo模型下载超时,Ctrl+C中断后重新执行,多试几次通常会过。
4.2 QGroundControl地面站的安装与连接
QGroundControl(简称QGC)是PX4的官方地面站,可视化显示飞行状态、实时调整参数、规划航线全部靠它。下载地址在QGC官网,选择Ubuntu 22.04对应的版本。
下载完成后,需要先给安装文件加可执行权限:
chmod +x ./QGroundControl.AppImage ./QGroundControl.AppImage首次启动QGC会弹出是否添加串口权限的提示,按指示把当前用户加入dialout组,重新登录后就能识别PX4的串口设备。
在SITL仿真模式下打开QGC,它自动通过UDP协议连接本地的仿真飞行器,无需额外配置。如果没连上,检查QGC的通信协议设置,确保通信方式选择UDP,端口设置为14550,这是PX4 SITL默认的MAVLink通信端口。
QGC连接成功后,能看到无人机的位置、姿态、电池电量等模拟信息,还可以在地图上规划航线,下发起飞指令,验证PX4的自主飞行能力。
4.3 MAVLink消息机制与常用调试命令
PX4与地面站、外部设备之间的通信协议是MAVLink,这是一种轻量级的消息传输协议,定义了消息在发送和接收时如何打包、校验、解析。在SITL模式下,PX4通过UDP发送MAVLink数据包到本地端口,QGC监听这些端口并解析数据,实现状态显示和控制指令下发。
在pxh>终端里可以执行一些常用命令来检查系统状态:
pxh> commander status # 查看飞行模式状态 pxh> param show sys_autostart # 查看自动启动配置 pxh> listener vehicle_attitude # 实时监听飞行姿态消息listener是非常有用的调试命令,可以订阅任意MAVLink主题并打印消息内容,排查看数据是否正常发布时经常用它。
4.4 在仿真环境中起飞与降落
在pxh>终端输入commander takeoff命令,可以让仿真无人机原地起飞到默认高度。起飞前确保Gazebo里无人机周围没有障碍物,默认环境没有太多模型,起飞一般都很顺利。
pxh> commander takeoff想要降落就执行commander land,无人机会自动下降并在地面停住。仿真环境下使用遥控器摇杆或者QGC虚拟摇杆也是可行的,但需要先配置摇杆校准,新手不熟悉的话可以先从命令行入手,逻辑更直接。
5. 常见问题排查与避坑心得
5.1 编译阶段的经典报错
报错一:arm-none-eabi-gcc版本不兼容
这种现象表现为编译刚开始就爆出一堆警告然后中断,提示找不到arm-none-eabi-gcc或者编译器版本不识别。解决方法是重新运行官方脚本ubuntu.sh,它会安装指定版本的编译器。特别注意,如果系统里手动安装过其他版本的arm编译器,要检查~/.bashrc里的PATH配置,避开版本冲突。
报错二:python empy模块缺失
编译过程中出现ModuleNotFoundError: No module named 'em'这个报错,说明Python的empy模板引擎没有安装。执行:
pip3 install --user empy==3.3.2注意Python包索引里有个叫empy的库,和em模块是两回事,安装的时候认准empy==3.3.2这个版本。还有jinja2的版本要求也是早年的3.x版本,官方脚本配置了就不会错,手动安装时别乱装最新版。
报错三:子模块拉取不完整
这个前面提过,执行git submodule update --init --recursive反复执行就好。如果卡在某个子模块很长时间,可以检查网络连接,或者直接用git的-c http.lowSpeedLimit参数调整传输超时阈值:
git -c http.lowSpeedLimit=1000 -c http.lowSpeedTime=999 submodule update --init --recursive实测这种配置能把超时限制放宽很多,防止子模块中途失败。
5.2 Gazebo相关的疑难杂症
问题一:Gazebo窗口打开后黑屏或卡死
这种大概率是显卡驱动问题,Ubuntu 22.04如果用的Intel核显,一般没有太多问题;如果用的Nvidia独显且没有装好驱动,Gazebo的渲染很容易出问题。实践中最快的排查方法是检查系统设置里是否有正确的显卡驱动,或者临时改用软件渲染:
export LIBGL_ALWAYS_SOFTWARE=1这条命令强制OpenGL使用软件渲染,牺牲一些画质但能保证Gazebo正常显示,临时调试完全够用。
问题二:Gazebo模型加载慢,卡在下载模型
这是国内网络环境的经典问题。Gazebo启动时会尝试从模型库下载所有默认模型,如果你的网络连接不稳定,全程可能卡很久。最有效的解决办法是手动下载gazebo模型库并放到本地:
git clone https://github.com/osrf/gazebo_models.git ~/.gazebo/models下载完成后,Gazebo启动时直接从本地加载模型,速度大大提升。
5.3 硬件控制QGC时连不上仿真
这个问题的原因通常是QGC启动顺序和PX4启动顺序不一致,或者UDP端口被占用。典型场景是先启动QGC,再启动PX4 SITL,QGC没有及时监听动态端口导致连接失败。解决方法是先启动PX4 SITL,等pxh>终端出现后,再启动QGC,基本上能自动连接。
如果还是连不上,查看QGC的通信设置,把UDP包监听端口改为14550,关闭防火墙对UDP端口的拦截:
sudo ufw disable防火墙是仿真联调时一个常常被忽略的大坑,Ubuntu默认没有启用,但如果你之前手动配置过防火墙规则,可能会挡住MAVLink的UDP数据包。
6. 开发环境后续扩展:从仿真到真机与外部生态
PX4开发环境搭建成功的标志不是Gazebo窗口弹出来那一下,而是你能在这套环境里持续做开发和验证,把仿真中得到的算法、参数迁移到真实硬件上跑起来。
真机开发时,编译目标从px4_sitl换成对应的硬件平台,比如Pixhawk系列用px4_fmu-v5或px4_fmu-v6x,编译完成后用QGC或者px4_uploader.py脚本烧录固件。烧录前把USB线连接好,按住飞控上的Bootloader按钮,再执行烧录命令,这一套流程熟练之后,从编译到上电跑起来其实就几分钟的事。
PX4与ROS 2的集成也是接下来几乎必然会碰到的一条路。ROS 2提供节点通信、Topic发布订阅、TF坐标变换等机制,是开发机载感知、路径规划、集群控制等复杂功能的基础。PX4官方提供了px4_ros_com这个包,配合micro-ROS或者px4_ros的中间件就能实现PX4与ROS 2的完整桥接。在Ubuntu 22.04上安装ROS 2 Humble或新版滚动版本时,要先确认版本与PX4的兼容关系,不然编译新包时又会出现一堆依赖报错。
嵌入式Linux方向也值得顺带提一句。PX4代码里有些东西不依赖飞控硬件概念,在Linux宿主上也有对应实现,比如用罗技手柄做体感控制、利用树莓派等Linux板卡跑PX4的Linux版本。这些玩法需要写设备树配置,裁剪系统镜像,工作量和本篇环境搭建不是一个量级,但在仿真环境跑通之后,再往这些方向深入会轻松不少。
最后再说一个我踩过很多次坑的经验:环境搭建过程中,遇到问题先冷静分析日志,再决定怎么修改,不要盲目重装系统或者反复clone仓库。PX4的编译工具链、依赖版本非常多,链路上任何一个环节不对都会出问题,但绝大多数报错在GitHub Issues和PX4官方社区里都能找到答案。把报错信息复制到搜索框,加上你的Ubuntu版本号,通常会有别人遇到过相同情况并给出了解决办法。这套环境搭好之后,后续的PX4二次开发和无人机算法验证就会顺畅非常多。