Leap Motion

Overview – 3. 모션 추적 데이터(Motion tracking data) (1)

원문과 원문에서 가져와 본 글에 사용한 영상 및 기타 자료들의 저작권은 Leap Motion에 있습니다.

잘 모르는 상태에서 한글로 옮기다보니 조금 헷갈릴 수 도 있을 것 같습니다. Leap Motion에서 얻을 수 있는 모션 정보는 크게 손과 프레임이 있습니다. 손은 각각의 손에 대한 움직임 정보를 가집니다. 세세하게는 각 손가락이나 연필 같은 도구에 대한 정보를 따로 가져올 수도 있고요. 손 자체의 대한 움직임도 알 수가 있습니다. 프레임 모션이라 부르는 다른 한가지믄, 손 물체가 아닌 전체적인 동작을 나타내는 것 같습니다. 양손을 위로 올리거나 한손을 왼쪽으로 쓸거나 하는 등의 전체적인 동작을 나타내는 것 같습니다. 저도 코딩을 해봐야 정확히 이해할 수 있겠지만, 당장 이 어설픈 글을 이해하는데 약간은 도움이 되시리라 믿습니다.

 

모션 추적 데이터 (1)

앞에서 이야기한 것과 같이 Leap Motion 컨트롤러는 자신의 시야에 들어온 손, 손가락, 도구를 추적하고, 그에 따라 데이터 세트, 혹은 프레임의 형태를 업데이트하는 형식으로 데이터를 제공합니다. 각 프레임은 기본 추적 데이터의 리스트를 가지고 있어요. 이것은 손이나, 도구 그리고 인식된 동작이나 현재 상황에서의 전체적인 모션 또한 포함합니다.

손, 도구, 동작 등이 감지되면 Leap Motion 소프트웨어는 이들에 각각 고유의 ID를 할당한답니다. 이렇게 할당된 ID는 컨트롤러의 시야에 있을 동안에는 같은 ID를 유지하게 되지요. 만약 추적하던 물체가 없어졌다가 다시 나타나게 되면 새로운 ID를 할당받게 됩니다. 왜냐면 소프트웨어는 지금 나타난 손이 아까 있던 손인지 아닌지 분간할 수 없으니까요.

프레임

프레임은 추적 데이터와 동작, 컨트롤러 시야 내에서의 전체 모션에 대한 정보를 가지고 있습니다.

추적 데이터 리스트

  • Hands - 모든 손들
  • Pointables - 특정 지점을 가리킬 수 있는 모든 손가락과 도구들
  • Fingers - 모든 손가락
  • Tools - 모든 도구
  • Gestures - 시작하거나 끝나거나, 업데이트 된 모든 동작

세가지 가리킬 수 있는 리스트(Pointables, Fingers, Hands)는 프레임에서 감지된 모든 pointable 객체를 갖습니다. 특별히 손과 관련된 pointables는 hands리스트의 Hand를 통해서 정보를 얻을 수 있어요. 하지만 컨트롤러 시야에 손의 일부만 감지된 상태나, 손이 아닌 도구일 경우에는 손과 관련되어있지 않다는 점을 유의하세요.

혹시 손 같은 물체을 프레임들 사이에서 추적중이라면, 각 프레임에서 물체에 할당된 ID를 사용할 수 있습니다. API에서 제공되는 함수를 이용하면 Hand, Finger, Tool, Pointable, Gesture 객체들을 ID로 찾아 얻어올 수 있어요. 이 함수는 현재 프레임에 해당 객체가 있다면 그 객체의 포인터를 리턴한답니다. 더이상 물체가 없다면 특별하게 이상한 값을 가진 객체가 리턴됩니다. 이 객체는 모양새는 그럴싸하지만, 올바르지 않은 값을 가지고 있습니다. 이러한 방식은 번거롭게 제대로된 값을 가지고 있는지 검사하는 과정을 줄이도록 고안되었습니다.

프레임 모션

Leap Motion 소프트웨어는 이전의 프레임에서 시작된 모든 모션과 그것의 이동, 회전, 크기 변화 등을 분석합니다. 예를들어, Leap Motion의 시야에서 양손을 왼쪽으로 이동하면 프레임은 이동에 대한 정보를 가지고 있게 됩니다. 또 양 손을 비틀어 손바닥이 위로 올라오게 하면 회전에 대한 정보를 가지죠. 양 손을 위로 올리거나, 서로에 대해서 떨어트리면 크기 변화에 대한 정보를 가지고요.  이렇게 Leap Motion 소프트웨어는 시야내에 있는 모든 물체를 분석합니다. 감지된 손이 한개든, 두개든 자동으로 이를 인식하여 상황에 알맞게 프레임 모션 정보를 제공할 겁니다. 또한 각각의 손에 대해서 움직임에 대한 정보를 가지고 있는 것은 물론이고요.

프레임 모션은 이전에 있던 프레임과 현재의 프레임을 비교하여 만들어집니다. 모션은 아래와 같은 정보를 포함해요.

  • Rotation Axis - 회전을 축을 나타내는 방향 벡터
  • Rotation Angle - 회전 축에 대한 시계방향으로의 회전 각
  • Rotation Matrix - 회전을 나타내는 변환 행렬
  • Scale Factor - 크기 변화에 대한 정도
  • Translation - 크기 변화를 제외하고 오직 이동에 대한 벡터

