Psychopy IO Gamepad

Я использую Builder в автономной версии PsychoPy 1.80.07 в Windows. Я пытаюсь понять, как создать компонент кода, чтобы получать ответы от геймпада Logitech F310. В идеале я хотел бы просто использовать триггеры. Я не получаю никакого кода ошибки при запуске эксперимента (это демонстрация ввода-вывода клавиатуры Stroop с заменой кода компонента кода ввода-вывода на код ниже). Кажется, что он работает нормально, но он просто показывает первое испытание и ожидает ответа от субъекта, поскольку думал, что он не слышит геймпад. Кроме того, я могу запустить демо-версию XInput Gamepad Coder, и все работает отлично. Я новичок в кодировании, поэтому любая помощь в указании, где я допустил ошибки, будет высоко ценится!

Вот что у меня в компоненте кода:

#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()

1 ответ

Если вы хотите получить последнее значение левого и правого триггеров на геймпаде, вы можете прочитать эти значения напрямую с помощью getTriggers() и вообще не использовать getEvents().

getTriggers() вернет dict, содержащий последнее состояние чтения триггеров iohub и время чтения значений.

Например, предположим, что 'gamepad' является переменной, содержащей ваш экземпляр устройства iohub xinput gamepad:

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        

Затем в вашем коде вы снова можете получить доступ к значениям ответа dict:

resp_time = response['time']
left_val, right_val = response['left_trigger'], response['right_trigger'] 
Другие вопросы по тегам