2011-10-02 33 views
5

私はシリアルポート経由で通信している赤外線カメラ/トラッカーを持っています。私は現在、これを行うためにpyserialモジュールを使用しています。カメラは、60Hzのレートでトラッキングされたオブジェクトの位置を更新します。追跡されたオブジェクトの位置を取得するために、私は1つのpyserial.write()を実行してから、pyserial.read(serialObj.inWaiting())を使って入ってくる応答を待ち受けます。応答/位置が受信されると、whileループが再入力され、以下同様に続きます。私の質問は、このアプローチの信頼性とスピードに関係しています。私は、少なくとも60Hzの速度でコンピュータが取得するポジションが必要です(そして、そのポジションは、UDPを介してリアルタイムOSに送信されます)。これは、Pyserial/Pythonが可能なことですか、代替のCベースのアプローチを検討する必要がありますか?pyserial/pythonとリアルタイムデータ取得

おかげで、 ルーク

+1

これはどのようになったのですか?どのような種類のサンプリングレートでPythonを手に入れることができましたか?私はRS232上のオハウススケールからの単純なデータ収集を行ったが、5hz(スケールであったかもしれない)しか得られなかった – Chris

答えて

0

Python は大丈夫ですが、一番良いことは、取得している秒当たりの読み取り回数を確認することです。毎秒読み取りが何回完了したかを数え、この数値が低すぎる場合は、パフォーマンスログなどに書き込みます。 pyserial読み取り呼び出しがブロックされているので、Pythonプログラムの残りの部分(ある場合)からI/O部分を切り離すことも検討する必要があります。

+1

すべての人に感謝する。私は他のものに移動することを検討する前に、私は読み取り/書き込みpyserial関数のパフォーマンスをテストすると思います。ブロックされたシリアル通話と、なぜプログラムの残りの部分をデカップリングする必要があるのか​​を説明することができます(あなたは正しいです、読み書きは必要な機能のほんの一部です)。 – dataman

+0

Pyserialは既定で読み取り呼び出しをブロックします(これを行わないように構成できます)。これが意味することは、 'read'を呼び出すと、プログラム全体が座って何かが書き込まれるのを待ってから読み込み、プログラムを続行できるということです。これを回避するには、非ブロッキング呼び出し( 'read'は即座に戻りますが、何もせずに)を使用する方法と、イベント駆動型のフレームワーク、例えばねじれたもの(あなたが待っている間に他のことをしていることを知る)またはプロセス/スレッドを使用して(ただし、プロセスからの着信メッセージを受信するのと同じ問題があります)。 – jozzas

+1

ええ、私はタイムアウト= 0を設定して、一度に1つの文字を得ることを終了します。つまり、私はwhileループ内でserial.read(1)を実行し、戻りコマンドの終了を示す '\ r'をチェックし、その条件が満たされたら新しいget get position requestを発行します。私はカメラシステムのどのフレームも見逃してしまったようには見えませんが、これはいつも確実だと確信しています。プログラムが実行されている間にブラウザを開いた場合のように、スクリプトを強制的に最優先にする方法がありますか? – dataman

1

これは、速度よりも待ち時間がより問題です。

Pythonは常にメモリの割り当てと解放を行いますが、データが再利用されると、同じメモリがCライブラリによって再利用されます。 OS(Cライブラリ/ UDP/IPスタック)はPython自体よりも大きな影響を与えます。

RTOSマシンでシリアルポートを使い、Cコードとあらかじめ割り当てられたバッファを使うべきだと思います。

0

私は、Pythonがデータにうまく対応していると思われます。私のアドバイスはそれをしようとするだろう、とPythonの代わりにPyPyを試し、その後、遅れに見える場合 - C.

http://pypy.org/

のように近い速度のためのマシンコードに至るまで、あなたの内側のループのほとんどをコンパイルのPythonの実装を