Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ARコンテンツ作成ハンズオン@Panasonic -MYOで始めるウェアラブルセンシング-
Search
TakashiYoshinaga
January 31, 2018
Technology
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ARコンテンツ作成ハンズオン@Panasonic -MYOで始めるウェアラブルセンシング-
2018/1/31に開催したハンズオンの資料
TakashiYoshinaga
January 31, 2018
More Decks by TakashiYoshinaga
See All by TakashiYoshinaga
Nreal Light / Air 開発入門ハンズオン
takashiyoshinaga
0
1.1k
MediaPipeのハンドトラッキングで作るARライトセイバー
takashiyoshinaga
1
410
UnityとZapWorksで始めようWebAR開発
takashiyoshinaga
0
4.4k
Getting Started with WebAR for HoloLens2 and Meta Quest
takashiyoshinaga
0
3k
Getting Started with HoloSDK
takashiyoshinaga
0
330
Getting Started with Non-Programming AR Development with MRTK v2.4.0
takashiyoshinaga
0
2.9k
Getting Started With MRTK (for Beginner)
takashiyoshinaga
0
770
始めようWebAR/VR開発
takashiyoshinaga
1
1.1k
Getting Started with Azure Kinect DK
takashiyoshinaga
1
6.2k
Other Decks in Technology
See All in Technology
WasmをRustにする
sansantech
PRO
0
270
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
340
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
200
DBについての基礎説明(MySQL編) - コロプラ 2026年度 新卒研修
colopl
0
130
AI導入は済んだ。次は統制を作り替える番だ_AI×開発組織 Summit 2026
techtekt
PRO
0
350
20261017福岡devIO 「AIは"良いダッシュボード"を作れるか?
jtakeda
0
190
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
0
180
Active Record Connection Adaptersにおける長年の課題に再び取り組む
yahonda
0
200
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
300
S3 Filesで挑む! 八戸せんべい汁の食べ頃問題
usanchuu
0
120
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
1
470
しろおびから始める!ログ活用の第一歩
shumei_ito
0
960
Featured
See All Featured
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
330
Paper Plane
katiecoart
PRO
5
54k
エンジニアに許された特別な時間の終わり
watany
109
250k
How to train your dragon (web standard)
notwaldorf
96
6.9k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Exploring anti-patterns in Rails
aemeredith
4
540
The Curious Case for Waylosing
cassininazir
1
570
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
Transcript
ARコンテンツ作成勉強会 MYOで始めるウェアラブルセンシング #AR_Fukuoka
氏名:吉永崇(Takashi Yoshinaga) 所属:九州先端科学技術研究所(ISIT) コミュニティ: ARコンテンツ作成勉強会 ブログ: http://tks-yoshinaga.hatenablog.com/ #AR_Fukuoka
Myo Gesture Control Armband (Myo,マイオ) 腕輪型のウェアラブル・モーションコントローラ. 筋肉の動きや腕の傾き・ひねりを使用して対象を操作.
Myoで取得できるジェスチャー ダブルタップ・手の開閉や伸展・屈曲の合計5種類 動作毎に異なる筋肉の活動を複数の電極で計測 電極
本日作成するコンテンツ https://youtu.be/ReQ8FDehXEw
ダウンロード 演習用素材 https://goo.gl/dGVJi2 MYO SDK https://developer.thalmic.com/downloads
Unityの基本操作を覚えよう
Unityのプロジェクトを作成 (1/2) Unityを起動後、画面右上のNEWをクリック New
Unityのプロジェクトを作成 (2/2) プロジェクト名・保存場所・3Dを指定してCreate project 3D 最後にCreate Project プロジェクト名 保存場所 ※保存場所は全角フォルダやDropbox用フォルダはNG
Unityの操作画面(概要) ゲーム空間の設計画面
ゲーム空間にCGを追加しよう 右クリック Cube
実行してみよう クリックして実行 クリックして終了 カメラから見た空間
オブジェクトの位置・向き・サイズを調整 クリックして選択 移動 回転 拡大・縮小
Scene(設計画面)の視点を変えよう [←] [→]で左右移動 [ ↑ ] [ ↓ ]で前後移動 [Alt]+ドラッグで回転
+ドラッグで上下左右 他にもいろいろ → http://goo.gl/Lq1ILT
CGの詳細情報の編集:位置の指定 クリック 選択したオブジェクトの 現在の詳細情報→ オブジェクトの詳細の 表示・追加・変更は Inspectorで行う 例えば、Transformの
Positionを変更すると 位置が変わる (x,y,z)を(0,0,0)に (x,y,z)を(0,5,0)に
CGの詳細情報の編集:物理演算の追加 Add Component 選択したオブジェクトに物理法則(重力)を適用 追加される
実行してみよう
少し遊んでみましょう(1/3) ① 右クリック Plane
少し遊んでみましょう(2/3) 少し傾ける Position (0,0,0) Plane
少し遊んでみましょう(3/3)
Sceneの保存 Scene名 [Ctrl]+[s]でダイアログを開き、好きな名前で保存 コンテンツ作成中はこまめに[Ctrl]+[s]すること
不要なCGの削除 Delete 削除したいオブジェクトを選択して[Delete]キー
次の作業内容 今日作成するコンテンツの準備 蝶 フィールド
Asset StoreでCGを入手 [Window] → [Asset Store]
Asset StoreでButterflyを入手 butterflyで検索 Butterfly with Animationを選択
Asset StoreでButterflyを入手 ダウンロード/インポート [ダウンロード]または [インポート]をクリック ダウンロード終了を待つ Importing
package ウィンドウが表示されたら [Import]をクリック Import
Asset StoreでButterflyを入手 GruffysAnimatedButterfly フォルダが追加される
蝶のCGをゲーム空間に追加 3Dモデルがあるフォルダを開く [GruffysAnimated…] → [Models] butterfly2.FBX を Hierarchyに
ドラッグ&ドロップ
フィールドを追加しよう 本日ダウンロードしたSampleフォルダの中にある SampleTerrainをダブルクリックしてプロジェクトに取り込む ダブルクリック Import
フィールドを追加しよう Assetsフォルダ内のNew TerrainをHierarchyにドラッグ&ドロップ Assets
確認 追加されたフィールドと蝶の位置関係を確認
フィールドの位置の調節 フィールドの横幅の半分の-250だけx方向に移動 この辺に蝶 500 Positionを -250, 0, -2 -250移動
調整 カメラの位置を変更してそれっぽくする 蝶のRotationを(0,180,0)にしてカメラと同じ方向を向かせる 180°
蝶を前進させるスクリプトを作成しよう
スクリプト記述用のGameObjectの追加 ①右クリック ②Create Empty
スクリプトの追加 (1/2) ② Add Component ① GameObject ③ New Script
スクリプトの追加 (2/2) ① スクリプト名 ② クリック スクリプト(C#)が追加される 【ここまでの操作】 空のGameObjectを作成し,そこにスクリプトファイルを追加 →
Unityではオブジェクトの機能の1つとしてスクリプトが働く
スクリプトの記述:エディタの起動 ダブルクリックして開く
public class Controller : MonoBehaviour { // Start関数は初期化のために一度だけ実行される void Start
() { } // Update関数は毎フレーム(◦◦ミリ秒間隔で)実行される void Update () { } } スクリプトの記述:イメージ このスクリプトで butterfly2を扱うよ ・・・ フレームごとに少しずつ移動
スクリプトの記述:実装 using UnityEngine; using System.Collections; public class Controller : MonoBehaviour
{ GameObject butterfly; //蝶をプログラムで扱うための変数 void Start () { // Hierarchyにある蝶の情報を変数に覚えさせる butterfly = GameObject.Find("butterfly2"); } void Update () { butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } このモデルの場合・・・ 蝶自身の前後方向はz軸で表される。 後ろ方向が+と定義されているため 前に進む場合は-をかける必要がある
蝶の視点で移動しよう Main Cameraをbutterfly2の子要素にする 子要素になった ことを確認 ドラッグ&ドロップ
移動のOn/Offの切り替え (1/2) using UnityEngine; using System.Collections; public class Controller :
MonoBehaviour { GameObject butterfly; //蝶をプログラムで扱うための変数 bool forward = false; //移動のOn/Offを記録する変数 void Start () { butterfly = GameObject.Find("butterfly2"); } void Update () { butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } forwardがtrueの時だけ実行
移動のOn/Offの切り替え (2/2) GameObject butterfly; //蝶をプログラムで扱うための変数 bool forward = false; //移動のOn/Offを記録する変数
void Start () { butterfly = GameObject.Find("butterfly2"); } void Update () { if (Input.GetMouseButtonUp(0)){ forward = !forward; //trueの時はfalse, falseの時はtrue } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } }
Game画面をマウスクリックすると 移動のOn/Offが切り替えられる このあとMyoを使ってOn/Offを切り替える
Myoを接続
初期設定 Myo Connectを起動後, 通知領域の を 右クリックしてArmband Managerを開く [Windows] [Mac]
初期設定 Connect a Myo Armbandをクリック クリック
初期設定 Myoをアンテナに近づけて認識させる
初期設定 CALIBRATIONをクリック クリック
初期設定 Create Profileをクリック クリック
初期設定 Myoを利き腕に装着 (勉強会では右を前提に話を進めます) 真ん中より 少し肘より
初期設定 Continueをクリック クリック
初期設定 Myoを装着する腕を選択し, Continueをクリック 右腕/左腕を選択
初期設定 (まだ操作しないでください) 次に行う動作がビデオで示されるので それを確認し,キーボードの[Space]キーを押す.
初期設定 Now recordingと表示されたら動画の動きを真似る
初期設定 動作の記録が終わったらContinueをクリック. ※やり直す場合は Do it againをクリック クリック
初期設定 (まだ操作しないでください) 引き続き, 次に行う動作のビデオを確認したら キーボードの[Space]キーを押す.
初期設定 Now recordingと表示されたら動画の動きを真似る
初期設定 動作の記録が終わったらContinueをクリック クリック
初期設定 同様の操作を以下のジェスチャに対して行う 内側(屈曲) 外側(伸展) リラックス
初期設定 設定の成否を確認するため動画の動きを真似る
初期設定 他のジェスチャについても確認。 問題なければComplete Profileをクリック
Myo SDKのインポート 事前にダウンロード・解凍したMyo SDKフォルダ内の MyoUnity.unitypackageをダブルクリック ダブルクリック
Myo SDKのインポート Import Unity Package内の[Import]をクリック. API Update Requiredが出た場合には [I Made
a Backup. Go Ahead!]をさらにクリック クリック クリック
Myo SDKのインポート MyoとMyo Samples フォルダが追加される
Myoの動きをUnity上でチェック (1/3) MyoのPrefabフォルダを開く [Assets] → [Myo] → [Prefab]
Hub-1 Myo を Hierarchyに ドラッグ&ドロップ
Myoの動きをUnity上でチェック (2/3) 手を動かしながら MyoオブジェクトのInspectorで Thalmic Myo(Script)をチェック ① 実行 ② Myo
③ 表示をチェック
Myoの動きをUnity上でチェック (3/3) MyoオブジェクトのThalmic Myoが腕の状態を知っている → 自作スクリプトと連携できればコントローラとして利用可能
Myoのデータ取得: スクリプトの記述 ダブルクリックして開く Assetsフォルダ
Myoのデータ取得: スクリプトの記述 public class Controller : MonoBehaviour { // Start関数は初期化のために一度だけ実行される
void Start () { } // Update関数は毎フレーム(◦◦ミリ秒間隔で)実行される void Update () { } } このスクリプトで Myoを扱うよ 今何してる? ・・・
Myoの初期化 using UnityEngine; using System.Collections; using Thalmic.Myo; public class Controller
: MonoBehaviour { GameObject butterfly; bool forward = false; ThalmicMyo myo; //Myoをプログラムで扱うための変数 void Start () { butterfly = GameObject.Find("butterfly2"); // 今接続されているMyoの情報を変数"myo"に覚えさせる myo = GameObject.Find("Myo").GetComponent<ThalmicMyo>(); } /*スペースの都合により以下省略*/
補足 GameObject.Find("Myo") . GetComponent<ThalmicMyo>();
Myoのデータ取得 public class Controller : MonoBehaviour { // Start関数は初期化のために一度だけ実行される void
Start () { butterfly = GameObject.Find("butterfly2"); myo = GameObject.Find("Myo").GetComponent<ThalmicMyo>(); } // Update関数は毎フレーム(◦◦ミリ秒間隔で)実行される void Update () { } } 今何してる? ・・・
Myoのデータ取得 ThalmicMyo myo; //Myoをプログラムで扱うための変数 void Start () { /*スペースの都合により省略*/ }
void Update () { myo.pose if (Input.GetMouseButtonUp(0)){ forward = !forward; } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } print(myo.pose); //現在の状態を取得して表示
動作確認 ① 実行 ② Console 筋肉の活動状態(pose)の 情報がリアルタイムに表示
ダブルタップを用いた移動/停止の切り替え void Update () { print(myo.pose); if (Input.GetMouseButtonUp(0)){ forward =
!forward; } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } if ( ダブルタップをしたら ){ forward = !forward; } if (myo.pose==Thalmic.Myo.Pose.DoubleTap){ forward = !forward; } if文の条件を手の状態を用いたものに書き換える
特定動作のみの利用 void Update () { print(myo.pose); if (myo.pose==Thalmic.Myo.Pose.DoubleTap){ print(myo.pose); forward
= !forward; } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } } 動作確認のためにprint(myo.pose)もif分の中に移動 移動
実験 1回だけダブルタップをしてみよう 1回のダブルタップを 複数回認識してしまう ダブルタップを用いたOn/Offの切り替えには不都合
スイッチとしての利用に関するアイデア Rest 1回のDoubleTap 切り替わり タップ開始のタイミング(状態切り替わり)がわかればOK → つまり、直前の状態と今の状態が異なる時を識別
切り替わりのタイミングの認識 Thalmic.Myo.Pose lastPose; //前の状態を覚えておく変数 void Start () { butterfly =
GameObject.Find("butterfly2"); myo = GameObject.Find("Myo").GetComponent<ThalmicMyo>(); } void Update () { if(myo.pose==Pose.DoubleTap){ print(myo.pose); //現在の状態を取得して表示 forward = !forward; } /*スペースの都合により省略*/ } if( 前の状態と異なる場合) { if(myo.pose==Pose.DoubleTap){ print(myo.pose); forward = !forward; } } if(myo.pose != lastPose) { //状態が切り替わったら下記を実行 lastPose=myo.pose; //最新の状態に更新 if(myo.pose==Thalmic.Myo.Pose.DoubleTap){ print(myo.pose); forward = !forward; } } Rest Rest DoubleTap DoubleTap DoubleTap Rest Rest ・・・・ → lastPose → lastPose
CGの向きを制御する void Update () { if(myo.pose != lastPose) { //状態が切り替わったら下記を実行
lastPose=myo.pose; //最新の状態に更新 if(myo.pose==Thalmic.Myo.Pose.DoubleTap){ print(myo.pose); forward = !forward; } } if(forward==true){ butterfly.transform.Translate(0, 0, -0.02f, Space.Self); } if(myo.pose == Thalmic.Myo.Pose.WaveIn){ butterfly.transform.Rotate( 回転角度 ); } } butterfly.transform.Rotate(0,-0.5f,0); x z y
CGの向きを制御する void Update () { if(myo.pose != lastPose) { //状態が切り替わったら下記を実行
lastPose=myo.pose; //最新の状態を記録 if(myo.pose==Thalmic.Myo.Pose.DoubleTap){ /*スペースの都合上省略*/ } } if(myo.pose == Thalmic.Myo.Pose.WaveIn){ butterfly.transform.Rotate(0,-0.5f,0); } else if(myo.pose == Thalmic.Myo.Pose.WaveOut){ butterfly.transform.Rotate(0, 0.5f,0); } }
蝶の高さを制御する void Update () { if(myo.pose != lastPose) { lastPose=myo.pose;
/*スペースの都合上省略*/ } if(myo.pose == Thalmic.Myo.Pose.WaveIn){ butterfly.transform.Rotate(0,-0.5f,0); } else if(myo.pose == Thalmic.Myo.Pose.WaveOut){ butterfly.transform.Rotate(0, 0.5f,0); } if (myo.accelerometer.z > 0.8) { butterfly.transform.Translate(0, 0.02f, 0); } }
加速度について 重力加速度:-1G Myoの加速度:1G 重力に逆らって静止するには鉛直方向に常に1Gの加速度 z y y z 【水平のとき】 加速度y:
1G 加速度z: 0G 【垂直のとき】 加速度y: 0G 加速度z: 1G z y
蝶の高さを制御する(再) void Update () { if(myo.pose != lastPose) { lastPose=myo.pose;
/*スペースの都合上省略*/ } if(myo.pose == Pose.WaveIn){ butterfly.transform.Rotate(0,-0.5f,0); } else if(myo.pose == Pose.WaveOut){ butterfly.transform.Rotate(0, 0.5f,0); } if (myo.accelerometer.z > 0.8) //腕がだいたい上を向いたとき { butterfly.transform.Translate(0, 0.02f, 0); } }
蝶の高さを制御する void Update () { /*スペースの都合上省略*/ if(myo.pose == Thalmic.Myo.Pose.WaveIn){ butterfly.transform.Rotate(0,-0.5f,0);
} else if(myo.pose == Thalmic.Myo.Pose.WaveOut){ butterfly.transform.Rotate(0, 0.5f,0); } if (myo.accelerometer.z > 0.8) { butterfly.transform.Translate(0, 0.02f, 0); } else if(myo.accelerometer.z < -0.8) { butterfly.transform.Translate(0, -0.02f, 0); } } z y -z方向に加速
完成