Unity-ML-Agents-Soccer Twos环境(3)-AgentSoccer.cs

文章详细解析了UnityML-Agents框架中的AgentSoccer类,包括初始化过程、移动代理的MoveAgent函数、启发式控制方法Heuristic,以及处理碰撞的OnCollisionEnter方法。内容涵盖了团队归属、行为参数、环境参数和奖励机制等关键概念。

官方链接:https://github.com/Unity-Technologies/ml-agents/blob/release_19/Project/Assets/ML-Agents/Examples/Soccer/Scripts/AgentSoccer.cs

目录

1. AgentSoccer.cs

1.1 导入命名空间

1.2 AgentSoccer类

1.3 Initialize()

1.3.1 public override void Initialize()

1.3.2 SoccerEnvController envController = GetComponentInParent()

1.3.3 envController != null

1.3.4 m_BehaviorParameters = gameObject.GetComponent()

1.3.5 m_BehaviorParameters.TeamId == (int)Team.Blue

1.3.6 m_SoccerSettings = FindObjectOfType()

1.3.7 m_ResetParams = Academy.Instance.EnvironmentParameters

1.4 MoveAgent()函数

1.4.1 public void MoveAgent(ActionSegment act)

1.4.2 var forwardAxis = act[0];

1.4.3 switch (forwardAxis)

1.4.4 switch (rightAxis)

1.4.5 switch (rotateAxis)

1.4.6 transform.Rotate(rotateDir, Time.deltaTime * 100f);

1.5 OnActionReceived()

1.5.1 public override void OnActionReceived(ActionBuffers actionBuffers)

1.5.2 AddReward(m_Existential)

1.5.3 MoveAgent(actionBuffers.DiscreteActions)

1.6 Heuristic()方法

1.6.1 public override void Heuristic(in ActionBuffers actionsOut)

1.6.2 var discreteActionsOut = actionsOut.DiscreteActions

1.6.3 Input.GetKey(KeyCode.W)

1.6.4 discreteActionsOut[0] = 1

1.7 OnCollisionEnter()

1.7.1 OnCollisionEnter()

1.7.2 var force = k_Power * m_KickPower

1.7.3 position == Position.Goalie

1.7.4 c.gameObject.CompareTag("ball")

1.7.5 var dir = c.contacts[0].point - transform.position

1.7.6 dir = dir.normalized

1.7.7 c.gameObject.GetComponent().AddForce(dir * force)

1.8 OnEpisodeBegin()

1.8.1 OnEpisodeBegin()

1.8.2 m_BallTouch = m_ResetParams.GetWithDefault("ball_touch", 0)


1. AgentSoccer.cs

1.1 导入命名空间

using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;

public enum Team
{
    Blue = 0,
    Purple = 1
}

这段代码是用于导入Unity ML-Agents的相关类库,包括ML-Agents的核心库以及行为决策相关的库。其中包括:

  • UnityEngine:Unity引擎的核心类库。
  • Unity.MLAgents:Unity ML-Agents的核心类库。
  • Unity.MLAgents.Actuators:定义了Agent的动作类型,例如连续、离散等。
  • Unity.MLAgents.Policies:定义了训练Agent的决策策略,例如随机策略、行为树策略等。

这段代码定义了一个枚举类型Team枚举值为Blue和Purple,用于表示环境中的两个队伍。在Unity ML-Agents中,代理(Agent)之间通常被分成不同的队伍,例如在足球场景中,有蓝队和紫队。使用Team枚举类型来指定队伍,便于对代理进行分类和管理。

1.2 AgentSoccer类

public class AgentSoccer : Agent
{
    // Note that that the detectable tags are different for the blue and purple teams. The order is
    // * ball
    // * own goal
    // * opposing goal
    // * wall
    // * own teammate
    // * opposing player

    public enum Position
    {
        Striker,
        Goalie,
        Generic
    }

