LeapMotion デベロッパーキットを使って、Javaで遊んでみた(1) – Information Teaching Service 雄飛

LeapMotion デベロッパーキットを使って、Javaで遊んでみた(1)

こんにちは、もとい、こんばんは。
脇保です。

今日は久しぶりにJavaをいじってみました。
Javaで何をしたかというと、LeapMotionを使った、ツールが欲しいと思いまして。

LeapMotion、曖昧な使い方ができるインターフェースだと思います。
すごく語弊のある形で書くと。

正確性の求められる操作では厳しいかもですが、ある程度緩い操作なら、
こちらのほうが素早くできるかもと思いまして。

LeapMotionはかなり前に中古で買って持っていて、これで何かしたいなと。

で、いざ買ったらそれで満足して放置してた訳ですが。

んで、Javaを再びいじりたいと思い、その取っ掛かりに候補と上がったのが、
LeapMotionという訳です。

さて、早速作業に入りましょう。

先ず、何はなくとも最新版のLeapMotionのデベロッパーキットを
手に入れないと何も始まりません。

LeapMotionのデベロッパー向け公式サイトにアクセスします。
https://developer.leapmotion.com/get-started

で、ログインするなり、まだ登録してない人は登録するなりします。
すると、最新版のデベロッパーキットをダウンロードできます。

今回使うのは、Windows環境でJava言語。

LeapSDKlibフォルダに、LeapJava.jarファイルがあります。

そして、今いるフォルダに、x64とx86というフォルダがあるので、
それも後で使います。

次にEclipse(でなくても(例えばNetBeans)でもいいけど)。
Eclepse日本語版公式サイトから、最新版をダウンロードします。
http://mergedoc.osdn.jp/

ダウンロードが終わったら、今度はサンプルを開きます。
LeapSDKsamplesに、Sample.javaがあります。

で、新規JavaProjectを作り、Cllassを作ります。
Cllassを作ったら、サンプルを貼り付けます。

次に、JavaProjectを右クリックして、
ビルド・パス(B)>外部アーカイブの追加(V )を、
右クリックメニューの中から探して、選択します。

すると、ファイル選択ウインドウが出るので、
先ほど解凍したLeapMotionデベロッパーキットの、
LeapSDKlibフォルダの、LeapJava.jarファイルを、
選択します。

次に、登録された、参照ライブラリのLeapJavaを選択して、
右クリックします。
先ほどと同じく、
ビルド・パス(B)>ビルドパスの構成(C )を、
右クリックメニューの中から探して、選択します。

そしたら、ネイティブライブラリ・ロケーションパスというものを、
設定します。

この値に、先に記した、LeapSDKlibフォルダにある、
x64かx86を選択します。

32Bitなら、x86、
64Bitなら、x64、
になります。

これで、漸くサンプルを実行する環境が整いました。

で、実行します。

サンプルは、ログに色々とLeaMotionの値が吐き出されるというものでした。

先ずは、実行結果を見ながら、ソースとにらめっこ。

で、流れが判ったら、早速書いていきます。

因みに、これだけだと判りづらいかもですが、

公式サイト
https://developer.leapmotion.com/documentation/java/devguide/Sample_Tutorial.html
に、HelloWorldがあるので、これを参考にするといいかもです。

記事は英語ですが、ダウンロードしたキットのソースと、
記事はある程度一緒なので、とても参考になります。

で、早速書きます。

新規にProjectを立ち上げるもよし、書き換えて編集するもよし。
因みに自分はサンプルをいじって作りました。

今回するべきことは、
値をGUI上に持っていきたい(ウィンドウ上にログを表示したい)
値を取得して変数に入れたい
変数の値を処理にかけて色々何かしたい。
です。

面白そうです、頑張って作っていこう。

参考にしたサイト
Hello World
https://developer.leapmotion.com/documentation/java/devguide/Sample_Tutorial.html

LeapMotionのサンプルプログラムで遊んだ
http://artak.hatenablog.com/entry/2014/02/17/221344

以下、ソース

import java.awt.BorderLayout;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

import com.leapmotion.leap.Arm;
import com.leapmotion.leap.Bone;
import com.leapmotion.leap.Controller;
import com.leapmotion.leap.Finger;
import com.leapmotion.leap.Frame;
import com.leapmotion.leap.Hand;
import com.leapmotion.leap.Listener;
import com.leapmotion.leap.Vector;

/**
 * @author yuhi
 *
 */
class GValue
{
    /**
     * グローバル変数
     */
    public static String s1;
    public static Integer hnd;
    public static Integer fing;
    public static Integer hndOfLorR;
    public static Vector elbPos;
    public static Vector wstPos;
}

class GSwing
{
    /**
     * グローバルSwingオブジェクト
     */
public static JFrame frame = new JFrame(“タイトル”);
    public static JPanel p = new JPanel();
    public static JTextArea  label1 = new JTextArea(20,20);
    public static JScrollPane scp = new JScrollPane(label1);
}

