2017年4月3日 星期一

Adobe AIR + Kinect (4) - Gesture with Arduino


這篇是關於自訂手勢 Static Gesture 

在之前有提到骨架資訊
Adobe AIR + Kinect (2) - Skeleton with 2D Character

首先感謝Gray Liao 在 Some extensions for AIRKinect  
一系列相關文章中給了我許多啟發與學習經驗,再次感謝。




目標:
比出 O & X的手勢來讓LED燈隨之亮滅。

來練習如何用自訂手勢來與Arduino互動吧!


AS
Custom Static Gesture 自訂靜態手勢:Bingo & Cross


Bingo

達成Bingo手勢的條件
◎ 雙手要高過頭部 (也不能過高,不然也不像圓圈 )
◎ 雙手要接近一定距離 (不要完全貼合)

在測試中發現手掌翻轉時會導致手部骨架位置資訊的變化,
結論是手心不要朝向螢幕,而是向下的角度完成(類似敬禮,如上圖)。
Cross
達成Cross手勢的條件

◎ 雙手不可高過頭頂 (約肩膀高度上下)
◎ 雙手交叉的位置靠近另一邊肩膀 (右手在左肩)

測試中發現了一些小細節,
當只是先計算單手靠近另一邊肩膀的距離值,
與雙手交叉靠近另一邊肩膀所得到的數據不同。
這應該是當做出交叉動作時,
Shoulder也會因為Hand 的關係(牽引)而有些許移動。








AS3 Connec to Arduino

使用as3Glue程式庫來與Arduino(實際上是SerProxy)連線,
並把Flash的訊息包裝成Firmata。
可以同時參考這裡。










Arduino
Arduino +  LED (設定pin 13, 不附圖XD)

Arduino Code 




SerProxy (記得要開啟呀)









====================
                   心得
====================

坦白說自己寫的靜態手勢判斷算法並不嚴謹(只是判斷是否在預設範圍內而已),

雖然預設是站著時判斷是否比出手勢,
但發現坐著coding時, 有時會莫名發生判定成功的情形XD
看來日後在設計時必須考慮更細微的使用情境會更好。

動作設定必須合理 & 清楚界定範圍:

在判定不相對嚴謹的情況下,
(要求嚴謹得要考慮更多種可能&實用性,只是實驗性質的判斷還不需要那麼複雜)
如果有多種以上的動作偵測,更要留意誤判的可能性。
即使不是做出A,但不經意的動作也有可能導致觸發。

接近的Gesture最好不要在同一個情境下作多種事情,導致模稜兩可。
(此例的Bingo/Cross = ON/OFF,但別又同時擁有其他功能。)


使用的數據類型是 position.world (3D position in world coordinate space)
判斷的數值會因為與鏡頭距離的不同而有所差異。
所以假設使用情境下,
應該要求User與Kinect 保持在一定距離,

好讓判斷能夠收斂在固定範圍內。

我想不論是其他偵測動作的算法或感應器,應該是必備條件。
(不然距離太遠、不經意做出的動作而導致誤判,也是非常可能的。)

另外,position沒有另外與depth, rgb 比較,
不知在不同情況下是否可以採取對應的數據類型。(留待日後再研究吧XD)