ついに本題です。Kinect for Windows SDK 2.0が返す四元数の意味


Kinect for Windows SDK 2.0のManaged Code版では骨格情報を格納するBodyクラスの中に関節角を表すプロパティとしてJointOrientation.Orientationを持っており、そのドキュメントには

[This documentation is preliminary and is subject to change.]
Gets or sets the direction of the joint relative to the parent joint in the skeleton.
とだけ書いてあります。なお、型はVector4です。親関節から見たその関節の方向を表すということは分かりましたが、これだけでは意味が分かりませんので可能な限り調べてみました。

まず基本情報として以下のことを抑えてください。

  1. Bodyクラスには人体の関節の位置情報および角度が格納されている
  2. 関節の位置情報はCameraSpaceという3次元空間のベクトルで表されている
  3. CameraSpaceの座標系はKinectを原点とし、Kinectから見て左が\(x\)軸正、上が\(y\)軸正、前方が\(z\)軸正の右手系
  4. 関節は腰骨中央のSpineBaseを根とする木構造を持っている
  5. 関節角(JointOrientation.Orientation)は大きさ1の四元数で表されている

Kinect V2 CameraSpaceKinect V2 Body

親子関係にある任意の2つの関節について、四元数に変換した親関節の位置情報(JointPosition)を\( P_{p} \)、子関節の四元数に変換した位置情報、四元数(JointOrientation.Orientation)をそれぞれ\( P_{c}, Q_{c}\) とします。このとき、次のような式が成り立ちます。\[P_{c}-P_{p}=\left\vert P_{c}-P_{p}\right\vert Q_{c}\left( 0i+1k+0j \right)\bar{Q_{c}}\]ここで位置情報を四元数に変換するとは、3次元ベクトル\( (a,b,c)\)を四元数\( ai+bk+cj\)と書き換えることをいいます。すなわち、親関節から見た子関節の方向は鉛直上向きのベクトルを股関節の四元数で回転させた向きと一致します。ただし、Bodyの端点である“THUMB_RIGHT“,“HAND_TIP_LEFT“,“FOOT_LEFT“などは四元数を持たないため、子関節がそのような関節であるときにはこの式は成り立ちません。なお、この式に関しては多量のフレームについて計算で確認済みです。

Kinect V2は腕のねじり等も認識できますので、SDK 2.0が返す四元数はそのようなねじりも含んだもっと強い意味を持ちます。それを表すため、「気をつけ」の姿勢をKinect V2で認識させたとき、\( (1,0,0),(0,1,0),(0,0,1) \)を各関節の四元数で回転させた方向をそれぞれ赤矢印、緑矢印、青矢印で示したのが下の図です。もちろん親関節から子関節への向かう向きが股関節の緑矢印と一致します。なお、関節のねじりの信頼性はそれほど高くないため、下の図は間違っている可能性があります。もしご利用の際はご自分でも確認してください。また、間違いを発見されたらお知らせいただけるとうれしいです。Kinect V2 のJointOrientations


コメント (0)


Add a Comment





使用可能なタグ: <b><i><br>新規コメントを追加: