Kinect SDK for Windows로 배워보는 NUI 개발
![]() |
김영욱 차장 iwinkey@hotmail.com 국내 유수의 대기업 프로젝트에 참여했던 풍부한 경험과 마이크로소프트 MVP로서 다양한 활동을 바탕으로 .NET과 관련된 개발 기술에 전념하고 있다. 현재 한국마이크로소프트에서 Evangelist로 근무하고 있다. |
또 이런 이야기를 한다면 필자를 늙은이 취급할 개발자들도 많겠지만 마우스도 없던 시절의 컴퓨팅 환경에 비하면 정말 매일 격세지감을 느낄 수 밖에 없다. 하지만 격세지감 따위를 즐기고 있을 만한 여유는 어디에도 없다. 세상은 정말 빠르게 변화하고 있는 듯 하다.
PC가 메인프레임으로 부터 컴퓨팅의 자유를 이끌어 냈을 때 세상은 퍼스널 컴퓨팅 세상으로 바뀌었고 모바일 혁신은 기존의 PC에서 모빌리티 자유를 이끌어 낼 수 있었다.
인터페이스에서도 다양한 혁신이 이끌어져 오고 있는데 키보드 마우스를 넘어서서 최근은 거의 모든 디바이스에서 볼 수 있는 터치 인터페이스의 확산 속도는 이전의 어떤 인터페이스 보다 확산 속도가 빠르다. 터치 인터페이스는 폰을 넘어서 타블릿PC 그리고 최근 영상이 공개된 원도우즈의 차기 버전(가칭 원도우즈8)까지 광범위 하게 사용되고 있다. 하지만 최근에 마이크로소프트가 발표한 키넥트는 이전에 그 어떤 인터페이스에서도 제시하지 못했던 새로운 차원의 인터페이스를 제시하면서 또 한번의 큰 변화를 예고하고 있다.
게임기에서 Windows로 넘어가는 Kinect
키넥트는 원래 게임 콘솔인 XBOX 360에서 게임을 위해서 출시되었다. 기존의 닌텐도나 소니에서 선보였던 손에 센서 뭉치를 들고 하는 방식이 아니라 사람을 직접 인식하는 혁신적인 방식이다. 물론 과거에도 사람을 직접 인식하는 기술들은 여럿 있었지만 별다른 부가장치의 부착없이 사람을 관절단위로 인식하는 시도는 처음 상용화 된 방식이다. 키넥트는 적외선, RGB, 깊이(Depth) 등의 세 가지 센서를 통해서 사람을 정확하게 관절로 인식하고 마이크로폰을 이용해서 음성인식이 가능하다. 키넥트는 부가적으로는 사람을 잘 인식하기 위해서 받침대와 목사이의 관절에 모터가 설치되어 있어서 사람을 찾아서 시선을 조정하기도 하는 등 제법 똑똑한 모습도 보여준다. 현 시점에 게임 시장에서 키넥트를 보면 상당히 성공적이다. 최단기간 1000만대를 팔아서 ‘가장 짧은 시간에 가장 많이 팔린 전자기기’라는 이름으로 기네스북에 오르기도 했다. 하지만 세상의 개발자들과 오덕후 들은 키넥트를 게임 용도로만 국한하지 않았다. 키넥트를 원도우즈를 시작해서 매킨토시, 리눅스, 안드로이드 등 다양한 플랫폼에 연결 시키는 오픈 소스 프로젝트가 진행되는가 하면 로봇이나 모형 헬기를 조정하는 용도부터 장애인들을 위한 다양한 프로젝트까지 여러가지 아이디어와 결합되기 시작했다.
<그림2>휠체어를 인식해서 따라다니는 쇼핑 카터 프로젝트 wi-Go
사람들의 아이디어가 무궁무진하고 다양한 형태로 표출되면서 좀 더 적극적으로 체계적인 지원에 대한 요구가 많아지면서 마이크로소프트는 키넥트를 XBOX 360의 게임을 위한 용도 이외에 PC와 연결되어서 일어날 수 있는 다양한 시나리오를 직접 지원하기 위해서 Kinect SDK for Windows를 발표하게 되었다.
Kinect SDK for Windows
Kinect SDK for Windows는 마이크로소프트 연구소(Microsoft Research)에서 준비되고 발표된 것으로 32비트와 64비트 버전 두 가지 모두 지원되지만 제공되는 샘플이 32비트 버전에서만 지원되는 것들이 있어서 아직은 32비트 버전을 사용할 것을 권장한다. Kinect SDK for Windows 안에서 키넥트를 위한 소프트웨어를 개발하기 위해서 3가지 구성 요소를 제공한다.
- 키넥트를 윈도우에 인식시키기 위한 디바이스 드라이버
- 키넥트를 제어하기 위한 API 프레임웍
- 샘플과 문서
키넥트를 이용한 소프트웨어 개발을 위해서는 당연하겠지만 키넥트가 필요하다. 하지만 키넥트를 받아든 순간 허걱하고 놀라게 되는데 당연히 USB인줄로만 알았던 컨넥터가 USB도 아닌 것이 처음 보는 형태로 되어 있기 때문이다. 키넥트를 사용하기 위해서는 표준적인 USB 포트가 제공해 줄 수 있는 전력보다 더 많은 전력을 소비해야 하기 특별한 형태의 컨넥터 타입이 필요하게 되었다.
그래서 구형 XBOX 360과 PC에서 키넥트를 사용하기 위해서는 별도로 전력을 공급할 수 있는 어뎁터가 필요하다. 해당 어뎁터는 시중에서 바로 구입할 수는 없고 마이크로소프트 고객센터로 전화해서 신청하면 구입할 수 있다.
하드웨어에 대한 준비가 끝났으면 이제 개발환경을 설정할 차례이다.
개발환경은 기본적으로 원도우7과 비주얼 스튜디오가 필요하다.
- 원도우7 (x86 혹은 x64)
- Kinect for Xbox 360 센서
- Microsoft Visual Studio 2010
- Microsoft .NET Framework 4.0 (Visual Studio 2010과 함께 설치 됨)
- DirectX Software Development Kit June 2010(C++만 필요)
- Microsoft Speech Platform SDK
- Kinect for Windows Runtime Language Pack
여기에 제일 중요한 것이 Kinect SDK for Windows(이하 키넥트 SDK) 이다. 키넥트 SDK는https://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/ 에서 다운로드 할 수 있으며 관련 문서들을 추가로 다운로드 받을 수 있게 되어 있다.
키넥트 SDK를 설치하고 나면 인체를 뼈대로 인식하는 것을 볼 수 있는 Skeletal Viewer와 음성인식과 간단한 게임을 보여주는 Sample Shape game 두 가지 완성된 샘플을 볼 수 있다.
<그림5>Skeletal Viewer
특히 Sample Shape game의 경우 인체를 인식하기도 하지만 음성 인식도 함께 가능해서 ‘Super Big’, ‘Start’,’Stop’과 같은 명령들을 직접 음성으로 내려 볼 수 있다.
키넥트를 이용한 애플리케이션을 개발하기 위해서는 위해서는 VC++ 혹은 C#, VB와 같은 개발 언어를 알아야 한다. 키넥트 SDK에서 제공되고 있는 라이브러리에서 인체 구조를 인식하고 제스츄어를 분석하는 등의 기능을 하는 부분이 NUI Library 이다.
<그림7>NUI Library
NUI Library는 키넥트에서 전송되어서 오는 이미지와 Depth 그리고 오디오 정보를 취합해서 애플리케이션에서 활용할 수 있는 정보로 전환하는 기능을 가지고 있는 핵심 요소이다. 좀 더 세부적으로 들어가면 <그림8>과 같은 아키텍처르 정리할 수 있다.
<그림8>키넥트 아키텍처
키넥트 하드웨어는 USB 기반의 기술로 PC와 연결되며 커널 모드 드라이버로 작성된 키넥트 드라이버가 하단에 자리 잡고 있다. 그 위에 카메라와 오디오 스텍이 있고 그 위에 최상위 추상화 레벨에서 NUI API와 오디오/비디오 컴퍼넌트가 잡리 잡고 있는 형태이다.
사실 개발자의 입장에서는 아키텍처 자체는 그리 중요하지 않을 수도 있다. 하지면 전체적인 그림을 이해하고 넘어가는게 아무래도 좀 더 개발에 탄력을 줄 수 있을 것 같다.
NUI Skeleton Tracking
NUI Library에서 제공되는 API중에서 NUI Skeleton API가 있는데 이는 키넥트 앞에 있는 사람을 최대 2명까지 뼈대로 인식해 낸다. 단순히 인식한다고 하면 사람의 형체만 인식하는 것처럼 보일 수 있지만 다시 이야기 하면 사람의 각 부분을 정확하게 인식해 낸다.
<그림9> NUI Skelton API의 인식 부분
NUI Skeleton API는 사람의 주요 부위를 20개로 인식하고 각 부분별로 명칭이 정해져 있다. 여기서 나오는 정보를 기반으로 애플리케이션에서 다양한 반응을 만들어네게 되는데 뼈대에 관한 정보를 찾아내기 위해서는 C++에서는 NuiSkeletonGetNextFrame을 사용할 수 있고 C#등에서는 SkeletonEngine.GetNextFrame을 사용해서 각 부분의 상태를 확인할 수 있다.
Kinect SDK for Windows 개발
키넥트 SDK는 VC++, C#, VB.NET 등등 네이티브 언어와 매니지드 언어를 모두 지원하는데 여기서는 C#언어를 기준으로 설명한다. 키넥트 SDK를 사용하기 위해서는 Microsoft.Research.Kinect.dll을 참조해야 한다.
<그림11> Microsoft.Research.Kinect.dll 참조
키넥트 관련 라이브러리에서 Microsoft.Research.Kinect.Nui에는 사람을 직접 인식하는 데 관련된 클래스들이 포함되어 있으며 Microsoft.Research.Kinect.Audio에는 음성 인식과 관련된 클래들이 포함되어 있다.
using Microsoft.Research.Kinect.Nui;
using Microsoft.Research.Kinect.Audio;
kinectRuntime = new Runtime(); kinectRuntime.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor);
<소스1>네임스페이스 설정
<소스1>에서 보면 개발에 필요한 두 개의 네임스페이스를 포함하고 키넥트를 사용하기 위해서 키넥트 런타임을 생성하고 초기화 시키는 과정을 볼 수 있다.
키넥트 SDK를 설치하고 나면 함께 설치되는 도움말을 보게 되면 생각보다 많은 객체와 내용들에 우선 질리실지도 모르겠다.
좀 더 싶게 접근하려면 Coding4Fun Kinect Toolkit (https://channel9.msdn.com/coding4fun/projects/Coding4Fun-Kinect-Toolkit) 을 사용할 수 있다. Kinect Took에서는 WPF Extension, WPF Controls, WinForm Extensions, skeletal Extensions등이 포함되어 있어서 개발이 한결 수월하게 해준다.
<그림12>Coding4Fun에 올라와 있는 Kinect 관련 프로젝트들
https://channel9.msdn.com/coding4fun 에서 오픈소스로 진행되는 프로젝트들을 보는 것도 흥미로울 것이다. Kinect Paint, Kinect Mouse등의 프로젝트는 흥미로운 요소들을 제공해 줄 것이다.
- 정리
키넥트를 바라보는 사람에 따라서 서로 다른 기대치를 가지고 볼 수 있겠지만 필자가 개발자의 눈으로 바라보는 키넥트는 ‘정말 재미있는 개발자들의 장난감’이다. 즐겁고 재미있게 만들고 고민하다 보면 키넥트와 관련된 정말 재미있는 애플리케이션들을 많이 만들 수 있을 것 같다.