728x90

OpenNI/NITE 는 인간과 장치간의 Natural Interaction 을 지원하는 오픈소스 API 및 제스쳐 인식을 지원하는 미들웨어입니다. OpenNI/NITE 와 Kinect 드라이버를 설치하고 실행하는 과정을 간단하게 정리해 봤습니다. 상세한 내용은 참고자료나 인터넷을 찾아보시기 바랍니다. 그리고, 설치시 문제점이나 수정사항이 있으면 언제든지 알려주시면 글에 반영하도록 하겠습니다.

설치환경 - 호스트컴퓨터 : 윈도우즈 XP/7, Ubuntu 10.04 LTS/11.10 기준

1. 의존 패키지 설치

먼저 OpenNI/NITE 가 의존하는 패키지들을 설치합니다.

예1) 윈도우즈 XP/7
먼저, 자바와 비주얼 스튜디오 2008/2010이 설치되지 않았으면 설치합니다. JDK 는 자바 홈페이지(http://java.sun.com) 에서 다운로드받아 설치합니다. 가능하면 1.6 버전 이상으로 설치합니다.

예2) 우분투 리눅스
먼저, 자바가 설치되지 않았으면 설치합니다. JDK 는 자바 홈페이지로부터 다운로드받거나 아래와 같은 openjdk 를 설치합니다.

$ sudo apt-get install openjdk-6-jdk

기타 의존 패키지들을 설치합니다.
- Ubuntu 10.04 일 경우 다음 패키지를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install git-core cmake libglut3-dev pkg-config build-essential libxmu-dev libxi-dev libusb-1.0-0-dev doxygen graphviz

- Ubuntu 11.10 일 경우에는 다음 패키지를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install mono-complete git-core cmake freeglut3-dev pkg-config build-essential libxmu-dev libxi-dev libusb-1.0-0-dev doxygen graphviz

2. 주요 패키지 설치

1) OpenNi 설치

OpenNI 홈페이지(http://www.openni.org) 로부터 OpenNI 설치파일을 다운로드하여 설치합니다.
OpenNI 설치파일은 OpenNI 홈페이지 상단의 다운로드 메뉴 (Downloads->OpenNI Modules) 또는 링크(http://www.openni.org/Downloads/OpenNIModules.aspx) 에서 다운로드할 수 있습니다.

예1) 윈도우즈 32비트 머신인 경우 unstable 버전으로 openni-win32-{버전}-dev.msi 파일을 다운로드하여 설치합니다.

예2) 리눅스에서 tar.bz2 압축파일을 다운로드하거나 소스코드를 빌드하여 설치할 수 있습니다.
tar.bz2 바이너리 압축파일을 다운로드하여 설치하려면 다음과 같은 명령을 실행합니다.
$ mkdir ~/kinect && cd ~/kinect
$ mkdir openni-bin-linux32 && cd openni-bin-linux32
$ wget http://www.openni.org/downloads/openni-bin-dev-linux-x86-{버전}.tar.bz2

$ tar xvfj openni-bin-dev-linux-x86-{버전}.tar.bz2
$ cd OpenNI-Bin-Dev-Linux-x86-{버전}
$ sudo ./install.sh

소스코드로부터 직접 설치하려면 다음과 같은 명령을 실행합니다.
$ mkdir ~/kinect && cd ~/kinect
$ git clone https://github.com/OpenNI/OpenNI.git
$ cd OpenNI/Platform/Linux-x86/Build
$ make && sudo make install

설치하고 난 후 내부 모듈들이 잘 설치되었는지 확인하려면 niReg 명령을 사용하면 됩니다.

$ niReg -l

또 niLicense 명령으로 라이센스를 등록/해제할 수 있습니다.

2) Kinect 드라이버 설치

