【Vive Pro Eye】視線追跡をより正確にするTobii提供のSDKを使って開発【G2OM】
前回から日が開きましたが、皆さん開発は順調でしょうか('ω')
今回は、以前の記事で「次はTobiiのSDKかな」みたいなこと言っておきながら放置してた内容をまとめていきます。
ぶっちゃけ、内容としては前回までのSRanipal_SDKがあれば、そんなに必要なものでもないかなという印象です。
でも精度は向上すると思いますし、開発もこっちの方がやりやすいような気がしてたりしてなかったり…(´・ω・)
(Viveのプログラムもどーせ内部ではTobiiのプログラムを使ってる気がしますし)
TobiiのSDKは何が違うのか
使われる方はTobiiのDeveloverとしてアカウント登録をしましょう。
特に何があるわけでもなく、簡単に手続き終わります(*'ω'*)
ViveのSDKと違う点の1つとして…説明が細かく、丁寧で、優しい!
画像や映像をたくさん使って説明してくれてました|д゚)
今回は簡単に、特徴やできることをまとめていきます。
英語が読める人や、グーグル先生がついてる人は、公式を見た方が絶対分かりやすいです( ˘•ω•˘ )やはりサンプル映像は神
TobiiSDKの最大の売り、G2OM
この部分に魅力を感じなければ、前回までのSRanipal_SDKで十分です('ω')
自分も、こうやってメモ代わりに書いてますが、開発要件を考慮したうえで使ってません(理由は後程)
【追記】GazeModifier(後述)は有能かもしれない
ほとんどの場合(消費者の嗜好調査とか)には有益なSDKだと思いますよ。
さて、Tobii G2OMとはなんなのか
説明を要約すると
「人が何を見ているかは、両目からの光線の交点で判別していました。しかし、骨格やヘッドセットの形、装着のキツさなどの要因に左右されてしまいます。色々制約を設定すれば、精度が上がるでしょうが、設定に知識と経験が必要とされるうえ、難しい。」
「そこで、機械学習を用いた補正プログラムを用意しました。」
ということで、何百万のデータで学習済みの補正がかかるようになります。
公式のページの映像にあるように、実際の視線の衝突判定が広くなっています。
コライダだけを変えるよりも、楽で軽く、対象物の切り替えもスムーズ…だそう(・o・)
実際、見られている物体がより正確に取れるという点では導入するべきでしょう。
自分は
・コライダの判定を自分で操作出来た方が設計していくうえで便利
・どの物体かではなく、物体上のどこを見ているかが取りたい
ので導入は見送りです(´・ω・)
まぁ、2つ目に関しては、if文で見ている&&物体上の点とすればいい気もしますが。
※注意 : SRanipal_SDKより後期の、Unity2018.2.5f1以降のサポートになっていますので気を付けて(1敗)(2018.1.5fでも動いた)
TobiiのSDKで出来ること
・視線が向けられているオブジェクトの取得
・視線の起点及び方向ベクトル
・2次元の眼球運動の取得
・3次元の眼球運動の取得
・両目の瞼の開閉具合の取得
・眼の動きから表情の取得
(その他:UIの開発、見ているものを手に取るなど)
【追記】
・GazeModifier
使い方はほんと、すべて公式がセットアップから、C#スプリントの書き方まで例と図を多用で書いてくれているので、ぜひそっちを参照してくださいな(/・ω・)/
【Vive Pro Eye】視線を投げかけたオブジェクトの情報を取得する【Unity】
開発仲間の皆様、お元気でしょうか('ω')
今回は『ザ・開発』って感じの、
使い道が多そうな内容になります。
内容としては、使用者がViveProEyeを通してVR空間の、
・何を見ているか(注視点)
・物体(オブジェクト)のどこら辺を見ているか
・視線の先のオブジェクトの位置情報・座標データ
を出力してもらいます。
つまりは、「視線の先にどんな物体があるか」という情報を取ってみます(゚∀゚)
そして前回未実装となっていた焦点距離も取得できている…かな?
またまた、以前に作成したスクリプトに追記していきます。
目線の先の物体の情報を取得する、Focus()
Unityにはオブジェクトから、指定した方向にベクトルを伸ばす
『ray(光線)』という機能があります。
みんなのバイブル(?)でも、アバターを爆発四散させるのに使われていましたね(゚∀゚)アヒャ
UnityによるVRアプリケーション開発 ―作りながら学ぶバーチャルリアリティ入門
- 作者: Jonathan Linowes,高橋憲一,安藤幸央,江川崇,あんどうやすし
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/08/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
この光線を、視線として使っているわけですね(。-`ω-)
取得できる情報は、光線の起点と方向ベクトル ※それぞれVector3
そして何よりも、光線が衝突したオブジェクトの情報です。
【使い方】
①SRanipal_Eye.Focus(GazeIndex.COMBINE, out ray, out focusInfo, radius, maxradius)
②SRanipal_Eye.Focus(GazeIndex.COMBINE, out ray, out focusInfo, maxradius)
③SRanipal_Eye.Focus(GazeIndex.COMBINE, out ray, out focusInfo)
※前もってRay ray、FocusInfo focusInfo、float radius, maxradiusを定義
③が一番簡略な形で、光線の起点と方向ベクトル、見たオブジェクトの情報が出力されます。
②の形では、その光線の長さを決めることが出来ます。
①の形では、それに加えて【視線の半径?】を決められます。②と何が違うんでしょう( ˘•ω•˘ )
見たオブジェクトの情報としてはstruct型で出力されまして
焦点位置、距離、コライダ情報、Rigidbody、Transform....
この距離(distance)っていうのが、float型なので輻輳距離に当たる説ないですかね…?(;´・ω・)
今度問い合わせてみようかと思います。
追記しました
目から光線を出す、GetGazeRay()
Focus()は光線を飛ばして、出力としてそのRayの情報と、衝突した物体の情報を返してくれました。
しかし、
物体の詳細な情報は要らない。視線だけ追えればいい。衝突位置はrayだけでも取れるし。
という人はこっちを使いましょう('ω')
【使い方】
①SRanipal_Eye.GetGazeRay(GazeIndex.Left, out origin, out direction)
②SRanipal_Eye.GetGazeRay(GazeIndex.Left, out ray)
※Vector3 origin,direction, Ray ray
個人的な意見ですが、頭部動揺にデモは影響されないのに、単体で使うとかなり影響される。。。
どっかで別に補正されてるのかな( ˘•ω•˘ )
解決しました。
デモのGazeSampleでは、ローカル座標からワールドの座標へ変換が行われていました(*'ω'*)
2019/08/25追記
以前、数値で取り出すときは右手座標であるとドキュメントにありましたが、こちらの関数で出力される方向ベクトルVector3はUnityと同様の左手っぽい( ˘•ω•˘ )
2020/04/03追記
・接続されてないと、原点が光線の起点、方向はz軸方向になります。
・接続されてるけど視線が取れてない時は、カメラ座標が起点,方向はカメラの正面方向になります。
・視線が取れていればカメラが起点、方向は視線の方向になります。
以下おまけ
眼の開き具合を数値化して出力、GetEyeOpenness()
以前floatで取れてたじゃん…
【使い方】
SRanipal_Eye.GetEyeOpenness(EyeIndex.LEFT, out openness)
※float openness
0~1で完全に見開いた時が1
瞳の位置を取得する、GetPupilPosition()
これも以前の関数じゃなく前回取れてたじゃん…?
【使い方】
SRanipal_Eye.GetPupilPosition(EyeIndex.LEFT,out position)
※Vector2 position
評価方法は以前紹介済み
どうぞよしなに
【ViveProEye】Unity用SDKで眼球運動の情報を数値で取りだす方法【C#】
はい、前回の記事の続きです。
ViveのYouTube Liveがありまして、SDKの情報もあるということで、
こちらを拝見させていただきました。
そして前回のgaze_direction_normalizedのベクトルの件を、質問で拾っていただけましたので、回答を待ちたいと思います(。-`ω-)
さて、前回の残りは4つ
・目の開き具合 済
・視線の方向ベクトル 済
・視線の起点座標
・瞳孔径
・瞳孔の位置座標
・輻輳距離
…ということで視線の起点の座標データからいきましょう(*'ω'*)
視線の起点の座標、gaze_origin_mm
これは開発者フォーラムを見ても、はっきりとした回答が分からないので、自分の予想込みの情報になります。
Cornea(角膜)が瞳孔を覆っているのが分かりますね。
この盛り上がっている部分の中心を、視線の起点の座標としている…らしい(フォーラム眺めた感じ)
Gaze Origin(Center of Cornea Sphere)って書いてあるし…( ˘•ω•˘ )
【使い方】
Vector3 ume = eyeData.verbose_data.left.gaze_origin_mm;
これもなぜかSystemOriginが原点座標になってる…ぽい?※フォーラムの画像参照
公式のドキュメントに【単位はメートルマイル】
絶対ミリメートルだと思うんですけどHTCさん…( ˘•ω•˘ )?
【2019/09/03追記】
公式曰く、誤表記で、ミリメートルということです。
あと、これも右手座標系なので気を付けてください。
瞳孔径を計測、pupil_diameter_mm
瞳孔径を取ってグラフ化・ビジュアル化してるこの個人開発者さんの動画がすごいので、見てみることをお勧めします。
ちゃんと明るいときと、暗いときで大きさが変わってるんですね(*'ω'*)
【使い方】
float ume = eyeData.verbose_data.left.pupil_diameter_mm;
直径で出力されます
公式は、これも単位がメートルマイルって書いてますけど…ミリメートルよね?
瞳孔の位置座標、pupil_position_in_sensor_area
視線の起点とは違い、こちらは2次元の座標です。
使い道が思い浮かびませんが…うーん('ω')
Vtuberさんの眼の動きとか、もしかしてこっちの変数なのかしら?
【使い方】
Vector2 ume = eyedata.verbose_data.left.pupil_position_in_sensor_area;
x,yがそれぞれ正規化されて、0~1の値で出力されます。
輻輳距離(未実装?)、convergence_distance_mm
簡単に言えば見ている物体までの距離を測れる・・・はずなのですが
他の開発者さんが疑問に思っている通り、まだ中身は未実装らしいです。
一応、箱だけあるので置いておきますね。
【使い方】
float ume = eyeData.verbose_data.combined.convergence_distance_mm;
未実装
これが、左目・右目・両目に適用した結果のまとめです。参考までに。
両目で瞳孔の位置などは、形としては取れるけど数値は0みたいな箇所もあったり。
追記2020/04/03
ソースコードをアップロードしました。
開発仲間0人状態ですので何卒Twitterもよろしくお願いします( ;∀;)
どうぞ良しなに
【Vive Pro Eye】Unity用SDKから瞳孔や視線の情報を取得する【C#】
どうも、お盆とは無縁に研究活動が存在する院生です(。-`ω-)
やっとSRanipal_SDKと開発者フォーラムの情報が、少しずつ理解できてきました。
そしてhtc従業員さんの回答が、的外れなことが多いなとも感じてます←
今回はUnityのSRanipal_Eye.csから取り出せる情報を整理していきましょう。
前回までと違って情報量多めです(解読がはかどったので)
これを見ればわかるように、Vive Pro Eyeの視線追跡で取得できるデータはかなり多いのですが、
今回は、C#の関数(メソッド)として用意されていたものから
・目の開き具合
・視線の方向ベクトル
・視線の起点座標
・瞳孔径
・瞳孔の位置座標
・輻輳距離
の数値を計測できるようにしていこうと思います('ω')
SDK内のドキュメントにも、解説は載っていましたが、
実際に数値を見てみると「なんか想像と違う」といった違和感があったので、それも合わせて、お知らせしようと思います。開発時の参考にしてください(解決したら教えてもらえると助かります)
今回はフォーラムで、「初心者は使ってみて」と載っていたコードに、
さらに多くの種類のデータを取れるように関数を追加して、まとめました。
まずは準備
前回作成したUmeEye.csを改良して、使っていきます。
今回も3つのnamespaceの中で関数を打っていきます。
使わない人はViveSR.anipal.Eye. + 今回紹介する関数で動くと思います。
今回namespace以外は要らないので
19行目及び31,32行目は消しちゃってください(゚∀゚)アヒャ
そして、SDKにあるSRanipal_Eye.csで取得されている、目のデータを取り込むために、次の4行を追加しましょう。
眼の開き具合を数値化、eye_openness
前々回、デモを動かしたときにアバターで、ウインクや半目が再現できましたよね('ω')
このように、目を開いているかどうかも判定できるわけですね。
ViveProEyeでは0~1の範囲で、正規化された数値が計測ができるようになっていました。
【使い方】
float ume = eyeData.verbose_data.left.eye_openness;
みたいな感じです。右目であればはleftをrightに変えるだけ(*'ω'*)
(両目も使えたけど、なぜか動作しませんでした)
視線の方向ベクトル、gaze_direction_normalized
さて、本題とも言っていい『視線』追跡ですね|д゚)
※これは公式のドキュメントではなく、個人的な感想です。
左右それぞれ及び、両目から関数を呼び出せるのですが、それぞれの眼からの視線ではないようです。
何を言っているか分かりにくいかもしれませんが、
「右目の視線=右目を始点とした方向ベクトルではない」っぽい
フォーラムの画像をつかって説明しますと、この関数に右目、左目、両目と適用すると、それぞれから推定されるSystemOriginからの方向ベクトルっぽいんですよね(;´・ω・)
つまり左目右目両目ともに多少違うけど、ほぼ同じ値が出るわけです。
片目の課題をやる以外であれば両目でセッティングしておけばいいと思います( ˘•ω•˘ )
【2019/10/26追記】
この自分の解釈があっているか未だに分かりませんが、同じように疑問に思った方がフォーラムにスレッドを作ってました。
回答がどういったものになるのか、気になるところです。
【使い方】
Vector3 ume = eyeData.verbose_data.left.gaze_direction_normalized;
(x,y,z)で各パラメータが-1~1で出てきます。
それと、この関数は右手座標系なのでx方向が正負逆になります。注意しましょう。
もう1500字超えて、見にくくなってしまいそうなので、次のページ行きます( ˘•ω•˘ )
【ViveProEye】SRanipal_Eyeから目の位置の生データを取り出そう【公式SDK】
前回の記事では、公式SDKで視線追跡を実際に動作させることが出来ました。
さて、しかしこれはスタートラインに立っただけで、この後どうすればいいかの情報が、とても少なく、訳分からないわけでして( ˘•ω•˘ )
そもそも眼の動きをトラッキングして…どういう形で記録できるんですかね…?
と、いうことで
今回はそれぞれの眼の、位置情報を取り出すことを試みます('ω')
まずは情報を整理
Vive SRanipal SDK 公式フォーラムを見てみると
既に同じように【眼球の位置情報】を取得したい質問者が…|д゚)
しかも、大体の目星をつけてる!すっごーい!C#が得意なフレンズなんだね!
htcの人が解答してくれていますが、以前の似た解答のリンクのページ・・・なぜか削除されてる!!( ;∀;)
とりあえず、ここに載ってた関数を使ってみましょう!
眼の位置情報を取るGetPupilPosition()
使う関数はEye.SRanipal_Eyeスクリプト、423行目の関数GetPupilPositionです。
関数名が『得る・瞳・位置』ってことでなんかそれっぽい(゚∀゚)
中身を見てみると、引数としてeye、positionを入力すると2次元の数値が得られる様子。
説明を見ると、
・出力される二次元座標はx,yそれぞれ、-1 ~ +1の変域
・原点(0,0)は正面を向いている状態
・(-1,-1)が左下を向いていて、(1,1)が右上を向いている状態
…らしい(。-`ω-)
スクリプトとしては、
アイトラッキングがONかを確認
⇒どっちの眼を引数に入れたかを確認
⇒指定の眼のデータを変数positionに第二引数として出力
フォーラムの人は「頑張っても-0.5~0.5の範囲になっちゃうんだけど!?」
とか書いてますね(*'ω'*)シゴトハヤイ
取得できる目の座標データとやらを確認してみる
ではでは、この関数を実際に使ってみますか…(・o・)
新しいスクリプトを作って…(今回はUmeEye.csとしました)
⇓
他のスクリプトと同じようにnamespaceでくくって…
⇓
出力用のVector2を定義して…
⇓
関数GetPupilPositionを使用! ※面倒だから左目だけ(゚∀゚)
そして確認できるようにログを設定!
完成!(*'ω'*)
そして実行!
イエーイ!(∩´∀`)∩
これでまた一つ取れるデータが増えました!
あとは何が取れれば便利だろうか…(。-`ω-)
ってことで、まだまだ続きます。どうぞよしなに。
【Vive Pro Eye】Unityで視線追跡を公式SDKを使って実行してみる。
さあ、まだまだ開発頑張っていきましょう(/・ω・)/オー!
前回はViveProEyeの接続とSteam・Viveportのセットアップ、
視線追跡を行うためのVive公式のSDKをインストールするところまで行いました。umehashi.hatenablog.com
今回はインストールしたSDKをUnityに実際に入れて、サンプルシーンで視線追跡を体験してみましょう!(=゚ω゚)ノ
やっとUnity…に取り掛かる前に
前回の下準備の続きがあったりします(。-`ω-)zzz
①steamVRの設定
SteamVRを立ち上げまして『設定』を開き、VIVEPORTとカメラONにしておきましょう。自分はOculusからの転校生なので、念のためvive仕様として変更したのですが、必須ではないかもしれません。。。。
②視線追跡の許可とキャリブレーション(調整)
まずは前回の最後でインストールした、SR_Runtimeを実行します。視線追跡が可能になります。タスクバーで起動できているか確認しましょう。
次に、ヘッドマウントをつけ、コントローラの一番手前のボタンを押して、steamホームを開きます。下の方にViveProという選択肢があるので選択。
初回は視線追跡に同意を求められますのでOKを選択(写真撮り忘れたので説明書の7ページ見てください)次回以降はこのようにキャリブレーションを行うとなりますので、起動時やプレイヤー交代時には行うようにしましょう。
私はここで「精度すげえ!」と感動したので、ぜひこのタイミングで実行して、ぜひ共感してください('ω')
さて、UnityにSDKを入れるにあたって、前回インストールしたファイルの中身を見てみましょう。
取り扱い説明書的な…? なお、やっぱり英語(;´・ω・)
中を読んだ感じ、注意するべきポイントはこのあたりかなと思います。
・Windows 8.1 or later (64-bit)
・Unity 2017.4.17 or later
そういえば最近、Unityのバージョンが、1週間ごとに更新されてる気がするんですけど、なんなんでしょうね…?(´・ω・)
(それよりBlenderが使いやすくなったと聞いてそっちも気になる)
ちなみに私は、自分が勝手に信頼を寄せているバージョン2018.1.5fを使っています(*'ω'*)
準備完了!新規プロジェクトいきまーす!
長い準備も終わり、いざUnityへ(゚∀゚)
Unityで新規プロジェクトを3Dで作って…
Edit>Project Setting>Player と進んでXR SettingをONにしておきましょう。
そしたら遂に!
Assets>Import Package>Costom Packageで、SRanipal_SDK_1.0.1.0_Eye内のunitypackageをインポートしましょう。
Assetsに『ViveSR』フォルダができていれば成功です。 そしてViveSRの中のScenesの中のEyeSampleを開きます。
そして実行すると…
なんだこのおっさん!?
これ…鏡になっていますので、私です(; ・`д・´)
眼が常に自分の動かした通りに動きます…科学の力ってスゲー
黒目が動くのはもちろん、半目やウインクも、綺麗に反映されてました。
これはVtuberさんが取り入れるに違いない(゚∀゚)(リップトラッキングも出来るし)
左右と後方には、1m・3m・5m離れた的があり、見ている箇所が光ることが確認できました。
と、いうことで公式のデモを動かすことには、とりあえず成功しました(´・ω・)
計測された視線はどんなデータなのか…2次元?3次元?
ここからは、プログラムの中身を覗かないと分からない領域に突入しちゃいますね( ˘•ω•˘ )
【追記】
この先のチュートリアルもどきを作ってみました。
次回は視線追跡技術として採用されている、Tobii社が提供しているSDKを試した記事となります。
…開発者の方がいらっしゃいましたら、情報共有させていただければ幸いです。
【Vive Pro Eye】とりあえず公式SDKを入手する。
今回はUnityで開発を行うための下準備段階のお話です。
ちなみにViveの本体の接続は、本体に同封されていたデカい紙の取説通りで問題なくできます。
UnityのSDKのインストール…の前に
Eyeとか関係なくViveに必要みたいなので、本体のコード繋げたりする間に、SteamVRとVivePortをインストールしました('ω')
・・・
センサの配線完了!インストール完了!取説書通りViveProSetup起動!
…ここで配線の詳しい方法を、日本語で教えてくれてたー!(; ・`д・´)ガーン
しかもインストールも、ここからできたんじゃん…
最初からViveProSettingを起動しておけばよかった。。。
と、とりあえず…Vive Pro Eyeをパソコンに繋いで動作するまでは出来ました( ˘•ω•˘ )
UnityでViveProEyeで視線追跡するためのSDKインストール
今回はViveのDeveloper向けの、公式が配布しているSDKを使わせていただきます。
まずは開発者としてViveにDeveloper登録しましょう。
steamやgoogleアカウントで登録できるの便利でいいですねぇ(。-`ω-)
そしてこちらのページから2つインストールするものがある様子
(2019/08/03追記:1.0.1.0のSRanipalInstallerがなくなってる…?)
https://hub.vive.com/en-US/profile/material-download
良く分からなかったんで、とりあえず最新版使っとけばいいか(;´・ω・)
ってことで僕は
・VIVE_SRanipalInstaller_1.0.3.0.msi
・SRanipal_SDK_1.0.1.0_Eye.zip
の2つをインストールしました。
LipトラッキングはVtuberやVChatで使うんですかね...?
インストーラーを起動して更にインストール
ではインストールした2つのファイルは何だったのか見ていきましょう。
VIVE_SRanipalInstaller_1.0.3.0.msi を起動してみると
Next連打していくとインストール終わり!
デスクトップにロボットのアイコンが出ましたか?
これが視線追跡を動作させるプログラム君です。
起動しているときは目が光ります(*'ω'*)
予想外に長くなったので、
2つ目のファイルと、デモを動かすは次の記事で(; ・`д・´)
以下のサイトで、ViveProEyeのSDKの紹介がされていましたので、
こちらも見てみることをお勧めします(英語だけど映像見ればなんとなくわかる)