public class Sample {

/**
* @param args
*/


public static void form_create()
{
GSwing.frame.setBounds(200, 200, 400, 400);
GSwing.frame.setVisible(true);
GSwing.p.add(GSwing.scp);
GSwing.frame.add(GSwing.p, BorderLayout.CENTER);
}

public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
// Create a sample listener and controller
form_create();
        SampleListener2 listener = new SampleListener2();
        Controller controller = new Controller();
        // Have the sample listener receive events from the controller
        controller.addListener(listener);
     
        // Keep this process running until Enter is pressed
        GValue.s1 =”Press Enter to quit…”;
        GSwing.label1.setText(GValue.s1);
        GSwing.p.repaint();
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Remove the sample listener when done
        controller.removeListener(listener);
    }

}

class SampleListener1 extends Listener {

    public void onConnect(Controller controller) {
    GValue.s1 = “Connected”;
    GSwing.label1.setText(GValue.s1);
    GSwing.p.repaint();
    }

    public void onFrame(Controller controller) {
        Frame frame = controller.frame();

        GValue.s1 = “Frame id: ” + frame.id()
                       + “, timestamp: ” + frame.timestamp()
                       + “, hands: ” + frame.hands().count()
                       + “, fingers: ” + frame.fingers().count();
       
        GSwing.label1.setText(GValue.s1);
        GSwing.p.repaint();
    }
}

class SampleListener2 extends Listener {

   

    public class AppFrame extends Frame {



public void paint(){
if ( GValue.hnd > 0 ) {
                        //ここに行いたい処理を書く
    //JOptionPane.showMessageDialog(null, “手の数:” + GValue.hnd.toString());
    }
    if ( GValue.fing > 0 ) {
                        //ここに行いたい処理を書く
    //JOptionPane.showMessageDialog(null, “指の数:” + GValue.fing.toString());
    }
    if ( GValue.hndOfLorR > 0 ) {
                        //ここに行いたい処理を書く
    //JOptionPane.showMessageDialog(null, “右手か左手か:” + GValue.hndOfLorR.toString());
    }
}




}

    AppFrame f;

        public void onFrame(Controller controller) {
            // Get the most recent frame and report some basic information
        Frame frame = controller.frame();

            GValue.s1 = “Frame id: ” + frame.id()+”n”
                           + “, timestamp: ” + frame.timestamp()+”n”
                           + “, hands: ” + frame.hands().count()+”n”
                           + “, fingers: ” + frame.fingers().count()+”n”;
           
            GValue.hnd = frame.hands().count();
            GValue.fing = frame.fingers().count();
           
            GSwing.label1.setText(GValue.s1);
            GSwing.p.repaint();

            //Get hands
            for(Hand hand : frame.hands()) {
                String handType = hand.isLeft() ? “Left hand” : “Right hand”;
                GValue.s1 =(”  ” + handType + “, id: ” + hand.id() +”n”
                                 + “, palm position: ” + hand.palmPosition())+”n”;
                GSwing.label1.setText(GValue.s1);
                GSwing.p.repaint();
                GValue.hndOfLorR = hand.id();

                // Get the hand’s normal vector and direction
                com.leapmotion.leap.Vector normal = hand.palmNormal();
                com.leapmotion.leap.Vector direction = hand.direction();

                // Calculate the hand’s pitch, roll, and yaw angles
                GValue.s1 =(”  pitch: ” + Math.toDegrees(direction.pitch()) + ” degrees,n”
                                 + “roll: ” + Math.toDegrees(normal.roll()) + ” degrees, n”
                                 + “yaw: ” + Math.toDegrees(direction.yaw()) + ” degreesn”);
                GSwing.label1.setText(GValue.s1);
                GSwing.p.repaint();

                // Get arm bone
                Arm arm = hand.arm();
                GValue.s1 =(”  Arm direction: ” + arm.direction()+”n”
                                 + “, wrist position: ” + arm.wristPosition()+”n”
                                 + “, elbow position: ” + arm.elbowPosition())+”n”;
                GSwing.label1.setText(GValue.s1);
                GSwing.p.repaint();
                GValue.wstPos = arm.wristPosition();
                GValue.elbPos = arm.elbowPosition();

                // Get fingers
                for (Finger finger : hand.fingers()) {
                GValue.s1 =(”    ” + finger.type() + “, id: ” + finger.id()+”n”
                                     + “, length: ” + finger.length()+”n”
                                     + “mm, width: ” + finger.width() + “mm”)+”n”;
                GSwing.label1.setText(GValue.s1);
                    GSwing.p.repaint();

                    //Get Bones
                    for(Bone.Type boneType : Bone.Type.values()) {
                        Bone bone = finger.bone(boneType);
                        GValue.s1=(”      ” + bone.type()+”n”
                                         + ” bone, start: ” + bone.prevJoint()+”n”
                                         + “, end: ” + bone.nextJoint()+”n”
                                         + “, direction: ” + bone.direction())+”n”;
                        GSwing.label1.setText(GValue.s1);
                        GSwing.p.repaint();
                       
                    }
                }
               f.paint(); 
            }

        }
       
   
}

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です