ArduPilot之开源代码框架
- 1. 系统框架
- 2. 工程框架
- 2.1 工程目录
- 2.2 代码组成
- 2.3 运行流程
- 4. 硬件传感器总线
- 4.1 I2C
- 4.2 SPI
- 4.3 UART
- 4.4 CAN
- 5. 软件设计概念
- 6. 总结
- 7. 参考资料
在研读ArduPilot的过程,尝试用一些中文的词汇来描述,可能会造成某些理解上的差异。因为从不同体系,不同背景,不同领域的视角看这份开源代码,相信一定会有所差异。
如果想原汁原味的去理解,还是建议大家看官方的资料:Learning ArduPilot — Introduction。
注:笔者会从个人的角度来分析和理解ArduPilot,如有问题或者建议,请评论留言,谢谢!
1. 系统框架
ArduPilot基本的结构图如下所示,我们重点关注ArduPilot系统框架(红框内部分)。
基本结构组成:
- Ground Station
- Companion Computer
- ArduPilot
- Hardware (Flight Control/Sensors etc.)
输入输出接口:
- MAVLink
- HAL(Hardware Abstraction Layer,使用OS和Driver对象模型通过传感器总线抽象解耦软硬件)
注1:STM32硬件通常采用基于ChibiOS的HAL设计,详见:Autopilot Hardware Options。
注2:如果需要移植到新的硬件,可参考Porting to a new flight controller board。
2. 工程框架
代码git版本CommitID:
commit 673bf619e548676d0de6930e92b2906c77dad922 (HEAD -> Copter-4.4, origin/Rover-4.4, origin/Plane-4.4, origin/Copter-4.4)
Author: Andrew Tridgell <andrew@tridgell.net>
Date: Thu Mar 23 17:43:27 2023 +1100
waf: added --board-start-time configure option
2.1 工程目录
.
├── AntennaTracker
├── ArduCopter
├── ArduPlane
├── ArduSub
├── Rover
├── Blimp
├── libraries
├── modules
└── Tools
每个设备代码下都有wscript脚本,比如:ArduCopter
工程采用了waf脚本组织模块编译。
#!/usr/bin/env python
# encoding: utf-8
def build(bld):
vehicle = bld.path.name
bld.ap_stlib(
name=vehicle + '_libs',
ap_vehicle=vehicle,
ap_libraries=bld.ap_common_vehicle_libraries() + [
'AC_AttitudeControl',
'AC_InputManager',
'AC_PrecLand',
'AC_Sprayer',
'AC_Autorotation',
'AC_WPNav',
'AP_Camera',
'AP_IRLock',
'AP_InertialNav',
'AP_Motors',
'AP_RCMapper',
'AP_Avoidance',
'AP_AdvancedFailsafe',
'AP_SmartRTL',
'AP_Beacon',
'AP_Arming',
'AP_WheelEncoder',
'AP_Winch',
'AP_Follow',
'AP_LTM_Telem',
'AP_Devo_Telem',
'AP_OSD',
'AC_AutoTune',
'AP_KDECAN',
],
)
bld.ap_program(
program_name='arducopter',
program_groups=['bin', 'copter'],
use=vehicle + '_libs',
defines=['FRAME_CONFIG=MULTICOPTER_FRAME'],
)
bld.ap_program(
program_name='arducopter-heli',
program_groups=['bin', 'heli'],
use=vehicle + '_libs',
defines=['FRAME_CONFIG=HELI_FRAME'],
)
2.2 代码组成
- 设备代码(AntennaTracker/ArduCopter/ArduPlane/ArduSub/Rover/Blimp)
- 共享库(库框架)
- 硬件抽象层
- 工具目录
- 外部支持代码(即mavlink、dronekit)
从这里,可以开出该开源工程支持6中设备的应用
- AntennaTracker(天线方位追踪)
- ArduCopter(多轴)
- ArduPlane(固定翼)
- ArduSub(潜艇)
- Rover(车辆)
- Blimp(气球)
2.3 运行流程
鉴于当前官方文档比较详细的资料是针对Copter的,所以很多图可能出现Copter字眼居多。
从ArduPilot运行流程图上看:
- 左上角的蓝色框说明了传感器驱动程序后端线程中运行。来自传感器的原始数据被收集,转换成标准单位,然后保存在驱动器的缓冲区内。
- 代码的主线程定期运行,并通过前端的方法访问可用的最新数据。例如,为了计算最新的姿态估计,AHRS/EKF将从传感器驱动器的前端提取最新的加速度计、陀螺仪和指南针信息。
4. 硬件传感器总线
用于传感器的硬件总线主要是以下四种形式。通过OS和Driver对象模型,解耦软硬件。
4.1 I2C
- 一对多配置
- 适用于短距离(即小于1m)的通信
- 总线以100kHz或400kHz运行,数据速率相对较低。
- 4个引脚(VCC、GND、SDA、SCL)
4.2 SPI
- 一对一
- 20Mhz+,相比I2C速度快
- 适用于短距离(10厘米)
- 至少5个引脚(VCC、GND、SCLK、主输出-从输入、主输入-从输出)+每个从选择引脚
4.3 UART
- 一对一
- 与I2C和SPI(即1m)相比,基于字符的协议更适合远距离通信
- 相对较快,速度为57Kbps~1.5Mbps
- 4个引脚(VCC、GND、TX、RX),外加2个可选引脚(清除发送、清除接收)
4.4 CAN
- 多主总线,任何节点都可以在需要时启动数据传输
- 基于分组的超长距离协议
- 高速,通常为1Mb(然而,在没有重大冲突的情况下,只有50%的总线比特率可以真正使用)
- 至少需要3个引脚(GND、CAN HI、CAN LO)。可选地,VCC可用于为节点供电
- 点对点拓扑。不建议使用星形或短柱拓扑
- 需要在总线的每一端进行端接
5. 软件设计概念
后续主要牵涉到的设计概念我们会逐步学习和研讨,这里先以列表的方式给出。
- Library
- Sensor Drivers
- Threading
- UARTs and the Console
- RC Input and Output
- Storage and EEPROM management
- File Systems
- EKF
- MAVLink
- Device Architect
6. 总结
总的来说,ArduPilot代码库相当大(核心ArduPilot git树大约有700k行),对新人来说可能相当可怕。因此,通过框架的学习,可以让我们更快的了解系统组成,抓共性,抓重点,循序渐进的逐步了解系统。
注:后续我们会一一细分开来,逐步研读内部设计框架和重点关键模块。
7. 参考资料
【1】Learning ArduPilot — Introduction
【2】Autopilot Hardware Options
【3】Porting to a new flight controller board
【4】waf: The meta build system