初始化 unity 环境

1

2

3

4

5import numpy as np

import matplotlib.pyplot as plt

from mlagents.envs import UnityEnvironment

%matplotlib inline

初始化环境 env = UnityEnvironment(file_name="3DBall", worker_id=0, seed=1)

file_name 是 unity 编译生成的二进制可执行环境。

worker_id 表示你想用哪个端口来与环境进行交互,可以用来进行并行交互,比如 A3C 。

seed 为训练过程中的随机种子,如果想让 untiy 环境每次随机的效果相同,则种子设置为固定值。

若 file_name=None 则表示 python 直接与 unity editor 进行交互,等待编辑器中的开始按钮被按下 Start training by pressing the Play button in the Unity Editor ,同时这个时候 worker_id 必须为 0 才能与编辑器进行连接。

1env = UnityEnvironment()

INFO:mlagents.envs:Start training by pressing the Play button in the Unity Editor.

INFO:mlagents.envs:

'Academy' started successfully!

Unity Academy name: Academy

Number of Brains: 2

Number of Training Brains : 2

Reset Parameters :

copy -> 1.0

Unity brain name: Brain1

Number of Visual Observations (per agent): 2

Vector Observation space size (per agent): 8

Number of stacked Vector Observation: 1

Vector Action space type: continuous

Vector Action space size (per agent): [2]

Vector Action descriptions: 3, 3

Unity brain name: Brain2

Number of Visual Observations (per agent): 0

Vector Observation space size (per agent): 8

Number of stacked Vector Observation: 1

Vector Action space type: continuous

Vector Action space size (per agent): [2]

Vector Action descriptions: 3, 3

获取基础 brain 信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27print(env.brains)

print(env.brain_names)

for name in env.brain_names:

params = env.brains[name]

print(params)

print('brain_name: ', end='')

print(params.brain_name)

print('num_stacked_vector_observations: ', end='') # 向量状态栈大小

print(params.num_stacked_vector_observations)

print('vector_observation_space_size: ', end='')

print(params.vector_observation_space_size) # 向量状态空间

print('number_visual_observations: ', end='')

print(params.number_visual_observations) # 图像状态数量

print('camera_resolutions: ', end='')

print(params.camera_resolutions) # 图像的分辨率

print('vector_action_space_type: ', end='')

print(params.vector_action_space_type) # 行为空间类型(离散或连续)

print('vector_action_space_size: ', end='')

print(params.vector_action_space_size) # 行为空间

print('vector_action_descriptions: ', end='')

print(params.vector_action_descriptions) # 行为描述

print('---------')

{'Brain1': , 'Brain2': }

['Brain1', 'Brain2']

Unity brain name: Brain1

Number of Visual Observations (per agent): 2

Vector Observation space size (per agent): 8

Number of stacked Vector Observation: 1

Vector Action space type: continuous

Vector Action space size (per agent): [2]

Vector Action descriptions: 3, 3

brain_name: Brain1

num_stacked_vector_observations: 1

vector_observation_space_size: 8

number_visual_observations: 2

camera_resolutions: [{'height': 450, 'width': 500, 'blackAndWhite': False}, {'height': 550, 'width': 600, 'blackAndWhite': False}]

vector_action_space_type: continuous

vector_action_space_size: [2]

vector_action_descriptions: ['3', '3']

---------

Unity brain name: Brain2

Number of Visual Observations (per agent): 0

Vector Observation space size (per agent): 8

Number of stacked Vector Observation: 1

Vector Action space type: continuous

Vector Action space size (per agent): [2]

Vector Action descriptions: 3, 3

brain_name: Brain2

num_stacked_vector_observations: 1

vector_observation_space_size: 8

number_visual_observations: 0

camera_resolutions: []

vector_action_space_type: continuous

vector_action_space_size: [2]

vector_action_descriptions: ['3', '3']

---------

重置训练环境,开始交互

train_mode=True 表示是训练模式,即用的是 Acadmey 中的 Training Configuration , train_mode=False 为推断模式,即用的是 Acadmey 中的 Inference Configuration ,unity 中会将每帧都绘制

config={} 是 reset 环境时的参数,类型为 dict 。需要预先在 unity editor 中定义所有的参数。

返回为一个 dict ,包含所有 brain 的信息

1

2

3brain_infos = env.reset(train_mode=True, config={

'copy': 1

})

INFO:mlagents.envs:Academy reset with parameters: copy -> 1

