アクションカメラをRaspberry Piから操作してみた

2024年07月30日 火曜日


【この記事を書いた人】
snara

2016年からIoTサービスの開発・運用に従事。埼玉県出身・埼玉県在住、埼玉を愛す男。好物は十万石饅頭。週末は愛車を丸1日乗り回すくらいの車好き。

「アクションカメラをRaspberry Piから操作してみた」のイメージ

はじめに

GoPro、Insta360、THETAなどのアクションカメラがあります。バイクや自動車の走行映像だったり、スポーツ・ダイビングなどのアクティビティ、さらには旅行のVlogの記録などにも利用され、SNSや動画投稿サイトでは必需品となっています。そのような使い方であれば、カメラを単体で使用したり、あるいは専用スマホアプリと組み合わせて使用するのが一般的だと思います。実は、これらの有名どころのカメラ製品は、カメラ単体やスマホアプリからの利用だけでなく、外部からカメラを操作できることはご存知でしょうか。この方法を活用すれば、単純な映像の記録だけでなく、外部機器からカメラを操作して業務利用するような使い方もできると思います。今回は、実際に外部機器からカメラを操作する手順をご紹介いたします。

使用する機器の紹介

GoPro

アメリカのGoPro社が販売するアクションカメラです。GoPro HEROシリーズが有名です。コンシューマー用途だけでなく、テレビ局の番組撮影などでも使われています。

https://gopro.com/ja/jp/

Insta360

深センのArashi Vision社が販売するアクションカメラです。360度カメラのInsta360 ONE / X シリーズ、プロ用途のInsta360 Pro、小型のInsta360 GOなどの機種があります。自動車やバイク・スポーツ系アクティビティなどの撮影用として人気があります。

https://www.insta360.com/jp/

THETA

リコーが販売する360度カメラです。コンシューマー用途だけでなく、不動産業・自動車販売業・建設業などのビジネス用途でも広く使用されているカメラです。
アクションカメラとは言いにくい機種ではありますが、今回は同等に扱っています。

https://www.ricoh360.com/ja/theta/

Raspberry Pi

ARMプロセッサを搭載したシングルボードコンピュータ(SBC)です。当初は教育用として開発されましたが、安価でかつ完成度が高いことからIoT用途として業務利用もされるようになりました。Linux SBCのデファクトスタンダードとも言える機種です。

https://www.raspberrypi.com/

