RTM on Androidとは

概要

特徴

 RTM on Android は、Android端末に対応したRTミドルウェアです。 RTM on Android を用いることで、ロボットやセンサーがAndroid端末と連携するシステムを迅速かつ安価に作成することが可能になり、次のような特徴があります。

  1. RTミドルウェアやRTCの知識が乏しくても、通常のAndroidアプリケーション開発スキルを持つ人であれば、容易にRTCの開発が可能となる。
  2. RTM on Androidを利用して開発したRTCは、ごく普通のAndroidアプリケーションとして扱うことができ、実行時のシステムリソースへの負荷も軽い。
  3. RTM on Androidを利用して開発したRTCは、OMGにより標準化されたRTC標準仕様Ver1.0に従った軽量RTCのOpenRTM拡張モデルとしての基本的な振る舞いに対応し、他プラットフォーム上のRTCともシームレスに相互接続できる。

なぜ必要か

 独立行政法人新エネルギー・産業技術総合研究機構(NEDO)の委託業務である「次世代ロボット知能化技術開発プロジェクト」において、ロボットシステムを効率的に構築するためのソフトウェア基盤であるOpenRTP(Open Robot Technology Platform)では、異なる環境の知能モジュールをシームレスに接続可能とするため、様々なOSやプログラミング言語に対応したRTミドルウェアが開発されています。しかし、残念ながら急速に普及しているスマートフォンやタブレットPCへの対応が遅れていました。

 そこで、オープンソースで公開されている点、扱いやすいライセンス(Apache Software Licencse v2)である点、豊富なAPIが公開されておりアプリケーションを開発しやすい点、などにおいて、今後益々の拡大が見込まれるプラットフォームであるAndroidに注目しました。OMGで承認された国際規格である RTC SpecificationをAndroid上に実現することで、Androidタブレットやスマートフォンを用いて、場所を選ばずにロボットの制御・監視が可能になります。

アーキテクチャと実装

Androidアーキテクチャとアプリケーション

 Android Runtimeには、省メモリ、低スペックなCPUなどの環境に最適化されたDalvik VMが含まれています。各アプリケーションは、それぞれが独立したLinuxのプロセスとなり、各アプリケーションに一つのDalvik VMインスタンスが対応して動作します。

 一般的なAndroidアプリケーションは、UIを持つコンポーネントであるActivityとして実装されます。Activityは画面の最上位に表示される場合にのみ動作することができ、他のActivityが上位に表示されたり、BackやHomeキーを操作されたりした場合には休止状態となるライフサイクルが決められています。一方、UIを持たず、バックグラウンドで継続的に動作するServiceも代表的なコンポーネント単位です。

RTCとAndroidにおけるコンポーネントの対応整理

 RTCは、必ずしもUIを必要としません。また、他RTCとの通信は継続的に実施できる必要があります。そのため、RTM on Androidでは、RTCがAndroid上でServiceとして動作するように実装を行いました。そして、UIが必要な場合は別途Activityを必要なだけ追加できるようにし、これら全体で一つのアプリケーション単位(apk)となるように考えられています。

 ServiceとしてRTCのコアな処理が動作することで、一つのAndroid端末上に複数のRTCを同時にActiveな状態で稼動させることもできます。

CORBA実装

 RTM on Androidは、OpenRTMのAndroid実装を目指しており、CORBA通信が必須です。しかし標準のAndroidプラットフォームではCORBAは未サポートのため、独自の実装が必要でした。実用化のためには、RTCをServiceコンポーネントとしてバックグラウンドで継続的に動作させる必要があり、CORBA実装を含め、システムリソースへの負荷を極力減らすことが重要でした。

 この要求に応えるCORBA実装として、独立行政法人産業技術総合研究所(以降、産総研)が開発した軽量CORBAのRtORBを採用し、これをAndroidにポーティングしました。Android開発環境のツールキットとしてGoogle社より提供されているNDK(Native Development Kit)を利用することにより、C言語での実装をほぼそのままポーティングすることに成功、ネーミングサービスとのI/F実装についても、RtORBに同梱されているCosNaming.idlからCソースを自動生成して同様にポーティングを行いました。

 これらはともに、Cのネイティブライブラリである.so形式として生成され、Androidアプリケーションに組み込むことができます。

 RtORBについては下記のサイトを参照してください。

OpenRTM実装

 RTM on Androidは、RTC標準仕様Ver1.0に従った軽量RTCのOpenRTM拡張モデルとしての基本的な振る舞いに対応しつつ、実行時のシステムリソースへの負荷も軽いRTCが開発できることを目指しています。そのため、OpenRTMの実装部分もIDLファイルからCソースを生成して最低限のロジックの実装を行い、NDKの利用により.so形式で組み込む実装を行いました。

 OpenRTM拡張モデル適用であるため、OpenRTM-aistに含まれているOpenRTM.idlなどの産総研の成果を一部利用させて頂いており、ライセンスの扱い等についての整理/調整も進めてきました。

