心理学和pylink例子

Mik*_*Mik 5 eye-tracking psychopy

我正在努力将心理学实验与eyelink眼睛跟踪系统相结合.这样做的方式似乎是通过pylink.不幸的是,我真的不熟悉pylink,我希望有一个实验样本将两者结合起来.我找不到一个.如果有人能够分享一个例子或者指向一个比sr-research提供的pylink api更易于访问的手册,我将非常感激.

谢谢!

Mic*_*ill 8

而不是PyLink,你可能想要在PsychoPy中使用ioHub系统.这是一个更通用的眼动追踪系统,它还允许以通用格式保存数据(与PsychoPy事件集成),并提供数据分析和可视化工具.

ioHUb可与您正在使用的特定眼动仪无关.您只需创建一个特定于EyeLink系统的配置文件,然后使用ioHiv提供的通用功能进行校准,实时访问凝视数据等.

这里有一些教学资源:http://www.psychopy.org/resources/ECEM_Python_materials.zip


bri*_*son 8

我很高兴你找到了解决方案.我没有使用iohub,但我们确实使用了心理学和眼线笔,因此下面的一些代码可能对其他想要调用更直接通信的人有用.请注意,我们的计算机使用Archlinux.如果下列任何一项对您没有任何意义,请不要担心,但也许它会帮助那些绊倒我们同样道路的人.

实验机与眼动仪之间的通信

首先,您必须与eyelink建立通信.如果您的实验机器已打开并插入实时Eyelink计算机,那么在Linux上您必须首先设置以太网卡,然后设置Eyelink使用的默认地址(这也适用于Eyelink 1000 - 它们保持相同的地址).请注意,您的以太网名称可能与enp4s0不同.尝试简单地使用ip link并寻找类似的东西.注意:这些命令正在输入终端.

#To set up connection with Eyelink II computer:
#ip link set enp4s0 up
#ip addr add 100.1.1.2/24 dev enp4s0
Run Code Online (Sandbox Code Playgroud)

Eyetracker功能

我们发现编写一些与Eyelink计算机通信的功能很方便.例如:

初始化Eyetracker

sp 指的是screenx的元组,屏幕尺寸.

def eyeTrkInit (sp):
        el = pl.EyeLink()
        el.sendCommand("screen_pixel_coords = 0 0 %d %d" %sp)
        el.sendMessage("DISPLAY_COORDS  0 0 %d %d" %sp)
        el.sendCommand("select_parser_configuration 0")
        el.sendCommand("scene_camera_gazemap = NO")
        el.sendCommand("pupil_size_diameter = %s"%("YES"))
        return(el)
Run Code Online (Sandbox Code Playgroud)

注意:pl功能来自import pylink as pl.另外,请注意,您可以在线找到另一个名为pylink的python库.它可能不是你想要的那个.通过Eyelink论坛,从那里获取pylink.它很旧,但它仍然有效.

校准Eyetracker

el是上面初始化的eyetracker对象的名称.sp屏幕尺寸,并且cd是颜色深度,例如32.

def eyeTrkCalib (el,sp,cd):
     pl.openGraphics(sp,cd)
     pl.setCalibrationColors((255,255,255),(0,0,0))
     pl.setTargetSize(int(sp[0]/70), int(sp[1]/300)) 
     pl.setCalibrationSounds("","","")
     pl.setDriftCorrectSounds("","off","off")
     el.doTrackerSetup()
     pl.closeGraphics()
     #el.setOfflineMode()
Run Code Online (Sandbox Code Playgroud)

打开数据文件

您可以与眼动仪进行通信,并执行打开文件等操作

def eyeTrkOpenEDF (dfn,el):
     el.openDataFile(dfn + '.EDF')
Run Code Online (Sandbox Code Playgroud)

漂移校正

或漂移正确

def driftCor(el,sp,cd):
    blockLabel=psychopy.visual.TextStim(expWin,text="Press the space bar to begin drift correction",pos=[0,0], color="white", bold=True,alignHoriz="center",height=0.5)
    notdone=True            
    while notdone:
        blockLabel.draw()
        expWin.flip()
        if keyState[key.SPACE] == True:
            eyeTrkCalib(el,sp,cd)
            expWin.winHandle.activate()
            keyState[key.SPACE] = False
            notdone=False
Run Code Online (Sandbox Code Playgroud)

发送和获取消息.

您可以设置许多内置变量,也可以添加自己的变量.这是一个从python程序向eyelink发送消息的示例

eyelink.sendMessage("TRIALID "+str(trialnum))
    eyelink.startRecording(1,1,1,1)

eyelink.sendMessage("FIX1")
    tFix1On=expClock.getTime()
Run Code Online (Sandbox Code Playgroud)

注视特遣队编程

以下是一些代码的一部分,它们使用了eyelink在实验程序逻辑中的最新示例.

while notdone:
            if recalib==True:
                dict['recalib']=True
                eyelink.sendMessage("RECALIB END")
                eyelink.startRecording(1,1,1,1)
                recalib=False
            eventType=eyelink.getNextData()
            if eventType==pl.STARTFIX or eventType==pl.FIXUPDATE or eventType==pl.ENDFIX:
                sample=eyelink.getNewestSample()

                if sample != None:
                    if sample.isRightSample():
                        gazePos = sample.getRightEye().getGaze()
                    if sample.isLeftSample():
                        gazePos = sample.getLeftEye().getGaze()

                gazePosCorFix = [gazePos[0]-scrx/2,-(gazePos[1]-scry/2)]

                posPix = posToPix(fixation)
                eucDistFix = sqrt((gazePosCorFix[0]-posPix[0])**2+(gazePosCorFix[1]-posPix[1])**2)

                if eucDistFix < tolFix:
                    core.wait(timeFix1)
                    notdone=False
                    eyelink.resetData()
                    break
Run Code Online (Sandbox Code Playgroud)

快乐的黑客.