티스토리 뷰

Processing

[Kinect with Processing] Kinect로 제어하는 LED

생각많은 소심남 2012. 8. 21. 00:36

앞에서 한창 아두이노와 프로세싱을 시리얼 통신을 통한 프로젝트를 진행했습니다. 이제는 시리얼 통신의 주체가 PC에서 넘어서서 키넥트로 바꾸는 것을 해봅니다. 기존의 아두이노 프로그램을 활용하고 이전에 사용했던 회로를 그대로 이용합니다. 물론 아두이노에 프로그램을 넣고 다른 것으로 수정하지 않았다면 그냥 회로만 구성하시면 됩니다. 이해가 안 가시는 분은 이전 포스트에서 확인하시기 바랍니다.

2012/08/15 - [About Processing] - [Arduino with Processing] Serial-Controlled LEDs

그러고 보니까 저도 회로도를 다시 구성해야 되네요..


자 그럼 본격적으로 다뤄야 할 것은 아두이노가 아니라 키넥트입니다. 우리는 이전에 프로세싱에서 키넥트를 활용할 수 있는 방법을 언급했습니다. 먼저 관련 라이브러리와 변수들을 선언해줘야겠지요.

앞의 포스트에서 시리얼 통신설정과 키넥트 환경 설정을 보신 분이라면 충분히 여기까지는 하실겁니다. 추가적으로 필요한 변수가 있는데 우선은 키넥트를 통해서 인식하는 손의 위치, 그리고 손을 스크린상에 투영시켰을때의 위치 그리고 그 손이 추적이 될때 나타낼 색에 대한 표현을 사전에 정의해두면 편합니다. 그래서 정의 부분은 다음과 같이 작성됩니다.

이제 setup을 지정해줘야 하는데 새로운 개념이 등장합니다. SimpleOpenNI 라이브러리는 맨 처음 포스트에서 언급한대로 OpenNI 드라이버를 기반으로 동작합니다. 그 와중에 설치되는 드라이버가 바로 NITE 라는 게 있습니다. 사실 저도 이 NITE를 키넥트 프로그래밍에 활용하려고 애를 썼습니다만. NITE용 예제들이 전혀 동작하지 않더군요. 보통 논문에서도 손을 트래킹하기 위해서 기존의 API를 활용한다고 하는데 그런게 전혀 안됩니다. 아무튼 그런 연유에서 프로세싱에서도 안되겠지 했는데 신기하게도 프로세싱에서는 NITE의 기능을 활용한 함수들이 동작합니다. 그중에서도 Gesture를 활용할 수 있는 예제가 있는데 그걸 구현하려면 다음과 같이 작성하면 됩니다.


여기서 처음 보는 함수가 바로 Gesture를 활용한다는 속성과 손을 인식하는 함수일 겁니다. 이 것들이 바로 SimpleOpenNI를 통해서 사용할 수 있는 NITE 함수들입니다. 그리고 그중에 활용할 수 있는 제스처가 여러개 있는데 하나가 바로 Wave 라는 겁니다. 물론 다들 아시겠지만 손을 좌우로 흔드는게 Wave가 되겠지요. 

 우선은 그 제스처가 인식되었을 때 어떡할 것인가에 대한 정의가 필요합니다.

이렇게 하면 제스처가 인식된 순간에는 그 제스처를 행한 손의 위치를 반환값으로 내보냅니다. 그 값이 바로 endPosition이 되겠지요. 

 물론 이런 동작들을 하기 전에 해야 될것은 바로 손을 먼저 인식해야 한다는 것이지요. 그 것에 대한 코드는 다음과 같습니다. 물론 손이 움직일 경우에 대한 위치값을 계속 개발자한테 전달받게 하는 것이죠.그럼 개발자는 그걸 활요해서 더 나은 어플리케이션을 구현할 수 있는 것이고요. 우선 여기서 언급한 내용이 코드로 적용됩니다.

이렇게 해두면 손의 위치를 전달 받을 수 있으며 사용자도 지금 handPointCol을 통해서 손의 위치가 추적되면 초록색으로 바뀌게끔 되어 있습니다. 이게 바로 onCreateHands의 역할이 됩니다. 그리고 매 프레임별로 갱신이 되면서 그 위치도 또한 handVec을 통해서 나오게 됩니다. 그건 onUpdateHands에서 해주는 일이 되겠습니다.


 자 손의 위치도 잡았으니 본격적으로 draw를 작성해야 됩니다. 이 내용도 앞에서 다룬 내용을 조금이라도 짬뽕화하면 적용시킬 수 있습니다. 일단 여기까지 작성해보겠습니다.



여기까지는 키넥트에서 DepthImage를 받아서 창에 띄워주고 손의 위치를 mapHandVec이란 변수를 통해서 뿌려주고 있습니다.그런데 여기까지는 정작 앞에서 다룬 시리얼 통신을 적용시키지 않았지요. 지난번에 써먹었던 것처럼 조건문을 활용한 정보를 받고 그에 대한 값을 LED의 밝기에 적용시켜 봅시다 코드 자체는 간단합니다.


추가로 적용한 것은 밑의 세줄인데 그저 손의 위치의 x,y 좌표를 받아서 각각의 width와 height으로 나눠준 것밖에 없습니다. 이렇게 하면 이 값은 1보다 작은 값이 나오게 되고 여기다가 255를 곱해서 결론적으로 아날로그 입력의 범위안의 값으로 LED에 들어가게 됩니다. 한번 결과를 볼까요?


처음에는 LED의 불이 꺼져있습니다. 당연히 손을 인식하지 않았기 때문이지요. 그와중에 앞에서 정의한 Wave 제스처를 사용하면 불이 켜지게 됩니다.보시면 추적된 손에는 초록색 점이 달려있고 그 손이 위로 향하면 붉은색 LED의 밝기가 조절됩니다. 반대로 좌우로 움직이면 노란색 LED의 밝기가 조절되는 것을 보실 수 있지요.


자 드디어 키넥트로 LED를 제어하는 것까지 해보았습니다. 어떻게 보면 무척이나 간단한 내용이지만 소프트웨어와 하드웨어가 궁극적으로 융합된 프로젝트의 첫발이라고 봅니다. 개인적으로 간단하게 할 수 있으면서 모션으로 하드웨어를 제어할 수 있다는 사실 자체가 무척이나 신기합니다. 역시 해보실 분은 프로젝트 공유해드릴테니 참고 바랍니다.

https://dl.dropbox.com/u/96808368/processing/kinect%2Bprocessing.zip

참고로 단점이 있다면 프로세싱에서 손을 따라가는데 한번 놓치면 다시 못잡는다는 겁니다. 이때는 다시 실행시켜주던가 해야 합니다. 이래서 환경에 대한 제한사항이 필요할 것 같습니다.




댓글