ネイティブアプリケーション開発を担当している上野です。
前回の記事 で弊社サービスである intdash を用いたデータ伝送がUnityで扱えるようになったとお伝えしましたが今回はAndroidアプリ開発などで利用されている開発言語である Kotlin
でも利用可能になりましたのでそのご紹介になります。
今回公開したもの
今回公開したものは、以下の3つです。
iSCP 2.0 Client Library for Kotlin について
iSCP 2.0 Client Library for Kotlin(※以下iscp-kt) は弊社の独自プロトコル iSCP(intdash Stream Control Protocol)
を用いてintdashサーバーへデータ伝送が可能になるクライアントライブラリの Kotlin版
です。
Kotlin版といいつつもKotlinはJavaへの互換性をもっており、Javaコードからもこのライブラリを利用する事も可能です。ライブラリはJARファイルで生成されており、Mavenリポジトリ形式でGithub Pagesに設置しました。ですので依存関係さえクリアできればAndroid以外のJavaプラットフォームでも利用可能です。
ライブラリの参照方法はAndroidの場合、以下の様に .gradle
ファイルにMavenリポジトリのパスと参照するライブラリを設定すれば利用可能です。
// settings.gradle ... dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() // Library references for iSCP maven { url "https://aptpod.github.io/iscp-kt" } // <- 追加 } }
// app/build.gradle ... dependencies { ... // Install iSCP implementation 'com.aptpod.github:iscp:0.11.0' // <- 追加 }
iscp-ktの最低Kotlinバージョンは 1.8.20
です。プロジェクトで利用するKotlinバージョンがそれ以上かどうか確認する必要があります。
// build.gradle plugins { id 'com.android.application' version '8.0.2' apply false id 'com.android.library' version '8.0.2' apply false id 'org.jetbrains.kotlin.android' version '1.8.20' apply false // <- 確認 id 'org.jetbrains.kotlin.jvm' version '1.8.20' apply false // <- 確認 }
実装方法に関しては ドキュメント を参照して頂くか、同じく公開したTHETA iSCP Pluginプロジェクト内のテストコードに RealtimeApiTest.kt が実装されています。
// RealtimeApiTest.kt ... @RunWith(AndroidJUnit4::class) class RealtimeApiTest { companion object { const val URL_API = "https://example.intdash.jp" const val ADDRESS = "example.intdash.jp" const val NODE_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" const val NODE_SECRET = "xxxxxxxxxx" } ...
ソースコードの定数にintdashサーバーと送信するノードの情報を入力する所があるのでそれらを修正して実行するだけでデータの送信を試すことも可能です。
intdash REST API クライアント について
Kotlin向け intdash REST API クライアント は intdashサーバーとのデータ伝送には認証情報の発行等が必要な為、それらを行うことができるREST APIクライアントの生成方法やその他のAPIの使用例が記載してあります。
THETA iSCP Pluginでは既にAPI クライアントをJavaプロジェクトとして生成した物を含めています。注意点としては現状 OpenAPI Generator からAPI クライアントを生成する際にKotlinとしては出力していません。現状Kotlinのみのコードで出力ができず、Javaとして出力してもKotlinコードから呼び出すことが出来るからです。
openapi-generator-cli generate -i openapi_public.yaml -g java -o intdash --additional-properties=library=okhttp-gson,apiPackage=com.aptpod.intdash,groupId=com.aptpod,artifactId=intdash,sourceFolder=src/main/java,disallowAdditionalPropertiesIfNotPresent=false,dateLibrary=legacy
また、生成コマンドもドキュメントに書かれているコマンドと若干変えており、dateLibrary=legacy
を追加しています。こちらは検証に利用したTHETA VのAndroid APIバージョンが25で若干古く、日付管理系のクラスが一部利用できなかった為です。APIを利用する際、日時として利用するクラスが java.time.ZonedDateTime から java.util.Date となり、マイクロ秒以下の時間指定が出来なくなってしまうので注意が必要です。
THETA iSCP Plugin について
THETA iSCP Plugin はタイトルにもある通りAndroidOSでintdash対応アプリケーション開発が可能になったのでその1例として開発した物になります。RICHO THETA はAndroidOSで動いている360°カメラデバイスで開発したアプリをプラグインとしてインストールする事が可能です。
今回は会社にTHETA Vがあったので開発したiscp-ktをプラグインとして組み込みintdashサーバーへ360°画像(H.264形式)をストリーミングするサンプルを公開する事にしました。
※THETA V以外のTHETAでもプラグインを動作させる事ができる可能性はありますがTHETA Vのみしか検証できていません。
以下は、セットアップ方法になります。詳細は README に記載してあります。
THETAにプラグインをインストールするにはTHETAを開発者モードする必要があります。また開発者モードにするには RICOH THETA プラグイン パートナープログラム に登録する必要があります。
上記を参考にパートナープログラムへの登録は こちら より行いました。
THETAが開発者モードになり、プラグインをインストールできるようになりましたらプロジェクトをリポジトリよりクローンしてAndroid Studioで実行して頂くか、Releases よりプラグインのapkファイルと設定ファイルをダウンロードしてセットアップが可能です。
{ "intdash" : { "server_url" : "https://example.com", "server_path" : "/api", "node_client_id" : "00000000-0000-0000-0000-000000000000", "node_client_secret" : "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "save_to_server" : false }, "video" : { "enabled" : true, "resolution" : { // THETA V supported resolutions: [ 3840x1920, 1920x960, 1024x512, 640x320 ] "width" : 1920, "height" : 960 }, "sample_rate" : 29.97, // THETA V's frame rate is fixed at 29.97 fps. "encode_rate" : 15, // Frame rate to be encoded and transmitted. "bit_rate" : 2000000, "i_frame_interval" : 2 } }
設定ファイルである iscp_plugin_settings.json にはintdashサーバーへデータをストリーミングする設定と送信する360°画像の解像度やビットレート、送信するレート(encode_rate
) などの設定が可能です。
公開したソースコードで一部 TODO としている部分があります。THETAはマイクが内臓されており、音声の収集が可能です。さらに最近のスマートフォンでは無くなってきているイヤホンジャックもついているのでお手持ちのマイクなどを利用しても収音できるかなと考えていましたが、一般的なAndroidアプリでPCMなどの生データを拾うことが可能な android.media.AudioRecord であったりOpenSL ESを利用している Oboe などのライブラリを使用してみたりしましたが、指定したサンプリングレート通りに音声データが集まらなかったり、ノイズがひどかったので今回の公開内容には混ぜておりません。手持ちのTHETA Vの調子が悪かったのかもしくはTHETA Vは現在は製造中止となっているようで新しい機種のTHETAであればもしかすると対応可能なのかもしれません。
※2023/09検証時THETA Vのファームウェアバージョンは 3.82.1
。
開発したサンプルを動かしてみた
電源を入れたら側面のモードボタンを長押しすることでプラグインが起動します。THETA iSCP Pluginのデータの送信開始・停止の方法は端末中央のシャッターボタンを押すだけです。
設定さえ行えてしまえば簡単にデータの送信ができることがお分かりいただけるかと思います。そして体感ですが遅延も大きくは感じられません。
また、私が開発を担当している VM2M Stream Video では360°画像の可視化が標準サポートされているので手元にiPhoneやiPadがある方限定にはなりますが可視化までお手軽にお試しいただけます。
構成は図で表すと以下のようになっております。
ネットワーク環境さえ用意できればTHETA単体で簡単に360°動画のストリーミングができるので便利だなと思っています。
レイテンシ比較
参考までにどの程度レイテンシがあるか計測してみます。スマートフォンにミリ秒単位で表示できる時計アプリを起動しTHETA Vで撮影しつつ、いくつかの可視化方法で可視化されるまでの時間を確認してみました。
ミラーリング(scrcpy)
初めにTHETAを scrcpy というAndroidのミラーリングアプリでWindowsパソコンにミラーリングしたものをカメラで撮影してみました。ミラーリングはUSBケーブル経由で行っています。
時計が表示されたスマートフォンの画面とWindowsパソコンに表示されたミラーリング画面を見比べてみると大体 200ミリ秒
程度のレイテンシであることが分かります。
構成は以下の通りです。
iSCP+Visual M2M Data Visualizer
続いて上の動画のリンクではWindowsパソコンの画面をキャプチャしたもので左側の画面が弊社の製品である Visual M2M Data Visualizer を表示したもので、右側がミラーリング画面になります。
秒のカウントは同じでミラーリングしている画面との差はおおよそ 50~60ミリ秒
程度でしょうか、Visual M2M Data Visualizer はインターネット経由で映像を可視化しているにも関わらず有線接続して可視化している画面と大差がありません。
構成は以下の通りです。
RTSP+ffplay
最後に比較対象として同じくWindowsパソコンの画面をキャプチャしたものですが、THETAで起動しているプラグインを THETA RTSP Streaming というTHETAの映像をRTSP経由で配信できるプラグインで確認してみました。左側で可視化しているアプリは ffplay で可視化しています。
ミリ秒以下だけみると同じく60ミリ秒程度の遅延かと思いきや 1秒
遅れています。
参考までに THETA RTSP Streaming はGithubに開発プロジェクトが公開されており、今回開発したプラグインの画像のエンコードまでの処理とほとんど同じとなっており、違いとしては伝送プロトコルと可視化ツールの違いのみとなります。
構成は以下の通りです。
最終結果
最終的な結果は以下のグラフの通りとなっております。
ミラーリング画面のレイテンシを加味して、撮影をした実時間とVisual M2M Data Visualizerで可視化されるまでの差は 250~260ミリ秒
程度のレイテンシで可視化できていそうです。
撮影場所はWiFiの電波の入りが若干悪い会社のエントランスで検証したのですが、自宅のWiFi環境ではもう少し早く 220~230ミリ秒
程度のレイテンシで可視化できていたのでWiFiルーターの性能やネットワーク環境にも依存しそうです。
最後に
ここまででintdashのを使うことでリアルタイム性はご理解いただけたと思いますがintdashは単にデータストリーミングするプロトコルで終わらず、ストリーミングしたデータをクラウドへ保存することも可能です。また、保存したデータは時系列データとして処理しており1つ1つのデータに時間情報を持たせている為、後から送信した通りにデータをリプレイ再生したり、集計を行うことも可能です。
今回は会社で既に所持していたTHETA Vを利用しての実験的な実装にはなりましたが、通常のAndroidスマートフォンなどで実装してもよいですし、 最新機種のTHETA Xでは端末に液晶が付いたことにより設定や操作が楽になったり、GPSも搭載されたようでより収集可能なデータも増える可能性がありそうです。
弊社ビジネスのご紹介
アプトポッドでは、IoTミドルウェア intdash の開発と、intdsahを活用したIoTシステムの構築を事業としています。
intdashは、あらゆるIoTデータを収集、伝送、管理、活用することができ、IoTデータを活用するさまざまなサービスのバックエンドとしてご活用頂いております。
IoTデータを利用したプラットフォーム、IoTサービスの開発や、リアルタイムデジタルツイン、製造現場のDX化など、IoTシステムの開発でお困りのことがあれば、ぜひ弊社までお声がけください。
弊社の問い合わせフォームは こちら です。