2021.09.22
Ultraleap社 Windows版SDKを用いたリープモーションコントローラを用いて手の関節の3次元座標を標準出力する方法
WEBマガジン非接触
1. はじめに
2. LMCまたはSIR170の購入
3. Windows版SDKダウンロード
4. SDKインストール
5. その他のツールのインストール (cmake, Visual Studio)
6. SDKサンプルプログラムのbuild
7. 3次元座標の標準出力
1. はじめに
Ultraleap社の国内唯一の正規代理店として当社が取り扱っておりますハンドトラッキング製品『リープモーションコントローラ』(以下、LMCと記載します)は、手と指の動きに特化したセンサで、細かい手指の動きも正確に、かつ遅延なく画面や空間上で表現させることが可能なため、AR/VR向け製品や非接触での画面操作などの用途に使用されています。
このLMCに関して、「xyz座標の取得方法は?」や「検出結果である指の位置情報をcsvファイルに出力したい」など、お客様から手と指の位置情報(3次元座標)に関するお問い合わせを頂くことが度々あります。
LMCでの3次元座標の取得方法については、専用SDK(Software Development Kit、ソフトウェア開発キット)に付随するサンプルプログラムに記載があります。
しかしながら、SDKをダウンロードするにはユーザー登録が必要、build(実行ファイル(*.exe)を生成)する環境構築が必要、サンプルプログラムの理解が必要、など様々な手順を踏まないとこのゴールに達することが難しくなっており、今まではこの手順を示した資料がなく、いろいろな資料を各自で読み進める必要がありました。
今回、Windows版SDKを用いた「LMCを用いて手の関節の3次元座標を標準出力する」という一連の手順をWebマガジンとしてまとめましたので、ご参照下さい。
なお、ご紹介する手順にて、LMCだけではなく、後継機種のStereo IR170(SIR170)でも問題なく動作します。
SIR170は、
S: ステレオカメラ(Stereo Camera)
IR:赤外(InfraRed)
170:前後・左右のFoV (Field of View、視野角)がそれぞれ170度
という意味であり、LMCよりもFoVが広くなっているのが特徴です。
2. LMCまたはSIR170の購入
まず初めにLMCまたはSIR170の購入方法をご説明します。
※ユーザー登録やSDKダウンロード時に製品番号等の入力が不要であるため、製品を購入せずにSDKを入手することは可能です。
個人ユーザー様やAmazonからの購入が可能な法人様には、当社公式Amazonサイトからの購入をお勧めしております。
Amazon経由での購入が難しい法人様には、当社のオンラインストアから購入可能です。
いずれのオンラインストアサイトからの購入が難しいお客様については、当社オンラインストアの「お問い合わせ」経由でご連絡下さい。
3. Windows版SDKダウンロード
専用のSDKは製品購入時には含まれておらず、Ultraleap社のWebサイトからダウンロードします。ここではSDKのダウンロード手順に関して説明します。SDKはLMCとSIR170で兼用です。
なお、これ以降、Windows版SDKに特化した記載内容となります。Mac OS版、Linux版のSDKはここ数年、更新されておらず、Version2.3.1のままとなっています(ダウンロードは可能)。最新の機能をご使用いただけますよう、Windows版のご利用をお勧めいたします。
最初にWindows版SDK の種類に関して説明します。2021年9月の時点でダウンロード可能なWindows版SDKは以下の通りです。
- ・Version 4.1.0:正式リリースVersion
- ・Version5.0.0:プレビューVersion
現在開発段階でありますが、Version5.0.0は内部のアルゴリズムを再構築しており、Version4.1.0などの以前のVersionよりも最初の手の検出精度、手の検出後のトラッキング(追従)精度が向上しています。
Version4.1.0とVersion5.0.0の認識精度の違いについては、こちらのWebサイトの下部にある「Gemini | Two hand interactions」および「Gemini | Improved hand initialization」のYoutube動画を参照ください。それぞれ左がVersion4.1.0(正式リリースVersion)、右がVersion5.0.0(プレビューVersion)での動作を示しています。
なお上記Youtube動画に記載があります「Orion」および「Gemini」ですが、
- ・Orion:Version4.X.X(V4)の開発コード名
- ・Gemini:Version5.X.X(V5)の開発コード名
を意味しています。
以上、Windows版SDKとして2つのSDKが存在することをご説明しました。この2つのSDKはそれぞれダウンロードが可能です。
ただし、Ultraleap社Webサイトの構成が分かり辛く、ダウンロード先までたどり着くのがなかなか厄介であります…。
また日本語でSDKダウンロード手順をまとめて下さっている個人ユーザー様も多数いらっしゃいますが、旧Leap Motion社時代のWebサイトを基にした記載の場合、リンク切れが発生しています。
※2019年にLeap Motion社とUltraHaptics社が統合され、Ultraleap社が設立されました。リンク切れは、この際にWebサイトを刷新したことによる影響です。
よって、2021年9月時点のUltraleap社のWebサイトの内容に合わせて、2種類のWindow版SDKのダウンロード手順をご説明いたします。
◆共通項目
(1)-1 Ultraleap社の開発者向けサイト(Ultraleap FOR DEVELOPERS)にアクセスします。
(1)-2 少し下にスクロールして、「Download Tracking Software」をクリックします。
◆Windows SDK Version4.1.0 ダウンロード手順
(2)-1 ”Windows Version 4.1.0”の上にある「DOWNLOAD」をクリックします。
(2)-2 ログインまたは新規登録ウィンドウが表示された場合、ユーザー登録済みであればログイン(メールアドレスとパスワードを入力して「サインイン」をクリック)、ユーザー未登録であれば新規登録(必要事項を入力した後「登録する」をクリック)を行います。
(2)-3 開発者・アカウントの選択ウィンドウが表示された場合、「開発者」をクリックします。
(2)-4 Windows版SDK Version4.1.0のzipファイル(LeapDeveloperKit_4.1.0+52211_win.zip)の保存ウィンドウが表示されるので、任意のフォルダーに保存します。
◆Windows SDK Version5.0.0 ダウンロード手順
(3)-1 少しウィンドウをスクロールし、「Join Gemini (V5) Preview」をクリックします。
(3)-2「DOWNLOAD GEMINI V5 PREVIEW」をクリックします。
(3)-3 (2)-2および(2)-3と同じウィンドウが表示された場合、(2)-2および(2)-3と同じ処理を行います。
(3)-4 Windows版SDK Version5.0.0のzipファイル(LeapDeveloperKit_5.0.0-preview+52386_win.zip)の保存ウィンドウが表示されるので、任意のフォルダーに保存します。
4. SDKインストール
ダウンロードしたWindows版SDKのzipファイルを展開した後、インストーラーを用いてSDKをインストールします。
zipファイルの展開およびインストール手順は以下の通りです。なお、Version4.1.0とVersion5.0.0でインストール手順は同じなので、Version5.0.0のSDKを基に説明します。
(1)Windowsのエクスプローラーにて、2. Windows版SDKダウンロードの(3)-4にて、Windows版SDK Version5.0.0のzipファイルを保存したフォルダーに移動する。
(2) zipファイル(LeapDeveloperKit_5.0.0-preview+52386_win.zip)を選択後に右クリックし、「すべて展開」を選択、実行します。
(3)展開先のフォルダーを設定し、「展開」をクリックします。
(4)展開後のフォルダーの下にSDKのインストーラー(LeapDeveloperKit_5.0.0-preview+52386_win.exe)が生成されているので、ダブルクリックして起動します。
(5)以下のウィンドウが表示されるので、「次へ」をクリックします。
(6)ライセンス契約書が表示されるので、内容を確認の上、「同意する」をクリックします。
(7)SDKのインストールが開始されます。
(8)SDKのインストール完了後、下記ウィンドウが表示されます。「完了」をクリックして終了します。
(9)以下、SDKインストール後の動作確認を行います。LMCまたはSIR170をカメラが上の向くように配置(卓上に置くなど)した後、Windows PCにUSB接続します。なお、USBハブを介さずに直接USBコネクタに接続して下さい。またUSB3.0があれば、USB3.0側に接続して下さい。
(10)接続完了後、タスクバー内にある「Leap Motionコントローラパネル」のアイコンが緑色になっていることを確認します。
(11)「Leap Motionコントローラパネル」のアイコンを右クリックし、「ビジュアライザー」を選択して起動します。
(12)LMCまたはSIR170のカメラ上に手をかざし、「ビジュアライザー」で手を認識していることを確認します。「ビジュアライザー」はウィンドウ左上の「X」をクリックすることで終了できます。
5. その他のツールのインストール (cmake, Visual Studio)
SDKのサンプルプログラムをbuildするには、SDKのインストール以外に、下記2つのツールのインストールが必要です。
- ・cmake:Visual Studioでのbuild環境構築時に使用
- ・Visual Studio:サンプルプログラムのbuild時に使用
cmakeについては、以下のWebサイトからダウンロード可能です。
Visual Studioに関しては、個人利用であれば、無償でVisual Studio Communityが使用できます。Visual Studio Communityは以下のWebサイトからダウンロード可能です。
・https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2019
それぞれのツールのインストール方法については、インターネット上で検索してお調べ下さい。
6. SDKサンプルプログラムのbuild
Windows版SDK、cmake、Visual Studioを用いて、以下の手順でSDKサンプルプラグラムのbuildを行います。Version4.1.0とVersion5.0.0のSDKでbuild手順は同じなので、Version5.0.0のSDKを基に説明します。
(1)Windowsのエクスプローラーにて、SDKのインストーラー(LeapDeveloperKit_5.0.0-preview+52386_win.exe)があるフォルダーに移動します。
(2)Windowsのエクスプローラーにて、(1)のフォルダーからLeapSDK\samplesに移動します。
(3)(2)のフォルダー上で、「build」という名前のフォルダーを作成します(エクスプローラーにて右クリック→新規作成→フォルダー→フォルダー名をbuildにします)。
(4)Windowsのエクスプローラーにて、(3)で作成したbuildフォルダーを選択後にShiftキーを押しながら右クリックし、「PowerShellウィンドウをここで開く」を選択し、実行します。
(5)PowerShellウィンドウが開くので、そのウィンドウにて以下のコマンドでcmakeを実行します。
cmake .. |
(6) PowerShellウィンドウで以下のコマンドを実行し、PowerShellを終了します。
exit |
(7)(3)で作成したbuildフォルダー内に「Samples.sln」というファイルが生成されていることを確認します。
(8)Windowsのエクスプローラーで、「Samples.sln」をダブルクリックしてVisual Studioを起動します。
(9)Visual Studioにて「Debug」から「Release」に切り替えます。
(10)Visual StudioにてBuild→Build Solutionを選択し、buildを実行します。(exeファイルを生成します)
(11)build完了後、Outputの個所に「Build: 10 succeeded, 0 failed, 0 up-to-date, 1 skipped」と表示されていることを確認します。
(12)Windowsエクスプローラーにて、(3)で作成したbuildフォルダーの下のReleaseファルダーに移動し、以下のようにサンプルプログラムの実行ファイル(exeファイル)が生成できていることを確認します。
(13)LMCまたはSIR170を接続し、いずれかのサンプルプログラムのexeファイルをダブルクリックして、正常動作することを確認します。以下、GLUTDistortionShaderSample.exe実行時の表示例を示します。
7. 3次元座標の標準出力
最後にSDKサンプルプログラムを用いた手の関節の3次元座標を標準出力する方法を説明します。
実際、手の3次元座標に関しては、SDKインストール時に含まれるドキュメント上に記載があります。
Windowsのエクスプローラーにて、インストーラーがあるフォルダー下の\LeapSDK\docs\LeapCに移動してください。
この中にあるindex.htmlをダブルクリックすることで、SDKのドキュメントが表示されます。
左側の階層で、LeapC API->LeapC Guide->Leap Concepts->Handを選択すると、SDKにおけるHandに関する情報が記載されています。
この個所を読み進めていくと手の3次元座標に関する記載があります。ドキュメント自体、情報量は多くて役立つのですが、しかしながら、一度読んだだけでは、理解しづらい内容になっております…。
SDKサンプルプログラム中のソースコードを確認し、それを修正するのが一番手っ取り早い方法なので、今回はこの方法で進めます。
ソースコードはLeapSDK\samplesフォルダにCファイル(*.c)として保存されています。
まずいろいろあるサンプルプログラムの中から、視覚的にも分かりやすい「GLUTSample」を基にします。このサンプルプログラム(GLUTSample.exe)を動かした際に「関節をプロットしてあるから3次元座標として取得しているだろう」、「それをそのまま標準出力できるだろう」、と予想しました。
GLUTSample.cの中を確認したところ、34行目から77行目のdisplay関数内で各種3次元座標を取得していました。
肘の3次元座標は、display関数内の以下の記述(46行目)で取得しています。
glTranslatef(hand->arm.prev_joint.x, hand->arm.prev_joint.y, hand->arm.prev_joint.z);
手首の3次元座標は、display関数内の以下の記述(52行目)で取得しています。
glTranslatef(hand->arm.next_joint.x, hand->arm.next_joint.y, hand->arm.next_joint.z);
手の中心の3次元座標は、display関数内の以下の記述(58行目)で取得しています。
glTranslatef(hand->palm.position.x, hand->palm.position.y, hand->palm.position.z);
手の各関節の3次元座標は、display関数内の以下の記述(63行目から77行目)で取得しています。
for(int f = 0; f < 5; f++){ //★0:親指、1:人差し指、2:中指、…
LEAP_DIGIT finger = hand->digits[f];
for(int b = 0; b < 4; b++){ //★0→3で手首側から指先の関節
LEAP_BONE bone = finger.bones[b];
glPushMatrix();
glTranslatef(bone.next_joint.x, bone.next_joint.y, bone.next_joint.z); //★関節の3次元座標取得
glutWireOctahedron();
glPopMatrix();
}
}
3次元座標を標準出力は、各3次元座標を取得した直後に、printf関数を用いた標準出力に出力する記述を追加するだけで対応可能です。
以下に3次元座標の標準出力を追加したdisplay関数を記載します(//printf addedの個所を追加)。基のdisplay関数と差し替えてご利用できます。
void display(void)
{
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(0, -300, -500); //”Camera” viewpoint
glClear(GL_COLOR_BUFFER_BIT);
LEAP_TRACKING_EVENT *frame = GetFrame();
for(uint32_t h = 0; h < frame->nHands; h++){
//printf added
printf(“hand_id=%d\n”, h);
// Draw the hand
LEAP_HAND *hand = &frame->pHands[h];
//elbow
glPushMatrix();
glTranslatef(hand->arm.prev_joint.x, hand->arm.prev_joint.y, hand->arm.prev_joint.z);
//printf added
printf(“elbow:x=%8.3f, y=%8.3f, z=%8.3f\n”, hand->arm.prev_joint.x, hand->arm.prev_joint.y, hand->arm.prev_joint.z);
glutWireOctahedron();
glPopMatrix();
//wrist
glPushMatrix();
glTranslatef(hand->arm.next_joint.x, hand->arm.next_joint.y, hand->arm.next_joint.z);
//printf added
printf(“wrist:x=%8.3f, y=%8.3f, z=%8.3f\n”, hand->arm.next_joint.x, hand->arm.next_joint.y, hand->arm.next_joint.z);
glutWireOctahedron();
glPopMatrix();
//palm position
glPushMatrix();
glTranslatef(hand->palm.position.x, hand->palm.position.y, hand->palm.position.z);
//printf added
printf(“palm :x=%8.3f, y=%8.3f, z=%8.3f\n”, hand->palm.position.x, hand->palm.position.y, hand->palm.position.z);
glutWireOctahedron();
glPopMatrix();
//Distal ends of bones for each digit
for(int f = 0; f < 5; f++){
LEAP_DIGIT finger = hand->digits[f];
for(int b = 0; b < 4; b++){
LEAP_BONE bone = finger.bones[b];
glPushMatrix();
glTranslatef(bone.next_joint.x, bone.next_joint.y, bone.next_joint.z);
//printf added
printf(“f[%d]_b[%d]:x=%8.3f, y=%8.3f, z=%8.3f\n”, f, b, bone.next_joint.x, bone.next_joint.y, bone.next_joint.z);
glutWireOctahedron();
glPopMatrix();
}
}
// End of draw hand
}
glFlush();
glPopMatrix();
}
以上の3次元座標の標準出力の修正を加えたうえで、再度Visual Studio上でbuildを実行してください。
修正後のGLUTSample.exeの実行結果を以下に示します。標準出力に各3次元座標が出力されているのが確認できます。
CSV出力に関しては、今回説明を省略しましたが、ファイルオープン・クローズに関する記述を追加し、printf関数をfprintf関数に差し替えれば、問題なくできるはずです。
以上、「LMC(およびSIR170)を用いて手の関節の3次元座標を標準出力する」手順をご説明しました。
今回のように、LMCおよびSIR170のSDKを用いて何か処理を行いたい場合は、まずはSDK付属のサンプルプログラムを動かし、そのソースコードを読んで処理手順を把握した上で、ドキュメントを読んでいろいろと工夫されるのがお勧めの方法です。