2013-12-23

compiling leapmotion.pd_linux on Ubuntu 12.04 (32 bit)

LeapMotion용 Pure Data Object는 Chikashi Miyama가 제작하였다. 맥과 리눅스를 지원한다. 맥용은 컴파일 된 파일이 있지만, 리눅스용으로 컴파일을 안 해놔서 직접 해야만 한다. 매우 번거롭긴 한데, 리눅서들은 뭐 그러려니 하고 만다. 자 험난한 길을 가보자.


 393268 leap motion controller


간략화된 순서는 다음과 같다.
1. Flext 설치. 이 것은 Pd 오브젝트를 만드는 것을 도와주는 프로그램이다.
2. LeapMotion SDK 설치. 이 것은 립모션 API가 들어있다. 제조사에서 공개해 준 것이라 믿을만 하다.
3. Pd_leapmotion 컴파일 하기. 위의 두 프로그램을 사용해 .pd_linux 파일을 만드는 것이다.


그렇게 쉽지는 않고 약간 복잡하다. 본격적으로 시작해 보자.


1. Pd_leapmotion 다운받기:
https://github.com/chikashimiyama/Pd_leapmotion

Pd_leapmotion을 다운받고 압축을 푼다. ~/Download 에다 받는다. https://github.com/chikashimiyama/Pd_leapmotion
해당 폴더는 여기에 있을 것이다. ~/Download/Pd_leapmotion-master


2. Flext 설치와 컴파일: 가서 설명을 보고 다운을 받는다:
http://grrrr.org/research/software/flext/

설치를 하자. 아마 svn이 없다고 나올 수도 있다 그러면 svn을 설치하자. sudo apt-get install subversion로 가능.
$ svn co https://svn.grrrr.org/ext/trunk/flext flext

컴파일러 확인. flext를 컴파일 하기 위해서 g++ 버젼을 확인하자. 3.3 이상이면 OK. 그 이하면 곤란하다.
$ g++ --version

다운받은 해당 디렉토리로 가서 컴파일 한다. 만일 에러가 나면 sudo로 해본다.
$ cd ~/Download/flext
$ bash build.sh pd gcc
$ bash build.sh pd gcc install

처음에 받은 Pd_leapmotion 폴더로 가서 익스터널을 컴파일 한다. 중요! flext와 Pd_leapmotion이 둘 다 ~/Download폴더에 있어야 한다.
$ cd ~/Download/Pd_leapmotion-master
$ bash ../flext/build.sh pd gcc
(생략) $ bash ../flext/build.sh pd gcc install
$ bash ../flext/build.sh pd gcc clean

다시 flext 폴더로 가서 설정을 한다.
$ cd ~/Download/flext
$ ./bootstrap.sh

bootstrap.sh가 안되면 Bootstrapping failed 메세지
$ sudo apt-get install libtool

도움말을 한번 본다. 상황에 따라 다르기 때문에 꼭 이것을 참고해야 한다.
$ ./configure --help

Pd source를 다운받고 압축을 푼다. ~/Download 폴더에 푼다. http://msp.ucsd.edu/software.html

소스 폴더를 잘 알아 놓는다. 내 경우엔 이렇다. /home/사용자/Downloads/pd-0.45-3/src

다시 flext 폴더로 가서 마무리 한다. 매뉴얼엔 sysdir이라고 나와 있는데, 도움말에는 sdkdir로 하라고 나와있다. 이거 틀리면 안된다. 겨우 알아냈다.
$ ./configure --enable-system=pd --with-sdkdir=/home/jong/Downloads/pd-0.45-3/src

flext 설치를 마무리 한다.
$ make $ sudo make install


3. LeapMotion SDK for Linux 설치. 가서 다운받고 압축을 푼다. ~/Download에 푼다:
https://developer.leapmotion.com/downloads

중요한 파일은 libLeap.so 이 파일이다. 경로는 ~/Downloads/LeapDeveloperKit/LeapSDK/lib/x86/ 혹은 /x64 에 있다. 자신의 OS에 맞는 것을 쓴다. Pd 유저라면 대부분 32비트 버젼일 것이다.


4. 설치를 도와줄 package.txt 파일 만들기. 중요한 파일인데 안 들어있다. 직접 만들어야 한다.
$ cd ~/Download/Pd_leapmotion-master
$ touch package.txt
$ nano package.txt

문서 편집기가 열리면 다음과 같이 적고 저장한다. INCPATH+와 LDFLAGS를 적어주어야 한다. 만약 안 되면 LDFLAGS를 빼고 해보자.
NAME=leapmotion
SRCDIR=.
SRCS=main.cpp Dispatcher.cpp
INCPATH+= -I/해당/경로/LeapDeveloperKit/LeapSDK/include
LDFLAGS='-L/해당/경로/LeapDeveloperKit/LeapSDK/lib/x86 -lLeap'



5. flext를 이용해서 Pd_leapmotion 컴파일 하기. 로그를 잘 보고 만약 에러가 나면 sudo로 다시 시도.
$ cd ~/Download/Pd_leapmotion
$ bash ../flext/build.sh pd gcc
$ (sudo) bash ../flext/build.sh pd gcc install    (여기서 에러가 났던 걸로 기억한다. 그러면 sudo를 쓰자.)

에러가 날 때 대처법: sudo로 실행해 본다. 나는 gcc install 할 때 에러가 났다. 그래서 sudo bash ../flext/build.sh pd gcc install 로 해결.
컴파일이 완료 되었다. 우리가 원하던 그 파일은 ~/Download/Pd_leapmotion-master/pd-linux/release-single 에 있다.
파일이름은 Pd_leapmotion.pd_linux 이다.


6. Pd에서 그냥 로드하면 에러가 난다. sudo와 LD_PRELOAD=를 안 붙이면, Pd로 오브젝트를 불러 올 때 다음과 같은 에러가 난다.
undefined symbol: _ZTIN4Leap9InterfaceE
leapmotion
... couldn't create


7. 실행할 때 Pd에 옵션을 붙여줘야 이 오브젝트를 제대로 로드할 수 있다. 아니면 에러가 난다. 실행 시 유의사항: sudo 로 해야한다. LD_PRELOAD=를 붙여준다. 이 것은 아까 언급한 SDK의 libLeap.so를 필요로 한다.

libLeap.so를 복사한다. 이름을 libLeap-x86.so로 바꾸었다. 64비트인지 32비트인지 정확히 알아야 한다.
$ cp ~/Download/LeapDeveloperKit/LeapSDK/lib/x86 ~/Download/Pd_leapmotion-master/pd-linux/release-single/libLeap-x86.so pd

다음과 같이 Pd를 실행하고, Pd_leapmotion-help.pd를 열어본다.
$ LD_PRELOAD=/home/jong/Downloads/leapmotion-linux-compile/Pd_leapmotion-master/pd-linux/release-single/libLeap-x86.so pd


끝이다. 지금까지 잘 따라 왔다면 다음과 같은 화면을 볼 것이다.



만들어진 Pd_leapmotion.pd_linux File link를 첨부한다. 잘 안되면 그냥 이것을 써도 무방함.
https://drive.google.com/folderview?id=0B42bn7ncw918RUVWWFFtZVZpVEE&usp=sharing

추가: master source의 main.cpp에 추가하면 Gyroscope처럼 쓸 수가 있다. (대박)
추가소스
//jong-pry
float pitch = hand.direction().pitch();
float yaw = hand.direction().yaw();
float roll = hand.palmNormal().roll();
//
t_atom handInfo[5];
//jong-pry
if (hands_gyro_flag) {
// gyro
SETFLOAT(&handInfo[0], i);
SETSYMBOL(&handInfo[1], gensym("gyro"));
SETFLOAT(&handInfo[2], pitch);
SETFLOAT(&handInfo[3], yaw);
SETFLOAT(&handInfo[4], roll);
ToOutAnything(1, gensym("hand"), 5, handInfo);
}
//
고쳐진 소스 첨부 (내가 고친거)
https://docs.google.com/file/d/0B42bn7ncw918X3VvLTB1dVR1YlU/edit

참고 Computing the Hand Orientation:
https://developer.leapmotion.com/documentation/Languages/C++/Guides/Leap_Tracking.html


참고 일반:
http://puredatajapan.info/?page_id=1514
http://musa.poperbu.net/index.php/tecnologia-seccions-30/-puredata-seccions-45/129-installing-leapmotion-puredata-external-on-linux
https://github.com/chikashimiyama/Pd_leapmotion/issues/1

No comments:

Post a Comment