モーションセンサー[Kinect -> Processing]_その1


開発環境


言語

- Processing 3.1.1

eclipseを使用し、core.jarをインポートした環境でコーディングしているため、ProcessingのIDEでは実行できません。

参考URL

http://hiroyukitsuda.com/archives/1721

- java 1.8.0_91

Processingで使用しているバージョン

モーションセンサー

Xbox 360® Kinect

API


Processing 3.x.xでSimpleOpenNIを利用する方法


Processing 3.x.xでSimpleOpenNIを利用するとExceptionが発生し利用できません。

対処方法が次のサイトに載っていたので参考し、対応しました。

registerDisposeメソッドの仕様が変わったみたいです。

https://forum.processing.org/two/discussion/13463/simpleopenni-fails-with-processing-3-0

Exception in thread "Animation Thread" java.lang.NoSuchMethodError: processing.core.PApplet.registerDispose(Ljava/lang/Object;)V
        at SimpleOpenNI.SimpleOpenNI.initEnv(SimpleOpenNI.java:383)
        at SimpleOpenNI.SimpleOpenNI.(SimpleOpenNI.java:255)
        at kinnect.sample.Sample.setup(Sample.java:14)
        at processing.core.PApplet.handleDraw(PApplet.java:2378)
        at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1527)
        at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:316)

対応方法

1 - SimpleOpenNIのソースをダウンロード

https://code.google.com/archive/p/simple-openni/source/default/source

2 - SimpleOpenNI.javaを修正

trunk/SimpleOpenNI-2.0/src/p5_src/SimpleOpenNI.javaの

parent.registerDispose(this)  -> parent.registerMethod("dispose", this) 

に置き換えます。

修正箇所は3箇所です。

3 - SimpleOpenNIMain.iのコメントを削除

trunk/SimpleOpenNI-2.0/src/SimpleOpenNIMain.iで#でコメントされている箇所を削除します。

#includeはコンパイルに必要なため、削除対象外とします。

 

「#+空白」を「//」に置換し、コメントアウトしました。

例)viで編集 

%s/# /\/\//gc

4 - openNIをインストール

http://www.openni.org/downloadfiles/openni-binaries/20-latest-unstable

上記サイトよりopenNIをダウンロードし、任意のディレクトリに解凍しinstall.shを実行します。

/work/kinect/ディレクトリを作成し配置しました。

mkdir /work/kinect/
cd /work/kinect/
sudo ./install.sh

5 - NiTEをダウンロード

https://github.com/voxels/Raw

上記サイトよりNITEをダウンロードし、任意のディレクトリに解凍します。

/work/kinect/に配置しました。

6 - eigen3をインストール

MacPortでインストールしました。

sudo port install eigen3

7 - buildOsx.shを修正(その1)

trunk/SimpleOpenNI-2.0/buildOsx.sh記載の以下を変更します。

 

DOPEN_NI_BASE

openNIの配置先を指定

DOPEN_NI_LIBDIR

openNIのLibraryの配置先を指定

DNITE_BASE

NiTEの配置先を指定

DNITE_LIBRARY

NiTEのLibraryの配置先を指定 

DEIGEN3D_INCLUDE

eigen3の配置先を指定

DP5_JAR

Processingのcore.jarの配置先を指定

DCMAKE_OSX_ARCHITECTURES 

OSのビットを指定

 

私の環境では次のように修正しています。

echo "--- generate cmake ---"
cmake -DCMAKE_BUILD_TYPE=Release \
      -DOPEN_NI_BASE=/Users/work/kinect/OpenNI-MacOSX-x64-2.2/ \
          -DOPEN_NI_LIBDIR=/work/kinect/OpenNI-MacOSX-x64-2.2/Redisti/ \
          -DNITE_BASE=/Users/work/kinect/NiTE-MacOSX-x64-2.2/ \
          -DEIGEN3D_INCLUDE=/opt/local/include/eigen3/ \
          -DP5_JAR=/work/.m2/repository/org/processing/core/3.1.1/core-3.1.1.jar \
          -DCMAKE_OSX_ARCHITECTURES="x86_64" \
          ..

