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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Raspberry Pi

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

Q&A

解決済

2回答

1003閲覧

python3でのμs単位のwait

surarinmon

総合スコア20

Python 3.x

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

Raspberry Pi

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

0グッド

0クリップ

投稿2019/01/18 03:50

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

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

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

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

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

python3.7

1import time 2import picamera 3import threading 4import RPi.GPIO as GPIO 5from time import perf_counter 6 7GPIO.setmode(GPIO.BOARD) 8GPIO.setup(11,GPIO.OUT) 9event = threading.Event() 10starttime = time.perf_counter_ns() 11 12def camera(): 13 global ctime 14 with picamera.PiCamera() as camera: 15 camera.resolution = (640,480) 16 event.wait() 17 cameratime = time.perf_counter_ns() 18 ctime = cameratime - starttime 19 print("CAM = {:}ns" .format(ctime)) 20 camera.capture('/home/pi/cameradata/image.jpg') 21 cameratime2 = time.perf_counter_ns() 22 ctime2 = cameratime2 - starttime 23 print("CAM2 = {:}ns" .format(ctime2)) 24 camera.stop_preview() 25 26def LED(): 27 global Ltime 28 time.sleep(1) 29 GPIO.output(11,GPIO.LOW) 30 event.set() 31 32 wait_sec = 0.0002 33 until = perf_counter() + wait_sec 34 while perf_counter()<until: 35 pass 36 37 38 GPIO.output(11,GPIO.HIGH) 39 LEDtime = time.perf_counter_ns() 40 Ltime = LEDtime - starttime 41 print("LED = {:}ns" .format(Ltime)) 42 time.sleep(0.01) 43 GPIO.output(11,GPIO.LOW) 44 time.sleep(0.1) 45 46 GPIO.cleanup() 47 48 49p1 = threading.Thread(target = camera) 50p2 = threading.Thread(target = LED) 51 52p1.start() 53p2.start() 54p1.join() 55p2.join() 56global ctimeLtime 57ctimeLtime = ctime - Ltime 58print("ctime-Ltime = {:}ns" .format(ctimeLtime)) 59 60

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

で1スレッドでやるのではだめなのでしょうか。

投稿2019/01/18 08:01

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

surarinmon

2019/01/18 08:06

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

2019/01/18 08:12

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

2019/01/18 08:14

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

2019/01/18 08:18

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

2019/01/18 08:22

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

2019/01/18 08:33

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

0

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

投稿2019/01/18 06:27

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

surarinmon

2019/01/18 06:44

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

2019/01/18 07:32 編集

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

2019/01/18 07:37

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

2019/01/18 07:37

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

2019/01/18 07:43

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

2019/01/18 07:43

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

2019/01/18 07:56

sleepで精度が出ない(時間が来てREADYになってもすぐ実行されない)のはリアルタイムOSじゃない事に起因すると思うので、Linuxでの限界と言う事だと思います。 2つのスレッドを非同期で動かさず、途中で同期を取る事で差を縮める事は出来ないでしょうかね。
surarinmon

2019/01/18 08:09

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

2019/01/18 08:25 編集

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

2019/01/18 08:23

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

2019/01/18 08:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問