こがねいろ

いろいろ備忘録

エラーなく実験が終了してしまう(ように見える)現象 [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)