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

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

ただいまの
回答率

90.35%

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

解決済

回答 2

投稿

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

surarinmon

score 12

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

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

import time
import picamera
import datetime
import threading
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)

USER_NAME = "pi/" 
HOME_DIR = "/home/" + USER_NAME
SAVE_DIR = HOME_DIR + "cameradata/" 

datetime = datetime.datetime.today()
datetime_formatted = datetime.strftime("%Y%m%d%H%M%S")

file_name = "IMG_" + datetime_formatted

starttime = time.perf_counter()


def camera():
  global ctime
  with picamera.PiCamera() as camera:
   camera.resolution = (1024,768)
   camera.start_preview()
   time.sleep(1)

   camera.capture(SAVE_DIR + file_name + ".jpg")
   cameratime = time.perf_counter() 
   ctime = cameratime - starttime
   print("CAM = {:.9f}s" .format(ctime))
   time.sleep(0.00001)

   camera.capture(SAVE_DIR + file_name + ".jpg")
   cameratime2 = time.perf_counter() 
   ctime2 = cameratime2 - starttime
   print("CAM2 = {:.9f}s" .format(ctime2))

   camera.stop_preview()


def LED():
 global Ltime

 for i in range(1):
    GPIO.output(11,GPIO.LOW)
    time.sleep(1)
    GPIO.output(11,GPIO.HIGH)
    LEDtime = time.perf_counter() 
    Ltime = LEDtime - starttime
    print("LED = {:.9f}s" .format(Ltime))
    time.sleep(0.01)
    GPIO.output(11,GPIO.LOW)
    time.sleep(2)

 GPIO.cleanup()





p1 = threading.Thread(target = camera)
p2 = threading.Thread(target = LED)
p1.start()
p2.start() 
p1.join()
p2.join()
print("camera - LED = {:.9f}s" .format(ctime = Ltime))
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

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

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

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

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

import time
import picamera
import datetime
import threading
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.OUT)

USER_NAME = "pi/" 
HOME_DIR = "/home/" + USER_NAME
SAVE_DIR = HOME_DIR + "cameradata/" 

datetime = datetime.datetime.today()
datetime_formatted = datetime.strftime("%Y%m%d%H%M%S")

file_name = "IMG_" + datetime_formatted


def camera():
    GPIO.output(11,GPIO.LOW)
    with picamera.PiCamera() as camera:
        camera.resolution = (1024,768)
        # プレビュー開始
        camera.start_preview()
        time.sleep(1)

        # capture開始直前にLEDを点灯
        GPIO.output(11,GPIO.HIGH)

        camera.capture(SAVE_DIR + file_name + ".jpg")
        # time.sleep(0.00001)  # こんなに短い時間sleepするような精度は多分ない。
        time.sleep(0.01)       # せいぜい10msが関の山
        # capture完了して10ms経過したらLEDを消灯
        GPIO.output(11,GPIO.LOW)

        # プレビュー終了
        camera.stop_preview()


# ここで何度でも好きなだけcameraを呼び出せるのではないかと推測します。
camera()
camera()


GPIO.cleanup()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/05 14:09

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

    キャンセル

  • 2018/12/05 22:04

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

    キャンセル

0

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


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

それなら単純ですよ。

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

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

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

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

平均 = 全体の和 ÷ 個数

でしたよね。

これに当てはめる。

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

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

sum = sum + arr[i]

のような状態。

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

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

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

これで割り出せる。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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