質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python 3.x

    10183questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Raspberry Pi

    1083questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

python3でのμs単位のwait

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 238

surarinmon

score 6

ラズベリーパイでカメラとLEDをほぼ同時に動作させようとしてるのですが、以下のプログラムから

 wait_sec = 0.0002
 until = perf_counter() + wait_sec
 while perf_counter()<until:
    pass

を除いたプログラムで時間差を測ったところ200μsほどずれてしまっています。

上記を挿入すればその時間差が縮まると思ったのですが結果は変わりませんでした。

200μsを気にするなと言われればそれまでなのですが、遅らせることでプログラムの動作を合わせるのは難しいのでしょうか?

import time
import picamera
import threading
import RPi.GPIO as GPIO
from time import perf_counter

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)
event = threading.Event()
starttime = time.perf_counter_ns()

def camera():
  global ctime
  with picamera.PiCamera() as camera:
   camera.resolution = (640,480)
   event.wait()
   cameratime = time.perf_counter_ns()
   ctime = cameratime - starttime
   print("CAM = {:}ns" .format(ctime))
   camera.capture('/home/pi/cameradata/image.jpg')
   cameratime2 = time.perf_counter_ns()
   ctime2 = cameratime2 - starttime
   print("CAM2 = {:}ns" .format(ctime2))
   camera.stop_preview()

def LED():
 global Ltime
 time.sleep(1)
 GPIO.output(11,GPIO.LOW)
 event.set()

 wait_sec = 0.0002
 until = perf_counter() + wait_sec
 while perf_counter()<until:
    pass


 GPIO.output(11,GPIO.HIGH)
 LEDtime = time.perf_counter_ns()
 Ltime = LEDtime - starttime
 print("LED = {:}ns" .format(Ltime))
 time.sleep(0.01)
 GPIO.output(11,GPIO.LOW)
 time.sleep(0.1)

 GPIO.cleanup()


p1 = threading.Thread(target = camera)
p2 = threading.Thread(target = LED)

p1.start()
p2.start() 
p1.join()
p2.join()
global ctimeLtime
ctimeLtime = ctime - Ltime
print("ctime-Ltime = {:}ns" .format(ctimeLtime))
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

一連の質問を見ていて思ったのですが、

  1. LED点灯
  2. 撮像
  3. LED消灯

で1スレッドでやるのではだめなのか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 17:06

    距離によって光が反射してるとこ,してないとこのある瞬間の写真を撮りたくてタイミングを合わせられないかなと思ってるので、二つを分けてほぼ同時にできるようにしてます...

    キャンセル

  • 2019/01/18 17:12

    それ距離/光速度オーダーの時間分解能が要るみたいな話だったりします?

    キャンセル

  • 2019/01/18 17:14

    はい...Lidarみたいな感じでできたりしないのかなと思って試してみてました

    キャンセル

  • 2019/01/18 17:18

    そもそも汎用機材でできるの? というあたりから厳しそうですね。。。

    キャンセル

  • 2019/01/18 17:22

    そうですよね...なんども丁寧に答えていただいてるのにすいません

    キャンセル

  • 2019/01/18 17:33

    そのへんで売ってるカメラとLEDを使っているなら、そもそも機材側が追い付かないかと。ある程度配慮した機材だとしても、pythonでのほほんと制御してできるかというとほぼ無理でしょう。
    わかってて自分で考えながらやってるなら良いですが、そうでなければちょっと考え直してください。

    キャンセル

+1

プログラムは読んでません。
その待ち方だと、CPUをほぼ占有するので、もしCPUがシングルコアなら他のスレッドがほとんど進まない事になりますが、そのあたりは大丈夫でしょうか?マルチコアですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 15:44

    raspberry pi 3B+を使っており、クアッドコアだと思います

    キャンセル

  • 2019/01/18 16:30 編集

    pythonはGlobal Interpreter Lockがあるので、この場合物理コア数は無関係です。具体的にビジーウェイトでどういう挙動になるのかは、pythonのスレッドのスケジューラの実装に依存するという話だと思うので、ちょっと私にはわかりませんけど。「容易に意図した通り動く」とは考えないほうが賢明ではあるしょう。

    キャンセル

  • 2019/01/18 16:37

    なるほど、では200μsを遅らせるためには現状難しいのでしょうか

    キャンセル

  • 2019/01/18 16:37

    ああ、1プロセスだと同時に1つしかスレッドが動かないと言う事ですね。となると、影響あるかも。

    キャンセル

  • 2019/01/18 16:43

    ビジーループじゃなくて、time.sleepじゃ駄目なんでしたっけ?
    そもそもリアルタイムOSじゃないので、限界はありますね。

    キャンセル

  • 2019/01/18 16:43

    time.sleepですと精度がmsあたりまでしかなく、うまくいかないですね...

    キャンセル

  • 2019/01/18 16:56

    sleepで精度が出ない(時間が来てREADYになってもすぐ実行されない)のはリアルタイムOSじゃない事に起因すると思うので、Linuxでの限界と言う事だと思います。

    2つのスレッドを非同期で動かさず、途中で同期を取る事で差を縮める事は出来ないでしょうかね。

    キャンセル

  • 2019/01/18 17:09

    途中で同期処理にすると、試してみますありがとうございます

    キャンセル

  • 2019/01/18 17:17 編集

    いちおうこういう経緯がありまして、質問のコードも(最適な実装かどうかは別として。だめなら半分弱くらい私の責任)同期を試みてはいるようです。>otnさん
    https://teratail.com/questions/169328

    キャンセル

  • 2019/01/18 17:23

    ああ、コード見ました。そうですね。同期していますね。
    そういう意味では同期のタイミングも、sleepが精度でないのと同じ意味で、精度でないか。
    同期の指摘は忘れてください。

    キャンセル

  • 2019/01/18 17:30

    ちょっと難しいですかね...お二人ともありがとうございました

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    10183questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Raspberry Pi

    1083questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。