1. ArduPilot 概述与生态

各位同学好,我是你们这门课的讲师。在无人机飞控这个圈子里摸爬滚打了十几年,ArduPilot 可以说是我最熟悉的伙伴了。今天咱们先不急着调参数,先把 ArduPilot 这个“大家伙”的来龙去脉搞清楚。你想想看,连它爹妈是谁、家里有几口人都不知道,后面怎么玩得转?

1.1 项目历史:从学生作品到行业标杆

ArduPilot 的故事,得从 2007 年说起。那时候有个叫 Jordi Muñoz 的墨西哥小伙子,跟一群发烧友在 DIY Drones 论坛上瞎折腾。他们用 Arduino 板子加传感器,搞出了最早的自动驾驶仪。说白了,就是想让航模自己飞。

我记得我第一次接触 ArduPilot 是 2012 年,那时候还是 APM 1.0 版本,一个 8 位单片机,算力弱得可怜。但就是这东西,让开源飞控真正走进了大众视野。后来项目发展太快,2013 年成立了 ArduPilot 基金会,代码库也迁移到了 GitHub 上。

关键时间节点:

  • 2007年:项目萌芽,基于 Arduino 的早期原型
  • 2010年:APM 1.0 发布,支持固定翼
  • 2013年:ArduPilot 基金会成立,代码迁移至 GitHub
  • 2016年:全面支持 Pixhawk 系列硬件
  • 至今:全球最大的开源自动驾驶仪项目之一

为什么它能活下来,而且活得这么好?我个人觉得,核心原因有两个:一是社区够开放,二是代码质量确实过硬。很多商业飞控公司,说白了就是在 ArduPilot 基础上改的。

1.2 支持的硬件平台

ArduPilot 能跑在多少种硬件上?我数过,光官方支持的就有几十种。这里我挑几个最常见的跟大家说说。

硬件平台 处理器 典型应用 我的评价
Pixhawk 1/2/4 STM32F4/F7/H7 多旋翼、固定翼、车船 最通用的选择,资料最多
Cube (Pixhawk 2/3/4) STM32F4/H7 工业级、科研用途 可靠性高,我项目里用得最多
Here+ / Here3 STM32F4 RTK 高精度定位 搭配 Cube 用,厘米级精度
Pixracer STM32F4 竞速、小型无人机 轻便,但接口少
Navio2 (树莓派) BCM2837 Linux 环境、教学 适合折腾,但实时性一般

嗯,这里要注意一点:不是所有硬件都能跑所有固件。比如 Pixracer 跑 Copter 没问题,但跑 Plane 就有点吃力。我建议新手直接上 Pixhawk 4 或者 Cube Orange,省心。

避坑指南: 我曾经遇到过有人用山寨版 Pixhawk 刷最新固件,结果传感器校准死活过不去。后来发现是硬件克隆不完整,EEPROM 里缺参数。所以,买硬件尽量走官方渠道,或者至少买经过认证的兼容版。

1.3 软件架构概览

ArduPilot 的软件架构,说白了就是一套代码,适配不同机型。它通过编译时的宏定义,把通用框架和特定机型的逻辑分开。我画了张图,你们一看就明白。

ArduPilot 软件架构概览 应用层 (APM:Copter / Plane / Rover / Sub) 核心库 (AP_Common, AP_Math, AP_Param, AP_Scheduler) 硬件抽象层 (AP_HAL, 驱动, 传感器接口) 硬件 (STM32, 传感器, 执行器) 说明 • 应用层:不同机型的 控制逻辑 • 核心库:通用算法和 参数管理 • HAL:屏蔽硬件差异 • 硬件:具体物理设备

你看,最上层是 APM:Copter、Plane、Rover、Sub 这四个“孩子”。它们共享底层的核心库和硬件抽象层。这样做的好处是:你学会调 Copter 的参数,换到 Plane 上,很多概念是相通的。

1.3.1 APM:Copter(多旋翼)

这是最火的机型,没有之一。从四轴到八轴,从 250 穿越机到农业植保机,都能跑。我个人的经验是,Copter 的调参最复杂,因为姿态控制要求高。后面咱们会花大量时间讲它。

1.3.2 APM:Plane(固定翼)

固定翼的飞控逻辑跟旋翼完全不同。它需要考虑空速、迎角、滑翔等。Plane 的代码里有很多气动模型,我当年为了搞懂它,啃了不少空气动力学的书。

1.3.3 APM:Rover(无人车/船)

这个相对简单,因为只有前后左右,没有俯仰和横滚。但别小看它,在复杂地形下,Rover 的路径规划算法也挺有意思。

1.3.4 APM:Sub(水下潜航器)

Sub 是最小众的,但技术含量不低。水下通信延迟大,GPS 用不了,全靠惯性导航和压力传感器。我做过一个水下项目,那真是...一言难尽,后面有机会再聊。

1.4 固件编译与烧录基础

说到编译,很多新手一听就头大。其实没那么玄乎。ArduPilot 的编译环境,说白了就是一套基于 Python 和 GCC 的工具链。

我的建议: 如果你只是调参,直接用官方编译好的固件就行,没必要自己编译。但如果你想改代码、加功能,那还是得学会编译。我一般用 WSL (Windows Subsystem for Linux) 来编译,比虚拟机快不少。

编译的基本流程是这样的:

  1. 准备环境:安装 Git、Python、ARM GCC 编译器
  2. 拉取代码:git clone https://github.com/ArduPilot/ardupilot.git
  3. 更新子模块:git submodule update --init --recursive
  4. 选择机型:比如编译 Copter,进入 ArduCopter 目录
  5. 配置:./waf configure --board Pixhawk4
  6. 编译:./waf copter
  7. 烧录:用 Mission Planner 或 QGroundControl 上传固件

这里我特别想强调一下 ./waf 这个工具。它是 ArduPilot 的构建系统,说白了就是帮你管理编译过程的。我第一次用的时候,忘了加 --board 参数,结果编译出来的是默认的 Pixhawk1 固件,刷到 Pixhawk4 上直接变砖。嗯,从那以后我再也不敢马虎了。

警告: 烧录固件前,一定要确认板子型号和固件版本匹配。特别是用 Mission Planner 自动下载固件时,它会根据你连接的飞控自动推荐,但偶尔也会翻车。我建议手动选择固件文件,确保万无一失。

烧录完成后,第一次上电,你会听到飞控发出“滴-滴-滴”的提示音。这时候别急着飞,先做传感器校准。这个咱们下一章会详细讲。

好了,第一章的内容就到这里。ArduPilot 的世界很大,咱们慢慢探索。记住,调参不是目的,让飞机安全、稳定地飞起来才是。后面我会带着大家一步步深入,把每个参数都吃透。