3. 源码获取与目录结构:Git克隆与顶层目录解析

好,咱们进入实操环节。这一章,我带你亲手把ArduPilot的源码“拉”下来,再把它拆开看看里面到底长什么样。说白了,就是先拿到武器,再熟悉武器。

3.1 用Git克隆官方仓库

获取源码,最正统的方式就是用Git。别去下载什么zip包,那玩意儿没有版本历史,你后面想切分支、看改动,会非常痛苦。我个人习惯,所有嵌入式项目都放在 ~/workspace 下,方便管理。

打开终端,执行下面这条命令:

cd ~/workspace
git clone https://github.com/ArduPilot/ardupilot.git

嗯,这里要注意。这个仓库挺大的,有几百兆,网速不好的话可能要等一会儿。我记得有一次在酒店里用公共WiFi克隆,断断续续搞了快一个小时,最后还校验失败……所以,我建议你找个稳定的网络环境。

克隆完成后,你会看到一个 ardupilot 文件夹。进去看看:

cd ardupilot
git branch -a

这条命令会列出所有分支。你会看到一堆远程分支,比如 remotes/origin/masterremotes/origin/Copter-4.5 等等。master是开发主线,每天都在变。我们做课程或产品,一般用稳定版。

3.2 切换稳定版分支

为什么要切稳定版?因为master分支可能今天能编译,明天就挂了。我在项目里吃过这个亏——早上拉的最新代码,下午编译报错,查了半天发现是某个新提交引入了bug。从那以后,我再也不敢在产线上用master了。

稳定版分支的命名规则是 Copter-版本号Plane-版本号。比如当前最新的Copter稳定版是4.5.x系列:

git checkout Copter-4.5

执行后,你的本地代码就切换到了Copter 4.5的稳定分支上。你可以用 git log --oneline -5 看看最近的提交记录,确认一下。

小技巧: 如果你不确定哪个版本最稳定,可以去ArduPilot官网看Release Notes。或者直接看GitHub上仓库的Tags,带 stable 标签的就是官方推荐的稳定版。

3.3 顶层目录结构解析

好,源码到手了。咱们来解剖一下它的顶层目录。你想想看,一个支持几十种载具、几百种传感器的固件,它的代码结构得有多复杂?其实不然,ArduPilot的顶层非常清晰。

ls -l 看一下,重点关注这几个目录:

目录名 作用 我的经验
libraries/ 核心库,所有载具共用。包括传感器驱动、数学库、通信协议等。 这是最常改的目录。我调飞控参数时,80%的时间都在这里翻代码。
ArduCopter/ 四旋翼/多旋翼的顶层逻辑。主循环、飞行模式、任务调度都在这里。 做无人机开发,这个目录是主战场。
ArduPlane/ 固定翼的顶层逻辑。 我很少碰,但结构跟ArduCopter非常像。
Tools/ 辅助工具。包括自动测试脚本、参数转换工具、地面站相关等。 调试时经常用,比如 Tools/autotest 里的仿真脚本。
mk/ Makefile构建系统。定义了编译规则、板级配置。 如果你要添加新的硬件板卡,就得改这里。
modules/ 第三方模块,比如ChibiOS实时操作系统、uavcan协议栈。 一般不动,除非要升级底层OS。

为什么是这种结构?说白了,就是“分层复用”。libraries 是底层基础,所有载具都调用它。ArduCopterArduPlane 这些是上层应用,只关心自己的飞行逻辑。你想想看,如果每个载具都自己写一套传感器驱动,那代码得多冗余?

3.4 核心逻辑:一张图看懂

为了让你更直观地理解,我画了一张结构图。它展示了源码的顶层依赖关系:

ArduPilot 顶层目录结构图 ArduCopter 多旋翼飞行逻辑 ArduPlane 固定翼飞行逻辑 libraries/ 核心库:传感器、数学、通信、参数 Tools/ 测试与调试工具 mk/ 构建系统与板级配置 modules/ 第三方模块(ChibiOS等) 载具层 核心库 基础支撑

从这张图可以看得很清楚:ArduCopterArduPlane 都依赖 libraries,而 libraries 又依赖 mkmodules 提供的底层支持。Tools 是独立的一套,不参与固件编译,但调试时离不开它。

3.5 避坑指南

我曾经遇到过: 有新手直接修改了 libraries/AP_HAL 里的底层接口,结果导致所有载具都无法编译。记住,libraries 是公共基础,改之前一定要想清楚影响范围。如果你只是做自己的飞控,建议只改 ArduCopter 目录下的文件。
另一个坑: 切换分支后,一定要更新子模块。ArduPilot依赖很多第三方库,比如ChibiOS。执行:
git submodule update --init --recursive
否则编译时会报“找不到头文件”的错误。我每次切分支后第一件事就是跑这条命令,已经形成肌肉记忆了。

3.6 小结

这一章,我们做了三件事:用Git克隆了官方仓库,切换到了Copter-4.5稳定分支,然后解剖了顶层目录结构。你现在应该能分清 librariesArduCopterTools 各自是干什么的了。

嗯,源码已经到手了。下一章,我们就要开始配置编译环境了。不过在那之前,我建议你先在 ardupilot 目录里随便逛逛,用 tree -L 2 看看子目录,熟悉一下。代码这东西,多翻翻自然就熟了。


公众号:蓝海资料掘金营,微信deep3321