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 vs PX4 核心架构对比 ArduPilot 架构 主循环调度器(Scheduler) 载具类型库(Copter / Plane / Rover...) AP_HAL 硬件抽象层 传感器驱动(内联在库中) 参数系统(AP_Param) 特点:大而全,紧耦合,参数驱动 调度方式:裸机轮询 + ChibiOS 线程 PX4 架构 NuttX RTOS 内核 uORB 消息总线(模块间通信) 独立模块(传感器/导航/控制) 模块化驱动(独立进程) 参数系统(param) 特点:模块化,松耦合,消息驱动 调度方式:NuttX 实时线程 左侧:紧耦合,参数驱动,适合快速配置;右侧:松耦合,消息驱动,适合模块化开发

你看这张图,左边 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 可以在运行时通过参数切换载具类型——当然,实际项目中很少有人这么干,但架构上确实更灵活。