余談
上記の機器はすべて執筆者の私物です(w

カメラをUSB接続してRaspberry Piから操作する

GoProやTHETAは、MTP(Media Transfer Protocol)というUSB上で動作するプロトコルが使用できます。Linux上でMTPを操作するライブラリとしてlibgphoto2があり、そのアプリケーション実装でgphoto2コマンドがあります。要はgphto2コマンドを使用することで簡単にカメラを操作できる、ということです。
今回は、Raspberry PiにTHETAをUSB接続して、実際にgphoto2コマンドで操作してみます。

 

  1. 事前準備として、Raspberry Piにgphoto2コマンドをインストールします
    $ sudo apt install gphoto2
  2. Raspberry PiとTHETAをUSBで接続します。
    THETAがRaspberry Piから認識されたことを確認します。
    gphoto2コマンドに –auto-detect や –summary のパラメータを付けて実行すると、THETAが認識されていることが確認できます。

    $ gphoto2 --auto-detect
    Model                          Port
    ----------------------------------------------------------
    USB PTP Class Camera           usb:001,005
      
    $ gphoto2 --summary
    Camera summary:
    Manufacturer: Ricoh Company, Ltd.
    Model: RICOH THETA V
      Version: 3.82.1
      (以下略)
  3. まずは静止画を撮影してみます。THETAを静止画モードに切り替えます。
    0x5013の設定項目に1の値をセットすることで、静止画モードに切り替わります。

    $ gphoto2 --set-config=5013=1
  4. 静止画を撮影します。
    gphoto2コマンドに–capture-image-and-download パラメータを付けて実行すると、撮影が行われます。
    撮影した映像ファイルは自動的にRaspberry Piのローカルにコピーされ、カメラからは削除されます。

    $ gphoto2 --capture-image-and-download
    New file is in location /store_00020001/DCIM/101RICOH/R0023981.JPG on the camera
    Saving file as R0023981.JPG
    Deleting file /store_00020001/DCIM/101RICOH/R0023981.JPG on the camera
  5. 続いて、動作の撮影もしてみます。THETAを動画モードに切り替えます。
    0x5013の設定項目に32770 (=0x8002) の値をセットすることで、動画モードに切り替わります。

    $ gphoto2 --set-config=5013=32770
  6. 動画を撮影します。
    gphoto2コマンドに –set-config movie=1 のパラメータを渡すと動画の撮影が開始されます。

    $ gphoto2 --set-config movie=1
  7. しばらく経過後、動画撮影を停止します。
    本来は gphoto2コマンドに –set-config movie=0 のパラメータを渡すと動画の撮影が停止されるはずなのですが、THETAは機種依存なのかこの方法では撮影停止できません。代わりにTHETA独自の方法で撮影停止します。

    # 一般的にはこれで撮影が止まるが、THETAでは動かない
    # $ gphoto2 --set-config movie=0
    # THETAは以下の方法で撮影を止める
    $ gphoto2 --set-config=/main/actions/opcode=0x1018,0xFFFFFFFF
  8. カメラ内に保存されている動画ファイルを確認し、Raspberry Piのローカルに保存します。
    gphoto2コマンドに –list-files パラメータを渡すとカメラ内のファイル一覧を表示できます。–get-file にファイル名を指定するとカメラに保存されているファイルを取得してRaspberry Piのローカルに保存できます。

    $ gphoto2 --list-files
    There is 1 file in folder '/store_00020001/DCIM/101RICOH'.
    #1     R0023984.MP4               rd 45120 KB 3840x1920 video/mp4 1714615443
      
    $ gphoto2 --get-file=/store_00020001/DCIM/101RICOH/R0023984.MP4

このように gphoto2コマンドを実行するだけでRaspberry PiからTHETAを操作することができました。意外と簡単に操作できましたね。
今回はgphoto2コマンドを使用しましたが、pythonをはじめとする各言語でlibgphoto2を使用したカメラ操作用のライブラリがありますので、スクリプトなどでカメラ操作を自動化させることもできます。THETAのMTP(USB API)の仕様は以下のリンクをご参照ください。
https://github.com/ricohapi/theta-api-specs/blob/main/theta-usb-api/README.md
今回はTHETAを使用しましたが、GoProもgphoto2コマンドで同様に操作することが可能です。
(残念ながらInsta360はgphoto2コマンドで操作することはできません。)

 

カメラをWi-Fi接続してRaspberry Piから操作する

THETAやInsta360はOSC (Open Spherical Camera) APIというREST APIが使用できます。OSCはGoogleが提唱しているカメラ操作用のREST APIで、仕様はGoogleにより公開されています(実際にはAPI仕様は機種依存な部分もありますので、実際に使用する場合はカメラメーカーが公開しているAPI仕様を参照するほうが無難です)。
今回はRaspberry PiからOSC APIを実行してInsta360を操作してみます。

  1. Raspberry PiをInsta360のWi-Fiに接続します。
    Insta360の電源を入れるとRaspberry PiからInsta360のSSID(”ONE X2 XXXXXX.OSC”など)が見えますので、そのSSIDに接続します。(Wi-FiのパスワードはInsta360のマニュアルをご参照ください。)

    注意
    Insta360は5GHz帯のWi-Fiを使用しています。Raspberry Pi 3B+ より前の機種(3B、Zero 2Wなど)は5GHz帯のWi-Fiに対応していないため、ご注意ください。今回はRaspberry Pi 4を使用します。
  2. 事前準備として、Raspberry Piに必要なコマンドをインストールします。
    $ sudo apt install curl jq
  3. カメラとの接続確認を行います。
    curlコマンドを使用し、試しにカメラに向けてAPIを実行してみます。

    $ curl -X GET http://192.168.42.1/osc/info | jq .

    以下のようにカメラの情報がJSON形式で返ってくればOKです。

    {
      "manufacturer": "Arashi Vision",
      "model": "Insta360 ONE X2",
      "serialNumber": "IXSXXXXXXXXXX",
      "firmwareVersion": "v1.0.62",
      "supportUrl": "https://www.insta360.com/product/insta360-onex2/",
       :
    (中略)
       :
    }
  4. 静止画を撮影してみます。Insta360を静止画モードに切り替えます。
    /osc/commands/execute というAPIを使用し、camera.setOptions というコマンドで captureMode を image に設定します。

    $ curl -X POST \
      -H "Content-type: application/json" \
      -H "X-XSRF-Protected: 1" \
      http://192.168.42.1/osc/commands/execute -d \
    '
    {
     "name": "camera.setOptions",
     "parameters": {
      "options": {
       "captureMode":"image",
       "hdr": "hdr",
       "photoStitching": "ondevice"
      }
     }
    }
    ' | jq .

    “done” の応答が返ればOKです。

    {
      "name": "camera.setOptions",
      "state": "done"
    }
  5. 静止画を撮影します。
    前回と同様 /osc/commands/execute のAPIを使用し、camera.takePicture というコマンドを実行します。

    $  curl -X POST \
     -H "Content-type: application/json" \
     -H "X-XSRF-Protected: 1" \
     http://192.168.42.1/osc/commands/execute -d \
    '
    { "name":"camera.takePicture"}
    ' | jq .

    以下のように、撮影が完了する前に “inProgress” (=撮影中)の応答が返ってきます。
    事後に “id” の値を使用しますので、メモしておきます。

    {
      "name": "camera.takePicture",
      "state": "inProgress",
      "id": "000592",
      "progress": {
        "completion": 0
      }
    }
  6. しばらく待ってから、静止画撮影が完了しているかを確認します。
    /osc/commands/status のAPIを使用し、パラメータとして前述の “id” の値を渡します。

    $ curl -X POST \
     -H "Content-type: application/json" \
     -H "X-XSRF-Protected: 1" \
     http://192.168.42.1/osc/commands/status -d \
    '
    { "id": "000592" }
    ' | jq .

    撮影が完了していた場合は、以下のように応答の中から映像のファイル名が取得できます。

    {
      "name": "camera.takePicture",
      "state": "done",
      "results": {
        "_fileGroup": [
          "http://192.168.42.1:80/DCIM/Camera01/IMG_20240430_155536_00_006.jpg"
        ],
        "_localFileGroup": [
          "/DCIM/Camera01/IMG_20240430_155536_00_006.jpg"
        ],
        "fileUrl": "http://192.168.42.1:80/DCIM/Camera01/IMG_20240430_155536_00_006.jpg"
      }
    }
  7. カメラ内に保存されている映像のファイルを取得し、Raspberry Piのローカルに保存します。
    $ curl -O "http://192.168.42.1:80/DCIM/Camera01/IMG_20240430_155536_00_006.jpg"

このように Raspberry PiからcurlコマンドでREST APIを実行するだけでInsta360を操作することができました。こちらも意外と簡単に操作できました。
今回はcurlコマンドを使用してAPIを実行しましたが、各種言語を使用してREST APIを呼び出すようなスクリプトを作成することで、カメラ操作を自動化させるようなことも可能です。
今回はInsta360で試しましたが、THETAもOSC APIに対応していますので、同様の操作が可能です。
また、GoProもOSC APIではない独自仕様のREST APIが利用可能です。
詳しくは以下のリンクをご参照ください。

さらなる展開を考える

上記のように、Raspberry Piから各カメラ製品を操作することができました。
これを利用して、Raspberry Piなどの外部機器からあれこれ操作することで、アクションカメラをクラウド連携させるようなこともできると思います。
また、IIJ IoTサービスの各種機能を組み合わせることで、より便利にカメラをクラウド対応させることができます。
例えば、カメラの映像ファイルを自動的にIIJ IoTサービスデータストレージにアップロードすることで、いちいちカメラのSDカードからファイルを取得せずとも撮影後すぐにクラウド上の映像を確認することが可能になります。
また、IIJ IoTサービスデバイスリンク機能デバイスコントロール機能を使用することで、遠隔地に設置してあるカメラをクラウド経由で操作することも可能になります。
このような使い方をすることで、アクションカメラを単なる動画撮影用のカメラとしてだけでなく、クラウド対応のウェアラブルカメラ・ 監視カメラなどとして業務利用するようなことも可能になると思います。
IIJでは、このようなアクションカメラとIoTを組み合わせた便利な使い方をご提案することも可能です。ご興味がある方はぜひお問い合わせください。

snara

2024年07月30日 火曜日

2016年からIoTサービスの開発・運用に従事。埼玉県出身・埼玉県在住、埼玉を愛す男。好物は十万石饅頭。週末は愛車を丸1日乗り回すくらいの車好き。

Related
関連記事