Goal
手の状態(開く・閉じる)をそれなりの制度で取得する。
Reference
いつもの公式
UnlimitedHand リファレンス (Unity用)
デバイスについておさらい
そもそも、UnlimitedHandって何をしているの?というところ。
手の状態を取得するのは、シートについている8つのフォトリフレクタというセンサーです。
HWの構造に説明が載っていますが、このセンサーによって筋肉の動きがわかるらしいです。
ただし、ここで取得される値が厄介で、同じ人でやっても手の状態とセンサ値がきれいに一致して取れないです。まして違う人になれば倍くらい値がずれることもありました。
そんなわけで、ただ閾値を決めて手を開いている、閉じているということはわかりません。
手の開閉状態を取得する
Falconerでは手の開閉で鷹がつついてきます。
ここではどのように手の開閉を検知しているのか参考に、いろいろいじってみました。
public class HandPhysicsControllerInput : MonoBehaviour{
public UH uhand;
[HideInInspector]
public int[] uPRSum = new int[8]; //Sum of the Sensors' Values
[HideInInspector]
public int count; //Count Number to calculate the Averages of the Sensor's Values
[HideInInspector]
public int[] uPRAve = new int[8]; //Averages of the Sensor's Values
public int FIRE_THRESHOLD_OPEN = 30; //Fire Threshold which compares with "PRVARSum"
public int FIRE_THRESHOLD_CLOSE = -30; //Fire Threshold which compares with "PRVARSum"
public int PRVARSum; //Finger Movement SUM
bool isHandOpen = true;
void Update () {
count++;
for (int i = 0; i < 8; i++)
{
uPRSum[i] += uhand.UHPR[i];
uPRAve[i] = uPRSum[i] / count;
}
if (30 < count)
{//reset the count
for (int i = 0; i < 8; i++)
{
uPRSum[i] = uPRAve[i];
}
count = 1;
}
PRVARSum = 0;
PRVARSum += (uhand.UHPR[1] - uPRAve[1]);
PRVARSum += (uhand.UHPR[2] - uPRAve[2]);
PRVARSum += (uhand.UHPR[3] - uPRAve[3]);
if (PRVARSum > FIRE_THRESHOLD_OPEN)
{
// 手を開く処理
}
else if (PRVARSum < FIRE_THRESHOLD_CLOSE)
{
// 手を閉じた処理
}
}
}
Falconerをもとにいじっていたので、その時のいろいろが無駄に書かれていたりする気もするのですが
フォトリフレクタの1,2,3の平均値との差分合計が閾値を超えたら手を開閉したと判断しているみたいです。
閾値に固定値を使うのがいいのかは微妙な気もしますが、自分で動かしてみると大体とれるっぽいです。
おまけ
現在アマゾンでUnlimitedHandが値引きされているみたいです(クリスマス?)
ここにきている人はすでに持っている人ばかりだと思いますが、両手用にいかが?