1. ArduPilot 与 PX4 概述:开源飞控双雄的江湖地位、历史渊源与核心设计哲学对比
做无人机系统选型,你迟早会撞上这两个名字:ArduPilot 和 PX4。圈子里有人叫它们「红蓝双雄」,也有人戏称「AP 党」和「PX4 党」。我入行那会儿,两边社区还经常在论坛上吵得不可开交——现在倒是理性多了,大家更关心哪个更适合自己的项目。
说白了,这两套飞控几乎撑起了整个开源无人机生态。从四轴航拍机到固定翼测绘机,从无人船到水下潜航器,你看到的绝大多数开源飞控方案,底层要么是 ArduPilot,要么是 PX4。那它们到底有什么区别?历史包袱是什么?设计哲学为什么截然不同?
这一章,我们先从根上把这两个东西讲透。
1.1 江湖地位:谁在用,用在哪
先看一组我整理的数据(截至 2025 年初):
| 维度 | ArduPilot | PX4 |
|---|---|---|
| 诞生年份 | 2009(前身 APM 2007) | 2012(从 PIXHAWK 项目独立) |
| 主要语言 | C++(ArduPilot 库) | C++(PX4 Firmware) |
| 实时操作系统 | 无(裸机调度 / ChibiOS) | NuttX RTOS |
| 硬件支持 | Pixhawk 全系 + 大量第三方板 | Pixhawk 标准 + 少数定制板 |
| 典型用户 | DIY 玩家、农业植保、测绘 | 科研机构、企业级产品、竞速 |
| 社区规模 | 大而杂(论坛 + Discord) | 小而精(GitHub + Slack) |
你可能会问:为什么 ArduPilot 用户更杂?其实跟它的历史有关。ArduPilot 最早是从 Arduino 社区长出来的,门槛低,谁都能上手改。PX4 则带着浓厚的学术基因,最早是苏黎世联邦理工学院(ETH Zurich)的实验室项目。嗯,一个草根,一个学院派——这个基因从一开始就注定了它们的设计走向。
我的经验:如果你做消费级产品或快速原型验证,ArduPilot 的生态会让你省很多事。但如果你需要严格的实时性保证、或者要做多传感器融合的科研验证,PX4 的 NuttX 架构更靠谱。我在 2018 年帮一家农业公司选型时,就因为 PX4 的 uORB 消息机制更清晰,最终选了 PX4——后来证明这个决定是对的,他们的多传感器冗余逻辑在 PX4 上实现起来比 ArduPilot 顺手得多。
1.2 历史渊源:两条不同的进化路径
要理解这两个飞控,得先看看它们是怎么长成今天这样的。
ArduPilot:从 Arduino 走出来的「老大哥」
2007 年,有个叫 Jordi Muñoz 的墨西哥小伙,在 DIY Drones 论坛上发了个帖子——用 Arduino 做了一个能自动飞行的固定翼控制器。后来 Chris Anderson(《连线》前主编)看到了这个项目,两人一拍即合,成立了 3D Robotics 公司。ArduPilot 这个名字,就是 Arduino + Autopilot 的合体。
早期 ArduPilot 跑在 8 位 Arduino 板上,代码量小,功能也简单。后来移植到 32 位 STM32 平台,逐渐演变成今天的 ArduPilot 库。我 2014 年第一次接触它时,还在用 APM 2.6 板子,8 位处理器,跑个四轴悬停都颤颤巍巍的。现在回头看,真是感慨。
ArduPilot 的核心哲学是:功能全面,配置灵活,兼容性强。它支持超过 20 种载具类型——四轴、六轴、固定翼、直升机、无人车、无人船、潜水器……你几乎找不到它不支持的平台。代价是什么?代码量大,模块耦合度高,新手容易在几百个参数里迷失方向。
PX4:从学术实验室走出来的「技术派」
PX4 的故事从 2012 年开始。ETH Zurich 的自动控制实验室(若当时)启动了一个叫 PIXHAWK 的项目,目标是做一个「开放、模块化、高性能」的飞控软硬件平台。硬件部分后来演变成了 Pixhawk 标准(现在由 Holybro 等厂商维护),软件部分就是 PX4。
PX4 从一开始就选择了 NuttX 实时操作系统。为什么?因为实验室需要严格的实时性——传感器数据必须在确定时间内被处理,不能有毫秒级的抖动。这个选择让 PX4 在实时性上天然优于 ArduPilot(后者早期是裸机轮询,后来才引入 ChibiOS)。
PX4 的核心哲学是:模块化、实时性、可验证。它的代码结构更像一个「微内核」——核心调度器 + 独立模块,模块之间通过 uORB 消息总线通信。这种架构的好处是:每个模块可以独立开发、独立测试、独立替换。坏处是:学习曲线陡,新手连编译环境都要折腾半天。
避坑指南:我曾经帮一个学生团队做毕设,他们选了 PX4,结果前两周全在搭环境、配工具链、理解 uORB 消息结构。后来我建议他们先用 ArduPilot 做原型验证,等算法成熟了再移植到 PX4——两周就搞定了原型。选型时一定要考虑团队的技术储备和时间成本。
1.3 核心设计哲学对比:两种思维模式的碰撞
下面这张 SVG 图,是我自己画的 ArduPilot 与 PX4 架构对比。你看完就能明白,为什么我说它们是「两种思维模式」。
你看这张图,左边 ArduPilot 的架构像一栋「大平层」——所有功能都在一个库里面,通过参数系统来切换。右边 PX4 更像「公寓楼」——每个模块独立运行,通过 uORB 消息总线互相通信。
这两种架构没有绝对的好坏,只有适不适合。我个人的经验是:
- 如果你需要快速出活,比如给客户演示一个农业植保方案,ArduPilot 的「开箱即用」体验更好。参数调一调,飞控板插上,半小时就能起飞。
- 如果你需要深度定制,比如替换某个传感器驱动、或者加入自己的控制算法,PX4 的模块化架构会让你少掉很多头发。每个模块可以单独编译、单独测试,不会牵一发动全身。
注意:不要被「开源」两个字迷惑了。开源不等于免费,也不等于简单。ArduPilot 和 PX4 的学习曲线都很陡,只是陡的方向不同。ArduPilot 的陡在「参数迷宫」,PX4 的陡在「架构理解」。我见过太多人因为选错方向,浪费了几个月时间。
1.4 核心差异速查表
最后,我整理了一个速查表。你可以把它截图存着,以后选型时拿出来对照。
| 对比维度 | ArduPilot | PX4 |
|---|---|---|
| 调度方式 | 主循环轮询 + 协程 | NuttX 实时线程 |
| 模块间通信 | 全局变量 + 回调 | uORB 消息总线 |
| 硬件抽象 | AP_HAL 层(统一接口) | 模块级驱动(独立进程) |
| 参数系统 | AP_Param(树形结构) | param(扁平键值对) |
| 载具类型 | 20+ 种(编译时选择) | 10+ 种(运行时选择) |
| 仿真支持 | SITL(原生) | Gazebo / jMAVSim |
| 日志系统 | DataFlash(二进制) | ULog(二进制) |
| MAVLink 实现 | GCS_MAVLink(多链路) | mavlink(单链路为主) |
嗯,这张表里有个细节值得注意:ArduPilot 的载具类型是在编译时确定的,也就是说你编译 Copter 固件,它就只能当四轴用。PX4 可以在运行时通过参数切换载具类型——当然,实际项目中很少有人这么干,但架构上确实更灵活。