エラーなく実験が終了してしまう(ように見える)現象 [PsychoPy]
概要と原因
PsychoPyで実験を作成していて,エラー表示がなく実験が終了してしまう「ように見える」ことがあります。
実際は正常に実験が終了しているのですが,ユーザー側には実験がエラーを吐かずに終了してしまうように感じられる場合を紹介します。
例えば,Routine-AとBが連続しているとき,それぞれのRoutine内に置かれたJoystickコンポーネントのボタン入力に応じてRoutineを終了させる場合を考えます。
# In Routine_A # Press a button to quit Routine_A if js01.getAllButtons()[0]: continueRoutine = False
# In Routine_B # Press a button to quit Routine_B if js02.getAllButtons()[0]: continueRoutine = False
このとき,Routine-Aで指定したボタンの入力を検出すると,Routine-Bへと移行します。
しかし,人間側のボタン押しは,多くの場合Routine-Bに移行した後も継続してしまいます。
(※ 人間が「一瞬の間」ボタンを押して離すまでの間に,コンピュータはRoutine-AからBへと移行してしまうため,Routine-Bでもキーを押していることになります。)
すると,Routine-Bにおけるif文の処理により,Routine-Bも即座に終了します。
このとき,人間側はRoutine-Bが「スキップされたような印象」を受けます。
これがエラーなく実験が中断されてしまうように見える現象の一因になります。
対策
簡単な対策としては,「Routine-Bでキーを検出しはじめるまでに少しだけタイムラグを持たせる」とか,「Routine-AとBでRoutineを終了させるキーを変える」などが挙げられるでしょう。
あるいは,「キーの”押し”と”離し”を分離して評価できるようなコードに変える」こともできるでしょう。
他に何か対策があればご教示ください。
参考までに,キーを検出しはじめるまでにタイムラグ(5秒)を持たせるコードを記しておきます。
# In Routine_B # Press a button to quit Routine_B if Routine_BClock.getTime() > 5: if js02.getAllButtons()[0]: continueRoutine = False
# The PsychoPy experiment ends without error (or so it seems)