25 Jul 2017, 06:51

Leap Motion を Pythonから使う方法を調べた

Leap Motion を Pythonから使う方法を調べた。

環境

  • Ubuntu 16.04, 64bit
  • Leap Motion SDK 2.3.1
  • Python 2.7.13

Pythonは 2系でしか動かないようだ。私はAnacondaを利用して、2系の環境を構築した。

必要なファイルを揃える

まずは、前回の記事に従って、Leap Motion SDKをインストールする。

Linux用のtarファイルを解凍すると、LeapSDKというフォルダがあるので、そこに移動。

Leap Motionを Pythonから操作するためには、以下の3ファイルが必要。

  • lib/Leap.py
  • lib/x64/libLeap.so
  • lib/x64/LeapPython.so

(64bitはx64/32bitはx86フォルダ)

作業用ディレクトリを作成して、そこに3ファイルをコピーする。

mkdir -p ~/repo/leap
cp lib/Leap.py ~/repo/leap
cp lib/x64/libLeap.so ~/repo/leap
cp lib/x64/LeapPython.so ~/repo/leap

LeapSDKの中にSample/Sample.pyがあるので、まずはそれを作業用ディレクトリにコピーして動かしてみる。数値がたくさん現れれば成功。

cp samples/Sample.py ~/repo/leap/
cd ~/repo/leap/
python Sample.py

基本スニペット

Leap Motionのプログラムの書き方は、Listener型とPoling型がある。

Listener型は、Leap Motionのフレームワークで Loopがある場合、

Polingは Leap Motion以外のフレームワークで Loopがある場合に使う。

サンプルコードに従って、Listener型の基本スニペットを書く。

import Leap, sys

class SampleListener(Leap.Listener):
    def on_frame(self, controller):
        # Get the most recent frame and report some basic information
        frame = controller.frame()
        print "Frame id: %d, timestamp: %d" % (frame.id, frame.timestamp)

def main():
    # Create a sample listener and controller
    listener = SampleListener()
    controller = Leap.Controller()

    # Have the sample listener receive events from the controller
    controller.add_listener(listener)

    # Keep this process running until Enter is pressed
    print "Press Enter to quit..."
    try:
        sys.stdin.readline()
    except KeyboardInterrupt:
        pass
    finally:
        # Remove the sample listener when done
        controller.remove_listener(listener)


if __name__ == "__main__":
    main()

main関数は変更せずに、on_frame()メソッドの中身だけ修正すれば良さそう。

frameに現在の情報がすべて含まれているので、そこからいろいろ取り出す。

手の座標を取得

まずは、手の座標を取得してみる。

on_frameの中に以下を書き込む。

    hands = frame.hands
    hand = hands[0] # first hand
    print(hand.palm_position)

palm_positionで手のひらの中心の座標が手に入る。実験してみた結果、手の座標が、(x, y, z)のタプルで取得できた。

(41.2968, 119.34, -71.5027)
(40.8835, 122.556, -71.095)
(38.7474, 126.202, -69.3811)
(36.5977, 130.135, -66.6525)
(34.1101, 134.531, -63.37)
(31.7521, 137.867, -59.3138)
(28.9372, 141.859, -54.9556)
(27.5701, 145.658, -50.0342)
(25.3786, 149.093, -45.6736)
(23.8103, 152.436, -40.7532)
(21.8484, 156.879, -36.0352)

ジェスチャーを検出する

ジェスチャーは4種類ある。今回は、Key Tapというジェスチャを試す。

ジェスチャーの検出には、事前の登録が必要。on_connect() でジェスチャーを登録する。

def on_connect(self, controller):
    controller.enable_gesture(Leap.Gesture.TYPE_KEY_TAP);

on_frameに以下を追加。

for gesture in frame.gestures():
   if gesture.type == Leap.Gesture.TYPE_KEY_TAP:
        print "  Key Tap id:", gesture.id

ジェスチャーを以下のようにすると、反応する。

Key Tap id: 1
Key Tap id: 2
Key Tap id: 3
Key Tap id: 4

