ARToolKit professional for Android の開発手順やTipsの紹介

Section 1 開発概論 ライブラリの構造と開発手法

About

ARToolKitは拡張現実感アプリケーションの開発に使用される世界も人気のあるライブラリです。 現在(2011年時点)、特に携帯電話……スマートフォン上で動作させることを重要視し様々なハードウェア及びソフトウェアのプラットフォームに移植されています。

ここで説明しているライブラリは ARToolKit Professinal を Android に移植したバージョンです。 このライブラリは、Android NDKAndroid SDKを用いるライブラリセットになっています。計算コア部分をAndroid NDK、それ以外をAndroid SDKという比較的簡単な実装方法から、全てAndroid NDKで実装する方法などを選択してアプリケーションを開発することになります。 そのため、Androidの開発について、Android SDKのみならずAndroid NDKの知識も必要になる場面があります。
なお、このライブラリはARToolKitのライセンスを購入する事で利用する事ができます。

ARToolKit for Android SDKコンポーネント

AndroidのほとんどのアプリケーションはJavaで開発され、Android SDKはそれをサポートするフレームワーク、豊富なクラスを提供しています。 また、これに加え、ネイティブ C/C++のコードベースのライブラリにアクセスできるAndroid NDKを使用することができます。 これにより、端末の持つパフォーマンスを最大限引き出す必要のある機能のために最適化する事ができます。

Android NDKを用いる一般的なアプローチは、JNIの命名スキームを使用たインターフェースを含むC/C++の共有ライブラリを構築することです。 Android SDKを用いたアプリケーションは、このライブラリをロードし、他のメソッドと同じように呼び出すことができます。

この方式を用いることで、ARToolKitのライブラリを移植することにより、Android上で動作させることが可能になりました。

ARToolKit for Android は、Androidアプリケーションの開発を可能にするために下記に示す C/C++ と Java の両方のコンポーネントが含まれています。

ARToolKit core modules
ARToolKitのコア部分です。画像からマーカーを検出し、位置などを計算する部分が含まれているネイティブなライブラリです。
ARToolKitWrapper
CとJNIインターフェースで、ARToolKitの機能やマーカー管理などの機能を含む、C++のラッパーライブラリです。主に下記のARBaseLibとあわせて使用します。
ARBaseLib
ARToolKitWrapperと通信するJavaのライブラリです。このクラスを使用してARToolKitのネイティブ機能に簡単にアクセスできるようになります。

ARBaseLibを利用したアプリケーションの構造をとても簡単にした図にすると下記のようになります。

ARToolkit for Android 簡易構造図

Android NDK部分については、コンパイル済みのパッケージが提供されています。 そのため、ARBaseLibを活用すれば基本的にJavaのみで開発することが可能です。

次は開発手法について説明します。

開発手法

ARToolKit for Android を使用してアプリケーションを作成する方法を下記に示します。

  1. 提供されているARBaseLib、ARToolKitWrpperのライブラリを使用し、主にAndroid SDKを使用して開発する方法
  2. ARToolKitWrpperを利用した新しい共有ライブラリを作成し、Android SDK、NDKを使用して開発する方法
  3. ARToolKitを直接利用する、ほぼ、Android NDK のみを使用して開発する方法

もっとも簡単な方法は、最初に上げた、提供されているライブラリを使用する方法です。
構造を簡単に図にすると下記のようになります。

ARToolkit for Android 簡易構造図 fig. 2

この場合、ARで負荷の高いマーカー検出のための画像解析や計算部分が高速化されます。 マーカー上のモデル表示、上記の図中のRenderer部分に当たる箇所はJavaのOpenGL ESを用いて独力で書くか、NyARToolKitのようにmin3dなど外部のJavaで書かれたレンダラーを用いることになると思います。

この場合、モデル表示に処理を取られ、アプリケーションが重いと感じることがあるかもしれません。
そこで、Rendererに該当する部分をAndroid NDK側で処理する方法があります。 また、適切なJavaで書かれたRendererがない場合、C言語で書かれたOpenGLのコードをAndroid NDKに移植して使うこともできると思います。

そのため、下記の図のような構造を採用することになると思います。

ARToolkit for Android 簡易構造図 fig. 3

ARBaseLibを使うこところまでは同じですが、OpenGL ESを使用する部分をAndroid NDKに任せています。 これにより、Javaで処理するよりも高度なモデルなどが表示しやすくなると共に、Cで書かれたRendererを利用することが可能になります。 しかし、この方法には欠点があり、ARToolKitで検出した結果をSDKを経由して、NDKに渡し直すという手順を取るため、行ったりきたりする分、遅くなるという現象が発生します。

となると結果的に全てNDKで書けばいいのではないか?ということになり、下記のような構造を採用することになります。

ARToolkit for Android 簡易構造図 fig. 4

メモリ管理さえ出来れば、この方法が最も安定し、書き方によってはiOSアプリと共有できるのでお勧めしたい構成ですが、難易度は一気に高くなります。

開発に必要な要件

このSDKは、Android 2.1以降のデバイスをターゲットとしています。 しかし、JITコンパイラが含まれる Android 2.2 以降が現実的です。 ほぼ全てNDKに押し込めるのであればAndroid 2.3以降ですが、カメラ周りの制御ができないので結果的にAndroid 2.2以降になると思います。

開発環境には、Eclipse、ADT、Android SDK、ネイティブ開発のためのAndroid NDKが必要です。
また、現在、ARToolKit for AndroidはWindows上で開発されているため、WindowsにCygwinが必要になります。

同時に、Android Emulatorはウェブカメラを代用として使うことができないため、Android端末が必須です。