Help us understand the problem. What is going on with this article?

C#でUSB接続したTHETA Sを操作できるライブラリを作成してみた

More than 3 years have passed since last update.

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の仕様とにらめっこしてチャレンジしてみてください。

soundkonchan
金沢に住んでいる人です。 ThetaとかC#とかに興味があります。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away