簡單地用 Golang 與 Leap Motion 互動!

Leap Motion 是一個用以偵測手部動作的小型傳感器,價格也蠻便宜的大約在 1,800 新台幣左右。雖然說優點是輕巧廉價容易開發,但是有時候感應上也會有些問題,例如說在手指相連再一起時 Leap Motion 經常會誤認成另一種手勢

順帶一提,Leap Motion 不能偵測像「關節」這麼細緻的地方,不過基本的稍微彎曲是可以的

其實就只是 Web Socket

要與 Leap Motion 溝通很簡單,Leap Motion 驅動自己開了個 Web Socket 在背後執行,只要程式語言支援建立、擷取 Web Socket 資料連線的話就能夠與 Leap Motion 連動。

Chrome 可以直接安裝 Simple WebSocket Client 套件,然後開啟連線ws://127.0.0.1:6437/v3.json 直接預覽目前 Leap Motion 的數據。還有,你可以替換掉網址後面的 v3.json 成另一種格式,不過這方面我沒有研究,這可能就要觀看官方手冊了。

因為 Web Socket 連瀏覽器都支援,所以你可以直接由 JavaScript 和 Leap Motion 進行互動,在官方文件上就有相關即時範例


1. 安裝 Motion 套件

Leap Motion 官方並沒有提供給 Golang 開發的套件,但是基於 Leap Motion 可以透過 Web Socket 就取得狀態,有人基於這個方式做出了給 Golang 的 Motion 套件

安裝方式非常簡單,一如往常地使用 go get 像這樣即可:

$ go get github.com/jaxi/motio

2. 撰寫程式

在 Motion 套件中的範例就已經提供了如何建立連線。我順便幫你加上了註釋 ;)。

package main

import (  
    "fmt"
    "github.com/jaxi/motion"
    "log"
)

func main() {  
    // 建立新的 Leap Motion 裝置
    d, err := motion.NewDevice()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("你已連線至 Leap Motion")

    // 監聽連線
    d.ListenAndReceive(true)
    defer d.Close()

    // 偵測 Leap Motion 感測器的每一幀
    for frame := range d.FrameQueue {
        // 偵測是否有手勢
        if len(frame.Gestures) > 0 {
            for _, g := range frame.Gestures {
                // 顯示目前手勢種類
                fmt.Println(g.Type)
            }
        }
    }
}

執行成果

現在透過 go run 然後揮動雙手轉圈下壓就能看見下列效果。

後記

這是個很簡單的手勢偵測範例,實際上你可以將上述的 for 迴圈改寫成下面這樣直接取得更多的詳細訊息:

// 偵測 Leap Motion 感測器的每一幀
for frame := range d.FrameQueue {  
    fmt.Println(frame)
}

Motion 套件其實也就只是幫你將 Web Socket 的 JSON 轉譯成建構體讓你在 Golang 中使用而已,而那些資料的用途可能要自己「親手體驗」了。