8 - buildOsx.shを修正(その2)

後述のjavadoc作成でエラーが発生するため、以下コメントアウトする。

# copy the doc
#cp -r ./doc/* ../dist/all/SimpleOpenNI/documentation/

9 - buildOsx.shを修正(その3)

上記対応を行い、ビルドしたがSimpleOpenNI.jarが作成されずエラーとなったため

コンパイルしたクラスファイルをjarファイルで圧縮するコマンドを追加します。

追加したコマンド「jar cvf SimpleOpenNI.jar SimpleOpenNI/」

 

otool -L libSimpleOpenNI.jnilib

echo "---create jar"
jar cvf SimpleOpenNI.jar SimpleOpenNI/

echo "--- copy ---"
# copy the library

10 - CMakeLists.txtを修正

次のように修正します。 

ADD_CUSTOM_COMMAND(TARGET SimpleOpenNI
                POST_BUILD
                COMMAND cmake -E echo "-----------------------------"
                COMMAND cmake -E echo "Compiling Java files..."
                COMMAND cmake -E make_directory ./SimpleOpenNI
                COMMAND cmake -E make_directory ${CMAKE_SWIG_OUTDIR}
                #COMMAND cmake -E copy_directory ${P5_WRAPPER} ${CMAKE_SWIG_OUTDIR}
                # cmake copy doesn't support wildcards, otherwise it just copies the hidden folder of svn, etc.
                # doesn't works on windows backslash
                COMMAND cp "${P5_WRAPPER}*.java" "${CMAKE_SWIG_OUTDIR}"
                #COMMAND cmake -E copy ${P5_WRAPPER_FILE} ${CMAKE_SWIG_OUTDIR}
                COMMAND ${JAVA_COMPILE2} -classpath ${P5_JAR} ${CMAKE_SWIG_OUTDIR}/*.java -d ./
                )
                #COMMAND cmake -E echo "-----------------------------"
                #COMMAND cmake -E echo "Creating jar file..."
                #COMMAND ${JAVA_ARCHIVE2} cvf SimpleOpenNI.jar SimpleOpenNI
                #COMMAND cmake -E echo "-----------------------------"
                #COMMAND cmake -E echo "Creating doc files..."
                #COMMAND cmake -E make_directory ./doc
                #COMMAND ${JAVA_DOC} -quiet -author -public -nodeprecated -nohelp -d ./doc  -version ${P5_WRAPPER}/*.java -version ${CMAKE_SWIG_OUTDIR}/ContextWrapper.java
                #COMMAND ${JAVA_DOC} -classpath ${P5_JAR} -quiet -author -public -nodeprecated -nohelp -d ./doc  -version ${CMAKE_SWIG_OUTDIR}/*.java)

11 - ディレクトリを作成

trunk/SimpleOpenNI-2.0/に2つのディレクトリを作成

Redisti

lib

12 - ライブラリの配置

trunk/SimpleOpenNI-2.0/dist/all/SimpleOpenNI/library/osx/以下のファイルを全て

trunk/SimpleOpenNI-2.0/lib/

にコピーする。

13 - ビルド

trunk/SimpleOpenNI-2.0/buildOsx.shを実行すると

trunk/SimpleOpenNI-2.0/dist/all/SimpleOpenNI/libraryに

SimpleOpenNI.jar生成されます。

このSimpleOpenNI.jarに置き換えて使用する事でExceptionが回避されKinectを利用できるようになります。

./buildOsx.sh

補足

自分の環境では以下ライブラリを導入していなかったため

トライ&エラーで以下ライブラリをインストールしています。

1 - cmakeのインストール

sudo port install cmake

2 - Command Line Developer Toolsのインストール

terminalで以下コマンドを実行 

xcode-select --install

3 - libtoolをインストール

sudo port install libtool

4 - libusbインストール 

sudo port install libusb +universal

5 - pcreのインストール

https://sourceforge.net/projects/pcre/files/pcre/8.39/

./configure
make
sudo make install
pcre-config --version

6 - swigのインストール

http://www.swig.org/download.html

./configure
make
sudo make install
swig -version

7 - boostのインストール

sudo port install boost