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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3263閲覧

繰り返しを用いて、実行結果から平均を求める方法

surarinmon

総合スコア20

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/05 03:45

以前カメラの起動とLEDの点灯の時間の誤差を調べるための質問をしたのですが、この誤差の平均を求めようと何回か繰り返し平均を求めようとしたのですが、for文等でうまくできません。

繰り返しを用いるためにはthreadingではなく別の方法ですべきなのでしょうか

python3

1import time 2import picamera 3import datetime 4import threading 5import RPi.GPIO as GPIO 6 7GPIO.setmode(GPIO.BOARD) 8GPIO.setup(11,GPIO.OUT) 9 10USER_NAME = "pi/" 11HOME_DIR = "/home/" + USER_NAME 12SAVE_DIR = HOME_DIR + "cameradata/" 13 14datetime = datetime.datetime.today() 15datetime_formatted = datetime.strftime("%Y%m%d%H%M%S") 16 17file_name = "IMG_" + datetime_formatted 18 19starttime = time.perf_counter() 20 21 22def camera(): 23 global ctime 24 with picamera.PiCamera() as camera: 25 camera.resolution = (1024,768) 26 camera.start_preview() 27 time.sleep(1) 28 29 camera.capture(SAVE_DIR + file_name + ".jpg") 30 cameratime = time.perf_counter() 31 ctime = cameratime - starttime 32 print("CAM = {:.9f}s" .format(ctime)) 33 time.sleep(0.00001) 34 35 camera.capture(SAVE_DIR + file_name + ".jpg") 36 cameratime2 = time.perf_counter() 37 ctime2 = cameratime2 - starttime 38 print("CAM2 = {:.9f}s" .format(ctime2)) 39 40 camera.stop_preview() 41 42 43def LED(): 44 global Ltime 45 46 for i in range(1): 47 GPIO.output(11,GPIO.LOW) 48 time.sleep(1) 49 GPIO.output(11,GPIO.HIGH) 50 LEDtime = time.perf_counter() 51 Ltime = LEDtime - starttime 52 print("LED = {:.9f}s" .format(Ltime)) 53 time.sleep(0.01) 54 GPIO.output(11,GPIO.LOW) 55 time.sleep(2) 56 57 GPIO.cleanup() 58 59 60 61 62 63p1 = threading.Thread(target = camera) 64p2 = threading.Thread(target = LED) 65p1.start() 66p2.start() 67p1.join() 68p2.join() 69print("camera - LED = {:.9f}s" .format(ctime = Ltime)) 70

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

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

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

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

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

guest

回答2

0

ベストアンサー

そもそも論になりますが・・・

自分はラズパイもってないので正確なことはわかりませんが、質問者さんがカメラとLEDの点灯を独立したスレッドで実行している必然性がわかりません。

カメラからの画像キャプチャーの完了時刻とLEDの点灯時刻の誤差に頭を悩ませるのではなく、カメラの制御とLEDの制御を同一のスレッドで行えばよいだけだと思えるのですが・・・そうできない理由があるのでしょうか?あるようには思えないのですが・・・

LEDの点灯タイミングが正確にはわからないので適当に仮定してコードを修正してみました。
すみませんが、ラズパイもってないので実行検証はしてません。

Python

1import time 2import picamera 3import datetime 4import threading 5import RPi.GPIO as GPIO 6 7GPIO.setmode(GPIO.BOARD) 8GPIO.setup(11,GPIO.OUT) 9 10USER_NAME = "pi/" 11HOME_DIR = "/home/" + USER_NAME 12SAVE_DIR = HOME_DIR + "cameradata/" 13 14datetime = datetime.datetime.today() 15datetime_formatted = datetime.strftime("%Y%m%d%H%M%S") 16 17file_name = "IMG_" + datetime_formatted 18 19 20def camera(): 21 GPIO.output(11,GPIO.LOW) 22 with picamera.PiCamera() as camera: 23 camera.resolution = (1024,768) 24 # プレビュー開始 25 camera.start_preview() 26 time.sleep(1) 27 28 # capture開始直前にLEDを点灯 29 GPIO.output(11,GPIO.HIGH) 30 31 camera.capture(SAVE_DIR + file_name + ".jpg") 32 # time.sleep(0.00001) # こんなに短い時間sleepするような精度は多分ない。 33 time.sleep(0.01) # せいぜい10msが関の山 34 # capture完了して10ms経過したらLEDを消灯 35 GPIO.output(11,GPIO.LOW) 36 37 # プレビュー終了 38 camera.stop_preview() 39 40 41# ここで何度でも好きなだけcameraを呼び出せるのではないかと推測します。 42camera() 43camera() 44 45 46GPIO.cleanup()

投稿2018/12/05 05:04

KSwordOfHaste

総合スコア18394

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

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

surarinmon

2018/12/05 05:09

勝手にこちらのほうが良いと思い込んでました、試してみますありがとうございました
KSwordOfHaste

2018/12/05 13:04

うまく動いてくれるとよいですね・・・自分で確認できる環境があったらよかったのですが。
guest

0

※ 私は質問にあるコードは読んでいません。(使ったことないので)


平均ってなんですか? 小学校で習う方ですよね?

それなら単純ですよ。

まず、配列 ( リスト? ) を用意してそれに誤差? 平均を出したいやつの値をいれていく。

以前の起動時の値はファイルで確保しておくとかのような処置が必要ですが、今回だけでいいなら普通に入れていく。

この配列(リスト) を arr としておきます。

で、平均の求め方ってなんでした?

平均 = 全体の和 ÷ 個数

でしたよね。

これに当てはめる。

全体の和は、考え方によってはforでループしているときに追加していけばいい。

和を入れる変数を sum としておくと、

sum = sum + arr[i]

のような状態。

ほかの言語 ( C++, Javaとか ) だと sum++ と書けますが、Pythonはわかりません。

末尾まで行ったら sum は すべての値の合計になっています。( breakとかのような特殊な場合を除いて )

それを 先ほどの式 "平均 = ..." のやつに当てはめる。

これで割り出せる。

投稿2018/12/05 04:26

BeatStar

総合スコア4958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問