跳转至

机器人软件系统架构

hh

写在前面

在设计机器人系统时,需要遵循一定的体系结构,使各部分、各层级功能充分解耦、各司其职、密切合作、流畅运行,以实现系统的全部功能和特性。机器人系统是嵌入式系统的一种,而对于一个一般的嵌入式系统而言,其体系结构包括嵌入式系统的元素、与嵌入式系统交互的元素、每个单独元素的属性以及元素之间的交互关系。常见的嵌入式系统模型如下图所示:

在概念上,这些模型适用于任何嵌入式系统;但对应于实际开发过程,应结合应用需求,对其进行适当的补充和调整,使各概念的含义更清晰、各模块功能更明确,以适用于机器人系统的开发。

大到一个机器人开发团队的软件工作、小到每一位成员的代码产出,写出能用的程序固然重要,但也要考虑到设计上的逻辑性、合理性和可移植、可拓展性。唯有如此,才能够提升开发和维护的效率,维持软件的活力,帮助团队持续稳定地发展。没有架构设计或不合理的架构设计,其弊端已经在过往的赛季中逐渐显现,是时候推广一个更为完善、更有发展潜力的架构,来理清对象逻辑层次关系,合理设计系统流程架构,引导自研应用生态发展

因此,我们参考大量资料,包括 STM32Cube Package 架构DJI 自动驾驶域控制器架构link),RT-Thread I/O 设备模型link)等,结合开发过程和应用的实际需求,形成战队机器人软件系统架构;该架构尚不成熟,需要更多的队员秉承科学的设计理念,不断优化和完善。

软件架构概述

嵌入式软件大体上可以分为两大类:系统软件应用软件。系统软件是支持应用程序的任何软件,例如设备驱动程序、操作系统和中间件。应用软件是上层软件,它定义了嵌入式设备的功能和用途,并处理与用户的大部分交互。

以步兵机器人的软件架构为例,下图中彩色色块覆盖的部分代表应用软件,其他部分代表系统软件及硬件。

swerve-architecture

以下部分将介绍具体模型,从体系结构层级的抽象向下具体到伪代码层级。

系统软件层(System Software Layer)

硬件抽象层(Hardware Abstraction Layer, HAL)

大多数嵌入式硬件需要某种类型的软件初始化和管理。HAL 是对硬件的抽象和封装,为软件提供了统一的硬件设备访问接口。HAL 涉及的各层级 STM32 外设包括 GPIO、TIM、IWDG、USART、SPI、CAN、I2C...

STM32Cube HAL 为此提供了支持

板级支持包(Board Support Package)

BSP 是进一步调用 HAL 的各种方法实现硬件配置、外设初始化、功能聚合等,从而为 STM32 片上硬件实现的可直接调用的功能支持包。上层模块调用板级支持包提供的接口,而无需关注 HAL 库及其他底层细节。在应用时,BSP 仅与对应外设自身功能相关,该层对数据的描述不具有特定含义。

使用 STM32CubeMX 生成项目时,外设配置相关的 BSP 将自动生成

设备驱动(Device Driver)

设备驱动程序是 BSP 的主要组成部分,是对 HAL 提供方法的再一次封装,提供统一易用的驱动接口以及驱动注册、软件 FIFO、回调函数注册等功能。按照外设的类型,编写对应的驱动(如 drv_can, drv_i2c...),以驱动对应类型的设备。

设备驱动是战队自研系统软件支持的一部分。对于新增加的外设,请编写独立、可移植复用的应用程序,并加入驱动库中

操作系统(Operating System)

嵌入式系统对实时性要求较高,采用实时操作系统(Real Time Operating System)。RTOS 的核心功能如下:

FreeRTOS Core

我们选用 FreeRTOS 进行开发。STM32Cube Packge 将 RTOS 内核组件定义在 Middleware 层级,在此不做改动

中间件(Middleware)

