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
Transcript
87 slides
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方向に加速
完成
More Decks by TakashiYoshinaga
See All by TakashiYoshinaga
Nreal Light / Air 開発入門ハンズオン
takashiyoshinaga
0
1.1k
MediaPipeのハンドトラッキングで作るARライトセイバー
takashiyoshinaga
1
420
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
340
Getting Started with Non-Programming AR Development with MRTK v2.4.0
takashiyoshinaga
0
2.9k
Getting Started With MRTK (for Beginner)
takashiyoshinaga
0
790
始めようWebAR/VR開発
takashiyoshinaga
1
1.1k
Getting Started with Azure Kinect DK
takashiyoshinaga
1
6.3k
Other Decks in Technology
See All in Technology
「いつか使う」の「いつか」は来ない 〜AI駆動開発における「作らない」判断について〜
ikki0006
0
200
自治体AIコンタクトセンター、何をどこに任せる?~Amazon Connect Customer +Amazon Bedrockの実践知~ / 20261107 Satoshi Torano
shift_evolve
PRO
1
130
The future of architectural work
ufried
0
200
AI時代における医療情報システムのセキュリティ / Security of Healthcare IT Systems in the AI Era
henryofficial
0
150
JAWSコミュニティに 参加して1年経った結果
ssakita
0
120
Gifu WordPress Meetup #200 に向けて、私たちには何ができるだろうか?/ 2026-11-07 Gifu WordPress Meetup
torounit
0
260
仕様と現実の間で落とし所を探るリモートMCPの認証・認可 — Sansanの認証基盤における課題と実践
sansantech
PRO
2
260
Shared Signals Framework 仕様解説
oidfj
0
380
Steering と Hook (チームの決まりを守らせる) | 目指せ Kiro マスター 06
inariku
PRO
2
110
Ebitengine製iOSアプリ公開ボタンを押す会
eiei114
0
120
顧客合意を取りながら進めるAWSコスト削減の実践
optim
0
160
アラートを見直していたら営業組織への理解にちょっとだけ繋がった話
z63d
1
170
Featured
See All Featured
Building Applications with DynamoDB
mza
96
7.3k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
70
69k
Darren the Foodie - Storyboard
khoart
PRO
5
4.1k
The untapped power of vector embeddings
frankvandijk
2
2k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
330
First, design no harm
axbom
PRO
2
1.4k
New Earth Scene 8
popppiees
5
2.8k
Prompt Engineering for Job Search
mfonobong
0
580
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
520
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k