psychtoolbox 是 MATLAB 中的一个工具包,对于科研人员设计实验范式来说是不二之选,因为它可以操作计算机的底层硬件,精度可以达到帧的级别。
文章目录
- 一、实验目的
- 二、psychtoolbox 的下载安装
- 三、Psychtoolbox 的基本使用
- 四、完整代码
一、实验目的
我们的目的是设计出一个迷宫(网格线上的一条路径),使得小球每隔3s就移动一格,当然每次小球移动的对错概率都是我们自己实现设定好的。
二、psychtoolbox 的下载安装
- 首先在BING搜索,认准第一个org结尾的官网,可以进入官网,也可以直接点击下方的“Download”,跳转到下载界面。
- 进入到下载界面后,按照下图中的三个步骤(第一步可不做,如果是第一次安装)。
(1)下面是第二步,点击这里可下载gstreamer,按照指引一步步安装即可。
(2)下载zip,将压缩包的子文件夹里的所有文件都拖入到一个新建的“toolbox”文件夹里。
处理完之后像下图一样就对了。
- 进入MATLAB,打开到刚才的toolbox->Psychtoolbox 路径。
- 在命令行中输入
SetupPsychtoolbox
,回车,等待即可,中间需要一路回车进行。最后出现“Success,Enjoy”等字样即安装成功。可以继续在命令行使用Screen
来测试是否安装成功。
三、Psychtoolbox 的基本使用
-
基本原理
首先它是通过一帧一帧翻转窗口来实现所谓的动态效果,所以我们的逻辑基本就是先在画布上绘制下一帧的画面,然后翻转。
可以自行到官网找到参考文档,网络上所有文章基本都是从那里复制出来的,并且还可以看到官网提供的Demos。 -
这里提供几个常使用到的函数:
/* 开头需要加的。 */
Screen('Preference', 'SkipSyncTests', 1);
Screen('Preference','SkipSyncTests',2);/* 隐藏鼠标。 */
HideCursor;/* 函数功能:新建一个窗口。* 返回值:w,窗口的句柄;* 返回值:wrect,主要用来获取屏幕的长宽。* 参数:命令,可在命令行“help Screen”获取帮助文档或者直接到官网。* 参数:第n个屏幕,一般无扩展屏的话直接默认0.* 参数:颜色,窗口的RGB数组。这里是黑色。*/
[w, wrect] = Screen('OpenWindow', 0, [0, 0, 0]);/* 写文本。一般进行心理实验之前需要一段引导语。* 参数:imread后面为图片的路径。*/
instruction=Screen('MakeTexture',w,imread('xxx\xxx\xx.tif'));
Screen('DrawTexture',w,instruction,[]);%显示提示语/* 函数功能:画直线。* 返回值:无* 参数:命令,画直线、画圆等等。* 参数:窗口的句柄,按之前来讲就是w。* 参数:颜色。* 参数:后面四个参数依次为x轴起点坐标、y轴起点坐标、x轴终点坐标、y轴终点坐标。* 参数:线宽。*/
Screen(‘DrawLine’, windowPtr [,color], fromH, fromV, toH, toV [,penWidth]);/* 函数功能:画实心圆。* 返回值:无* 参数:命令。* 参数:窗口的句柄。* 参数:颜色。* 参数:后面四个参数依次为圆的左、上、右、下边界坐标。*/
Screen(‘FillOval’, windowPtr [,color] [,rect] [,perfectUpToMaxDiameter]);/* 翻转。每次绘制完画布都要进行一次翻转,这样新绘制的场景才能显示出来。重要!!! */
Screen('Flip',w)/* 延时函数,单位:秒。*/
WaitSecs();/* 按键检测。以下是一个退出机制,按下Esc键退出。27对应Esc键的ASCII值。*/
while true[keyIsDown,~,keyCode]=KbCheck;if keyCode(27)break;end
end/* 关闭窗口,搭配上面的退出机制使用。*/
Screen('CloseAll');/* 常用的颜色RGB值。*/
color_red = [255,0,0];
color_white = [255, 255, 255];
color_black = [0, 0, 0];
color_yellow = [255, 255, 0];
四、完整代码
- 功能逻辑通过一个哈希表来一一映射小球每一步的正确、错误情况。
decision_hashmap = zeros(1, 100);
decision_hashmap(1, [3,7,13,18,23,27,32,37, 42,46,50, 54,58, 63,67, 72,76, 79, 83]) = 1; % 第i个元素置一表示第i步为小球错误运动方向
step_up_right = 8 + 2 * 2; % 由up转向right的第x步step_right_down = step_up_right + 8 + 2 * 3;step_down_left = step_right_down + 8 + 2 * 3;step_left_up = step_down_left + 6 + 2 * 3;step_up_right_2 = step_left_up + 6 + 2 * 2;step_right_down_2 = step_up_right_2 + 4 + 2 * 2;step_down_left_2 = step_right_down_2 + 4 + 2 * 2;step_left_up_2 = step_down_left_2 + 2 + 2 * 1; step_up_end = step_left_up_2 + 2 + 2 * 1;
在for循环里实现小球的转向和正误判断,下面只张贴正确情况的转向逻辑代码,完整代码可移步gitee仓库Psychtoolbox绘制小球走迷宫下载。
for step = 1 : step_up_end% 通过中间变量,记录上一步小球的位置if(step == 1)previous_y_index_up = xy_4_trace_start(2);previous_y_index_down = xy_4_trace_start(4);previous_x_index_left = xy_4_trace_start(1);previous_x_index_right = xy_4_trace_start(3);elseprevious_y_index_up = current_y_index_up;previous_y_index_down = current_y_index_down;previous_x_index_left = current_x_index_left;previous_x_index_right = current_x_index_right;end% 小球动态路径if ~decision_hashmap(step) % 正确if step <= step_up_right current_y_index_up = previous_y_index_up - length_chessboard;current_y_index_down = previous_y_index_down - length_chessboard;current_x_index_left = previous_x_index_left;current_x_index_right = previous_x_index_right;Screen('FillOval', w, color_ball, [current_x_index_left current_y_index_up ...current_x_index_right current_y_index_down]);elseif step <= step_right_down current_y_index_up = previous_y_index_up ;current_y_index_down = previous_y_index_down ;current_x_index_left = previous_x_index_left + length_chessboard;current_x_index_right = previous_x_index_right + length_chessboard;Screen('FillOval', w, color_ball, [current_x_index_left current_y_index_up ...current_x_index_right current_y_index_down]);...
end