
如果你玩过无人机大概率听过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 email2.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-v5Pixhawk FMUv5硬件编译烧录到Pixhawk 4等飞控板px4_fmu-v6xPixhawk FMUv6X硬件编译烧录到Pixhawk 6X等飞控板px4_rosROS 2集成仿真配合ROS 2编写复杂算法如果你的开发目标只是验证算法建议优先用SITL仿真烧硬件前再编译固件。没接硬件的情况下强行编译硬件版本会出现链接错误或找不到设备之类的报错别被吓到这只是因为你没接对应的目标板。3.5 编译产物的存放目录编译完成后生成的固件存放在build/目标名/目录下比如build/px4_sitl_default/。具体固件文件根据目标不同有差异硬件固件一般是.px4文件仿真固件会生成可执行的px4文件。调试时如果需要查看具体的固件路径可以用以下命令find build -name *.px4 -o -name px44. 仿真联调实战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模型下载超时CtrlC中断后重新执行多试几次通常会过。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 empy3.3.2注意Python包索引里有个叫empy的库和em模块是两回事安装的时候认准empy3.3.2这个版本。还有jinja2的版本要求也是早年的3.x版本官方脚本配置了就不会错手动安装时别乱装最新版。报错三子模块拉取不完整这个前面提过执行git submodule update --init --recursive反复执行就好。如果卡在某个子模块很长时间可以检查网络连接或者直接用git的-c http.lowSpeedLimit参数调整传输超时阈值git -c http.lowSpeedLimit1000 -c http.lowSpeedTime999 submodule update --init --recursive实测这种配置能把超时限制放宽很多防止子模块中途失败。5.2 Gazebo相关的疑难杂症问题一Gazebo窗口打开后黑屏或卡死这种大概率是显卡驱动问题Ubuntu 22.04如果用的Intel核显一般没有太多问题如果用的Nvidia独显且没有装好驱动Gazebo的渲染很容易出问题。实践中最快的排查方法是检查系统设置里是否有正确的显卡驱动或者临时改用软件渲染export LIBGL_ALWAYS_SOFTWARE1这条命令强制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 SITLQGC没有及时监听动态端口导致连接失败。解决方法是先启动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二次开发和无人机算法验证就会顺畅非常多。