ですから、私は経験の浅いPythonコーダーであり、収集したものはかなり複雑なニーズかもしれません。私は認知科学者であり、正確な刺激表示とボタン押下検出が必要です。これを行う最善の方法は、リアルタイムオペレーティングを使用することですが、これを実行する方法がわかりません。理想的には、各トライアルでプログラムがリアルタイムで動作し、トライアルが終了すると、OSは次のことができます。細心の注意を払っていないことに戻ります。約56回の試行があります。これを私のpythonスクリプトからコーディングする方法があるでしょうか?
(繰り返しになりますが、私が知る必要があるのは、刺激が実際にいつ表示されるかだけです。リアルタイムの方法では、刺激が希望するときに表示されることが保証されます。トップダウンのアプローチです。一方、コンピューターが実際にそれを表示する機会を得たときに記録することを知る方が簡単な場合は、よりボトムアップのアプローチを取ります。)
人々がリアルタイムコンピューティングについて話すとき、彼らが意味するのは、割り込み(最も一般的にはタイマーによって開始される)から実行中の割り込みを処理するアプリケーションコードまでの待ち時間が小さく、予測可能であるということです。これは、制御プロセスを非常に正確な時間間隔で繰り返し実行できること、または、あなたの場合のように、外部イベントの時間を非常に正確に計ることができることを意味します。レイテンシーの変動は通常「ジッター」と呼ばれます-1msの最大ジッターは、繰り返し到着する割り込みの応答レイテンシーが最大1ms変動することを意味します。
「小さい」と「予測可能な」はどちらも相対的な用語であり、人々がリアルタイムのパフォーマンスについて話すとき、それらは1μsの最大ジッターを意味する場合があります(たとえば、送電用のインバーターを構築する人々はこの種のパフォーマンスを気にします)、またはそれらはいくつかを意味する場合がありますミリ秒の最大ジッター。それはすべて、アプリケーションの要件によって異なります。
いずれにせよ、いくつかの理由から、Pythonは、このジョブに適したツールではない可能性があります。
malloc
またはC++のnew
)を回避します。 Pythonはこれをきちんと隠しているため、レイテンシーを制御するのは非常に困難です。繰り返しになりますが、これらの優れた既製のライブラリを多数使用すると、状況が悪化するだけです。mlockall
の呼び出しを行うことができるかもしれませんが、新しい割り当てがあると事態が混乱します)。もっと基本的な質問があります。ボタンが物理的なボタンなのか、画面上のボタンなのかはわかりません。画面に表示されている場合、オペレーティングシステムは、マウスの物理的なボタンを押してからPythonアプリケーションに到達するイベントまでの間に予測できない量の遅延を課します。これをどのように説明しますか?それを測定するより正確な方法、それがそこにあるかどうかさえどうやって知るのでしょうか?
Pythonは、純粋主義者の基準では、リアルタイム言語ではありません。ライブラリと関数が多すぎて、必要最低限の速度を実現できません。ただし、組み込みシステムとは対照的に、すでにOSを使用している場合は、多くの真のリアルタイム機能がすでに失われています。 (「リアルタイム」と聞くと、VHDLコードがFPGAのワイヤを流れるのにかかる時間だと思います。他の人はそれを「ボタンを押すと、人間の遅い視点からすると瞬時に何かをする」という意味で使用します。 「。後者のリアルタイムの解釈を使用していると思います。)
刺激表示とボタン押下検出とは、(たとえば)人に画像を表示し、ボタンをクリックして画像を識別したり、画像を見たことを確認したりする試行のようなものがあることを意味すると思います-おそらくテストするために反応速度。ミリ秒までの精度(人間の反応の時間と比較して無視できるはずです)を心配しない限り、Pythonを使用してこのようなテストを行うことができます。 GUIで作業するには、Tkinterを調べてください: http://www.pythonware.com/library/tkinter/introduction/ 。刺激とボタンを押す間のタイミングに取り組むには、時間のドキュメントを見てください: http://docs.python.org/library/time.html
幸運を!
ミリ秒の精度で時間遅延を科学的に測定しようとしているため、汎用コンピューターでタイムスライスの対象となるプロセスはお勧めできません。 C、Java、Pythonのいずれで実装されていても、タイムシェアリングモードで実行されている場合、結果を検証するにはどうすればよいでしょうか。 CPUが測定中にプロセスを中断せず、それによって結果が歪むことがないことを証明するのは難しいかもしれません。
この目的のために、既知の速度でティックし、刺激と応答の間に発生するティックの離散数を測定できるクロック回路を備えた専用デバイスを構築する必要があるようです。そのデバイスは、そのようなタイミング制約のないソフトウェアによって制御できます。たぶん、この質問を 電気工学 取引所に投稿する必要があります。
専用のデバイスがなければ、最新のオペレーティングシステムの用語であり、カーネル内で実行され、タスク切り替えの対象とならない真のリアルタイムソフトウェアを開発する必要があります。これを行うのは簡単ではなく、正しく行うには多くの労力が必要です。自分の目的のために専用のソフトウェア制御可能なデバイスを構築するのに費やすよりも多くの時間がかかると思います。
最も一般的なオペレーティングシステムの割り込みは、プログラミング言語に関係なく、実験のタイミングを台無しにするほど可変です。 Pythonは、独自の信頼性を追加します。Windows割り込みは特に悪いです。Windowsでは、ほとんどの割り込みは約4ミリ秒で処理されますが、場合によっては35ミリ秒より長く続くこともあります!(Windows7)。
PsycoPyアプリケーションを試して、うまくいくかどうかを確認することをお勧めします。グラフィックカードにopenGLで動作させることで問題にアプローチしますが、コードの一部はグラフィックカードの外部で実行され、オペレーティングシステムの割り込みの影響を受けます。既存のpythonコードはPsycoPyと互換性がない可能性がありますが、少なくともPythonにとどまります。PsycoPyはタイミングの問題なしに視覚刺激を表示するのに特に優れています。方法についてはドキュメントのこのページを参照してくださいボタンを押す操作を処理します: http://www.psychopy.org/api/event.html
問題を正しい方法で解決するには、LinuxRTやQNXなどのリアルタイムオペレーティングシステムが必要です。そのうちの1つでpythonアプリケーションを試して、リアルタイム環境でpythonを実行するだけで十分かどうかを確認できますが、pythonは変動性をもたらします。pythonがガベージコレクションを決定した場合、グリッチが発生します。Python自体はリアルタイムではありません。
National Instrumentsは、LabviewRTと呼ばれる非常に使いやすいプログラミング言語でリアルタイムにプログラミングできるセットアップを販売しています。 LabviewRTは、リアルタイムで動作するFPGAドーターカードにコードをプッシュします。高いです。
この問題を最小限に抑えるだけでなく、解決することを強くお勧めします。そうしないと、レビュー担当者が不快になります。
LinuxマシンでPythonコードを実行している場合は、カーネルを低レイテンシー(プリエンプティブ)にします。カーネルをコンパイルするときにフラグがあります。
カーネルを中断しないように、マシンで実行されている他のプロセスが最小限であることを確認してください。
Pythonスクリプトに高いタスク優先度を割り当てます。
さらに、画像の表示は瞬時ではないことに注意してください。実験をモニターの垂直リトレースフェーズ(ディスプレイのコンテンツのフレームの最後の行と次のフレームの最初の行の送信の間の一時停止)と同期させる必要があります。
候補が反応するはずのフレームを送信した後、vsyncフェーズの開始時にタイマーを開始します。
そして、絶対反応時間を取得するために、画像は少なくとも部分的に少し早く見えるようになることを覚えておく必要があります。モニターの内容の瞬間的な外観(〜10 ms @ 60Hz)。