오픈소스로 사용가능한 Kinect 드라이버는 크게 libfreenect 와 SensorKinect 가 있습니다. lilbfreenect 는 OpenKinect 프로젝트에서 개발 중인 드라이버로서 리버스 엔지니어링으로 해킹하여 만들어진 드라이버이고, SensorKinect 는 본래 Kinect 센서를 만든 PrimeSense 사의 소스코드를 수정하여 만든 것입니다. 두 가지 버전은 장단점이 있는데, OpenNI 에서는 SensorKinect 버전을 사용하고 있습니다.

SensorKinect 드라이버는 여러 싸이트에서 제공받을 수 있지만, 최신 드라이버는 센서키넥트 싸이트 (http://github.com/avin2/SensorKinect)로부터 다운로드받을 수 있습니다.
이 싸이트의 Bin 디렉토리를 클릭하여 해당하는 운영체제에 맞는 파일을 다운로드하여 설치합니다.
주의) 주의할 점은 OpenNI 싸이트의 센서 드라이버는 Kinect 가 아닌 ASUS 에서 만든 Kinect 와 비슷한 Xtion Pro 센서 드라이버이므로 설치해서는 안된다는 점입니다.
참고) SensorKinect 의 또다른 버전은 다음 싸이트들에서도 다운받을 수 있습니다.
ROS 싸이트: Kinect 를 로봇에 적용 //git clone https://github.com/ros-pkg-git/Sensor.git,
//git clone https://github.com/boilerbots/Sensor.git

예1) 윈도우즈 32비트 머신인 경우 SensorKinect091-Bin-Win32-{버전}.msi 파일을 다운로드하여 설치합니다. 드라이버가 자동으로 설치되지 않으면, “제어판->장치관리자”를 확인해보고 알수없는 Xbox NUI Motor 장치만 보이면, “드라이버 업데이트" 또는 “새 하드웨어 추가” 를 통해 드라이버 설치 디렉토리를 C:\Program Files\PrimeSense\SensorKinect\Driver 디렉토리로 선택하여 드라이버를 설치해 줍니다. 그리고 반복하여 장치관리자를 확인하면서 NUI Camera 와 NUI Audio 도 마찬가지로 설치해 줍니다.

예2) 리눅스에서 tar.bz2 압축파일을 다운로드하거나 소스코드를 빌드하여 설치할 수 있습니다.
tar.bz2 압축파일을 다운로드하여 설치하려면 다음과 같은 명령을 실행합니다.
$ cd ~/kinect
$ git clone https://github.com/avin2/SensorKinect.git
$ cd SensorKinect/Bin
$ tar xvfj SensorKinect091-Bin-Linux32-{버전}.tar.bz2
$ cd Sensor-Bin-Linux-x86-{버전}
$ sudo ./install.sh

소스코드로부터 직접 설치하려면 다음과 같은 명령을 실행합니다.
$ cd ~/kinect
$ git clone https://github.com/avin2/SensorKinect.git
$ cd SensorKinect/Platform/Linux-x86/Build
$ make && sudo make install

드라이버가 잘 설치되었으면 lsusb 명령을 실행하여 장치가 잡혀있는지 확인합니다.
$ lsusb
...
Bus 002 Device 003: ID 045e:02b0 Microsoft Corp.
Bus 001 Device 004: ID 045e:02ae Microsoft Corp.
Bus 001 Device 003: ID 045e:02ad Microsoft Corp.
...

3) NITE 미들웨어 설치

OpenNI 환경에서 Kinect 를 활용한 다양한 응용 프로그램을 제작하려면 NITE 미들웨어를 사용하는 것이 좋습니다. NITE 설치파일은 OpenNI 홈페이지 상단의 다운로드 메뉴 (Downloads->OpenNI Modules) 또는 링크(http://www.openni.org/Downloads/OpenNIModules.aspx) 에서 다운로드할 수 있습니다.

예1) 윈도우즈 32비트 머신인 경우 unstable 버전으로 nite-win32-{버전}-dev.msi 파일을 다운로드하여 설치합니다.

