RICOH THETA SではUSB MTPの仕様が公開されています。
https://developers.theta360.com/ja/docs/v2/usb_reference/
ただ、仕様を見ただけではどうやって実現したらよいかわかりませんでした。
調査を進めると、WindowsではWPDからMTPコマンドを実行できることがわかりました。
自分はC#が好きなので、C#から使えるライブラリを作成しよう!となりました。
WpdMtpLib
https://github.com/kon0524/WpdMtp
こちらが作成したライブラリです。
WpdMtpLibを使用するにはMTPの知識が少し必要なのでものすごくざっくりと説明します。
MTPではカメラ側をレスポンダー、接続機器(今回はWindows PC)側をイニシエータといいます。
イニシエータがレスポンダーにリクエストを送信すると、レスポンダーがイニシエータにレスポンスを送るという流れになっています。
リクエストには、リクエストの種別・パラメータ・データフェーズの有無の情報が含まれています。
データフェーズとはリクエストとレスポンスの間にある状態で、データを送信または受信するフェーズです。
リスエストの種別によって、データフェーズが無い場合、イニシエータからレスポンダーへデータを送る場合、レスポンダーからイニシエータにデータを送る場合の3ケースがあります。
例えば静止画撮影のリクエストの場合は以下のようになります。
リクエスト種別:0x100E(InitiateCapture)
パラメータ:StorageID, ObjectFormatCode
データフェーズ:なし
上記リスエストをレスポンダーに送り正しく受理されれば撮影されます。
詳しくは上記THETA SのMTP仕様にある、MTPの仕様書をご確認ください。
では早速やってみましょう。
まずはUSB接続したTHETA Sへ接続します。
MtpCommand command = new MtpCommand();
string[] deviceIds = command.GetDeviceIds();
command.Open(deviceIds[0]);
例ではdeviceIdsの最初のidをopenしていますが、本当はここでTHETA Sかどうがチェックする必要があります。
この時、THETA Sの電源ボタンのLEDが赤色の場合は、電源ボタンを押して撮影可能状態にしましょう。
次に撮影です。
command.Execute(MtpOperationCode.InitiateCapture, new uint[2] { 0, 0 }, null);
ピヨっと音が鳴ると思います。
Executeの引数は3つあります。最初がリクエスト種別で二つ目がパラメータ。InitiateCaptureのパラメータはStorageIdとObjectFormatCodeの2つ設定する必要がありますが、THETA Sの場合はどちらも0を指定してくださいと書いてあるため0が2つの配列を指定しています。最後がデータフェーズのデータですが、InitiateCaptureにはデータフェーズがないためnullです。
操作が終わったら正しく切断しましょう。
command.Close();
他にも画像の取得などもできるので、MTPの仕様とにらめっこしてチャレンジしてみてください。