触れるVRを目指して ~senso glove DK2買ってみた話 その2 導入編~

1.前提条件・機材解説
2.導入 ← イマココ
3.unityでのhaptic実験
4.unityでのハンドトラッキング実験
5.メイン検証

〇事前準備(ハマったところ)

購入直後はsenso gloveのバッテリー残量が0でした.
バッテリー残量はPCと無線通信する以外確認する方法がなく,バッテリー残量が少ない状態だと,正常に接続できないことが多い模様です.
導入工程に入る前にまず充電を

〇ドライバの導入

公式ドキュメントに従って進めていきますが,開発版デバイスということもあってかかなりドキュメントに抜けが多く,かつリンクが失効してたりします.

1.ドライバのダウンロード
公式サイトのdev centerより,Driver for Windows 7 and aboveをダウンロードします.
2018.7.13時点では,Quick Guideのリンクは死んでいます



2.ダウンロードしたzipを解凍
2018.7.13時点では「senso-driver.08.06.2018」というフォルダが生成されるます.

3.BLEアダプタ(付属のUSB無線親局のこと)をPCに接続
CSR8510 A10という機器として認識されます.

4.BLEアダプタのドライバを更新



ここはQuick Guide記載の通り
 a.Zadig.exeを起動
 b.[Option] - [List All Device]を選択
 c.セレクトボックスから「CSR8510 A10」を選択
 d.Replace Driverを選択

5.もう1つのBLEアダプタもドライバ更新
Quick Guideに
"You can insert second BLE adapter from the Senso package into your PC."
とある通り,もう1つのBLEアダプタも接続し,同様の手順でドライバ更新します.

6.実行に必要なソフト群を起動
Quick Guideには
"There is a convenient "start.bat" script to start all the software needed and start working. "
とありますが,senso-driver.08.06.2018にstart.batは同梱されていません.
曖昧な理解ですが,
run_dk2.cmdを実行すればBLEサーバーが2つとsenso UIが2つ起動し,自動でgloveと通信が開始します.
(右手と左手にそれぞれ別のサーバーが必要)

7.キャリブレーション
Gloveを装着した状態で,机の上など平らな面に手を置き,
下の画像のように表示が変わったら,手首を45度ほど持ち上げればキャリブレーション完了です.




8.サンプルプログラムを遊ぶ


Senso Hands DemoをDLすれば,サンプルプログラムが動作します.



肘より先だけが動きます.
中心の円柱に触れると円柱が凹んでいき,触れた部分のモーターが割と雑に振動します.
残念ながらVR対応のサンプルプログラムではないため,視覚で触覚が騙される間隔は体験できません.

9.unity向けのsenso SDKを導入する



Plugin for Unity3D 5.xをダウンロードします.
Unity3D 5.xって書いてありますが,保存された環境はunity 2017.03の模様.
どないやねん.

その下にあるSample Projectもunity向けですが,
viveと併用したハンドトラッキングが必須で実行しようとするとLightning House環境無いよとsteam VRのエラーが出て止められます.
vive欲しい.どこも品切れ

10.Senso pluginを使ってみる.
Senso > Prefabsにある,SensoManagerとRight Hand ContainerをHierarchyに入れます.


Senso Managerの設定はこんな感じ.
sceneを再生すると,Head Position Sourceで設定したオブジェクトの位置にあたりに設定した手が移動します.
Senso HostSensoPortは6.の工程で起動した,Senso UIで確認できます.
Hands > Sizeはデフォルトでは2ですけど,今回は右手だけ動作確認するので1
Hands > Element0 にRight Hand Containerをセットします.



Right Hand Containerはこんな感じ.
どうやら,Senso Hand Exampleをアタッチして,ボーンを指定すれば
sensoを使って任意のオブジェクトを操作できる模様です.自作モデルの手を使いたい場合は
ここら辺を改造するっぽいです.

ここまで設定してsceneを再生すると,手が動きます.手首だけ.
そう,プレハブ自体が手首より先しかなかったので薄々感づいていましたが,
この設定では肘より先のトラッキングではなく,手首より先しか認識しません.
viveさえ手に入れば不要になる努力かもですが,実験のためにはもう少し工夫が必要ぽいです.