예2) 리눅스인 경우 tar.bz2 압축파일을 다운로드하여 설치합니다.
$ cd ~/kinect
$ mkdir nite-bin-linux32 && cd nite-bin-linux32
$ wget http://www.openni.org/downloads/nite-bin-linux-x86-{버전}.tar.bz2
$ tar xvfj nite-bin-linux-x86-{버전}.tar.bz2
$ cd NITE-Bin-Dev-Linux-x86-{버전}
$ sudo ./install.sh

설치하는 도중에 “Please enter your PrimeSence license key” 라는 라이센스 키를 입력하라는 내용이 나오면 다음과 같은 키 값을 입력합니다.
키-> 0KOIk2JeIBYClPWVnMoRKn5cdY4=

3. 동작 테스트

다음은 OpenNI 및 NITE 패키지의 샘플 프로그램들을 실행시켜 봄으로써 동작테스트를 수행합니다.

1) OpenNI 샘플 프로그램
먼저 OpenNI 패키지의 샘플 프로그램을 실행시켜 봅니다.

예1) 윈도우즈인 경우 시작메뉴->OpenNI->Samples->NiViewer 를 실행시킵니다.

예2) 리눅스의 경우 다음과 같은 명령을 실행합니다.
$ cd ~/kinect/openni-bin-linux32/OpenNI-Bin-Dev-Linux-x86-{버전}
$ cd Samples/Bin/Release
$ ./NiViewer

참고로, 리눅스에서 NiViewer 실행 시에 "Open failed: Failed to set USB interface!" 와 같은 오류 메시지가 출력될 때에는
gspca_kinect 라는 커널 모듈이 따로 설정되어 있기 때문이므로, 이 모듈을 제거하여야 합니다.
먼저 "lsmod" 명령으로 이 모듈이 설치되어 있는지 확인하고, "sudo rmmod gspca_kinect" 를 수행합니다.
그래도 다음에 또 나타나면 아예 다음 명령을 실행하여 모듈이 설치될 수 없도록 합니다.
sudo
mv /lib/modules/3.0.0-12-generic/kernel/drivers/media/video/gspca/
gspca_kinect.ko /lib/modules/3.0.0-12-generic/kernel/drivers/media/video/gspca/gspca_kinect.ko.BAK

다음은 샘플 프로그램의 목록입니다.
NiCRead (이미지 중앙의 깊이를 출력)
NiSimpleCreate (SamplesConfig XML 파일을 사용하지 않는 NiCRead 의 C++ 버전)
NiSimpleRead (SamplesConfig XML 파일을 사용하는 NiCRead 의 C++ 버전)
SimpleRead (NiCRead 의 C# 버전)
NiSimpleViewer (깊이와 비디오 뷰어)
SimpleViewer (NiSimpleViewer의 C# 버전)
NiViewer (깊이와 비디오를 보여주며 녹음 가능)
NiUserTracker (동작 감지 및 골격 추적)
UserTracker (NiUserTracker의 C# 버전)
NiUseExtension
NiAudioSample

NiBackRecorder (몇 초간 저장 가능)
NiRecordRaw
NiRecordSynthetic (레코딩 열고 변환 후 재레코딩)
NiConvertXToONI (레코딩 복사)

2) NITE 미들웨어 샘플 프로그램
다음은 NITE 패키지의 샘플 프로그램들을 실행시켜 봅니다.

예1) 윈도우즈인 경우 시작메뉴->PrimeSense->NITE->Samples 메뉴의 여러 샘플 프로그램들을 실행시킵니다.

예2) 리눅스의 경우 다음과 같은 명령을 실행하여 디렉토리를 이동합니다.
$ cd ~/kinect/nite-bin-linux32/NITE-Bin-Dev-Linux-x86-{버전}
$ cd Samples/Bin/x86-Release

이 디렉토리의 여러 샘플 프로그램들을 실행시킵니다. 그런데, 만약에 실행하는 도중에 다음과 같은 오류가 발생할 수 있습니다.
InitFromXml failed: Device Protocol: Bad Parameter sent!

이런 경우에는 설정과 관련된 xml 파일들을 수정해 주어야 합니다. 수정하는 파일은 NITE 패키지의 Data 디렉토리에 있는 Sample-User.xml, Sample-Scene.xml, Sample-Tracking.xml 파일입니다. 각 파일의 내용 중 다음 줄을 수정합니다.
3째줄의 라이센스 키 값을 설정합니다.
 <License vendor="PrimeSense" key="0KOIk2JeIBYClPWVnMoRKn5cdY4="/>
17째 줄의 Configuration 태그 내에 노드 출력 모드를 설정해 줍니다.
 <MapOutputMode xRes="640" yRes="480" FPS="30"/>

샘플 프로그램을 실행시킨 후 손이나 몸을 움직여 잘 동작하는지 확인하고, 프로그램 종료 시에는 ESC 키를 누르면 됩니다.

다음은 샘플 프로그램의 목록입니다.
Sample-Boxes (손 제스쳐를 통한 3 개의 박스 선택, 좌우:이동, 위: 선택, 앞: 취소)
Sample-Boxes.net (Sample-Boxes 의 C# 버전)
Sample-CircleControl (원 제스쳐 인식)
Sample-Players (여러 사용자 skeleton 골격 추적)
Sample-PointServer
Sample-PointViewer (손 움직임 추적)
Sample-SceneAnalysis (사람 인식)
Sample-SingleControl (흔드는 제스쳐 인식)
Sample-StickFigure (가상 공간에 골격과 사람 위치)
Sample-TrackPad (2차원 그리드 선택)

4. 프로그램 개발

OpenNI 프로그램의 구조는 비교적 간단합니다. OpenNI 프로그램의 주요 상태 정보를 가지는 Context 객체를 생성한 다음, 깊이(depth), 이미지(image), 오디오(audio), 제스쳐(gesture), 손지점(hand point), 사람(user) 등의 데이터를 생성하는 generator 객체들을 생성합니다. 이 메타객체들이 데이터를 만들어내도록 구동시킨 다음 루프를 돌면서 데이터를 추출하여 원하는 작업을 수행합니다. 프로그램을 종료하기 전에 모든 객체를 해제합니다.

예를 들면, 다음 코드는 깊이(depth) 맵을 생성하는 OpenNI 프로그램의 주요 골격 코드를 보여줍니다.

// status 를 OK 로 설정
XnStatus nRetVal = XN_STATUS_OK;

// 새로운 Context 객체 생성
xn::Context context;
nRetVal = context.Init(); // context.InitFromXmlFile(SAMPLE_XML_PATH, scriptNode, errors);

// generator 생성
xn::DepthGenerator depth;
nRetVal = depth.Create(context); // context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth);

// 데이터 생산 시작
nRetVal = context.StartGeneratingAll();

// 메인루프 시작
while (bShouldRun) {
// 새로운 데이터 갱신을 위해 대기
nRetVal = context.WaitOneUpdateAll(depth);
// 잘 갱신되었는지 확인
if (nRetVal != XN_STATUS_OK) {
printf( Failed updating data: %s\n , xnGetStatusString(nRetVal));
continue;
}
// 원하는 작업 수행
...
}
// 모든 객체 해제
context.Shutdown();
//또는
//depth.Release();
//context.Release();


OpenNI/NITE 는 C++, java 등의 프로그래밍 언어를 지원하며 MS 윈도우즈/리눅스/Mac 등에서 응용 프로그램을 개발할 수 있습니다.

예1) 윈도우즈 에서 비주얼 스튜디오 08 이용
OpenNI/NITE 샘플파일로 응용 프로그램을 만들기 위해서는 비주얼 스튜디오 08 에서 프로젝트를 생성하여 샘플파일 (및 OpenGL 로 화면에 디스플레이하는 경우 GL, glh 등의 헤더 디렉토리들 포함) 을 복사하거나 샘플파일 디렉토리를 통째로 복사하여 위치를 옮기고 프로젝트 설정을 수정한 후 실행시킵니다.

아래 1)~5) 와 같이 개별 프로젝트 설정 부분을 다음과 같이 수정합니다. {프로젝트 디렉토리}는 . (현재 디렉토리) 이거나 프로젝트 절대경로를 가리킵니다.

1) 프로젝트 속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리
"$(OPEN_NI_INCLUDE)";C:\Program Files\Prime Sense\NITE\Include;{프로젝트 디렉토리}
2) 프로젝트 속성 -> 링커 -> 일반 -> 출력파일
{프로젝트 디렉토리}/Debug/{프로젝트이름}.exe
3) 프로젝트 속성 -> 링커 -> 일반 ->추가 라이브러리 디렉터리
$(OPEN_NI_LIB);$(XN_NITE_INSTALL_PATH)\Lib;$(XN_NITE_INSTALL_PATH)\Lib\$(ConfigurationName);{프로젝트 디렉토리}\Libs
4) 프로젝트 속성 -> 링커 -> 입력 ->추가 종속성
OpenNI.lib XnVNite.lib glut32.lib
5) 프로젝트 속성 -> 링커 -> 디버깅 -> 프로그램 데이터베이스 파일 생성
{프로젝트 디렉토리}/Debug/{프로젝트 이름}.pdb

xml 설정 파일을 사용하는 경우 {OpenNI 설치 디렉토리}/Data 디렉토리의 샘플 xml 파일을 참고하여 만들거나 수정합니다.

다음은 샘플 디렉토리 안에 있는 glut32.dll 파일을 WINDOWS 폴더의 system32 폴더안에 넣습니다.

그리고, 실행시킵니다.

예2) 리눅스 환경에서 g++, make 사용
리눅스 환경에서는 gcc/g++, make 등을 사용하여 프로그램을 개발할 수 있습니다. OpenNI 샘플 디렉토리 내의 아무 프로젝트 디렉토리 내에서 make 를 실행시켜 빌드할 수 있습니다.

예3) java 및 이클립스 사용
OpenNI/NITE 는 자바로도 개발 가능한데, Eclipse 를 활용한 테스트 방법은 다음과 같습니다.
먼저 Eclipse 에서 일반 자바 프로젝트를 생성한 다음, 소스코드(샘플코드 참고)를 작성하여 src 에 포함시킵니다.

관련된 jar 라이브러리 파일들을 프로젝트에 포함시킵니다. 이클립스 메뉴에서 File->Import...->General->File System 메뉴에서 Library 경로를 {OpenNI 설치 디렉토리}/bin 을 선택하여 org.OpenNI.jar 를 체크하여 생성한 프로젝트에 추가하고, NITE 응용인 경우 마찬가지로 Library 경로를 {NITE 설치 디렉토리}/bin 를 선택하여 com.primesense.NITE.jar 를 추가합니다.
패키지 탐색창에서 org.OpenNI.jar 과 com.primesense.NITE.jar 를 각각 마우스 오른쪽버튼 클릭하여 Build Path>Add to Buildpath 에 추가합니다.
그리고, 테스트를 위해 샘플 디렉토리의 자바 소스코드는 src 디렉토리에 복사하고, {OpenNI 설치 디렉토리}/Data (NITE 응용인 경우 {NITE 설치 디렉토리}/Data) 디렉토리를 프로젝트 디렉토리에 복사합니다.

마지막으로 실행 시에 Run As->Java Application 을 클릭하여 실행하면 됩니다.

참고자료:
http://www.scribd.com/doc/57176565/59, OpenNI User Guide
http://www.openni.org, OpenNI 홈페이지
http://cafe.naver.com/openkinect, OpenKinect 네이버까페
http://openkinect.org, OpenKinect 홈페이지

728x90

'UTIL' 카테고리의 다른 글

비글보드(beagleboard)  (0) 2013.06.08
Kinect Installation on BeagleBoard-xM and PandaBoard running Ubuntu 12.04  (12) 2013.06.08
kinect on android  (0) 2013.06.06
키넥트 안드로이드 연결  (2) 2013.06.03
kinect device driver  (0) 2013.06.02

+ Recent posts