windows10 64bit/unity2017.03でNovint Falcon使おうとしたら躓いた話

〇はじめに

昔遊ばせてもらったmikumiku握手(参考リンク)を昨今のVRブームで思い出したので自分でも作ってみました.

mikumiku握手で検索するとヒットする情報を参考に,機材を買いそろえたまではいいものの,肝心のNovint falconの導入で躓いたので忘備録を作成するものです。

〇Novint Falconとは

2007年にNovint Technologyから販売開始されております,Hapticデバイスです.
立体操作が可能な3Dマウスとしての特徴と,ロボットアーム的な自力で動く機能を持っており,手触りや手応えをそれとなく感じることができます.
日本ではamazonで\77,000ぐらいで買えます.
Amazonリンク
なお,詳しい経緯は知りませんが,Novint Technology自体は現在稼働していないらしく(倒産?)公式サイトにも「We’ll be back soon!」とだけ表示されております。
http://www.novint.com/

〇躓いたポイント(2点)

1.windows10 64bit環境は,Novint Falconのデフォルトドライバが動作しない.

会社が死んでいる関係で当然公式から最新のドライバを入手することもできません.これについては,下記のサイトでwindows10 64bit向けのドライバを入手できます.
Force Dimension(会員登録要)

導入方法については,CAI3Dのドキュメンテーションの中にありました.
CAI3D > Documentation > Introduction > Installation > Novint Technologiesにはこうあります.

・Uninstall all software provided by Novint. Carefully follow all instructions that may be displayed on the screen during uninstallation.

・Download and install the Force Dimension drivers for your Windows architecture (32- or 64-bit) from the Force Dimension website.

・Restart your computer.

・Connect your Falcon haptic device.
要約
  1. Novint製のソフトウェア(ドライバと本体付属CDにある体験ソフト類のことと思われる)をアンインストールする.
  2. ForceDimensionからドライバDLしてインストールする.
  3. パソコンを再起動する.
  4. falconをパソコンに繋ぐ.

解説テキスト類には特に断りがありませんが,windows10にfalconを接続すると,インストールメディア読み込まなくても勝手にNovint製のドライバが入る模様なので,Force Dimension導入前にうっかりPCに接続してしまったら,アンインストール要です.

導入確認方法ですが,公式の体験ソフト内にあるチュートリアルで動作確認をすることはできません.
CHAI3DをDLし,examplesから適当なフォルダを選んでビジュアルスタジオで64bit向けビルドをするのが一番手っ取り早いかと思います.

2.falconとunityの連携に関する記事は全て公式ドライバ準拠で書かれている
falcon unityで検索すると上位に出てくるのはFalcon Wrapperを使う方法(unity pro専用)と,FalconServerを使う方法がヒットします.
どちらも公式ドライバを使用する方法なので利用できません.

そこでForce Dimension(会員登録要)にあるSDKを,unityのネイティブプラグインとして活用します.
下図のようにAssets/Pluginsに以下のファイルを入れて、SDK添付のドキュメントに従って実装すればOK
・dhd64.dll
・dhdc.h
・dhdms64.lib





falconの動作をunityで拾うだけのサンプルコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
unsafe public class falconDllTest : MonoBehaviour {
    [DllImport ("dhd64.dll")] private static extern int dhdOpen ();
    [DllImport ("dhd64.dll")] private static extern int dhdGetPosition (double *px,double *py,double *pz,sbyte ID=-1);
    [DllImport ("dhd64.dll")] private static extern int dhdClose ();
    double px,py,pz;
    void Start () {
        if (dhdOpen () < 0) {
            Debug.LogWarning ("error:cannot open device");
        }
    }
    void OnApplicationQuit(){
        Application.CancelQuit ();
        dhdClose ();
        Debug.LogWarning("exit");
        Application.Quit ();
    }
    // Update is called once per frame
    void Update () {
        fixed(double* ppx=&px,ppy=&py,ppz=&pz) {
            dhdGetPosition (ppx, ppy, ppz);
        }
        Debug.LogWarning ("x" + (px*100).ToString());
        Debug.LogWarning ("y" + (py*100).ToString());
        Debug.LogWarning ("z" + (pz*100).ToString());

    }
}
xが奥行方向,yが左右方向,zが上下方向



SDK内にはdhdのほかにdrdというライブラリもあり,デバイス自体を機械的に動作させるにはdrdが必要なような印象を当初受けたが,drdは精密な位置動作をするときに使うライブラリらしく,大体どっちの方向に動かすぐらいの操作の場合,dhdSetForceで力を加えるだけでOK.