Psychopy 和 pylink 示例
Psychopy and pylink example
我正在致力于将心理实验与 eyelink 眼动追踪系统相结合。执行此操作的方法似乎是通过 pylink。不幸的是,我真的不熟悉 pylink,我希望有一个结合这两者的实验样本。我找不到一个。如果有人能够分享一个示例或向我指出比 sr-research 提供的 pylink api 更易于访问的手册,我将非常感激。
谢谢!
您可能想要研究在 PsychoPy 中使用 ioHub 系统而不是 PyLink。这是一个更通用的眼动追踪系统,还允许以通用格式保存数据(与 PsychoPy 事件集成),并提供数据分析和可视化工具。
ioHUb 的构建与您正在使用的特定眼动仪无关。您只需创建一个特定于您的 EyeLink 系统的配置文件,然后使用 ioHiv 提供的通用功能进行校准、实时访问眼动数据等。
这里有一些教学资源:http://www.psychopy.org/resources/ECEM_Python_materials.zip
很高兴您找到了解决方案。我没有使用 iohub,但我们确实使用了 psychopy 和 eyelink,因此下面的一些代码可能对其他希望调用更直接通信的人有用。请注意,我们的计算机使用 Archlinux。如果以下 none 对您有任何意义,请不要担心,但也许它会帮助那些在与我们相同的道路上跌跌撞撞的人。
实验机与眼动仪通信
首先,你要和眼联建立起沟通。如果您的实验机器已打开并插入实时 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
眼动仪功能
我们发现编写一些与 Eyelink 计算机对话的函数很方便。例如:
初始化眼动仪
sp
指screenx,screeny sizes的元组。
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)
注意:pl
函数来自 import pylink as pl
。另请注意,还有一个名为 pylink 的 python 库,您可以在线找到它。它可能不是你想要的。浏览 Eyelink 论坛并从那里获取 pylink。它很旧,但仍然有效。
校准眼动仪
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()
打开数据文件
您可以与眼动仪对话并执行打开文件等操作
def eyeTrkOpenEDF (dfn,el):
el.openDataFile(dfn + '.EDF')
漂移校正
或漂移正确
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
发送和接收消息。
您可以设置许多内置变量,也可以添加自己的变量。这是从您的 python 程序向 eyelink
发送消息的示例
eyelink.sendMessage("TRIALID "+str(trialnum))
eyelink.startRecording(1,1,1,1)
eyelink.sendMessage("FIX1")
tFix1On=expClock.getTime()
注视随机编程
这里是一些代码的一部分,在实验程序的逻辑中使用了 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
祝黑客愉快。
对于未来的读者,我想分享我的库以结合 pylink 和 psychopy。我最近更新了它以使用 python 3。它提供了简单易用的高级功能。
https://github.com/colinquirk/templateexperiments/tree/master/eyelinker
您还可以使用 PsychoPyCustomDisplay
class 在较低级别工作(有关 EyeLinkCustomDisplay
的更多信息,请参阅 pylink 文档)。
有关它的使用示例,请参阅:
https://github.com/colinquirk/ChangeDetectionEyeTracking
(在撰写本文时,此实验代码尚未 python 3 准备好,但它应该仍然是一个有用的示例。)
repo 还包括其他用于创建实验和记录 EEG 数据的模块,但如果您只对 eyelinker 代码感兴趣,则它们不是必需的。
我正在致力于将心理实验与 eyelink 眼动追踪系统相结合。执行此操作的方法似乎是通过 pylink。不幸的是,我真的不熟悉 pylink,我希望有一个结合这两者的实验样本。我找不到一个。如果有人能够分享一个示例或向我指出比 sr-research 提供的 pylink api 更易于访问的手册,我将非常感激。
谢谢!
您可能想要研究在 PsychoPy 中使用 ioHub 系统而不是 PyLink。这是一个更通用的眼动追踪系统,还允许以通用格式保存数据(与 PsychoPy 事件集成),并提供数据分析和可视化工具。
ioHUb 的构建与您正在使用的特定眼动仪无关。您只需创建一个特定于您的 EyeLink 系统的配置文件,然后使用 ioHiv 提供的通用功能进行校准、实时访问眼动数据等。
这里有一些教学资源:http://www.psychopy.org/resources/ECEM_Python_materials.zip
很高兴您找到了解决方案。我没有使用 iohub,但我们确实使用了 psychopy 和 eyelink,因此下面的一些代码可能对其他希望调用更直接通信的人有用。请注意,我们的计算机使用 Archlinux。如果以下 none 对您有任何意义,请不要担心,但也许它会帮助那些在与我们相同的道路上跌跌撞撞的人。
实验机与眼动仪通信
首先,你要和眼联建立起沟通。如果您的实验机器已打开并插入实时 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
眼动仪功能
我们发现编写一些与 Eyelink 计算机对话的函数很方便。例如:
初始化眼动仪
sp
指screenx,screeny sizes的元组。
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)
注意:pl
函数来自 import pylink as pl
。另请注意,还有一个名为 pylink 的 python 库,您可以在线找到它。它可能不是你想要的。浏览 Eyelink 论坛并从那里获取 pylink。它很旧,但仍然有效。
校准眼动仪
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()
打开数据文件
您可以与眼动仪对话并执行打开文件等操作
def eyeTrkOpenEDF (dfn,el):
el.openDataFile(dfn + '.EDF')
漂移校正
或漂移正确
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
发送和接收消息。
您可以设置许多内置变量,也可以添加自己的变量。这是从您的 python 程序向 eyelink
发送消息的示例eyelink.sendMessage("TRIALID "+str(trialnum))
eyelink.startRecording(1,1,1,1)
eyelink.sendMessage("FIX1")
tFix1On=expClock.getTime()
注视随机编程
这里是一些代码的一部分,在实验程序的逻辑中使用了 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
祝黑客愉快。
对于未来的读者,我想分享我的库以结合 pylink 和 psychopy。我最近更新了它以使用 python 3。它提供了简单易用的高级功能。
https://github.com/colinquirk/templateexperiments/tree/master/eyelinker
您还可以使用 PsychoPyCustomDisplay
class 在较低级别工作(有关 EyeLinkCustomDisplay
的更多信息,请参阅 pylink 文档)。
有关它的使用示例,请参阅:
https://github.com/colinquirk/ChangeDetectionEyeTracking
(在撰写本文时,此实验代码尚未 python 3 准备好,但它应该仍然是一个有用的示例。)
repo 还包括其他用于创建实验和记录 EEG 数据的模块,但如果您只对 eyelinker 代码感兴趣,则它们不是必需的。