따라서 여러 프레임 동안 들어온 각 손이나 손가락을 직접 사람이 분석할 필요없이 모션 정보를 곧바로 이용할 수 있답니다.

프레임은 또한 한 프레임 안에서의 사람이 어떤 의도로 움직인지를 예상한 정보도 가지고 있습니다. 예를들어 다음 프레임에서 크기가 커질 확률이 높다고 기록되어있다면 물체의 회전이나 이동은 무시하는 등의 처리도 가능한 것이죠.

손 모델

손 모델은 인식된 손의 위치, 특성, 이동 등에 대한 정보를 제공합니다. 또한 손가락이나 손이 쥐고 있는 도구에 대한 정보도 포함해서요.

Leap Motion API를 이용하면 손에 대해 가능한 많은 정보를 제공하려하지만, 항상 매 프레임마다 손의 모든 속성을 이용할 수 있는 것은 아닙니다. 어쩔 수 없는 상황도 있어요. 주먹을 쥐면 Leap Motion 컨트롤러에서는 손가락을 인지할 수 없어 손가락 리스트에는 아무것도 없어지게 되는 식이죠. 따라서 이렇게 정보가 없는 상황에 대해서 따로 처리하는 부분을 넣어야 할 것입니다.

Leap Motion은 왼손인지 오른손인지 구분하지 않습니다. 한명이 아니라 두 사람이서 Leap Motion을 사용하거나 손 비슷한 물체가 나타난다면 두개 이상의 손이 손 리스트에 나타날 수도 있어요. 하지만 제대로된 모션 추적을 하기 위해서 2개까지의 손만 나타나도록 하는 것을 권합니다.

손 애트리뷰트

손 객체는 인식된 손의 여러 정보를 제공합니다.

  • Palm Position - Leap Motion 원점으로부터의 손바닥의 중심이 위치하는 지점을 밀리미터 단위로 표시
  • Palm Velocity - 손바닥이 1초에 몇 밀리미터를 움직였는지
  • Palm Normal - 손바닥 면에 수직인 벡터. 벡터의 방향은 손바닥으로부터 아래를 향함.
  • Direction - 손바닥의 중심으로부터 손가락으로 향하는 방향 벡터
  • Sphere Center - 손을 오무린 정도에 따라 결정되는 가상의 구가 위치하는 중심
  • Sphere Radius - 손을 오무린 정도에 따라 결정되는 가상의 구가 가지는 반지름

direction과 palmNormal은 손이 어느 방향을 나타내는지 표현하기 위해서 사용하며 Leap Motion 좌표계에서 유닛벡터를 이용하여 표현합니다.

palmNormal은 손바닥 바깥 방향이고, direction은 손가락의 방향을 가리킨다.

또한 Leap Motion은 손의 오무린 정도를 나타내기 위해서 가상의 공을 이용하는데, 마치 공을 쥐었다고 생각했을 때처럼 말이죠. 오무린 정도에 따라서 sphereCenter와 sphereRadius는 공의 위치나 크기를 나타내게 됩니다.

손가락을 구부리면 공의 크기가 줄어든다.

손 모션

손 객체는 또한 프레임간 인식된 손의 움직임에 대한 정보를 갖습니다. 이것은 손가락이나 도구와 관련된 손의 움직임이나, 손이 이동, 회전 크기 변화에 대한 것이지요. Leap Motino의 시야 내에서 손을 이리저리 움직이면 이동에 대한 정보를 생성하게 될 거에요. 손 뒤집기, 비틀기, 젖히기 등의 동작은 회전을 생성하게 됩니다. 손가락이나 도구를 앞으로 밀거나 서로에게서 떨어트리면 크기 변화에 정보가 기록되죠.

손 모션은 현재 프레임과 이전에 있던 프레임간에서 인식된 손의 특성을 비교하여 정보를 생성합니다. 그 속성은 아래와 같습니다.

  • Rotation Axis - 회전을 축을 나타내는 방향 벡터
  • Rotation Angle - 회전 축에 대한 시계방향으로의 회전 각
  • Rotation Matrix - 회전을 나타내는 변환 행렬
  • Scale Factor - 크기 변화에 대한 정도
  • Translation - 크기 변화를 제외하고 오직 이동에 대한 벡터

손 객체는 프레임과 마찬가지로 어떻게 의도하고 움직였는지에 대한 정보도 포함합니다.

손가락과 도구 리스트

손이 지금 사용하고 있는 도구나 손가락에 따라 아래 세가지 중 하나로 할당됩니다.

  • Pointables - 손가락이 도구
  • Fingers- 손가락
  • Tools - 도구

이전 프레임에서 알아낸 ID를 이용하여 각 손가락이나 도구 하나를 얻어올 수도 있습니다. Hand::finger() 나  Hand::tool() 를 이용하거나 손가락이든 도구든 상관이 없다면  Hand::pointable() 을 이용할 수도 있죠. 이 함수들은 현재 프레임에서의 해당하는 객체의 포인터를 리턴하지만, 프레임에 존재하지 않는다면 앞서 이야기했던 특별한 값을 갖는 객체를 리턴합니다.

 


Add a Comment Trackback