系统框架概述 - Ligcox/BTP_DM GitHub Wiki
设计目的
Birdiebot目标感知与决策框架(Birdiebot Target Prception And Decision Making Framework,BTPDM)是一款针对RMUC/RMUL/RMUT开发的基于python开源框架。
BTPDM在开始设计的初期,希望能够帮助RoboMaster的参赛队伍能够快速地开发和调试机器人的上位机部分,而无需花费时间解决繁琐的编译、跨平台调试等问题。事实上,在开发的前期,我们也使用了不同类型的开发板,由于系统架构的原因,编译型语言在不同架构(X86、ARM、AARCH64)的上位机对框架表现出了大量的问题。因此,BTPDM采用了脚本语言开发和实现。
随着RoboMaster赛事的发展和迭代。赛场上不同环境一直处于变化和更新。BTPDM希望在框架的底层实现通用的类模板和接口,后续随着功能的不断更新以及赛事规则的更改,能够仅仅只添加的相应的 任务(task) 和 重写(overwriting) 类的方法,实现机器人的功能。
BTPDM希望在保证系统稳定的前提下,满足一定程度的机器人实时处理需求,这一点可以参照性能分析。
机器人功能解耦
开放系统互连参考模型 (Open System Interconnect, OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。OSI将计算机网络中各个模块进行解耦并实现各个层级之间的各种协议。
BTPDM参考了OSI/RM的设计模式,将机器人系统解耦为五个部分称之为木鸢机器人互联参考模型(Birdiebot Robot System Interconnection Reference Model,BRS/RM)。在BRS/RM中,机器人的各个功能结从高到低分别为物理层、执行层、会话层、决策层、数据融合与处理层。
- 物理层:机器人机械部分,包括电池、电机、电调等机构
- 执行层:MCU
- 会话层:BCP链路上的各类设备和BCP本身,实现上位机与MCU的通讯交互
- 决策层:通过对系统中产生的各类数据转换为最优决策
- 数据融合与处理层:获取各类图像及传感器信息,并将其处理
线程之间的关系
BTPDM中的运行过程中会创建超过4个线程,这些线程包括了:
- 主线程:任务调度器分配的正在执行的任务
- 图像读取线程
- BCP读取线程
- BCP写入线程
- 底盘控制决策线程
- 其他线程
这些线程 通常 在BTPDM启动时候被创建,在程序结束时被自动释放。这得益于BTPDM的任务调度器机制。具体的说,BTPDM经常启动时,会在主线程中启动任务调度器,任务调度器的生命周期与BTPDM的生存周期是相同的。任务调度器会根据程序执行的需要,打开相应的线程。在程序退出或发生异常时,任务调度器会对存续的线程对象执行清理。
BTPDM究竟在做什么
而在BTPDM中,主要实现的是上位机处理的会话层、决策层及数据融合与处理层。简单来说,BTPDM会通过USART读取信息,实时获取当前需要的机器人状态。通过一个中心的任务调度器,来实时将系统性能分配给不同的任务。任务调度器所选择的任务会有限占用主线程,对任务进行处理转化为决策数据后,会将数据转化为BCP帧。BCP帧本质上是一串十六进制的bytes数据,在会话层上BCP链路中的各类设备会将BCP数据完成重新组包,并执行相应的决策。BTPDM的数据流图如下: