2010年12月24日金曜日

[Kinect] build Nite library in Mac (try memo)

[2010/12/28]
全然ダメだったので題名変更


あとPlayersとSceneAnalysisはNiteのライブラリをリンクする必要なかった、、、
(リンクしなくてもエラーなし)
てことは下記のエラーはNiteとはまったく関係ない?

他のサンプルはリンクしないとエラーが出る。(あたりまえだけど)

----

すごくあやしい英語もつけてみます。
Warning!! I can not write english well

こないだからMacOSXでKinectを使えるように頑張ってたんだけど、やっとできたのでメモなんかうまくいかない。
(I tried to use Kinect on MacOSX in several days. and success.  not success)

OpenNIとSensirKinectはroxluさんがMacでコンパイルできるようにしてくれた。
(You can build OpenNI and SensirKinect on Mac tanks to roxlu)
http://www.roxlu.com/blog/entry/116/openni-and-sensorkinect-driver-for-mac-/page/

しかし現状、インストール先が選択できず、ヘッダファイルもコピーされないので不便で、Niteライブラリのbuildにも支障が出る。
(but, can not select install prefix and do not copy headers. so,  very inconbinience and but inflence to build Nite Library)

そこで、CMakeLists.txtを修正して、任意の場所にインストールできるようにしてみた。
ついでにniLicenseでエラーが出るのも修正。
(so, fixed CMakeLists.txt to can install optional install path and fixed niLicense)

https://github.com/yosilove/OpenNI
https://github.com/yosilove/SensorKinect

でもまだ「CMAKE_TEST_BUILDがOFFの時にインストールパスが絶対パスじゃないとエラーが起きる」というバグがあるのでpullリクエストはしない。
(but , now have bug "occur error when install path is not absolute path when CMAKE_TEST_BUILD is OFF", so does not pull request now.)


そして。。。
(And...)

Niteライブラリのインストールとサンプルプログラムのコンパイルに成功しました!たぶん。。。
(Success to install Nite Library and sample program! maybe...)
https://github.com/yosilove/Nite-for-Mac

ただ、このサンプルを実行してもエラーがでるのでもしかすると失敗かもしれない。
(But, this sample program occur error when execute, so, Possibly DONT SUCCESS)

実行時エラーのメッセージはこんなの
(here is running error message)
%Sample-Players
.....
XnXMLConfig::xnConfigureCreateNodes(): call to xnProductionNodeTypeFromString()
ProductoniNodeType (see Include/XnTypes.h): 2
XnXMLConfig::xnConfigureCreateNodes(): call to xnEnumerateProductionTrees
The pContext->pNodesMap is empty
The pContext->pNodesMap is empty
........
We did not find any items in the NodeInfoList
XnOpenNI::xnEnumerateProductionTrees() line 1050, fails!
We did not find any items in the NodeInfoList
XnOpenNI::xnEnumerateProductionTrees() line 1050, fails!
.....
InitFromXml failed: Can't create any node of the requested type!

XMLファイルの生成に失敗してるのか?それともデバイスが見つからないのが原因??
(Failed to create xml file? or can not detect device??)

だれか助けてくれ。。。
(Please help me...)


てゆうか、英語が非常に怪しいので詳しい人いたらツッコミくださいな。

6 comments:

匿名 says:
2010年12月27日 16:47

Linux 用の .so がそのままじゃんかよー。Mac は .dylib だ。コンバーターでもあるのかと思った。そりゃ動かんわ。

@yosilove says:
2010年12月27日 18:30

>匿名 さん

コンパイル時(ライブラリのリンク時)にErrorもWarningも出なかったのでそこは問題ないと思ったのですが、やっぱそんなことないですか。。。

「InitFromXml failed」はOpenNIのエラーのようだったので、Niteに行く前にデバイスの検出でエラーがでてるとばっかり思ってました。
すいません。

@yosilove says:
2010年12月28日 19:29

つ http://hintsforums.macworld.com/archive/index.php/t-57740.html
ここによると、Agnerさんと言う人がELFをMach-Oに変換できるのをつくってくれたっぽいです。
つ http://www.agner.org/optimize/

「実行ファイルは駄目だ!」というエラーがでるけど、え?実行ファイルなの?それともオプションがおかしいの?

% objconv -v1 -fmacho libXnVNite.so libXnVNite.dylib
Error 2022: Cannot convert executable file

匿名 says:
2010年12月28日 23:27

いい線行ってますね。このコンバーターは以前見たことがあります。ただObject File Converterってあるので.oファイルしか無理なのでは(ソース見てませんが)?
共有ライブラリは実行ファイルと同形式です。http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA#.E5.85.B1.E6.9C.89.E3.83.A9.E3.82.A4.E3.83.96.E3.83.A9.E3.83.AA

匿名 says:
2010年12月28日 23:57

誤解があったらまずいので。いい線というのは見つけてきた物のセンスに対してです。
今回の問題に対してはダメです。おなじインテルコードなのでコンバート可能に思えますがLinuxとMacOSXではシステムコールが違うのでNITEがそれを使用しているとそこで動かなくなります。公開されている下層のドライバがシステムコールを全部吸収してくれていてNITEが純粋な計算だけのルーチンだと可能かもしれませんがroxluさんの移植がすんなりいっていないのを見るとそうではないのでしょう。
エミュレータやVMで動かす路線に変更したほうが良いと思われます。実際VirtualBoxではNITE起動させることはできるのですがDirectXの表示がダメでした。数値を取り出すだけならいけるのかもしれません。このあたりを攻めるほうが速いのでは?

@yosilove says:
2010年12月29日 0:52

>匿名さん
アドバイスありがとうございます。
Niteと一緒に使う予定のプログラムをMacで書いてたのでできれば、、、と思ったのですが、たしかにVMのほうが早そうですね。

共有ライブラリって実行ファイルと同形式だったんですね、勉強不足でした。。。

ちなみにobjconvの機能に関してですが、
objconvのドキュメントによると.aと.libには対応しているようです、
.soや.dllについてはマニュアルの14ページに以下のようにあるのでやっぱり難しいかもしれませんね。。。
ーー
It is preferred to make static libraries (*.lib, *.a) rather than dynamic link libraries or shared objects (*.dll, *.so). Shared objects in Unix systems require position- independent code and global offset tables (GOT) that can cause compatibility problems.
ーー

[自分用メモ]
エラーを無視するとdylibに変換すること自体はできるが強引過ぎる手なだけに無理があるらしい。
% file lib/libXnVNite.dylib
lib/libXnVNite.dylib: Mach-O 64-bit object x86_64

objectではなくdynamically linked shared libraryとなるのが正しい、そして案の定これ

ld: in /usr/local/OpenNI/lib/libXnVNite.dylib, malformed .o file, symbol _init with address 0x27D60 is not with section 1 (__TEXT,_init) address range of 0x0 to 0x18 for inferred architecture x86_64

その上システムコールも使っているらしい。
(前略)
142393: log
142397: malloc
142404: memcpy
142411: memmove
142419: memset
(後略)

ただし、OpenNIのライブラリをリンクしているらしく、これらのシステムコールはそいつらの分かもしれないので、Niteのメンバだけを抽出するように頑張ればいけるかもしれない。(objconvは指定したメンバだけを抽出する機能もあるっぽい)

しかし締切りがヤバいのであきらめてubuntu使おう。。。

コメントを投稿