本文介绍ArduPilot的基本结构.在动手之前,先搞定用什么工具来看代码.你可以直接用浏览器在github上看,不过最好是能用个IDE工具,结构化地显示代码,方便你找函数,结构,类定义之类的东西.
推荐一些
- Eclipse在Windows, Linux或者MacOS上都挺好
- Emacs也一样可以用在三个系统上,用etags快速定位各种代码元素
- Vim on emacs with ctags (,上一句勉强翻出来了,这句不知道了,因为没用过,不过楼主会好好学习的以后可能就会翻译了,等好心人通过点评给我指点)
- 有很多其他的IDE(集成开发环境),大多数都是可以高度定制的,很适合ArduPilot.如果你有喜欢的IDE,并且在ArduPilot上用的很爽,记得在wiki上分享一下你的经验哦.
基本结构
ArduPilot的基本结构分为5个部分:
- 各模型目录
- 硬件抽象层
- 共享库
- 工具目录
- 外部支持代码
你需要先去github上下载代码, 下面我们就逐步介绍细节.
各模型目录
除了.cpp源代码文件之外,各模型目录还包含了一个.inc文件,用来列出引用到的库. 编译脚本读取这个文件来配置编译时的头文件包含和库链接信息.
硬件抽象层
硬件抽象层,是ArduPilot能移植到各种不同平台的关键.其顶层抽象在libraries/AP_HAL目录下,定义了个其他代码所需要遵循的接口,每个板子则各自有一个AP_HAL_XXX这样的子目录, 比如AP_HAL_AVR是给AVR板子的,AP_HAL_PX4是给PX4的,AP_HAL_Linux是给Linux相关板子的(楼主对这里还有点不确定linux相关的板子是什么)
工具目录
工具目录下是各种杂七杂八的支持目录. 比如tools/autotest实际上是autotest.ardupilot.org 的后台基础, tools/Replay则提供log回放功能.
外部支持代码
在有的平台上,我们需要外部支持代码来提供额外特性或者板子支持.当前用到的外部支持包有:
- PX4NuttX -用在PX4板子上的NuttX RTOS的内核
- PX4Firmware - 用在PX4板子上的基本PX4中间件和驱动
- uavcan -用在ArduPilot上的uavcan CANBUS实现
- mavlink -mavlink 协议和代码生成器
注意:这些大多是在编译用于PX4/Pixhawk的ArduPilot时以Git子模块的方式引入的.
编译系统
当前编译可以通过make指令完成, 也可用arduino IDE来编译AVR芯片相关内容. mk/目录下的makefile文件, 为每种支持的板子定义了编译规则.
为特定的板子编译一种模型固件或者测试固件(sketch我也不会翻)时,用指令 "make TARGET", 这里的TARGET就是板子的类型.下面是一些可用板子类型
- make apm1 - APM1板子
- make apm2 - APM2板子
- make px4-v1 - PX4v1
- make px4-v2 - Pixhawk (以及 Arsov AUAV-X2)
- make pxf - Erle brain(BBB(BeagleBoneBack)+PXF(PixHawk Fire Cape))组合
- make navio - 树莓派+NavIO组合
- make linux - 通用的linux版本
- make flymaple - FlyMaple板子
- make vrbain - VRBrain板子
- make sitl - 闭环仿真过程中用到的半实物仿真(SITL)软件
更多的接口正在加进来,所以经常用make help看看有什么新东西吧
对于所有这些版本,都可以增加一些额外的编译参数,或者用并行编译来加快速度.比如你可以输入:
make apm2-octa -j8
表示采用8线程并行编译一个APM2板子的版本. 你也可以试试使能ccache特性来加快编译
有些板子支持直接把编译得到的固件加载到板子.比如:
make px4-v2-upload
会编译和加载一个测试固件到Pixhawk
有些辅助指令可以用在特定的板子上,比如:
- make clean -清空非px4版本的编译成果
- make px4-clean - 完全清空PX4文件的编译成果
- make px4-cleandep - 清空PX目标的依赖