2016-10-06 3 views
5

最近、私はmpu9250に接続したraspberrypi 2b +のデバイスベースを開発しています(自分で溶接する)。ラズベリーパイでもっと正確な時間を測定するには?

I正しく9軸データを読み取ることができ、私は異なる時間差で各データ入力ことに気づいた:図は、各々二つのデータの間の時間差を示す

。 しかし私はQTimerを使って10msごとにmpu9250を一度読んで確認しています。

だから私はRaspberryPi部2bの+にこのコードを試してみました:

import time 
import matplotlib.pyplot as plt 

time_arr = [] 
for i in range(5000): 
    t0 = time.time() 
    print "K" 
    t1 = time.time() - t0 
    time_arr.append(t1) 

plt.plot(time_arr) 
plt.show() 

そして結果:

enter image description here

も、これらの単純なコードはまだ図にピークを示し、それは私を置いています...

誰でも私がこれらの問題を解決するのに役立ちますか、何が起こっているのか説明できますか?

+0

で提供されていますtime.perf_counter()を使用することを検討してPiは一貫性のないパフォーマンス/スケジュールを持っている問題であり、 ?もしそうなら、あなたの問題にリアルタイムOSを使用することを検討してください。 – jmercouris

+0

rasbian-jessieをインストールし、最新のバージョンに更新してください。それは問題ですか? –

+0

はい、問題はありますか、コードを実行するためのグラフィカル環境が必要ですか? – jmercouris

答えて

1

あなたの最初のテストでは、タイマーをバックグラウンドタスクとして扱うQTimerを使用しています。 QTは主に応答性の高いGUIを提供することに重点を置いています。

2回目のテストでは、ループ内にprintステートメントがあります。ステートメントを実行するのに必要な時間が変動する可能性がある印刷にはいくつかの要因があります。

より良いアプローチのためにthreading.Timerクラスを見てください。

ドキュメントは言う:

このクラスは、一定の時間が経過した後にのみ実行されなければならないアクションを表す - タイマーを。 TimerはThreadのサブクラスであり、カスタムスレッドを作成する例としても機能します。

スレッドは、start()メソッドを呼び出して、スレッドと同様に開始されます。 cancel()メソッドを呼び出すことによって、タイマーを停止することができます(アクションが開始される前に)。

注意それも言うこと:タイマーがそのアクションを実行する前に待機します

間隔は、ユーザーが指定した間隔とまったく同じではないかもしれません。

つまり、完璧ではありませんが、今見ているものよりもかなり優れている可能性が非常に高いです。


あなたがより良い精度でスケジューリングタスクとは対照的に、より高精度で時間を測定することに興味がある場合は、Pythonの3

関連する問題