vector_observations 是一个 numpy ,维度为 (智能体数量, 向量状态的长度 * 向量状态栈大小) ,其中向量状态栈代表有多少状态被储存起来一起作为当前的状态

visual_observations 是一个 list ,个数为 Brain 中设置的摄像机的个数,其中每一个元素为也为一个 list ,长度为智能体数量。该 list 中的元素为一个三维的 numpy ,维度为 (长,宽,通道数) 。如每个 Brain 要设置左右两台观测的摄像机,则 visual_observations 长度为 2 ,分别代表左右两个摄像机。第一个元素为所有智能体的左摄像机的图像集合,第二个元素为所有只能提的右摄像机的图像集合。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29for name in env.brain_names:

params = env.brains[name]

info = brain_infos[name]

print(info)

print('vector_observations: ', end='') # 向量状态 numpy

print(info.vector_observations.shape)

print('visual_observations: ') # 图像状态 list

for i, obs_per_camera in enumerate(info.visual_observations):

print('\t', 'number of agents', len(obs_per_camera))

for j, ob in enumerate(obs_per_camera):

print(ob.shape)

if params.camera_resolutions[i]['blackAndWhite']:

plt.imshow(ob[:, :, 0], cmap=plt.cm.gray)

else:

plt.imshow(ob)

plt.show()

print('text_observations: ', end='') # 文字状态 list

print(info.text_observations)

print('rewards: ', end='') # 奖励 list

print(info.rewards)

print('local_done: ', end='') # 智能体回合是否结束 list

print(info.local_done)

print('max_reached: ', end='') # 智能体回合是否到达最大步数(如果达到最大步数,无论智能体回合是否结束,local_done 也为 True) list

print(info.max_reached)

print('previous_vector_actions: ', end='') # 上一个向量行为 numpy

print(info.previous_vector_actions.shape)

print('agents: ', end='') # 所有智能体 id list

print(info.agents)

print('---------')

vector_observations: (2, 8)

visual_observations:

number of agents 2

(450, 500, 3)

(450, 500, 3)

number of agents 2

(550, 600, 3)

(550, 600, 3)

text_observations: ['', '']

rewards: [0.0, 0.0]

local_done: [False, False]

max_reached: [False, False]

previous_vector_actions: (2, 2)

agents: [14714, 14736]

---------

vector_observations: (1, 8)

visual_observations:

text_observations: ['']

rewards: [0.0]

local_done: [False]

max_reached: [False]

previous_vector_actions: (1, 2)

agents: [14658]

---------

一个最简单的交互方式

1

2

3

4

5

6

7

8env.reset(train_mode=False, config={

'copy': 1

})

for i in range(200):

env.step({

'Brain1': np.random.randn(2, 2),

'Brain2': np.random.randn(1, 2)

})

INFO:mlagents.envs:Academy reset with parameters: copy -> 1

一个单 brain 的复杂例子(不能直接执行,只是演示)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41def simulate(brain_info):

steps_n = 0

dones = [False] * len(brain_info.agents)

trans_all = [[] for _ in range(len(brain_info.agents))]

rewards_sum = [0] * len(brain_info.agents)

states = brain_info.vector_observations

while False in dones and not env.global_done:

actions = ppo.choose_action(states)

brain_info = env.step({

default_brain_name: actions

})[default_brain_name]

rewards = brain_info.rewards

local_dones = brain_info.local_done

max_reached = brain_info.max_reached

states_ = brain_info.vector_observations

for i in range(len(brain_info.agents)):

trans_all[i].append([states[i],

actions[i],

np.array([rewards[i]]),

local_dones[i],

max_reached[i]])

if not dones[i]:

rewards_sum[i] += rewards[i]

dones[i] = dones[i] or local_dones[i]

steps_n += 1

states = states_

return brain_info, trans_all, rewards_sum

brain_info = env.reset(train_mode=False)[default_brain_name]

for iteration in range(ITER_MAX):

if env.global_done:

brain_info = env.reset(train_mode=train_mode)[default_brain_name]

brain_info, trans_all, rewards_sum = simulate(brain_info)

mean_reward = sum(rewards_sum) / len(rewards_sum)

踩过的坑

如果直接给 step 传入 dict 的话,尽管每个 brain 的 action 都是 numpy 类型,但在执行完毕后会变为 list

1

2

3

4

5

6

7

8env.reset(train_mode=True)

actions = {

'Brain1': np.random.randn(2, 2),

'Brain2': np.random.randn(1, 2)

}

print(type(actions['Brain1']), type(actions['Brain2']))

brain_info = env.step(actions)