続く








触れるVRを目指して ~senso glove DK2買ってみた話 その1 機材解説編~

〇はじめに

以前VR握手会を企画したとき(企画サイト)(開発ログ)にこんな感想を頂きました.
「等身大のキャラクターが目の前に現れてすごくよかった。
(背が低いキャラなので)頭を撫でたいと思った。」

これは,次の企画のネタになるのではと思い試行錯誤を始めました.
形になるかはまだわかりませんが,試行錯誤を記録しようと思います.

ドキュメントの分量的には全5回程度になる予定です。
1.前提条件・機材解説 ← イマココ
2.導入
3.unityでのhaptic実験
4.unityでのハンドトラッキング実験
5.メイン検証

〇目指すゴール

ハンドトラッキングして,キャラクタの髪に触れたときそれっぽいフィードバックを返す体験ソフトの開発

〇筆者の環境

〇今回購入した機材について

senso glove DK2(公式サイト) お値段は$599.00(送料別)
主たる機能は
  • 両手の肘より先のトラッキング
  • HTC viveを持っていれば,steamVR経由で完全なハンドトラッキング可能
    ↑購入後判明.単体で完全なハンドトラッキングができると思っていた.
  • 各指の腹と,手首の甲側にバイブレーションが付いており,リアクションを返せる.
  • バイブレーションの強さは1~10の10段階.長さは1~65535までms単位
  • 振動の途中に強さ0でバイブレーション命令を送ると,上書きして振動を止めれる.




グローブの左右,専用の無線通信用USBが2つ,本体の充電ケーブルが2つ梱包されています.
USB2.0で利用可能です.


公式サイトには記載がありませんが,購入時にメールにてサイズを確認されます.
MサイズとLサイズがある模様.今回購入したのはMサイズ.



↑公式から来たメール.サイズの質問と住所を英語で書いてくれとのこと.



Lサイズはどうせアメリカンなんだろと思い込んでMサイズ買ったけど思ったよりサイズがギリギリ.
わかりにくい写真で恐縮ですが,手の横幅が10cm、長さが20cmぐらい.
長さはもう少し何とかなる気がしますが,横幅がこれより大きい場合Lサイズの方がいいかも.



続く


blender アドオン開発の勉強したログ

0.はじめに

UTAU技術部全然関係ないけど他にログ残すいいところがないのでここに書きます.許して.
成果物になるまでまだだいぶ時間がかかりそうなので,とりあえず技術検証した情報をまとめるものです.

1.ドキュメント

はじめてのBlenderアドオン開発
https://legacy.gitbook.com/book/nutti/introduction-to-add-on-development-in-blender/details
日本語チュートリアルです.
一通り開発方法掲載されています.

Dev:Py/Scripts
https://wiki.blender.org/index.php/Dev:Py/Scripts
サンプルコードがいろいろ見れます.

Blender Documentation Contents
https://docs.blender.org/api/blender_python_api_2_75a_release/
APIリファレンスがあります.

2.作りたい機能

必須機能イメージ:
1.オブジェクトAとオブジェクトBを指定の面で結合する.
2.結合に際してオブジェクトAは位置,向き,サイズを変更せず,オブジェクトBを変更する.
3.接合面の頂点数が異なる場合,オブジェクトA側の接合面を加工し頂点数をあわせる.

できたらつけたい機能イメージ:
1.自動操作の結合状態から,GUIを使ってオブジェクトBの位置,向き,サイズを調整可能にする.
2.オブジェクトA側の頂点数調整時のスムージングをGUIで設定できるようにする.

3.実装イメージ

初期条件:
1.オブジェクトA,オブジェクトBにはそれぞれ[key1]をマテリアルとする面が1つだけある.
2.オブジェクトBが選択状態,オブジェクトAがアクティブである.
3.key1面のサイズ,向き,位置は問わない.