一般而言,中间件软件是任何不是操作系统内核、设备驱动程序或应用程序的系统软件。为便于区分系统软件与机器人开发相关的软件,机器人抽象组件(如设备应用、算法等)和模组将被定义到应用软件层,但它们严格意义上也属于中间件,允许任务重用。

在本架构中,中间件包括:

  • 已经包含在现成系统支持包中的应用软件,如 USB 应用支持
  • 第三方供应商提供的现成软件(如 DSP 库)
  • 自研通信服务组件、内存管理、Shell、日志、自定义通信协议等操作系统扩展组件
  • 自研设备管理框架

自研中间件是战队自研系统软件支持的一部分。按照操作系统的扩展需求,基于 FreeRTOS 进行研发

应用软件层(Application Software Layer)

组件(Component)

组件是一些独立模块,在系统中发挥功能但不与其他模块耦合。

简单功能聚合(Tool)

包括通用常量及简单功能(使用宏、内联函数等形式实现)。

各应用中所需的通用常量和简单功能均应从此处调用

设备应用(Device)

设备是组成机器人的最小单元,包括各类传感器(IMU、激光测距等)、执行器(电机、舵机等)、遥控系统、裁判系统等模块。设备应用对各类实体设备进行抽象,管理更高层软件对设备的访问;同时,抽象设备与驱动匹配的程序接口,以控制设备对象所需的底层数据交互。

设备应用对象的设计内容主要涉及:

  • 设备对象的构造和初始化方法
  • 设备可解释数据的处理和解析方法
  • 设备应用方法
  • 设备驱动方法注册接口

其中,对于设备应用的使用者而言,对象的驱动方法是抽象且通用的;而对于设备应用本身而言,可以通过预留驱动的注册接口,为同一种应用注册不同的底层驱动。

设备应用基于设备驱动 (Device Driver) 提供的通用外设操作方法进行开发,战队通用。对于新增加的设备,建议编写独立、可移植复用的应用,并加入组件库中

算法(Algorithm)

算法作为抽象的功能模块,形成独立应用组件,供更高层软件调用。

算法组件战队通用。对于新增加的算法,建议编写独立、可移植复用的应用,并加入组件库中

模组(Module)

模组是组成机器人的具有一定聚合关系的实体组件集合,或抽象的复杂功能模块(如云台、底盘、错误检测器等)。各模组独立实现,互相解耦。

模组对象的设计内容主要涉及:

  • 模组对象的构造和初始化方法
  • 设备和算法的实例化
  • 数据 in/out 接口
  • 模组功能实现所需的处理逻辑
  • 模组应用方法

模组仍具有一定的可复用性,对一些共有的模组各兵种应尽量协作完成

任务 / 线程(Task / Thread)

任务依赖于系统软件,由操作系统管理和调度;任务描述该嵌入式系统最高级的目的,简介清晰地展示运行过程,并与用户进行了大部分交互;除此之外还有一些通用的系统必要的任务。

任务的设计按照机器人实际任务需求实现,大体上可分为 感知决策规划控制 四大方向,以及 设备校准模式管理消息处理错误诊断用户接口 等杂项任务。具体而言,设计内容主要涉及:

  • 按一定顺序初始化模组,以及完成其他的杂项初始化
  • 处理数据交互
  • 按任务逻辑执行计算,调用相关的方法

任务的执行与操作系统紧密联系,因此,需要对任务调度逻辑、优先级、中断、数据流向等有清晰明确的认识。

由于各兵种任务不尽相同,基本不存在可复用的情况,因此任务由各兵种电控各自实现,但请遵循设计指南

附录

版本说明

版本号 发布日期 说明 贡献者
hh 2022.09 预发布,适用于裸机架构 薛东来
hh 2023.03 适用于 RTOS 薛东来

参考资料

[1] Tammy Noerga, Embedded Systems Architecture - A Comprehensive Guide for Engineers and Programmers.

[2] Development guidelines for STM32Cube Expansion Packages.

[3] Mastering the FreeRTOS Real Time Kernel - A Hands-On Tutorial Guide.