ArduPilot之开源代码框架

在研读ArduPilot的过程,尝试用一些中文的词汇来描述,可能会造成某些理解上的差异。因为从不同体系,不同背景,不同领域的视角看这份开源代码,相信一定会有所差异。

如果想原汁原味的去理解,还是建议大家看官方的资料:Learning ArduPilot — Introduction

注:笔者会从个人的角度来分析和理解ArduPilot,如有问题或者建议,请评论留言,谢谢!

1. 系统框架

ArduPilot基本的结构图如下所示,我们重点关注ArduPilot系统框架(红框内部分)。

基本结构组成:

  1. Ground Station
  2. Companion Computer
  3. ArduPilot
  4. Hardware (Flight Control/Sensors etc.)

输入输出接口:

  1. MAVLink
  2. 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 代码组成

  1. 设备代码(AntennaTracker/ArduCopter/ArduPlane/ArduSub/Rover/Blimp)
  2. 共享库(库框架)
  3. 硬件抽象层
  4. 工具目录
  5. 外部支持代码(即mavlink、dronekit)

从这里,可以开出该开源工程支持6中设备的应用

  • AntennaTracker(天线方位追踪)
  • ArduCopter(多轴)
  • ArduPlane(固定翼)
  • ArduSub(潜艇)
  • Rover(车辆)
  • Blimp(气球)

2.3 运行流程

鉴于当前官方文档比较详细的资料是针对Copter的,所以很多图可能出现Copter字眼居多。

在这里插入图片描述

从ArduPilot运行流程图上看:

  1. 左上角的蓝色框说明了传感器驱动程序后端线程中运行。来自传感器的原始数据被收集,转换成标准单位,然后保存在驱动器的缓冲区内。
  2. 代码的主线程定期运行,并通过前端的方法访问可用的最新数据。例如,为了计算最新的姿态估计,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. 软件设计概念

后续主要牵涉到的设计概念我们会逐步学习和研讨,这里先以列表的方式给出。

  1. Library
  2. Sensor Drivers
  3. Threading
  4. UARTs and the Console
  5. RC Input and Output
  6. Storage and EEPROM management
  7. File Systems
  8. EKF
  9. MAVLink
  10. 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
【5】ArduPilot开源飞控系统之简单介绍

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值