NyARToolkit for Javaインストールメモ

Ubuntu 8.04にNyARToolkitをインストールして、サンプルを動かしたときのメモです。

Javaの切り替え

sun-java, openjdk, gcjなどいくつかJavaが入っていたので、sun-javaかopenjdkに切り替える。

$ update-java-alternatives -l

で入っているJavaを確認して、

$ sudo update-java-alternatives -s java-6-sun

で切り替え。

依存ライブラリのインストール

JMF, JOGL, Java3Dをインストールする。
ちなみにreadmeには「JMFとJOGLかJava3Dをインストールしてください」と書いてあるのだけど、これだと「(JMF)と(JOGLかJava3D)」なのか「(JMFとJOGL)か(Java3D)」なのか分かりにくいと思った。で、前者が正しい。細かいことだけどちょっと迷ったので一応メモ。

JMFをインストール

Oracle Technology Network for Java Developers | Oracle Technology Network | Oracleからjmf-2_1_1e-linux-i586.bin をダウンロードして、インストールしたい場所に置いて実行。今回は ~/lib/ に置いた。

$ cd ~/lib
$ /bin/sh ./jmf-2_1_1e-linux-i586.bin

==> エラー出た

tail: `+309' を 読み込み用でオープンできません: No such file or directory

http://semanticlog.blogspot.com/2008/05/ubuntu-ubuntu-804-hardyjmf.htmlによるとバグがあるらしいので直す。

tail +309 $0 > $outname
 の行を
tail -n +309 $0 > $outname
 に直す。

あと一度実行してエラーが出るとファイルが0バイトになって動かなくなるので注意。

再度実行。今度はうまくいった。

java.lang.Error: Can't open video card 0

というエラーが出るけど気にしない。

環境変数を設定。.zshrc (or .bashrc)に以下を追記する。

export JMFHOME=/home/kambara/lib/JMF-2.1.1e
export CLASSPATH=.:$JMFHOME/lib/jmf.jar:${CLASSPATH}
export LD_LIBRARY_PATH=$JMFHOME/lib:${LD_LIBRARY_PATH}
JOGLをインストール

JOGLはOpenGLJavaバインディング
https://jogl.dev.java.net/のCurrent release buildからダウンロードして、インストールしたい場所に解凍。
今回はjogl-1.1.1-linux-i586.zipを~/lib/に解凍した。

環境変数を設定。クラスパスにはjogl.jarとgluegen-rt.jarを追加する。

export JOGL_HOME=/home/kambara/lib/jogl-1.1.1-linux-i586
export CLASSPATH=$JOGL_HOME/lib/jogl.jar:$JOGL_HOME/lib/gluegen-rt.jar:${CLASSPATH}
export LD_LIBRARY_PATH=$JOGL_HOME/lib:${LD_LIBRARY_PATH}
Java3Dをインストール

https://java3d.dev.java.net/binary-builds.htmlからj3d-1_5_2-linux-i586.binをダウンロードして、インストールしたい場所に置いて実行。今回は ~/lib/j3d-1_5_2/ に置いた。

$ ~/lib/j3d-1_5_2
$ /sh/bin j3d-1_5_2-linux-i586.bin

環境変数を設定。クラスパスにj3dcore.jar, j3dutils.jar, vecmath.jarの3つを追加する。

export J3D_HOME=/home/kambara/lib/j3d-1_5_2
export CLASSPATH=$J3D_HOME/lib/ext/j3dcore.jar:$J3D_HOME/lib/ext/j3dutils.jar:$J3D_HOME/lib/ext/vecmath.jar:${CLASSPATH}
export LD_LIBRARY_PATH=$J3D_HOME/lib/i386:${LD_LIBRARY_PATH}

Webカメラの設定

http://www.geocities.jp/lg3d_lgscope/lgcam/lgcam.htmlの下の方を見つつ、JMFでWebカメラの設定をした。
ちなみにエレコムわけありショップで500円ぐらいで買ったグネグネ曲がるWebカメラを使っている。こういう古くて安いWebカメラならUbuntuは大抵認識してくれる。

上でインストールしたJMFのbinの中にあるツールを使ってカメラの設定をする。
USBにWebカメラをつないだあと

$ cd JMF-2.1.1e/bin
$ ./jmfinit

でカメラを認識する(はず)。
カメラを使えるか確認するにはjmstudioを使う。

$ ./jmstudio

jmstudioを起動して、「File > Preference」の「Capture Devices」タブのリストにカメラがあればOKを押す。無ければリストの下の「Detect Capture Devices」で検出する。
「File > Capture」で「Use video device」にチェックを入れ、カメラを選んで適当に値を入れる。
ちなみに今回の設定値はこう。

  • カメラ: v4l:Pixart PAC207-BCA:0
  • Encoding: RGB
  • Video Size 320x240
  • Frame Rate: 15.0
  • Bits per Pixel: 24

OKを押せば映像が映るはず。もし「Couldn't initialize the Capture Device!」と怒られても、jmstudioを再起動すると問題なく動いたりする。

NyARToolkitのサンプルを動かす

ダウンロードファイル一覧 - NyARToolKit - OSDNからNyARToolkit for Javaをダウンロードして解凍。今回はNyARToolkit-2.1.0を使った。

jmfのサンプル

sample/jmfの中のNyarToolkitLinkTestを動かしてみる。

$ cd NyARToolkit-2.1.0/sample/jmf
コンパイル
$ javac -sourcepath .:../../src:../../src.utils/jmf jp/nyatla/nyartoolkit/jmf/sample/NyarToolkitLinkTest.java
実行
$ java -classpath .:../../src:../../src.utils/jmf:${CLASSPATH} jp/nyatla/nyartoolkit/jmf/sample/NyarToolkitLinkTest

実行する時の-classpathオプションで ${CLASSPASS} が必要というところでつまずいた。環境変数のCLASSPASSに追加されるんじゃなくて上書きされるんですね。(Javaは初心者)

Data/の中に入っている「Hiro」と書かれたマーカー (Data/pattHiro.pdf) を印刷して、カメラにかざして認識すればOK。

joglのサンプル(動かず)
$ cd sample/jogl
コンパイル
$ javac -sourcepath .:../../src:../../src.utils/jogl:../../src.utils/jmf jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite.java
実行
$ java -classpath .:../../src:../../src.utils/jmf:../../src.utils/jogl:${CLASSPATH} jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite

==> ウィンドウが開いたところでクラッシュ。まだ原因分からず。

An irrecoverable stack overflow has occurred.
#
# An unexpected error has been detected by Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0xb7e584e7, pid=22675, tid=2987015056
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b23 mixed mode, sharing linux-x86)
# Problematic frame:
# C  [libc.so.6+0x734e7]  memset+0x37
java3dのサンプル
$ cd sample/java3d
コンパイル
$ javac -sourcepath .:../../src:../../src.utils/jmf:../../src.utils/java3d jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D.java
実行
$ java -classpath .:../../src:../../src.utils/jmf:../../src.utils/java3d:${CLASSPATH} jp/nyatla/nyartoolkit/java3d/sample/NyARJava3D

一応動いた。けど映像が上下逆さまだったり、いまいちマーカーをうまく認識しない。これは安物カメラの問題かもしれない。

あとGLXのバージョンを上げろというwarningが出ているがとりあえず放置。

GLX version 1.3 or higher is required
Java 3D WARNING : reported GLX version = 1.2
    GLX version 1.3 or higher is required
    The reported version number may be incorrect.  There is a known
    ATI driver bug in glXQueryVersion that incorrectly reports the GLX
    version as 1.2 when it really is 1.3, so Java 3D will attempt to
    run anyway.

今のところのまとめ

まだうまくいかないところもあるけどUbuntuでも使えそうです。
joglのサンプルでクラッシュする問題を解決したい。