print(type(actions['Brain1']), type(actions['Brain2']))

关闭连接

1env.close()

unity和python通讯_Python 与 Unity mlagents 交互 API相关推荐

  1. arduino和python对接_Python:与Arduino进行交互-后续

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 通过Python与Arduino进行交互 首先,我们得导入serial库来连接python与Arduino ...

  2. 【100个 Unity踩坑小知识点】| Unity调用API ,动态获取Android权限,附带所有Android权限表格

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  3. 【Unity】【Wwise】在Unity中获取某个Wwise事件的持续时间

    [Unity][Wwise]在Unity中获取某个Wwise事件的持续时间 解决方案 注意事项 边边角角 小吐槽 有一次接到这么一个需求:要在界面上显示出一段人物语音的长度,并且在播放的时候进行倒计时 ...

  4. unity 200.8m yoy_没错,Unity双十一来了

    Unity调价通知发布后,Unity官方微信后台收到不少关于Unity双十一的咨询.今年不仅有双十一,还将持续一整个月! 本次"双十一活动"是调价前最后一次软件授权优惠,可以说是购 ...

  5. python画代码-Python教程_Python画Mandelbrot集 代码

    Python教程_Python画Mandelbrot集 代码 作者:Comet 来源: 课课家 www.kokojia.com点击数:278发布时间:2015-06-19 11:17:19 曼德勃罗集 ...

  6. unity 删除子节点_【Unity文档】Realtime GI介绍(一)

    * 介绍 Unity中,有两种GI的技术:烘焙(Baked)和预计算实时(Precomputed Realtime)全局光照,这篇是讲预计算实时部分的 目录 如何决定光图分辨率 光图中的Charts是 ...

  7. Unity优化之GC——合理优化Unity的GC (难度3 推荐5)

    原文链接: http://www.cnblogs.com/zblade/p/6445578.html 最近有点繁忙,白天干活晚上抽空写点翻译,还要运动,所以翻译工作进行的有点缓慢 =.= 本文续接前面 ...

  8. unity运行环境_LG电子与Unity合作仿真软件 加速研发更安全的自动驾驶汽车系统...

    据外媒报道,位于硅谷的韩国LG电子公司美国研发中心(LG Electronics America R&D Center)的工程师正与Unity Technologies公司的机器学习专家合作, ...

  9. python多线程_Python多线程和队列结合demo

    每周一07:22,准时为你充电 一.使用场景 大家都知道python的多线程不是真正的多线程,但是对于io类型的任务,多线程还是能发挥作用的.那么多个线程之间是如何进行变量共享的呢,很多时候我们可以借 ...

最新文章

  1. socket 995 错误 boost
  2. 25个别出心裁的简历设计作品欣赏
  3. 骚操作!阿里对业务中台痛下杀手!但却继续推进数据中台?
  4. Windows计算机管理打不开提示程序未关联解决办法
  5. 撞库攻击:一场需要用户参与的持久战
  6. 您是否也想过让你的电脑百毒不侵呢!
  7. Apache Camel 2.12 –支持后退,以减少较积极的轮询路线
  8. Python可以这样学(第六季:SQLite数据库编程)-董付国-专题视频课程
  9. Shell脚本学习-阶段十二-在CentOS 7上给一个网卡分配多个IP地址
  10. 重载 重载递增递和减运算符
  11. vscode的pip安装
  12. 将Hexo个人博客部署到个人云服务器--最详细踩坑教程
  13. 游戏中符文系统与天赋系统等的作用
  14. 爬取贝壳网的40000条基本数据
  15. 【离散数学】数学归纳法
  16. 在Sonar中配置license和copyright的检查
  17. 卡西欧计算机如何取消g,卡西欧g-shock怎么关闭闹钟 gshock取消闹钟方法
  18. 三维激光点云到二维图像的投影
  19. 2020-12-17 前辈科研体会及博客分享
  20. golang快速扫描

热门文章

  1. 模块的封装性分析-读书笔记
  2. CodeProject每日精选: Progress controls 进度条
  3. Python_类的特殊成员方法
  4. 解决jQuery与其他库冲突的方法
  5. HTML-超链接锚点笔记
  6. 动手学深度学习(PyTorch实现)(二)--softmax与分类模型
  7. 全局变量及其含义php,php Server:php超全局变量Server的含义与用法示例
  8. php 仓库管理实例,php+mysql超市仓库管理系统
  9. C#中的类声明和对象定义方法实验
  10. oracle rlw,Oracle数据库终于支持R语言 发力数据挖掘