とりあえず、今日はここまで。

25 Jul 2017, 02:11

Ubuntuに Leap Motion SDKをインストールした作業メモ

机の中に眠っていたLeap Motionを数年ぶりに使ってみようと思う。

Ubuntuに Leap Motion SDKをインストールした作業メモです。

環境

  • Ubuntu 16.04
  • Leap Motion SDK 2.3.1

SetUp

公式サイトからLinux用のSDKをダウンロード

cd Downloads
tar xvzf Leap_Motion_SDK_Linux_2.3.1.tgz
cd LeapDeveloperKit_2.3.1+31549_linux
sudo dpkg -i Leap-2.3.1+31549-x64.deb

エラーが発生した。leap deamonがない。

Failed to start leapd.service: Unit leapd.service not found.
dpkg: パッケージ leap の処理中にエラーが発生しました (--install):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 5 を返しました
ureadahead (0.100.0-19) のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
処理中にエラーが発生しました:
 leap

解決策がForumにあった。パッチを当てればいいらしい。(パッチは結局失敗する、後述)

  • Leap Motion SDK fails to install properly on Ubuntu 15.04 – Customer Support – Leap Motion Community

    Download the .tgz file from https://www.leapmotion.com/setup120, extract, and download the patch file to /tmp/patch:
    tar xzf Leap_Motion_Setup_Linux_2.3.1.tgz
    cd Leap_Motion_Installer_Packages_release_public_linux
    wget -O /tmp/patch https://gist.githubusercontent.com/jmwilson/8e6c579eac5fa7fa9f0d/raw/0b597ceb1f8184952bf067267ac4171691949068/patch
    
    Extract the .deb file into a new leap directory and enter it:
    dpkg-deb --raw-extract Leap-2.3.1+31549-x64.deb leap
    cd leap
    
    Patch the contents of the current directory:
    patch -p2 </tmp/patch
    
    Go back to the parent directory and build a new .deb file:
    cd ..
    fakeroot dpkg-deb --build leap (this can take a while...)
    
    Install the patched .deb:
    sudo dpkg --install leap.deb
    

patchを当てても動かなかった。他の人も同様の症状がでているみたい。

解決策がforumにあった。

  • Linux install of SDK fails – Development – Leap Motion Community

    1 - After the install failure, I simply uninstalled with:

    sudo dpkg -r leap

    2 - Now, with no leap installed yet, I followed the post above and just created the file as mentioned there (I used the terminal to write the following command, to use the nano text editor as root user):

    sudo nano /lib/systemd/system/leapd.service

    3 - I pasted that content (reproduced here for easiness): (also please note that on Ubuntu terminal, you paste with CTRL+SHIFT+V instead of just CTRL+V)

    Found by Kevin Cole 2014.11.22 at

    https://github.com/atejeda/leap-fedora-rpm

    #

    Remember to:

    #

    ln -s /lib/systemd/system/leapd.service /etc/systemd/system/leapd.service

    systemctl daemon-reload

    # [Unit] Description=LeapMotion Daemon After=syslog.target [Service] Type=simple ExecStart=/usr/sbin/leapd [Install] WantedBy=multi-user.target

    4 - Saved (CTRL+O then ENTER), and exited (CTRL+X)

    5 - Still using the terminal, executed the two commands from that same post, BUT I included the sudo prefix to run them as root user:

    sudo ln -s /lib/systemd/system/leapd.service /etc/systemd/system/leapd.service sudo systemctl daemon-reload

    6 - All is right now and we can properly install. So, I just installed the original package:as in the official Leap guide:

    sudo dpkg –install Leap-2.3.1+31549-x64.deb

    (please just note that I'm using a x64 Ubuntu, so I installed the 64 bits package)

    7 - Done!!!

これでうまくいった!

確認

LeapControlPanelを起動する。ツールバーにLeap Motionのアイコンがでて、緑色になった。

試しに、Diagnostic Visualizerを起動してみる。手が正しくトラッキングされていることが分かる。