Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ARコンテンツ作成ハンズオン@Panasonic -MYOで始めるウェアラブルセンシング-
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
TakashiYoshinaga
January 31, 2018
Technology
170
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
400
UnityとZapWorksで始めようWebAR開発
takashiyoshinaga
0
4.3k
Getting Started with WebAR for HoloLens2 and Meta Quest
takashiyoshinaga
0
2.9k
Getting Started with HoloSDK
takashiyoshinaga
0
320
Getting Started with Non-Programming AR Development with MRTK v2.4.0
takashiyoshinaga
0
2.9k
Getting Started With MRTK (for Beginner)
takashiyoshinaga
0
750
始めようWebAR/VR開発
takashiyoshinaga
1
1.1k
Getting Started with Azure Kinect DK
takashiyoshinaga
1
6.2k
Other Decks in Technology
See All in Technology
ヘルスケア領域における AI 活用と その安全性担保のための取り組み (Leveraging AI in Healthcare and Our Efforts to Ensure Its Safety) - Google I/O Extended Tokyo 2026, July 11, 2026
zettaittenani
0
240
DatabricksにおけるMCPソリューション
taka_aki
1
160
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
3
1.2k
Road to SRE NEXTの今までとこれから
hiroyaonoe
0
260
生成AIの活用/high_school2026
okana2ki
0
120
勉強会企画をアプリで構造化してみた 〜そこで見えた、AIとの付き合い方〜 / I've structured a study group plan using an app.
pauli
0
340
貴方はどのエンジニアリングを磨くのか
hatyibei
0
110
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
860
AI時代における最適なQA組織の作り方
ymty
3
500
小さいから、全部わかる。— 常駐AI "xangi" のすすめ
sugupoko
0
290
AI駆動開発におけるQAエンジニアの役割事例 〜AI駆動開発の現場から〜
kobayashiyorimitsu
0
430
クラウド上のデータ復旧で見落としがちな制約: 医療系 SaaS の BCP 設計から得た教訓
kakehashi
PRO
0
3k
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
30 Presentation Tips
portentint
PRO
1
340
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Into the Great Unknown - MozCon
thekraken
41
2.6k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Optimizing for Happiness
mojombo
378
71k
Between Models and Reality
mayunak
4
370
The Language of Interfaces
destraynor
162
27k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
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方向に加速
完成