玩无人机的对ArduPilot应该都熟。植保机、巡检机、测绘机,很多背后跑的就是这套开源GPLv3固件。前些年国内做无人机的公司多,主要原因就是国外开源了ArduPilot。

我截图时这个仓库1.6万颗星,2013年建仓,这算是GitHub上资历最老的一批开源飞控。
其实它的出生比2013年开始开源要早得多,故事要从任天堂说起。2007年前后,Wired主编Chris Anderson搞了个DIY Drones论坛,自己先动手,把Wii的Nunchuk体感手柄拆了,里面的加速度计接上单片机,给遥控直升机做了台自驾仪。
同期墨西哥一个还在等绿卡的小伙子Jordi Munoz,也用Wii手柄里的传感器加Arduino做了套自驾程序,视频发到了论坛上。
我第一次翻到这段史料的时候还有点惊讶,飞控祖师爷的起点,居然是游戏手柄里拆出来的传感器。
两个人就这么认识了,2009年合伙成立了3D Robotics。同年ArduPilot 1.0发布,一块自驾板卖24.95美元。

直到现在,这个ArduPilot仓库里分了ArduCopter、ArduPlane、Rover、ArduSub、ArduTracker、Blimp。天上飞的多旋翼、固定翼、直升机,地上跑的车,水里游的船和ROV,连飞艇都有专门的固件。

那个年代DIY无人机就是这种画风,纯纯手工搭建的。跑ArduPilot的飞控板正在天上飞,机架上那点自驾板,就是当年那块24.95美元的板子的后代。

水下也照跑不误,这台开源ROV装的就是ArduSub,同一套代码换个载具继续用。硬件支持才是它最离谱的地方,官方列出362种板子定义。
从一百多块的F405板到工业级的Cube,同一套固件刷进去就能用。这背后是2011到2012年间打好的硬件抽象层,把底层差异全隔开了。
当时参与的人里有个名字值得单说:Andrew Tridgell,写rsync和Samba的那位,网络文件系统的祖师爷,跑来给飞控做自动化测试。
ArduPilot飞控的灵魂是EKF3,一个24个状态量的扩展卡尔曼滤波。这个东西是相当牛逼啊!说白了就是针对好几个测量结果,谁也不全信:陀螺说转了多少度,加速度计说往哪边倾,GPS说飞到哪了,气压计说爬了多高,咱不全信。而是采用EKF把这几路互相打架的数据揉成一个最可信的答案,说白了就是通过预测来逐渐接近最可能的答案。

我之前拆过大疆的飞控板,硬件上看料堆得很足,但是算法那层是更牛的,但是咱们看不到()。ArduPilot恰恰相反,支持几乎所有的板子,算法全部开源你都可以看到所有代码。
2025年6月出了件让ArduPilot社区难受的事。乌克兰蛛网行动,117架运行着ArduPilot飞控固件的无人机袭击了俄军机场。社区的行为准则明确反对武器化,但是GPL甚至连抄袭都管不住,怎么可能管的住用途呢?
那代码全开源,飞控厂靠什么活?靠卖板子和整机。飞控软件本身从来不是护城河。3DR后来败给了大疆,公司转型,但是ArduPilot活得好好的,社区自治到现在还在周更。护城河是十几年的飞行数据积累,这个抄不走。
那这套代码内部到底长什么样?我把仓库翻了个底朝天,一层一层拆给你看。

先看顶层目录,结构意外地清爽:六个载具各占一个文件夹,隔壁一个libraries塞着全部共享代码。

真正牛逼的东西都在libraries这个目录下。什么PID控制、自稳控制、AHRS、摄像头、HAL,以及大名鼎鼎的EKF2和EKF3等等各种具体的功能模块都是在这里实现的,这是一个巨大的宝库。你做很多项目都可以来参考这一套代码的。
其中AP_开头是基础组件:AP_InertialSensor管IMU,AP_GPS管定位,AP_Baro管气压,AP_BattMonitor管电池。
AC_开头是Copter专用控制:AC_AttitudeControl管姿态,AC_WPNav管航点,AC_PID是全项目共用的标准PID库。
AC_AutoTune你大概听过,自动整定PID就出自这里。

官方autotune示意图:调参时机体可能突然转个90度,离目标点漂5米都算正常,新手第一次看吓得不敢用。