アルゴリズム
1.オブジェクトAの接合面の中心座標と法線ベクトルを求める
2.オブジェクトBの接合面の中心座標と法線ベクトルを求める
3.オブジェクトBの中心座標がオブジェクトAの中心座標と一致するよう,オブジェクトBを移動する.
4.オブジェクトBの法線ベクトルとオブジェクトAの法線ベクトルの逆から,回転角度を求める.
5.オブジェクトBを3D回転する.
6.接合面の各頂点の接合面の中心座標からの角度を求める.
7.(オブジェクトA側の頂点数がオブジェクトB側の頂点数より少ない場合)
 オブジェクトBの頂点角度を基にオブジェクトAのエッジを分割する
8.オブジェクトB側の各頂点に近いオブジェクトA側の頂点座標をオブジェクトB側の頂点座標にあわせる.
9.(オブジェクトAの方が頂点座標が多い場合)残りのオブジェクトAの頂点座標を近傍のオブジェクトBの頂点座標に割り振る
10.同一座標にある頂点を結合する.

4.技術検証結果

現在のモードを取得
bpy.context.object.mode

モードの変更

bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.mode_set(mode='EDIT')

など

現在アクティブなオブジェクト
bpy.context.object

現在選択しているオブジェクトのindexのリストを取得
indexList=
for i in bpy.data.objects:
if i.select:
indexList.append(i)

オブジェクトにマテリアル名key1が含まれるかチェック
if "key1" in bpy.data.objects[index].select:

全ての頂点の選択解除
bpy.ops.mesh.select_all(action='DESELECT')

マテリアルkey1のマテリアルインデックスを取得
bpy.data.materials.keys().find("key1")

マテリアルインデックス0のマテリアルを含む頂点をすべて選択する
bpy.ops.object.material_slot_select(0)

現在アクティブなオブジェクトのうち選択している頂点のインデックスリストを取得
selectVerticesIndex=

for i in range(len(bpy.context.object.vertices)):
if bpy.context.object.vertices[i].select:
selectVerticesIndex.append(i)

頂点インデックス0の頂点のグローバル座標を取得
import bmesh
bm = bmesh.new()
bm.from_mesh(bpy.context.object.data)
list(bm.verts)[0].co.x #X座標
list(bm.verts)[0].co.y #Y座標
list(bm.verts)[0].co.z #Z座標
bm.free()

頂点インデックス0の頂点を(0,1,0)移動
import bmesh
bm = bmesh.new()
bm.from_mesh(bpy.context.object.data)
list(bm.verts)[0].co.x += 0#X座標
list(bm.verts)[0].co.y += 1 #Y座標
list(bm.verts)[0].co.z += 0#Z座標
bm.to_mesh(bpy.context.object.data) #オブジェクトモードじゃないと動かない
bm.free()

アクティブなオブジェクト全体を(0,1,0)移動
bpy.ops.transform.translate(value = (0,1,0))

オブジェクトのjoin
bpy.ops.object.join()

頂点の結合(editモード)
bpy.ops.mesh.merge(type='FIRST')

頂点インデックス0の頂点を選択
import bmesh
bm = bmesh.new()
bm.from_mesh(bpy.context.object.data)
list(bm.verts)[0].select_set(True)
bm.to_mesh(bpy.context.object.data) #オブジェクトモードじゃないと動かない
bm.free()

スマホ向けMMDパノラマVRに夢を見て敗れた記録

1.はじめに

  • 筆者はVRchat未経験.いわゆる界隈の最先端にいる人ではない.周回遅れ組
  • 筆者はVRコンテンツは見るのも作るのも楽しいと思っている.
  • 筆者はVR体験の最大の参入障壁は要求マシンスペックだと思っている.
  • 筆者はVRが普及するときは、スマホで十分なコンテンツが使えるようになった時だと考える.
  • 本文は,現状簡単に個人で作成できるスマホVRコンテンツがいかほどのものか,実験した記録である.


2.結論

