aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

Androidでもintdash対応アプリケーション開発が可能に

ネイティブアプリケーション開発を担当している上野です。

前回の記事 で弊社サービスである 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°カメラデバイスで開発したアプリをプラグインとしてインストールする事が可能です。

プラグイン l RICOH360 Blog

今回は会社にTHETA Vがあったので開発したiscp-ktをプラグインとして組み込みintdashサーバーへ360°画像(H.264形式)をストリーミングするサンプルを公開する事にしました。

※THETA V以外のTHETAでもプラグインを動作させる事ができる可能性はありますがTHETA Vのみしか検証できていません。

以下は、セットアップ方法になります。詳細は README に記載してあります。

THETAにプラグインをインストールするにはTHETAを開発者モードする必要があります。また開発者モードにするには RICOH THETA プラグイン パートナープログラム に登録する必要があります。

qiita.com

上記を参考にパートナープログラムへの登録は こちら より行いました。

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のデータの送信開始・停止の方法は端末中央のシャッターボタンを押すだけです。

youtu.be

設定さえ行えてしまえば簡単にデータの送信ができることがお分かりいただけるかと思います。そして体感ですが遅延も大きくは感じられません。

また、私が開発を担当している VM2M Stream Video では360°画像の可視化が標準サポートされているので手元にiPhoneやiPadがある方限定にはなりますが可視化までお手軽にお試しいただけます。

構成は図で表すと以下のようになっております。

THETA iSCP Plugin 可視化例

ネットワーク環境さえ用意できればTHETA単体で簡単に360°動画のストリーミングができるので便利だなと思っています。

レイテンシ比較

参考までにどの程度レイテンシがあるか計測してみます。スマートフォンにミリ秒単位で表示できる時計アプリを起動しTHETA Vで撮影しつつ、いくつかの可視化方法で可視化されるまでの時間を確認してみました。

ミラーリング(scrcpy)

初めにTHETAを scrcpy というAndroidのミラーリングアプリでWindowsパソコンにミラーリングしたものをカメラで撮影してみました。ミラーリングはUSBケーブル経由で行っています。

現実世界とミラーリング画面との差

時計が表示されたスマートフォンの画面とWindowsパソコンに表示されたミラーリング画面を見比べてみると大体 200ミリ秒 程度のレイテンシであることが分かります。

構成は以下の通りです。

ミラーリング構成図

iSCP+Visual M2M Data Visualizer

youtu.be

続いて上の動画のリンクではWindowsパソコンの画面をキャプチャしたもので左側の画面が弊社の製品である Visual M2M Data Visualizer を表示したもので、右側がミラーリング画面になります。

Visual M2M Data Visualizerとミラーリング画面との差

秒のカウントは同じでミラーリングしている画面との差はおおよそ 50~60ミリ秒 程度でしょうか、Visual M2M Data Visualizer はインターネット経由で映像を可視化しているにも関わらず有線接続して可視化している画面と大差がありません。

構成は以下の通りです。

iSCP+Visual M2M Data Visualizer 構成図

RTSP+ffplay

youtu.be

最後に比較対象として同じくWindowsパソコンの画面をキャプチャしたものですが、THETAで起動しているプラグインを THETA RTSP Streaming というTHETAの映像をRTSP経由で配信できるプラグインで確認してみました。左側で可視化しているアプリは ffplay で可視化しています。

ffplayとミラーリング画面との差

ミリ秒以下だけみると同じく60ミリ秒程度の遅延かと思いきや 1秒 遅れています。

参考までに THETA RTSP Streaming はGithubに開発プロジェクトが公開されており、今回開発したプラグインの画像のエンコードまでの処理とほとんど同じとなっており、違いとしては伝送プロトコルと可視化ツールの違いのみとなります。

構成は以下の通りです。

RTSP + ffplay 構成図

最終結果

最終的な結果は以下のグラフの通りとなっております。

レイテンシ比較結果

ミラーリング画面のレイテンシを加味して、撮影をした実時間とVisual M2M Data Visualizerで可視化されるまでの差は 250~260ミリ秒 程度のレイテンシで可視化できていそうです。

撮影場所はWiFiの電波の入りが若干悪い会社のエントランスで検証したのですが、自宅のWiFi環境ではもう少し早く 220~230ミリ秒 程度のレイテンシで可視化できていたのでWiFiルーターの性能やネットワーク環境にも依存しそうです。

最後に

ここまででintdashのを使うことでリアルタイム性はご理解いただけたと思いますがintdashは単にデータストリーミングするプロトコルで終わらず、ストリーミングしたデータをクラウドへ保存することも可能です。また、保存したデータは時系列データとして処理しており1つ1つのデータに時間情報を持たせている為、後から送信した通りにデータをリプレイ再生したり、集計を行うことも可能です。

今回は会社で既に所持していたTHETA Vを利用しての実験的な実装にはなりましたが、通常のAndroidスマートフォンなどで実装してもよいですし、 最新機種のTHETA Xでは端末に液晶が付いたことにより設定や操作が楽になったり、GPSも搭載されたようでより収集可能なデータも増える可能性がありそうです。

www.ricoh360.com

弊社ビジネスのご紹介

アプトポッドでは、IoTミドルウェア intdash の開発と、intdsahを活用したIoTシステムの構築を事業としています。

intdashは、あらゆるIoTデータを収集、伝送、管理、活用することができ、IoTデータを活用するさまざまなサービスのバックエンドとしてご活用頂いております。

www.aptpod.co.jp

IoTデータを利用したプラットフォーム、IoTサービスの開発や、リアルタイムデジタルツイン、製造現場のDX化など、IoTシステムの開発でお困りのことがあれば、ぜひ弊社までお声がけください。

弊社の問い合わせフォームは こちら です。

www.aptpod.co.jp