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/master、remotes/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 看看最近的提交记录,确认一下。
stable 标签的就是官方推荐的稳定版。
3.3 顶层目录结构解析
好,源码到手了。咱们来解剖一下它的顶层目录。你想想看,一个支持几十种载具、几百种传感器的固件,它的代码结构得有多复杂?其实不然,ArduPilot的顶层非常清晰。
用 ls -l 看一下,重点关注这几个目录:
| 目录名 | 作用 | 我的经验 |
|---|---|---|
libraries/ |
核心库,所有载具共用。包括传感器驱动、数学库、通信协议等。 | 这是最常改的目录。我调飞控参数时,80%的时间都在这里翻代码。 |
ArduCopter/ |
四旋翼/多旋翼的顶层逻辑。主循环、飞行模式、任务调度都在这里。 | 做无人机开发,这个目录是主战场。 |
ArduPlane/ |
固定翼的顶层逻辑。 | 我很少碰,但结构跟ArduCopter非常像。 |
Tools/ |
辅助工具。包括自动测试脚本、参数转换工具、地面站相关等。 | 调试时经常用,比如 Tools/autotest 里的仿真脚本。 |
mk/ |
Makefile构建系统。定义了编译规则、板级配置。 | 如果你要添加新的硬件板卡,就得改这里。 |
modules/ |
第三方模块,比如ChibiOS实时操作系统、uavcan协议栈。 | 一般不动,除非要升级底层OS。 |
为什么是这种结构?说白了,就是“分层复用”。libraries 是底层基础,所有载具都调用它。ArduCopter、ArduPlane 这些是上层应用,只关心自己的飞行逻辑。你想想看,如果每个载具都自己写一套传感器驱动,那代码得多冗余?
3.4 核心逻辑:一张图看懂
为了让你更直观地理解,我画了一张结构图。它展示了源码的顶层依赖关系:
从这张图可以看得很清楚:ArduCopter 和 ArduPlane 都依赖 libraries,而 libraries 又依赖 mk 和 modules 提供的底层支持。Tools 是独立的一套,不参与固件编译,但调试时离不开它。
3.5 避坑指南
libraries/AP_HAL 里的底层接口,结果导致所有载具都无法编译。记住,libraries 是公共基础,改之前一定要想清楚影响范围。如果你只是做自己的飞控,建议只改 ArduCopter 目录下的文件。
git submodule update --init --recursive否则编译时会报“找不到头文件”的错误。我每次切分支后第一件事就是跑这条命令,已经形成肌肉记忆了。
3.6 小结
这一章,我们做了三件事:用Git克隆了官方仓库,切换到了Copter-4.5稳定分支,然后解剖了顶层目录结构。你现在应该能分清 libraries、ArduCopter、Tools 各自是干什么的了。
嗯,源码已经到手了。下一章,我们就要开始配置编译环境了。不过在那之前,我建议你先在 ardupilot 目录里随便逛逛,用 tree -L 2 看看子目录,熟悉一下。代码这东西,多翻翻自然就熟了。
公众号:蓝海资料掘金营,微信deep3321