基础设置:Monitor
在开始编写程序之前,需要对显示器的基本参数进行设置。因为我们的程序是在电脑屏幕上显示的(废话),所以需要告诉psychopy我们的屏幕是什么样的,多宽,多少分辨率,以及你距离屏幕有多远(影响观察的视角)。这样才能保证显示正常。而且,如果我用另一台电脑跑程序的话,就得重新调整参数。
首先打开Tools→Monitor Center。弹出显示器设置对话框。
对话框的右边是高级的校正,通常不需要更改。
左边第一个窗口,是选择显示器。可以新建(new),保存(save)和删除(delete)。默认的显示器为“testMonitor”。
下方的窗口是显示器的参数配置名称,通常以时间为名称来保存校正的参数。可以通过Copy添加一个新的参数校正。
最下方的窗口就是具体的参数设置了,其中
- Use Bit++:………………Sorry!目前还没搞明白是啥意思,水平有限,呵呵呵。
- Screen Distance(cm):输入被试与屏幕的距离,单位是cm。毕竟距离直接影响了视角,对于一些视觉的研究,特别是以刺激大小作为自变量的研究来说,这个属性就非常关键。
- Size(pixels; Horiz, Vert):屏幕的分辨率,到电脑的显示设置的找找就行。
- Screen Width(cm):电脑屏幕的物理宽度,这个……,自己用尺子量一量吧。
最后的Notes窗口用来写关于这个显示器的标注,可有可无。
上述参数的设置与程序中使用的单位紧密挂钩,当然,使用不同的单位所需的参数也不一样。不过,最好还是把所有的参数都提前设置好。
显示器的参数设置非常重要,因为这些参数与实验中的刺激显示大小,呈现位置有密切的联系。
builder界面简介
builder界面分成了三部分:
- 右边是component(组件)视图。是实验最为基本的元素,分为刺激,反应,自定义组件,接口四种类型。实际上,常用的就是刺激和反应这两类。而刺激中常用的就是文字,图片,视频,音频;反应就是鼠标和键盘。
- 左边是Routine视图。Routine这个词我没有找到很好的中文来翻译,同学们可以简单理解为一个实验的单元。多个组件组合在一起就形成了一个Routine。所以,一个Routine可以包含一次反应,一段指导语,或者一系列刺激。也就是常规的实验单元(也不知道这样定义准不准确)
- 下方是Flow(流程)视图。顾名思义,Flow就是整个实验的流程,由多个Routine组合在一起。可以在Flow视图中添加Routine。如果要使某个或某几个Routine循环呈现的话,可以添加Loop来实现。
用builder创建简单反应时的测量程序
接下来,让我们动动手,完成一个视觉简单反应时的小程序。完成之后你会发现,builder真的很方便。
1.先感谢一下你的被试:定义实验的欢迎界面以及指导语
在component界面选择Text(文字)组件,单击之后进入Text的设置界面。界面分为Basic,Advanced,Data和Testing四个字窗口,现主要介绍Basic窗口。
- name随便起一个。当然最好是具有一定含义,能够清楚理解的,最好短一点。不过不能使用中文,毕竟builder实际上也是编程语言(中文太难了,Python不认识,哈哈)。这里我们将名字定义为"Welcome"。
- start意味着在本次Routine中,该component啥时候开始,可以选择时间(time),帧(frame N)以及条件(condition)三种方式。这里我们使用最简单的时间,后面输入0。意味着这段文字从一开始就呈现。(灰色的expected start没啥用,忽略就行)
- stop同样有多种方式,我们选用最简单的持续时间(duration),设置为1。意味着该component持续1s。
- color可以通过右键点击输入框进行选择,或者自己输入颜色名称,或者使rgb代码都可以。
- font是字体。此处使用默认的就行。
- letter height是字体大小,单位需要在advanced中进行设置,默认的是窗口垂直距离的相对大小。此处设置为0.05,意味着字体的高度是窗口高度的5%。
- position是呈现的位置。(0,0)表示屏幕正中,可以将屏幕当成二维坐标系,position就定义了其中的一个点。以中点为基准,左和下是负值,右和上是正值。注意的是,此处的数值单位同样需要在advanced中定义。
- text就是要呈现的文字,此处直接输入中文就可以了。输入“您好!欢迎参加本实验”。
- 之后点击OK完成第一个component的设置
如下图:
回到builder主界面后,先保存一下,随便起个名字吧。
然后点击Tools-Run。弹出Runner界面。选中我们的程序,点击右侧绿色的小人就开始运行了。
开始运行后,会默认弹出输入被试编号和实验轮次的基本信息框,随意输入就行。
运行之后,可以看到我们的欢迎词呈现了1s,之后程序就结束了。接下来,让我们继续完善
2. 为欢迎词添加一个反应按键
我们想让被试自由的浏览欢迎词,通过自己按键结束浏览,而不是强制1秒就退出。此时,重新打开刚才设置的Welcome(鼠标点击一下就行)。
- 将stop定义的duration删掉。空白表示一直呈现。之后点击OK退出Welcome
- 添加键盘的component,点击右侧的键盘图标,弹出界面。
- 名字随便起,此处设置为”EndWelcome".
- Start定义为0,意味着按键跟欢迎词同步,从一开始就可以进行按键。如果我设置为0.5,那么0.5秒后才能开始按键,被试至少要阅读0.5秒的欢迎词(因为Welcome是从0开始的)。
- Stop空白就好,意味着被试什么时候按键都行。假设我设置为3,那么3秒以后这个按键就失效了。
- 勾选Force end of Routine。说明只要按键,那么这个Routine就停止。
- Allow Keys中填写有效的按键,用单引号将按键输入就行。此处我们只保留空格键‘space’。
- Store表示要保存的按键,此处因为只是一个欢迎界面,不是正式实验,所以不用保存按键。下拉选择nothing
- Store Correct表示保存正确率,此处不用勾选
- 其他的默认就好
如下图:
再次运行程序,发现欢迎词一直都显示着,直到按下空格键后才退出。
为了让被试知道可以按空格键,我们再添加一段说明。
3.添加按空格键的说明
再次添加一个Text的component,
- 名称随便,此处用PressSpace
- start为0,stop空白,与刚才的组块一致
- pos改为(0,-0.4),注意,最底部是-0.5,因为整个窗口高度为1。
- text文字输入“按空格键继续”
- 其他设置自由发挥吧,如图:
大家再次运行看看效果吧
4.添加指导语
实际上,我们可以将指导语直接写在欢迎页中(多打几行字的问题)。不过,为了进一步说明Routine和Flow,我们单独用一个Routine来定义指导语。
首先,我们将之前定义好的欢迎Routine重新命名,免得以后搞混淆了。在Flow中右键点击trial,选择rename,将名字改为Start_Welcome(尽量不要与其他的重名,虽然这里是Routine,之前的是component)
接下来,在Flow的界面左上方点击Insert Routine,选择new,并定义好名字,此处用“instructions”。
接下来点击Flow流程图中的位置插入Routine,将instructions放在之前欢迎页的Routine后面。
在Flow视图中点击instructions,打开这个Routine,开始添加component。
这里同样添加两个文字组件和一个键盘组件。操作跟之前相同。只是指导语的文字输入
“本测试是一项快速反应任务。
一会屏幕中将出现一个十字,请注视。
十字消失,并在短暂间隔后会出现红色的圆形
请你在看到红色圆形时快速按下空格键”
5.呈现刺激
再插入一个Routine,命名为trial,用来设置刺激。
在trial中先添加一个polygon组件(stimuli分类下,自己找找看),作为注视点。
- shape选择cross(十字),其他的也可以,不过我习惯用十字作为注视点
- size改为(0.05,0.05)
- 持续时间为0.5秒
具体设置如图:
再添加一个polygon组件,命名为stim,用来作为刺激。
- start设置为1,因为注视点持续0.5秒,所以1表示注视点消失后,再间隔0.5秒才出现刺激
- stop空白,一会通过键盘来控制
- shape选择regular polygon,下方的Num vertices输入100,也就是100个顶点的多边形,这样就非常接近圆
- size设置为(0.2,0.2),同学们也可以换成其他参数试试看效果。
- 点击advanced子窗口,右击fill color,选择红色填充。
其他设置默认就行,如图
接下来,再添加一个键盘,设置与之前基本相同,区别在于:
- start设置为1。因为刺激是1秒才开始出现的。
- 因为此时需要记录数据,store选择last key(其实只要不是nothing就行,因为此时需要记录的只是反应时)
好了,我们再运行一次试试,现在程序的雏形已经有了。不过反应了一次之后就退出,实在不够尽兴。如果要让trial多出现几次,最笨的办法当然是继续添加routine。简单的办法就是添加一个loop(循环)。
6.添加loop
在insert routine下方,点击insert loop,然后选择trial前后的节点作为起点和终点。选择好以后就弹出了loop的对话框,其中nreps表示重复的次数,这里输入10,那么trial就会重复10次。
7 实验结束提示
最后,我们再添加一个Routine,命名为End(其他名字也可以,随你喜欢),用于呈现实验结束的提示。
在end中添加一个Text组件和keyboard组件,前者用于呈现“实验结束,感谢你的参与。请按空格键退出实验”。后者用于退出界面。具体的设置参照上面就可以完成了
数据结果
程序的第一版已经完成了,同学们可以尝试着运行一遍。运行结束之后,程序根目录下会自动生成一个data的文件夹,里面保存了刚才的测试结果。数据文件默认的命名规则是“被试编号-文件名-运行时间”
现在data文件夹里应该有很多文件,毕竟刚才我们运行了很多次了。找到完整程序的运行结果(可通过生成时间以及被试编号查找)
找到以后打开excel的数据文件,发现所有的数据都保存在里面了。每一列都component的某个结果(如start,stop)。
当然,我们不需要这么多数据,可以回到builder界面,打开不需要保存数据的component,在data子窗口中将勾去掉就行了。
未完待续,仍需要完善的程序
由于程序中注视点与刺激的呈现间隔是固定的(0.5s),练习效应必然导致被试产生预判,从而提升反应时。如果不控制住这个额外变量,那整个测试就不准确了。
要控制也很简单,只需要将注视点与刺激的间隔随机化就行。
那么随机化如何在builder中实现呢?可以在loop中实现。
具体怎么操作,我们下次再聊