    [HideInInspector]
    public Team team;
    float m_KickPower;
    // The coefficient for the reward for colliding with a ball. Set using curriculum.
    float m_BallTouch;
    public Position position;

    const float k_Power = 2000f;
    float m_Existential;
    float m_LateralSpeed;
    float m_ForwardSpeed;


    [HideInInspector]
    public Rigidbody agentRb;
    SoccerSettings m_SoccerSettings;
    BehaviorParameters m_BehaviorParameters;
    public Vector3 initialPos;
    public float rotSign;

    EnvironmentParameters m_ResetParams;



......


}

这部分代码定义了一个叫做 AgentSoccer 的类,并声明了其中的一些变量和枚举类型。

team 变量是一个枚举类型 Team,枚举成员包括 BluePurple,用于表示代理所在的队伍。

m_KickPowerm_BallTouch 变量是 float 类型,分别用于表示代理的踢球力量和碰到球的次数(球被踢的次数)m_BallTouch 变量的值可以通过课程设定进行修改。

position 变量是一个枚举类型 Position,枚举成员包括 StrikerGoalieGeneric,用于表示代理的位置前锋(Striker)、门将(Goalie)或者普通(Generic)。

[HideInInspector]是一个用于Unity的C#脚本的属性修饰符。它的作用是隐藏Unity编辑器面板上的公共变量。在脚本中使用[HideInInspector]修饰的变量仍然可以在代码中进行访问和修改,但是在编辑器中将不会显示该变量。这通常用于保护变量不被其他脚本修改,同时又不想让该变量在编辑器中显示出来。

k_Power常量是float类型,其值为2000.0f。在代码中,常量使用const关键字来声明,一旦声明并赋值后,在程序执行期间不会改变。

m_Existentialm_LateralSpeedm_ForwardSpeed 变量是 float 类型,分别用于表示代理获得的奖励、横向速度和前向速度。

agentRb 变量是一个 Rigidbody 类型,用于表示代理的物理属性。

m_SoccerSettings 变量是一个 SoccerSettings 类型,用于存储足球比赛的相关设置信息。

m_BehaviorParameters 变量是一个 BehaviorParameters 类型,用于表示代理的行为参数,例如它所使用的神经网络模型。

initialPos 变量是一个 Vector3 类型,表示代理的初始位置。

rotSign 变量是一个 float 类型,用于控制代理的旋转方向。

m_ResetParams 变量是一个 EnvironmentParameters 类型,用于存储重置环境的参数。

1.3 Initialize()

public override void Initialize()
{
    // 获取环境控制器,计算当前代理在环境中的存在时间比例
    SoccerEnvController envController = GetComponentInParent<SoccerEnvController>();
    if (envController != null)
    {
        m_Existential = 1f / envController.MaxEnvironmentSteps;
    }
    else
    {
        m_Existential = 1f / MaxStep;
    }

    // 获取代理的BehaviorParameters组件,判断代理所在的队伍和初始位置
    m_BehaviorParameters = gameObject.GetComponent<BehaviorParameters>();
    if (m_BehaviorParameters.TeamId == (int)Team.Blue)
    {
        team = Team.Blue;
        initialPos = new Vector3(transform.position.x - 5f, .5f, transform.position.z);
        rotSign = 1f;
    }
    else
    {
        team = Team.Purple;
        initialPos = new Vector3(transform.position.x + 5f, .5f, transform.position.z);
        rotSign = -1f;
    }

    // 根据代理的位置属性设置代理的运动速度
    if (position == Position.Goalie)
    {
        m_LateralSpeed = 1.0f;
        m_ForwardSpeed = 1.0f;
    }
    else if (position == Position.Striker)
    {
        m_LateralSpeed = 0.3f;
        m_ForwardSpeed = 1.3f;
    }
    else
    {
        m_LateralSpeed = 0.3f;
        m_ForwardSpeed = 1.0f;
    }

    // 获取SoccerSettings对象和代理的刚体组件,并设置初始角速度和最大角速度
    m_SoccerSettings = FindObjectOfType<SoccerSettings>();
    agentRb = GetComponent<Rigidbody>();
    agentRb.maxAngularVelocity = 500;

    // 获取环境的重置参数对象
    m_ResetParams = Academy.Instance.EnvironmentParameters;
}

