首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何映射开放AI健身房游戏中的自定义键?

如何映射开放AI健身房游戏中的自定义键?
EN

Stack Overflow用户
提问于 2018-04-09 02:04:13
回答 1查看 683关注 0票数 3

我试图让用户使用自定义键来播放赛车-V0环境,我认为我可以这样使用utils.play:

代码语言:javascript
复制
import gym
from gym.utils.play import *

play(gym.make("CarRacing-v0"))

它对atari环境很好,但在本例中,我得到了

代码语言:javascript
复制
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-3-080385c697d2> in <module>()
      8 # play.keys_to_action = KEYWORD_TO_KEY
      9 
---> 10 play(gym.make("CarRacing-v0"))
     11 
     12 # mapping of keys

~/Documents/openai/gym/gym/utils/play.py in play(env, transpose, fps, zoom, callback, keys_to_action)
     92         else:
     93             assert False, env.spec.id + " does not have explicit key to action mapping, " + \
---> 94                           "please specify one manually"
     95     relevant_keys = set(sum(map(list, keys_to_action.keys()),[]))
     96 

AssertionError: CarRacing-v0 does not have explicit key to action mapping, please specify one manually

所以我想知道如何做这个自定义的动作映射?play代码中的注释说它是一个映射keys_to_action: dict: tuple( int ) -> int

atari_env是这样做的:

代码语言:javascript
复制
KEYWORD_TO_KEY = {
            'UP':      ord('w'),
            'DOWN':    ord('s'),
            'LEFT':    ord('a'),
            'RIGHT':   ord('d'),
            'FIRE':    ord(' '),
        }

我知道car_racing脚本通过捕获按在3个元素数组中的键并将该值传递给env.step来实现这一点。所以我尝试了一种类似的方法:

代码语言:javascript
复制
KEYWORD_TO_KEY = {'STEER':ord('a'),'GAS':ord('w'),'BREAK':ord('s')}
play.keys_to_action = KEYWORD_TO_KEY

它没有起作用。我知道转向是错误的,但我想我至少可以让车辆转向一个方向。然后,我检查了将关键字重新映射到Atari游戏中的一个自定义组合。游戏成功了,但关键的映射是原始的,而不是我的修改。

你们知道如何正确地进行这个自定义键映射吗?

EN

回答 1

Stack Overflow用户

发布于 2022-09-12 11:48:14

下面是一个游戏游戏的例子。我还在评论中包括了其他健身房运动员的比赛方式。

代码语言:javascript
复制
import pygame
import gym
from gym.utils.play import play        
import numpy as np 
import warnings
warnings.filterwarnings('ignore')

# mapping = {(pygame.K_LEFT,): 0, (pygame.K_RIGHT,): 1}
# play(gym.make("CartPole-v0"), keys_to_action=mapping)

# mapping = {(pygame.K_LEFT,): 0, (pygame.K_RIGHT,): 2}
# play(gym.make("MountainCar-v0"), keys_to_action=mapping, noop=0)

mapping = {"w": np.array([0, 0.7, 0]),
            "a": np.array([-1, 0, 0]),
            "s": np.array([0, 0, 1]),
            "d": np.array([1, 0, 0]),
            "wa": np.array([-1, 0.7, 0]),
            "dw": np.array([1, 0.7, 0]),
            "ds": np.array([1, 0, 1]),
            "as": np.array([-1, 0, 1]),
            }
default_action = np.array([0,0,0])
play(gym.make("CarRacing-v2"), keys_to_action=mapping, noop=default_action)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49724621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档