最底下的AP_HAL,这是硬件抽象层,整个项目的地基。前面说的362种板子能跑同一套代码,靠的就是它定义了一套标准的接口,谁在什么芯片上实现了这套标准的接口,谁就能跑ArduPilot。所以通过这层抽象,就把底层的硬件和上层的算法完全隔离开了,以至于后面才能发展出各种各样的飞控来跑这套飞控算法。
然后再看看这套开源飞控支持哪些传感器?
IMU,20个驱动。MPU6000、MPU9250走Invensense老后端,ICM-42688-P走Invensensev3。BMI055、BMI088、BMI160、BMI270全都有独立驱动。工业级的ADIS1647x、ADIS16607、SCHA63T也在,连FPGA方案的SCH16T都没落下。
气压计,14颗芯片。MS5611、BMP280、BMP388、BMP581、DPS280、SPL06、FBM320、ICP101XX。还有颗KellerLD,那是潜水用的压力传感器,ArduSub用得上。
磁力计,22个,QMC5883L、QMC5883P、IST8310、IST8308、RM3100、LIS3MDL、AK09916、BMM150、BMM350等等。
GPS,16种。u-blox一家就分老协议和CFGv2两套驱动,M8、M9、M10全覆盖。
RTK是全家桶:RTCM3差分解析、移动基站模式,Swift的SBP、Septentrio的SBF、NovAtel的NOVA、Trimble的GSOF都有专门驱动。
测距仪,50个驱动,全场最多,我把这个清单拉到底是有点震惊的。
国产北醒一家就占了5个型号:TFMini、TFMiniPlus、TF02、TF03、TFS20L,还有CAN版。
LightWare、Maxbotix、Garmin LidarLite、ST的VL53L0X和VL53L1X、TeraRanger,全是现成的。
毫米波雷达也进来了:Ainstein、USD1、NRA24。
连几块钱的HC-SR04超声波都有专门驱动,玩具和测绘机喝同一锅代码。
这还没算光流、IR锁、ADS-B接收机、视觉动捕、发电机、漏水检测这些。
实际体验就是:市面上买得到的飞控外设,大概率插上就能用。
这个飞控还有一套比较牛逼的操作系统,在STM32上跑的是ChibiOS实时系统,早年是NuttX,后来整体搬迁。Linux板子直接跑Linux,ESP32版跑的是FreeRTOS。但是应用层代码感觉不到这些,全被AP_HAL遮住了。
调度用的是AP_Scheduler, Copter的快循环400Hz跑姿态相关,其他任务按周期排队。IMU采样放在高优先级线程里,这套飞控的实时性设计得很牛逼的。
编译环境也非常好用。构建系统叫waf,工具链就是gcc-arm-none-eabi交叉编译器。两条命令出固件:./waf configure --board Pixhawk6C,然后./waf copter。
想玩仿真?--board sitl,PC上跑出一整架假飞机,jMAVSim、Gazebo给它当外部环境。
最后把算法链捋一遍,这就是你推油门时发生的事。传感器数据进来,先过EKF3,就是前面说的那个24状态卡尔曼滤波,融合出姿态、位置、速度。位置环算出想去的速度,速度环算出需要的加速度,然后交给姿态环。姿态环再压到角速率环,最后混控器把力分配到每个电机,DShot或者PWM等信号给到电调,电调控制电机按照设定的转速转动,产生升力。
固定翼和多旋翼不太一样,用的是一套算法:L1控制器管航点导航,TECS管总能量,速度和高度一起算账。
之前我还自己玩ArduPilot,这玩意的代码读起来是真精妙,我记得当时还写了一些代码阅读笔记。不过现在有了AI写代码,好像看代码的人越来越少了。另外,可能也是因为这几年的战争问题,导致国内无人机管控越来越严。这里再替北京的模友默哀三秒。我之前做了无人机飞控、也做过直升机飞控、支奴干飞控、穿越机飞控,现在因为政策问题,飞控我基本上都不碰了。这也是我为什么前段时间做卡丁车,天上的东西玩不了,就开始玩地面上的,甚至往水里去。
但是,不管做不做飞控、做不做车类、做不做无人船,ArduPilot这套代码里的各种算法、各种框架、各种驱动,随便扒出来都能放在其他项目里成为最优秀的那一点代码。
这是这个项目的仓库地址:github.com/ardupilot/ardupilot。