在这段代码中,首先通过 GetComponentInParent<SoccerEnvController>() 获取当前 Agent 所在的 SoccerEnvController 组件,然后根据获取到的 SoccerEnvController 组件来设置 m_Existential 变量。如果获取不到 SoccerEnvController 组件,则直接使用 MaxStep(即训练步数)来设置 m_Existential 变量。

接下来,根据 BehaviorParameters 中设置的 TeamId 来确定 Agent 的队伍和初始位置。如果 TeamId 为 0,则为蓝队,初始位置在当前位置左边 5 个单位;如果 TeamId 为 1,则为紫队,初始位置在当前位置右边 5 个单位。同时,rotSign 变量也被设定为 1 或 -1,用于在训练中控制 Agent 的旋转方向。

然后根据 Agent 的位置属性来设定其速度属性。如果 Agent 是守门员,则设定其横向和纵向速度都为 1.0;如果是前锋,则横向速度为 0.3,纵向速度为 1.3;否则(位置为 Generic),则横向速度为 0.3,纵向速度为 1.0。

接下来,通过 FindObjectOfType<SoccerSettings>() 获取 SoccerSettings 组件,并将 agentRb 设定为当前 Agent 的 Rigidbody 组件。此外,还将 agentRb 的 maxAngularVelocity 设定为 500。

最后,使用 Academy.Instance.EnvironmentParameters 获取环境参数,并将其设定为 m_ResetParams。

1.3.1 public override void Initialize()

Initialize() 是 Agent 类中的一个虚函数,需要被重写。在该函数中,可以进行一些初始化的工作,比如初始化 Agent 的状态、设定 Agent 的动作空间和观察空间等。

1.3.2 SoccerEnvController envController = GetComponentInParent<SoccerEnvController>()

SoccerEnvController envController = GetComponentInParent<SoccerEnvController>();

这行代码的作用是获取当前Agent所在的父物体(Parent)并获取其上挂载的SoccerEnvController组件的引用,以便在后续的代码中获取该环境的最大步数。GetComponentInParent方法会在当前GameObject的父物体上查找该类型的组件。如果没有找到,则会继续在父物体上查找,直到找到该组件或者查找到达根节点为止。

1.3.3 envController != null

    if (envController != null)
    {
        m_Existential = 1f / envController.MaxEnvironmentSteps;
    }
    else
    {
        m_Existential = 1f / MaxStep;
    }

这段代码的作用是获取Agent所在的Soccer环境控制器(SoccerEnvController)的组件,判断其是否为空。如果不为空,则将m_Existential设置为1除以Soccer环境控制器的最大步数(MaxEnvironmentSteps);否则将m_Existential设置为1除以Agent的最大步数(MaxStep)。

如果envController不为空,说明Agent是被包含在SoccerEnvController中的一个子GameObject中,这时可以从父级对象中获取到环境控制器的组件。如果envController为空,说明Agent并不在SoccerEnvController中,而是单独作为一个对象存在,此时需要使用Agent自身的最大步数。

1.3.4 m_BehaviorParameters = gameObject.GetComponent<BehaviorParameters>()

m_BehaviorParameters = gameObject.GetComponent<BehaviorParameters>();

这一行代码是获取当前游戏对象(agent)上的BehaviorParameters组件该组件包含了一些特定的行为参数和策略。这些参数和策略可以影响agent的决策和行为。在Unity ML-Agents中,BehaviorParameters组件是在训练开始时指定的。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天寒心亦热

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值