一、ArduPilot概述:从航模爱好者的代码到全球最大开源自动驾驶平台

大家好,我是你们这趟ArduPilot源码之旅的向导。先说说我自己吧——我接触ArduPilot大概有七八年了,从最早的APM 2.0板子开始玩,后来给无人机公司做过飞控移植,也给农业无人车改过导航逻辑。说实话,这项目陪我熬过不少夜,也踩过不少坑。

今天咱们聊第一章:ArduPilot到底是什么?它从哪来,要往哪去?

1.1 项目起源:一个叫DIY Drones的社区

ArduPilot的故事,得从2007年说起。

那时候无人机还没现在这么火,航模圈子里玩得最多的是固定翼。有个叫Chris Anderson的哥们——对,就是后来《长尾理论》的作者——他创立了一个叫DIY Drones的网站。初衷很简单:让普通人也能造出能飞的自动驾驶飞机。

当时市面上没有开源飞控,所有代码都是闭源的。你想改个参数?没门。你想加个功能?自己从头写吧。

Chris团队基于Arduino平台,搞出了第一版ArduPilot。嗯,你没看错,最早它就是个Arduino扩展板。代码量大概几千行,功能也就够让一架固定翼飞个简单的航点。

我记得我第一次看到那段代码时,心里想的是:「就这?这也太简陋了吧。」但正是这个「简陋」的东西,开启了整个开源自动驾驶生态。

核心转折点:2010年,ArduPilot项目正式从DIY Drones独立出来,成为Github上的一个开源项目。同年,3DRobotics公司成立,开始商业化支持ArduPilot硬件。

1.2 发展历程:从APM到PX4再到独立分支

ArduPilot的发展,我习惯分成三个阶段:

阶段 时间 关键事件
萌芽期 2007-2010 基于Arduino,支持固定翼
成长期 2011-2015 APM 2.x硬件,支持多旋翼、无人车
成熟期 2016-至今 Pixhawk硬件,支持无人船、水下航行器

这里有个小插曲。2014年左右,PX4项目从ArduPilot分叉出去,成了另一个独立飞控。当时社区里吵得很凶,有人说ArduPilot要死了。结果呢?ArduPilot不仅没死,反而越活越壮。为什么?

我个人觉得,核心原因是ArduPilot的代码设计更「接地气」。它不像PX4那样追求极致的实时操作系统抽象,而是直接基于裸机调度。你想想看,对于大多数开发者来说,裸机调度比RTOS好理解多了。这也是ArduPilot社区能吸引那么多贡献者的原因之一。

1.3 核心特点:为什么选ArduPilot?

这些年我用过不少飞控,闭源的、开源的都有。但最终让我死心塌地跟着ArduPilot走的,是这几个特点:

  • 全平台支持:一套代码,跑在无人机、无人车、无人船、水下航行器上。你不需要为不同平台重写逻辑。
  • 硬件无关性:从STM32F1到F7,从NuttX到ChibiOS,ArduPilot都能跑。我曾在项目里把飞控从F4芯片换到F7,代码几乎没改。
  • 丰富的传感器支持:GPS、IMU、激光雷达、光流、超声波……你能想到的传感器,它基本都支持。
  • 成熟的MAVLink协议:地面站、机载计算机、遥控器之间的通信,全靠这个协议。它比ROS的通信机制轻量得多。
  • 活跃的社区:Github上400+贡献者,每天都有PR合并。遇到问题去论坛问,基本当天有人回。

避坑指南:我曾经在选型时纠结过ArduPilot和PX4。最后选了ArduPilot,原因很简单:我需要支持无人车和无人船,而PX4当时对这两块的支持还很弱。如果你只做无人机,两个都可以;但如果你要做多平台,ArduPilot是更稳妥的选择。

1.4 主要应用领域:不止是无人机

很多人一听到ArduPilot,第一反应就是「无人机飞控」。其实它的应用范围远不止于此。

我简单列几个我亲眼见过的场景:

  • 农业无人机:喷洒农药、测绘农田。ArduPilot的航点规划和地形跟随功能,在这块特别好用。
  • 无人车:物流配送、巡检机器人。ArduPilot的轮式车辆支持,从差速转向到阿克曼转向,全都有。
  • 无人船:水质监测、海洋测绘。我有个朋友用ArduPilot改了一艘无人船,在太湖上跑了半年,没出过问题。
  • 水下航行器:ROV、AUV。虽然这块支持还在完善中,但已经有人用它做水下考古了。
  • 固定翼/VTOL:长航时侦察、物流配送。ArduPilot的固定翼支持,可以说是所有开源飞控里最成熟的。

说白了,只要你能想到的自动驾驶场景,ArduPilot基本都能覆盖。这也是它最大的魅力所在。

1.5 知识体系总览:一张图看懂ArduPilot

下面这张图,是我自己画的ArduPilot知识体系结构。你把它当作整个课程的地图就行。

ArduPilot 知识体系总览 ArduPilot 核心 硬件抽象层 (HAL) 核心库 (AP_*) 应用层 (Vehicle) STM32/NuttX ChibiOS/FreeRTOS AP_InertialSensor AP_GPS / AP_Baro ArduCopter ArduPlane ArduRover ArduSub 三层架构:硬件抽象 → 核心库 → 应用层,各层之间通过API解耦

这张图里,从上到下是三层架构。最上层是应用层,也就是你最终看到的ArduCopter、ArduPlane这些。中间是核心库,所有传感器驱动、导航算法都在这里。最下面是硬件抽象层,负责屏蔽不同芯片和操作系统的差异。

你想想看,这种设计的好处是什么?

说白了,就是「一次编写,到处运行」。你写一个AP_InertialSensor的驱动,只要遵循HAL接口,就能在STM32、NuttX、ChibiOS上无缝切换。我在做项目移植时,经常只需要改HAL层的几行代码,整个飞控就能跑在新硬件上。

注意:虽然ArduPilot的硬件抽象做得很好,但不同平台的性能差异还是存在的。比如在低端芯片上跑ArduCopter,你可能需要关掉一些不必要的功能模块。我曾在F1芯片上跑过完整版ArduCopter,结果CPU占用率直接飙到95%——嗯,那是个教训。

1.6 本章小结

好了,第一章的内容就到这里。我们聊了ArduPilot的起源、发展、特点和应用领域。核心就一句话:ArduPilot是一个全平台、硬件无关、社区活跃的开源自动驾驶框架。

下一章,我们会深入源码,看看ArduPilot的目录结构是怎么组织的。到时候我会带着你,一行一行地看代码——别怕,我会用最通俗的方式讲给你听。


专注资料整理