UnlimitedHand+Unity動作で焦る所の解説

おはようございます．
既に12/08ですが，まだサンフランシスコ時間では12/07なはずです．
すいません．

hoimeiと申します．長く大学に所属していますが，サークルには入れていません．
ある方がAdvent Calendarに誘ってくださいました．本当にありがとうございます．
大人の都合により過激なことは記載できないので，できるだけ真面目にいってみます．

先日UnlimitedHand関連のハッカソンに参加しました．
![ハッカソンの様子](https://qiita-image-store.s3.amazonaws.com/0/401/3ca54c45-bbdb-0a3f-3aae-8a6fe3020bc4.jpeg)
ハッカソンの様子(イメージです)

今回は，そこで得られた経験のうち，参加者が焦ったポイント3つとその解決策を紹介したいと思います．

### UnlimitedHandとは？
UnlimitedHandは，今流行り始めたVRやAR用のコントローラです．
腕の位置と手の動きを検出しながら，電気刺激でユーザの手を動かして，
触覚のうちの深部感覚を伝えるというデバイスです．
[![https://www.youtube.com/embed/dTpOG4ZYrXU](https://qiita-image-store.s3.amazonaws.com/0/401/b94a75af-5cfd-fe5c-4db7-b2f5e44f1761.png)](https://www.youtube.com/embed/dTpOG4ZYrXU)

公式ページ
http://unlimitedhand.com/ja/

公式開発サイト(日本語)
http://dev.unlimitedhand.com/ja/

### 動作で焦る点3つ
ハッカソンに参加してみると，焦る点が下記の通り3つありました．
　**1. 色々な保護フィルムを剥がし忘れる**
　**2. プログラムをアップデートし忘れる**
　**3. Quaternionが怖い**
以上の点をクリアすると比較的使い易いです．
上記の焦ポイントと解決策を，詳しく記載していきます．
なんか朝日が綺麗だな．




### 焦ポイント 1. 色々な保護シートを剥がし忘れる
まず，UnlimitedHand本体を手に入れてセットアップするときに，
焦って保護シートを剥がし忘れます．

**保護フィルムを剥がし忘れると，
電気刺激のためのゲルが保管シートについたり，腕にくっついたりします．**
微笑ましい光景です．


保管シートから保護フィルムを剥がす様子．
![保管シートから保護フィルムを剥がす様子](https://qiita-image-store.s3.amazonaws.com/0/401/fadb72db-f84a-05e9-539a-56ffff079cab.jpeg)
そういえば，知り合いにリモコンの保護フィルム剥がさずにいる方がいるのですが，
ほんとうにムズムズします．

この保護フィルムですが，本体側にも付いています．
焦りは禁物です．公式動画を置いておきますが，心なしか公式の人も焦りながら剥がしていますね．
[![https://www.youtube.com/watch?v=4lN4xakCsx8](https://qiita-image-store.s3.amazonaws.com/0/401/fabd295e-243c-f3f1-9248-9d1c4e89f964.png)](https://www.youtube.com/watch?v=4lN4xakCsx8)

あとは公式ページの通りにゲルを貼り付けてUnlimitedHand本体のセットアップできました．

公式ページの本体のセットアップ
http://dev.unlimitedhand.com/ja/introduction/index_intro.html





### 焦ポイント 2. プログラムをアップデートし忘れる
さっそくUnlimitedHandとUnityを接続しよう！と思うのですが，
そのまま接続すると手痛い目にあいます．
というのは，**初期状態のUnlimitedHandは，深部感覚を伝達する電気刺激がMAXに設定されています．**
![150415022548_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/401/2a040706-9337-c9f3-7afd-b5fcb444d1f2.jpeg)

つまり，UnlimitedHand本体を初期状態で使用すると，電気刺激で思いっきり手を引っ張られます．安全性は保証されているとはいえ，本当に手痛い目にあいます．

恐ろしいです．初期状態の開発者のしたり顔が想像できます．
ハッカソン会場で，アップデートし忘れた参加者が数人いましたが，これは本当に．．．


#### 解決策① Arduinoでアップデートする
UnlimitedHandをUnityと接続するプログラム(Serial*Unity*)をアップデートする方法は公式ページに掲載されています．
(公式)ArduinoのUnlimitedHand用ライブラリのインストール方法
http://dev.unlimitedhand.com/ja/introduction/instLib4Arduino.html
(公式)ArduinoのプログラムをUnlimitedHandにアップデートする方法
http://dev.unlimitedhand.com/ja/introduction/sketch.html

#### 解決策② 専用アプリでアップデートする
ただ，Arduinoを使ってプログラムをアップデートするのは面倒なので，
私は専用のアップローダ UHUpdater を使うのをお勧めします．便利．
プログラムは"Serial*Unity*"的なものを選ぶといいです．

(公式)UHUpdaterの使い方
http://dev.unlimitedhand.com/ja/Updater.html






### 焦ポイント 3. Quaternionが怖い
ここでやっとUnlimitedHandとUnityを接続します．
普通につなげますが，早速腕の位置を取得しようとすると，Euler Angles と Quaternionが選べます．
Euler Anglesで腕の位置を取得しようとすると，ジンバルロックという数学的な破綻がおきます．
具体的には，Euler Anglesだと操作するUnityオブジェクトが変な所で反転します．

そんなときにはQuaternionを使うといいです．
Quaternionは4次元だし，なんとなく怖いという理由で嫌厭されがちですが，
**腕の動きとUnityオブジェクトの動きを同期させるなら，断然Quaternionです．**

#### Quaternionの使い方①
まず，公式ページに従って，つなげたいプロジェクトの設定や
プロジェクト内にUnlimitedHandのオブジェクトを作ります．

(公式)UnlimitedHandとUnityの接続方法_プロジェクト設定
http://dev.unlimitedhand.com/ja/unity/serial_com.html
(公式)UnlimitedHandとUnityの接続方法_UnlimitedHandオブジェクト設定
http://dev.unlimitedhand.com/ja/unity/makeUH.html

#### Quaternionの使い方②
次に，UnlimitedHandと同期させたいUnityオブジェクトのコードに
以下のような記述を書きます．

```csharp:hogeBehaviour.cs
using UnityEngine;
using System.Collections;

public class hogeBehaviour : MonoBehaviour{
  //UnlimitedHandインスタンスの作成. 
  //Inspector画面でUnlimitedHandオブジェクトをuhandにドラッグアンドドロップしておく
  public UH uhand; 
  
  void Start(){
  }

  void Update(){
     //UnlimitedHandオブジェクトのQuaternionを，UnityオブジェクトのQuaternionに代入
     //ただし，Quaternionの順番や+-が，Unityオブジェクトのモデルによって異なるので，
     //配列番号や+-を書き換えたりしながら調整しないといけない
     transform.rotation = new Quaternion(uhand.UHQUaternion[0],
                                         uhand.UHQUaternion[1],
                                         uhand.UHQUaternion[2],
                                         uhand.UHQUaternion[3]);
  }

}
```

こんな感じで，Quaternion全然簡単．怖くない．

ちなみに，Unityオブジェクトの回転場所(原点)がズレていると，また動作がおかしくなるので注意です．手のUnityオブジェクトを使う場合は，肘の位置に回転場所(原点)を置くといいです．
回転場所(原点)を指定する方法は，いろいろあると思いますが，
下記のサイトの説明がとても親切でした．本当に素晴らしいです．
http://portaltan.hatenablog.com/entry/2016/04/15/134129

### まとめ
UnlimitedHandとUnityを接続するときに，焦るポイント3つとその解決策を紹介しました．
というか，ハードウェアからソフトウェアまでハッキングするときって，それ自体で焦ると思いますが，皆様の幸せなハッキング人生をお祈りいたします．
![IMARIB20160807065718_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/401/de1b63e2-7a05-e598-0966-b08702901bc6.jpeg)


ちなみにハッカソンでは四つん這いになってお腹にUnlimitedHandを装着して
乳牛体験(乳牛として腹にある擬乳を絞られる方)できるアプリを提案したチームが優勝していました．