スマホVRはまだ時代が追い付いてないと感じた.
スマホVRVRだと考えられるとVRが嫌いになりそう.(理由は後述

3.実験方針

とりあえず実験ターゲットを3Dモデルを使ったVR動画に絞って考える.
方法論としては3つ考えられる.
A案 unityにモデルとモーションを読み込んでandroidアプリにする
→権利関係的に拡散はできない.個人利用限定か
B案 youtubeVR動画として投稿する
→cardboardだけ買ってもらえばみんなで楽しめる.
C案 高画質VR動画を再生するスマホアプリを導入し,VR動画をDL形式で配布する.
→権利関係的に配布大丈夫なのか確信が持てない.

せっかくなのでみんなで楽しみたいので,B案を本命としてA案は予備実験とする.
C案は疲れたから試してない.誰か知ってたら教えて.

4.予備実験

3Dモデルが動く動画をunityで作成しスマホアプリ化してみる
4.1.手順
本論でないため詳細な手順略
4.2.結果
端末にもよるけど,fpsが10~30ぐらいしか出なくて,もの凄くVR酔いする.
ローポリ化とかそこら辺の最適化をすればクリアできる課題かもしれないけど,
簡単に作成できるの領域を超えるから追実験はしない.
(参考)
VR酔いfps(リフレッシュレート)の関連性に関して
https://vrinside.jp/news/vr-terminologie/


5.本体実験

MikuMikuDomeMasterを使ってMMD+MMEでパノラマVR動画を作成する.
演算能力足りなくてfps下がるなら最初から動画にする作戦.
5.1.手順
5.1.1.MMD(http://www.geocities.jp/higuchuu4/)とMME(https://www6.atwiki.jp/vpvpwiki/pages/219.html)を導入する.
5.1.2.MikuMikuDomeMasterを導入する(https://twitter.com/Caeru_Odin/status/721653643036897280)
5.1.3.こちらの手順通り動画を出力する.
(http://greety.sakura.ne.jp/redo/2016/01/mmdm-stereo-equi-movie.html)
注意点としては,DomeMaster.pmxを読み込んだ瞬間MMDが激重になるので,必要な編集は事前に終わらせておくこと.
5.1.4.つんでれんこ(https://tdenc.com/TDEnc/download/)でMP4にする.
5.1.5.360 Videos MetaData(https://support.google.com/youtube/answer/6178631?hl=ja)を使って,パノラマ動画だと認識されるようにする.
この時,説明文には"[3D Top-bottom] のチェックボックスはオンにしないでください"とあるが,必ずチェックすること.
5.1.6.Youtubeに投稿する.
5.1.7.スマホで再生し,画質を最大(1080p60s)にしてcardboardのマークをタップする.

5.2.結果
画質悪すぎて楽しめない.
360度ぐるっと外周分が1080p(1920*1080)となるので,実際スマホに表示されている範囲をせいぜい90度ぐらいだとすると,480*270ぐらいのサイズを全画面に引き延ばした感じになる.
youtubeで表示できる最大画質は端末自体のディスプレイ解像度に依存する.
表示範囲だけでHD画質720p(1280*720)を実現しようとした場合,パノラマ動画自体は2,880p(5,120*2,880)ぐらいの画質が必要.
なお,4Kスマホが2,160p(3,840*2,160).無理げーである.

(参考)パノラマ動画と画質の考え方
http://blog.livedoor.jp/rna135711/archives/52014788.html

6.おわりに

今回の検証範囲では,スマホVRはまだ時代が追い付いてきてないと感じた.
マシンスペックが大敵すぎる.
MMD * スマホだったら比較的手軽かなーと思ったけど世界はそんなに甘くなかった.
2次創作文化圏外(オリキャラ・オリ曲・オリモーション)でVR動画作れる目途が立ったら,B案にこだわる必要性が消えると思っているので,C案の追加実験するかもしれない.
ちなみに筆者のPCはoculusの最小スペックぐらいであるが,3分ぐらいの動画出力するのに2時間ぐらいかかった.

なお,今回の実験範囲外なので書いてないけど,パノラマVR静止画表示するぐらいなら,スマホVRでも遊べなくはないかなーという感じ.

筆者周回遅れ組なので,最先端では常識かもしれないけど,いろいろ試して楽しかったのでよしとする.


追記:C案検証したけど,youtubeと同じく端末解像度以上に再生できなかったので,スマホの8割が4Kになるころまで覚えてたら続き実験しますね

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.






【技術メモ】UTAUと文字コードとwindows10アップデートについて

※注意※ 開発者向け情報です.
また,将来不具合が出る恐れがあるレベルの話で将来のトラブルを約束するものではありません.

〇UTAUの文字コードについて

  • ustは[#SETTING]がANSI、それ以外がshift-jisで保存される.
  • ust保存画面の選択肢にあるutf-8を選んだ場合,ustはすべてUTF8で保存され[#SETTING]に"Charset=UTF-8"が追記される.
  • プラグイン起動時の中間ファイルは,ustの文字コードにかかわらず,[#SETTING]がANSI、それ以外がshift-jisで保存される.
  • 日本語環境ではANSI=shift-jisという認識で概ね問題ないので,上記プラグインの仕様で何も問題ないが,ANSIの実文字コードwindowsの言語環境によって異なる.
    ex)日本語→shift-jis,繁体中国語→big5,簡体中国語→GBKなど)
  • プラグイン用中間ファイルをshift-jis専用にしてると外国環境では動かない場合があるのは上記のとおりだいたいANSIのせい

〇windows10 のアプデについて

  • redstone4のIPでansiiをutf8に変更できるようになっている
    (いくつかのタレコミ記事,検証ツイートはあるものの公式リリースは発見できず.
    IPに参加していないためあくまで2次情報.気になるならぐぐって)
  • 今のところ今後これが標準となるという情報はなし.

〇だから何?

  • 既存のshift-jis環境で作成したustの音源パスが文字化けする.
  • ansiがutf8となった環境では,海外UTAU環境と同様,プラグインの[#SETTING]とそれ以外の部分の文字コードが異なる関係でいくつかのUTAUプラグインが動作しなくなる.
  • 界隈アクティブな開発者はこの点留意したら今後慌てなくていいかも(海外対応にもつながる)
  • 過去のサイクル的には2018年春ごろにredstone4が来そうなので,来たら実証実験します.

〇実際にやってみた 2018/05/02追記

やっぱりシステムの文字コードutf-8にしたらダメだった.
というか思った以上にダメだった.
そもそもGUI自体が文字化けしまくっている.歌詞も入力しようとしたら文字化けする.
当然文字化けしまくってるのでUTAわない.

なおアプデしただけでは問題ありません.普通に使えます.
以下検証画像





【H29夏休み自由研究】UTAU音源の2マイク同時録音について【基礎実験】

  1. 前書き
    UTAU音源の事前加工として,現在は確立されていないが,複数のマイクで同時収録した音源をEQやモーフィング等で合わせるという手法が考えられる.

    上記の手法について研究するため同時録音に挑戦してみたところ,同時録音した差分自体がUTAUの伸縮器を差し替えるよりも変化の大きいものであり,差分として成り立つ可能性を見出した.

    そこで,実際に同時録音を行った音源に同一のフレーズを歌わせたものでアンケートによる主観評価を行い,マイク差分の価値を確認するものである.
  2. 実験方法
    oremoを用いて2ch同時録音を行い,自作ソフトにてLR分離を行った.
    各音源で同一のフレーズを歌唱させ,twitterにてアンケートを行う.

    なお収録に用いた機材は以下の通り
    ・オーディオIF steinberg UR22 mk2
    ・Lchマイク(コンデンサ) オーディオテクニカ AT4040
    ・Rchマイク(ダイナミック) SHURE SM58
  3. 実験結果
    8/20 20:40時点のアンケート結果を下記に示す.なお1つ目がAT4040,2つ目がSM58である.
    1曲目



    2曲目



  4. 結論
    状況によっては2重録音による差分は十分選択肢として通用すると考えられる.
  5. 考察
    マイク差分音源は原音設定が完全に流用可能なため,ノイズ除去や周波数表の作成の手間等はかかるものの,気軽に差分音源を作成できるのではないかと思われる.
  6. あとがき
    挫折しなかったらダブリングした音源で事前加工するためのフリーソフト開発するので,
    興味がある人は実験がてら録ってみてください.僕が得します.
  7. 蛇足
    ハッピーバースデー俺ー
    今年も頑張りまーす