RTM on Androidのアーキテクチャ

 RtORB、CosNaming, OpenRTMの実装をネイティブライブラリとして組み込めたことで、あとはこれらを利用するRTCを簡単に実装/実行できる仕組みが必要です。

 RTM on Androidでは、これらを利用してServiceコンポーネントとしてRTCが動作するためのJavaクラス群、およびネイティブライブラリで提供されるOpenRTMなどの実装をJava層から利用するためにJNI(Java Native Interfase)によりラッピングした独自ライブラリを実装することで、これを実現しています。さらに、OpenRTMの基本データ型を扱うためのクラスや、RTCの状態遷移に伴い呼び出されるActionの仕組み、またデータポートの入出力を行う仕組みなどをJava層に実装しました。この際、アプリケーション開発者が直感的かつシンプルに利用できるAPIを用意することで、簡単な最小限の記述を行えばRTCの実装が行えるように配慮しています。

 また、RTCには個々に任意の数のデータポートと対応するデータ型、コンフィグレーションの種類/データ型/初期値など、固有のプロファイル情報の指定が必須で、RTM on Androidでは、これらを定義する雛形Javaソースを実装しています。指定できるプロファイル情報は概ねOpenRTM-aistと同等ですが、CPU負荷の調整を想定し、実行コンテキストの周期設定も有効となるようにしました。

 さらに、Actionの実装やデータポートからの入力時に呼び出されるコールバック実装を記述するための雛形Javaソースを実装しています。

RTC実装方法

 Androidアプリケーションの最も一般的な開発方法は、Google社により提供されているEclipse用のSDKを利用し、Eclipse上でアプリケーション単位にAndroidプロジェクトを作成してJavaソースやXMLの編集からビルドまでを実施する方法でしょう。この環境であれば、UIのデザインも含め全てEclipse上で作業が可能となります。

 RTM on AndroidによるRTC開発もAndroidアプリケーション開発と同様ですので、RTM on AndroidもEclipse上のAndroidプロジェクトにて作業できるようにしました。

_images/fig3s.png

RTM on AndroidによるAndroidプロジェクトの例

 上図左側のパッケージ・エクスプローラーにて選択状態となっており、右側のエディタ画面に表示されているのは、RTCのプロファイルを記述するための雛形Javaソースの編集事例です。また、パッケージ・エクスプローラー上で選択状態のひとつ上にあるファイルは、Action等の実装を記述するための雛形Javaソース、中段の赤枠で示している4つの.soファイルがRtORB, CosNaming, OpenRTMとJNIラッピングのネイティブライブラリ群です。さらに、最下部に表示されているファイルは、ネイティブライブラリ群を利用してServiceとしてRTCを動作させる仕組みなどを持つクラス群のjarファイルです。

 本事例は、UIを持つ例であり、Activityの実装を記述しているのが選択状態の一つ下のJavaソースです。

 この事例からも分かるとおり、RTM on AndroidによりRTCを開発する方法は通常のAndroidアプリケーションを開発する方法と何ら変わるところはありません。また、開発者が記述するべきソースファイル数も極めて少なくて済みます。

利用事例

Android上で動作させるRTCの用途想定

RTM on Androidを利用して開発するRTCの用途としては、概ね下記の3タイプと、それらの任意の複合タイプに分類されると考えられます。

  1. Senseタイプ
Android端末(スマートフォンやタブレット端末)内に組み込まれている各種センサ(加速度センサ、GPSセンサなど)から情報を取得して、他RTCに出力するタイプ。このタイプにはUIは不要であり、Serviceのみのアプリケーションとすることが可能です。
  1. Actタイプ
他RTCからの入力に従い、Android端末上で別のアプリケーションを起動したり、Application Frameworkにて提供されているAPIを利用したりすることで、Android端末内に組み込まれているデバイスなどを操作するタイプ。例えば、外部からの信号によりカメラで静止画や動画の撮影を実施したり、指定された音声を出力したりという利用が可能で、このタイプもUIは不要です。
  1. View / Controlタイプ
独自UIを持つか、あるいはUIを持つ別アプリケーションとインタフェースを持ち、UI操作により何らかの情報を他RTCに出力したり、他RTCからの入力などをViewに表示したりするタイプ。RTCで動作するロボットやアクチュエータの制御、外部センシング情報のモニタなどが可能です。独自UIを持つ場合は、ServiceとActivityを併せ持つアプリケーションとなります。

RTC開発事例1-ロボットの遠隔制御・監視

  • Android端末を用いてロボットを遠隔制御
  • タブレットからロボットを操作
  • ロボットのカメラ映像をタブレットで表示
_images/sample1.png

RTC開発事例2-センサーネットワーク

  • Android端末をセンサネットワークのデバイスとして活用
  • 部屋情報をセンサーと接続したAndroid端末から収集
  • 収集結果をタブレットに表示
_images/sample2.png

RTC開発事例のコンポーネント構成

RTC開発事例1、2で使用されているコンポーネントの構成を下図に示します。

_images/components.png

コンポーネントの構成図

RTC開発事例1のRTC群を表示しているRT System Editor画面を下図に示します。(赤枠内がAndroidタブレット上のRTC)

_images/fig6s.png

RT System Editor画面