ArduPilot之开源代码框架

2023-05-16

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系统框架(红框内部分)。

基本结构组成:

  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开源飞控系统之简单介绍

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ArduPilot之开源代码框架 的相关文章

随机推荐

  • Qt5.12.11交叉编译+64位ARM_aarch64+全志H5 CortexA53

    1 准备工作 购买的H5开发板 xff0c 附带资料里面只有关于qt4 8的支持 xff0c Qt5新增了很多插件 xff0c 为了在H5上运行Qt5的程序 xff0c 需要交叉编译Qt5版本的源码 xff0c 记录下编译Qt5 12 11
  • ESP32接入百度云,在线语音识别

    1开发环境及工具 开发板使用的是ESP32 LyraTv4 3 入下图所示 xff0c 开环境在是在Ubuntu20 04上搭建的ESP IDF xff0c 在ESP IDF中添加了支持语音开发的sdk xff0c ESP ADF 2开发过
  • ARM 7 三级 中断流水线

    ARM 7 在冯诺依曼 结构的 是三级流水线技术 分别是 取址 译码 执行 当有BL 的指令 执行时 流水线 也会被阻断 在分支指令执行的时候 其后第一条指令 被 解码 第二条 指令 被 取址 xff0c 当前的PC指针是 指在取址这的 x
  • S5PC100 I2C总线

    I2C 使用2根双向信号线来传递数据 SCL 时钟线 SDA 数据线 特点 半双功 xff0c 仅需要2根线 一般在PCU 上占2个PIN I2C 总线 上 都是 oc od 输出 xff0c 所以使用上拉电阻 当总线空闲的时候 都是输出
  • java代码自动生成一(freemarker)

    size 61 large 网上有很多代码自动生成工具 xff0c 如abator和hibernate xff0c 这些工具虽好 xff0c 却没有源码 xff0c 不能修改模板 xff0c 让人很不爽 我刚毕业的时候 xff0c 项目经理
  • linux内核 2.6.35下的驱动例子

    创建 设备节点 mknod dev hello c 字符设备 或者b xff08 块设备 xff09 250 1 查看 cat proc devices 当前设备节点 insmod 安装 rmmod 删除 编译 Makefile 1 需要配
  • E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

    出现这个问题的原因可能是有另外一个程序正在运行 xff0c 导致资源被锁不可用 而导致资源被锁的原因 xff0c 可能是上次安装时没正常完成 xff0c 而导致出现此状况 解决方法 xff1a 输入以下命令 sudo rm var cach
  • shell 脚本中的引用问题

    原始代码如下 bin sh myvar 61 34 Hello world 34 echo myvar echo 34 myvar 34 echo 39 myvar 39 echo myvar echo Enter some test re
  • Linux内核的TCP源码入门(一)

    文章目录 前言一 TCP报文段结构1 报文段整体结构2 TCP首部 固定部分3 TCP首部 选项 options 二 TCP接收和发送数据1 TCP的 34 接口 34 2 发送数据3 接收数据3 1 ip层向上调用INET Socket层
  • 【API接口工具】postman-Windows版、Linux安装

    Windows安装 Postman 适用于 Windows 7 及更高版本 下载最新的 Postman 版本 选择并运行该 exe文件以安装 Postman Postman v9 4 是 Postman 的最后一个版本 xff0c 同时支持
  • 四轴飞控DIY调试起飞简明步骤

    四轴飞控DIY调试起飞简明步骤 调试起飞简明步骤Step1 xff1a 飞控配置Step2 xff1a 试飞目标测试内容坐标系 Step3 xff1a 试飞方法1 升降 xff08 Throttle xff09 2 偏航 xff08 yaw
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • 穿越机用途和机架尺寸

    穿越机用途和机架尺寸 1 穿越机的用途2 穿越机的机架3 机架的类型3 1 正X型机架3 2 宽X型机架3 3 长X型机架3 4 Hybrid机架3 5 涵道机架 4 总结 1 穿越机的用途 穿越机按功能分 xff0c 主要分为竞速Race
  • 关于穿越机FPV视频果冻效应的讨论

    关于穿越机FPV视频果冻效应的讨论 1 名词定义2 摄像原理2 1 快门分类2 2 常见传感器2 3 卷帘拍摄 3 产生原因4 解决方法4 1 振动出处4 2 软件方法 辅助作用 4 3 硬件方法 直接办法 5 F450试验机FPV视频问题
  • 四轴飞控DIY Mark4 - 减震

    四轴飞控DIY Mark4 减震 1 DIY Mark42 改进事项2 1 Mark4 5 inches机架2 2 2205 2450KV 无刷电机2 3 电机与机架的TPU防震2 4 飞控防震垫圈2 5 三叶平衡桨 3 试飞效果3 1 视
  • Java的压力测试工具之Jmeter

    size 61 large Apache JMeter是Apache组织开发的基于Java的压力测试工具 用于对软件做压力测试 xff0c 它最初被设计用于Web应用测试但后来扩展到其他测试领域 它可以用于测试静态和动态资源例如静态文件 J
  • 四轴飞控DIY Mark4 - 整理&参数优化

    四轴飞控DIY Mark4 整理 amp 参数优化 1 历程2 参数优化2 1 固件BF4 3 12 2 动态怠速值2 3 滤波参数2 4 电调PWM频率2 5 GPS高度配置2 6 返航速度和高度2 7 线性推力修正2 8 图传频道调整
  • ArduPilot开源飞控系统之简单介绍

    ArduPilot开源飞控系统之简单介绍 1 源由2 了解 amp 阅读2 1 ArduPilot历史2 2 关于GPLv32 3 ArduPilot系统组成2 4 ArduPilot代码结构 3 后续3 1 DIY F4503 2 软件设
  • ArduPilot Kakute F7 AIO DIYF450 之GPS配置

    ArduPilot Kakute F7 AIO DIYF450 之GPS配置 1 源由2 步骤2 1 模块预测试2 2 物理连接2 3 UART配置2 4 Compass使能2 5 GPS使能2 6 校准Compass 3 GPS amp
  • ArduPilot之开源代码框架

    ArduPilot之开源代码框架 1 系统框架2 工程框架2 1 工程目录2 2 代码组成2 3 运行流程 4 硬件传感器总线4 1 I2C4 2 SPI4 3 UART4 4 CAN 5 软件设计概念6 总结7 参考资料 在研读ArduP