开发工具
- Unity2019.4.7f1
- 3D
安装插件
导入完成
布置场景
1.创建面板
首先将坐标控制为0,0,0,位置
创建两个球体,两个材质体
设置红球可以移动
- 为红球添加刚体
此时,两个球体,自身都有碰撞检测器Sphere Collider
设置摄像机的场景
首先选择Main Camera 在导航栏中选择GameObject ->Align With View or Ctrl+Shift+F
规范:创建文件夹存放脚本
设置Unity脚本编辑器
创建脚本RollerAgent,继承自Agent智能体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//引入命名空间
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
public class RollerAgent : Agent
{
public Transform transform;
Rigidbody rBody;
// Start is called before the first frame update
void Start()
{
rBody = GetComponent<Rigidbody>();
}
//进入新一轮调用的函数
public override void OnEpisodeBegin()
{
base.OnEpisodeBegin();
}
//收集观察的结果
public override void CollectObservations(VectorSensor sensor)
{
base.CollectObservations(sensor);
}
//接收动作是否得到奖励
public override void OnActionReceived(float[] vectorAction)
{
print("Horizontal" + vectorAction[0]);
print("Vertical" + vectorAction[1]);
}
//是否手动操作智能体
public override void Heuristic(float[] actionsOut)
{
//拿到水平垂直的位置
actionsOut[0] = Input.GetAxis("Horizontal");
actionsOut[1] = Input.GetAxis("Vertical");
}
}
- 继续为AI添加脚本
上图第四个,启发式类型,和代码一样:是否手动操作智能体
运行: - 让红球跟着移动
public float speed=10; //定义一个速度
//设置位置
Vector3 control = Vector3.zero;
control.x = vectorAction[0];
control.z = vectorAction[1];
rBody.AddForce(control * speed);
重置游戏
//进入新一轮调用的函数
public override void OnEpisodeBegin()
{
print("Start");
//重新开始小球的位置
this.transform.position = new Vector3(2, 0.5f, 0);
//速度和旋转
this.rBody.velocity = Vector3.zero;
this.rBody.angularVelocity = Vector3.zero;
//base.OnEpisodeBegin();
}
接收动作 - 设置智能体奖励
此时分成两处代码块
- 1.狗子出界
if (this.transform.position.y<0)
{//掉到外部-结束此轮游戏
EndEpisode();
}
- 2.狗子成功
判断条件 - 物体相碰
float distance = Vector3.Distance(this.transform.position,target.position);
if (distance < 1.4f)
{//小球距离
print("狗子成功了");
SetReward(1.0f);
EndEpisode();
}
随机Target的位置并收集观察结果
在开始的方法OnEpisodeBegin中添加
- 随机生成骨头的位置
target.position = new Vector3(Random.value*8-4,0.5f, Random.value * 8 - 4);
收集观察结果完成前期训练准备
CollectObservations方法中
//收集观察的结果
public override void CollectObservations(VectorSensor sensor)
{//--添加观察者
//当前位置坐标,targer的坐标
sensor.AddObservation(target.position);
sensor.AddObservation(this.transform.position);
//速度 x,z
sensor.AddObservation(rBody.velocity.x);
sensor.AddObservation(rBody.velocity.z);
//base.CollectObservations(sensor);
}
Unity面板中
-
- 修改Behavior Name
RollerBall
- 2. Space Size观察几个值
一个Position是三个值,即x,y,z
x,z轴的速度都是一个float的值 所以是两个值
3+3+1+1=8个
- 3. Stacked Vectors 压缩成几位的向量
1
-
4. Vector Action 监听多少向量 Heuristic方法中监听的float值
x+y=2 -
- Behavior Type 启发学习
改成默认Default
训练
- 1.新建文件夹
放入
config.yaml文件 注意:RollerBall名字和上述的Unity面板1中的Behavior Name相同
behaviors:
RollerBall:
trainer_type: ppo
hyperparameters:
batch_size: 64
buffer_size: 12000
learning_rate: 0.0003
beta: 0.001
epsilon: 0.2
lambd: 0.99
num_epoch: 3
learning_rate_schedule: linear
network_settings:
normalize: true
hidden_units: 128
num_layers: 2
vis_encode_type: simple
reward_signals:
extrinsic:
gamma: 0.99
strength: 1.0
keep_checkpoints: 5
max_steps: 300000
time_horizon: 1000
summary_freq: 1000
threaded: true
打开 激活
activate ml-agents
切换到项目盘
(ml-agents) D:\Desktop\zhao_qian项目集\Roll-A-Ball\Assets\Train>mlagents-learn config.yaml
当前没有使用GPU 说以忽略GPU的错误
运行访问
直接断开了,提示的这个错误是什么呀?
File "d:\_zqstudent\envs\ml-agents\lib\site-packages\mlagents\trainers\learn.py", line 82, in run_training maybe_init_path, File "d:\_zqstudent\envs\ml-agents\lib\site-packages\mlagents\trainers\trainer_util.py", line 154, in handle_existing_directories "Previous data from this run ID was found. "
mlagents.trainers.exception.UnityTrainerException: Previous data from this run ID was found. Either specify a new run ID, use --resume to resume this run, or use the --force parameter to overwrite existing data.
(ml-agents) D:\Desktop\zhao_qian项目集\Roll-A-Ball\Assets\Train>mlagents-learn config.yaml
我的出现了错误,没有使用视屏给的这种
更改后代码
(ml-agents) D:\Desktop\zhao_qianDemo\Roll-A-Ball\Assets\Train>mlagents-learn config.yaml --run-id=firstRun --train
自动移动---切换到 Unity 运行项目,就可以看见开始训练了
-------- 训练结束,断开连接(unity中停止运行)
将文件中的模型赋值
-- 再次运行结束,不用使用cmd命令行
unity安装