GoPro-Raspberry pi-フライトコントローラーまとめ

プログラミング
image_print

ここまで

  1. GoProとUSB WIFIアダプター(RTL88x2BU) で通信
  2. GoProとWiFiの追加

でハードウェアの準備をし、

  1. GoProをPythonで動かす
  2. GoProとフライトコントローラーの中継

で、ソフトウェアの研究を積み重ねてきました。

あらためて全体のシナリオを確認します。

  1. GCSやプロポのスイッチからフライトコントローラーへカメラシャッターを要求する信号が飛びます。
  2. フライトコントローラーはAUX GPIOをHighにすることでRaspberry Piにシャッターコマンドを中継します。
  3. Raspberry PiはあらかじめGoProとhttpでの交信を確立していて、GoProにシャッターコマンドを送ります。

最終的なプログラムは次のとおりとなります。

前提はOpen GoProのインストールが必要です。

pip install open-gopro

同時に30秒おきにKeepAliveを送っています。

2024/4/23に、GPIOがラズパイOSで動かなくなっているので、推奨されているgpiozeroの使用に書き換えました。

"""
   gopro-fc.py 
   
   This program scenario is;
   1. establish connection to GoPro
   2. wait for GPIO(SIGNAL_PORT) 
   3. Send Shutter command to GoPro
   
   4. Frequently send keep alive command to GoPro
   
   Therefore this program has infinite loop
   
   10/12/2023 First Edition. By Tsukasa Takao
   4/23/2024  Second Edition. GPIO->gpiozero
"""

import requests
import time
import json
import threading
from gpiozero import Button 

SIGNAL_PORT = 26
GOPRO_BASE_URL = "http://10.5.5.9:8080/"

def request_shutter():

    print("Shutter requested")

    response = requests.get(GOPRO_BASE_URL
                            +"/gopro/camera/shutter/start",
                            timeout=3)
    # request_cmd("/gopro/camera/shutter/stop") # release

    response.raise_for_status()

    time.sleep(3)

    response = requests.get(GOPRO_BASE_URL
                            + "/gopro/camera/shutter/stop",
                            timeout=3)
    resp=response.raise_for_status()


def request_alive(): # loop as ohter thread

    while True:
        response = requests.get(GOPRO_BASE_URL
                                +"/gopro/camera/keep_alive",
                                timeout=3)
        response.raise_for_status()
        resp = response.json()

        print("Keep Alive")

        time.sleep(30)

if __name__ == '__main__':

    # Try photo mode.
    response = requests.get(GOPRO_BASE_URL+
                            "/gopro/camera/presets/set_group?id=1001",
                            timeout=3)
    # request_cmd("/gopro/camera/shutter/stop") # release
    # if not good, throw error.
    response.raise_for_status()

    # GPIO event listner
    button = Button(SIGNAL_PORT, pull_up=False)
    button.when_pressed = request_shutter

    # Generate keep alive thread
    thread_A = threading.Thread(target=request_alive)
    thread_A.start()

    # Loop
    while True:
        time.sleep(10)

    thread_A.join() # wait until thread_A

テストする時はGoProのWIFI APに繋がなければなりません。
もしRaspiとSSH接続をしている場合、有線LANか、USBキーボード+HDMIディスプレイに切り替えておかないとテストできなくなります。

ピッという音と共にモードが切り替わり、Mission Plannerで「シャッタートリガー」を押すとGoProで写真が取れます。

ターミナルをオフにしてもプログラムを動かし続けるためには

nohup python gopro-fc.py &

でいけると思います。
このプログラムはGoPro WiFiを止めると、httpがエラーを起こしますから止まります。

タイトルとURLをコピーしました