You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:23:20