Robocup2D入门笔记(5)——agent2d球队结构

2024-02-18 12:50

本文主要是介绍Robocup2D入门笔记(5)——agent2d球队结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇博客将重点介绍agent2d这个底层球队,agent2d本身也是当前最常用的一个底层球队,是helios团队开发出的底层球队,方便我们能够快速上手,将自己的想法付诸实践。点击进入下载地址,注意要先安装librcsc然后再安装agent2d的球队代码。

一、球队框架

agent2d的框架可以看下面这张图片:在这里插入图片描述
可以看到,agent2d总共有3个开始入口,分别是start.sh,start_offline.sh以及train.sh,分别对应普通模式开始,离线状态开始以及训练模式开始。

通过上面的脚本,开始运行main_player.cpp以及main_coach.cpp,这里面只用一个main函数,用于创建client并连线到服务器,从这里开始后面的一系列初始化的过程。

下一层级为samplePlayer以及sampleCoach,这个类可以认为是球员以及教练的大脑,球员类从这里衍生出了交流类(communication)、世界模型类(worldModel)、行为类(behavior)、策略类(strategy)、角色类(role)等,之后会详细介绍。

再往下是playerAgent类,这个类可以被认为是球员的身体类,它负责支配球员做出各种简单的动作,例如转身、踢球等。

最底层是soccerAgent以及basicClient类。soccerAgent类负责处理服务器发来的各种信息,例如比赛开始、比赛中止等;而basicClient类负责与服务器完成通信,从上层接收并发送指令到服务器,将服务器发来的信息上传到上层类。可以认为soccerAgent类就是介于底层通信类和上层抽象球员类之间的一个桥梁

二、交流类

这里的交流类指的是球员之间以及球员和教练之间的交流,可以主要分为三个部分,分别是信息类(xxxMessage)、信息处理类(xxxMessageParser)以及其他类;

在agent2d的球员交流之中,球员之间是用固定的信息模板来进行交流的,agent2d自带了一些固定的信息模板,例如要发送球的位置信息就得调用球的信息类来生成信息,生成一个带有固定前缀码(1个char)以及固定长度的信息,这里面就涉及信息的编码了;之后信息处理类先判断发送来的信息是否符合对应的要求(前缀码和长度),然后再对信息进行解码,获得信息并记录到memory类当中。

三、世界模型类

世界模型类(worldModel)是agent2d的一个非常重要的类,主要的功能就是记录球场的各种状态,例如球的位置,队友的位置,对手的位置,当然这里记录的信息是球员通过视觉或者听觉获得的,并不一定是正确的,会有一定的限制和偏差。

它下设了各种各样的object用于例如记录球以及队友对手的各种属性等等,而这些object类又是继承于AbstractObject类。

四、策略类

策略(strategy)在agnet2d中指的是球队层面的一些战术配合,例如阵型、角色分配等。

agent2d的阵型采用的是DT跑位,这里有必要多介绍一下跑位的相关知识。在Robocup2D的历史中,最开始是没有跑位的,这个时候球员基本都是追着球跑,没有什么战略性可言。之后随着项目的发展,出现了第一种跑位方式——SBSP,基于吸引子与排斥子的跑位,简单的说就是根据球的位置算出一个当前的跑位点,这样大家就不会一窝蜂的去追球了。之后继续发展,出现了DT跑位,通过delauny三角形先把球场划分开,然后以球在这些划分的三角形的交点处为情况设置阵型,而球不在交点的时候就采用三个交点的情形按比例计算出跑位点,具体可以看这篇文章。agent2d采用的是后一种办法。对应的类就是DTFFormation类,agent2d也封装了其他的跑位类,但是没有调用,而这些类都是基于SampleFormation继承而来的。

role类的话就是各种各样的球员角色了,例如守门员、前锋等,不同的角色会有不同的行为。

五、行为类

行为(behavior)在Robocup2D中可以认为是一系列动作(action)的组合,例如踢球是一个动作,但射门就是一个行为,因为射门需要首先确定踢球的角度力度等,踢这个动作只是简单的一环。

agent2d中封装好了许多动作和行为,行为类会调用对应的动作类。如果要修改推荐也是从行为上修改,修改动作相对来说效果并不会非常明显。

上一篇:Robocup2D入门笔记(4)——常见模型

下一篇:Robpcup 2D入门笔记(6)——总结及后续

这篇关于Robocup2D入门笔记(5)——agent2d球队结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/721199

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决