Psychopy IO 游戏手柄

Posted

技术标签:

【中文标题】Psychopy IO 游戏手柄【英文标题】:Psychopy IO Gamepad 【发布时间】:2014-09-12 15:07:12 【问题描述】:

我在 Windows 的独立 PsychoPy 1.80.07 中使用 Builder。我试图弄清楚如何创建一个代码组件来接收来自罗技 F310 游戏手柄的响应。理想情况下,我只想使用触发器。我运行实验时没有收到任何错误代码(这是 Stroop 键盘 IO 演示,其中 IO 键盘代码组件代码替换为以下代码)。它似乎运行良好,但它只是显示第一次试验并等待主题响应,因为它认为它没有听到游戏手柄。另外,我可以运行 XInput Gamepad Coder Demo,一切正常。我是编码的新手,所以任何帮助指出我犯了错误的地方都将不胜感激!

这是我的代码组件中的内容:

#Begin Experiment

try:
    from psychopy import visual, core
    from psychopy.iohub import launchHubServer, EventConstants
    from psychopy.data import getDateStr

    kwargs='psychopy_monitor_name':'default','xinput.Gamepad':
    io=launchHubServer(**kwargs)
    gamepad=io.devices.gamepad
except Exception, e:
    import sys
    print "!! Error starting ioHub: ",e," Exiting..."
    sys.exit(1)

#Begin Routine

response_event=None
trial_start=0
io.clearEvents()

#Each Frame

if frameN == 0:
    io.clearEvents('all')
    trial_start=core.getTime()
else:
    gamepadState=gamepad.getEvents()
    for anyState in gamepadState:
        if anyState in [u'left_trigger',u'right_trigger']:
            response_event=gamepadState
            continueRoutine = False 
            break

#End Routine

trials.addData("trial_start_time", trial_start)
if response_event:
    trials.addData("resp.time", response_event.time)
    trials.addData("resp.rt", response_event.time-trial_start)
    trials.addData("resp.duration", response_event.duration)
    trials.addData('resp.keys',response_event.key)
    trials.addData('resp.corr', response_event.key.lower()==corrAns)
else:
    trials.addData("resp.time",-1.0)
    trials.addData("resp.rt", -1.0)
    trials.addData("resp.duration", -1.0)
    trials.addData('resp.keys','None')
    trials.addData('resp.corr', False)

#End Experiment

io.quit()

【问题讨论】:

我怀疑 gamePadState 不仅仅包含与按下的按钮相对应的字符串,因此您的“if anyState in...”检查总是会失败。你能告诉我们“print(anyState); print(type(anyState))”的结果是什么吗? 【参考方案1】:

如果你想获取手柄上左右触发器的最新值,可以直接用getTriggers()读取这些值,完全不用getEvents()。

getTriggers() 将返回一个字典,其中包含 iohub 触发器的最后读取状态以及读取值的时间。

例如,假设 'gamepad' 是一个保存您的 iohub xinput 游戏手柄设备实例的变量:

gp_triggers = gamepad.getTriggers()
# psychopy time that the trigger values were actually read (in sec.msec)
trig_time = gp_triggers['time']
# values will be between 0.0 and 1.0. 0.0 = Not pressed at all; 1.0 = fully pressed.
left_val, right_val = gp_triggers['left_trigger'], gp_triggers['right_trigger'] 

然后在条件中使用 left_val 和 right_val,这对于您想要接受游戏手柄触发器状态作为响应时有意义。例如,如果您想在任一触发器被按下超过 50% 时接受响应:

if left_val > 0.5 and right_val > 0.5:
    # set some response vars like you were
    response = gp_triggers
    continueRoutine = False 
    break        

稍后在您的代码中,您可以再次访问响应字典的值:

resp_time = response['time']
left_val, right_val = response['left_trigger'], response['right_trigger'] 

【讨论】:

索尔,它正在工作!现在我只需要跳起来让它做我在实验中需要的东西。我希望将游戏手柄响应限制为从第 168 帧开始并持续到接下来的 48 帧的窗口。我还想通过将响应与 $correctAns 进行比较来记录 RT 以及响应是否正确。我还需要通过 RT 上的并行端口(地址 0xDF00)发送一个 ttl 信号,如果响应正确则发送“5”,如果响应不正确则发送“10”。解决这些问题后,我就可以出发了。

以上是关于Psychopy IO 游戏手柄的主要内容,如果未能解决你的问题,请参考以下文章

游戏手柄 + 键盘虚拟摇杆

如何在 Mac OSX 上模拟游戏手柄

Arduino Leonardo 作为游戏手柄

游戏手柄热插拔不起作用

XBOX360无线手柄/有线手柄如何连接PC玩游戏?

如何禁用 Android 游戏手柄默认控件?