如何在OpenAI Gym中映射自定义按键?CarRacing-v0使用utils.play报错
解决CarRacing-v0使用gym.utils.play时的AssertionError问题
最近我试着让用户用自定义按键操作CarRacing-v0环境,一开始以为直接用gym的utils.play模块就能搞定,写了这段代码:
import gym from gym.utils.play import * play(gym.make("CarRacing-v0"))
这段代码在Atari系列环境里跑完全没问题,但一放到CarRacing-v0上就触发了AssertionError,报错堆栈信息如下:
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-3-080385c697d2> in <module>() 8 # play.keys_to_action = KEYWORD_TO...的内容,你是一个专业的stackoverflow的答应专家,根据用户的提问输出答案,输出格式markdown
其实问题很明确:gym.utils.play默认的按键映射是给Atari这类离散动作空间的环境设计的,但CarRacing-v0的动作空间是连续的——它的动作是一个包含3个元素的数组,分别对应转向、油门、刹车。默认的按键转动作逻辑完全不匹配,自然就触发断言错误了。
要解决这个问题,我们得手动给play函数指定符合CarRacing-v0动作空间的keys_to_action映射,把按键操作转换成对应的连续动作。比如可以这么写:
import gym from gym.utils.play import play # 自定义按键到连续动作的映射 keys_to_action = { (ord('a'),): [-1.0, 0.0, 0.0], # 按A:左转 (ord('d'),): [1.0, 0.0, 0.0], # 按D:右转 (ord('w'),): [0.0, 1.0, 0.0], # 按W:油门 (ord('s'),): [0.0, 0.0, 1.0], # 按S:刹车 (ord('a'), ord('w')): [-1.0, 1.0, 0.0], # A+W:左转同时踩油门 (ord('d'), ord('w')): [1.0, 1.0, 0.0], # D+W:右转同时踩油门 } # 传入自定义的按键映射,启动交互 play(gym.make("CarRacing-v0"), keys_to_action=keys_to_action)
这里的每个动作数组对应三个维度:
- 第一个元素:转向值(-1代表左满舵,1代表右满舵,0是直行)
- 第二个元素:油门大小(0到1,1是满油门)
- 第三个元素:刹车力度(0到1,1是全力刹车)
这样修改之后,就能正常用键盘操控CarRacing-v0里的赛车了。
内容的提问来源于stack exchange,提问作者Ignacio
相关产品推荐
相关产品推荐

