Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
2014 年度
卒 業 論 文
入力デバイス LeapMotion の可能性
指導教員 白井英俊 教授
中京大学 情報理工学部 機械情報工学科
学籍番号 H411007 石田 晃基
(2015 年 1 月)
卒業論文要旨
題目 入力デバイス LeapMotionの可能性 学籍番号 H411007 氏名 石田晃基 指導教員 白井英俊 本研究は、次世代型の入力デバイスとして開発された LeapMotion を対象と
して、ユーザー面から実際に利用し、また開発者の立場からこれを用いたアプ
リケーション開発を行うことにより、LeapMotion の利用可能性を明らかにする
ことを目的としたものである。LeapMotion を研究対象とした理由は、そもそ
も身体の動きを利用した機器の制御に関心があり、実用的にどのような場面で
この機器を活かすことができるのか考えたかったからである。
LeapMotionはコンピュータの手前に置かれるように設計された小型USB周辺
装置であり、2基の赤外線カメラと赤外線照射 LEDから構成されている。これに
より赤外線 LEDに照らされた手や指を赤外線カメラで撮影し、画像解析により
3D空間での手や指の位置を割り出すことができる。現在 LeapMotion の主たる
使用例はそのほとんどがゲームであり、日常で使用例を見る機会はない。そこ
で普段利用するマウス・キーボードに代わる入力デバイスとしてのアプリケー
ション開発を手がかりにして LeapMotion のいろいろな可能性を考えようとし
た。
まず LeapMotion による 3輪駆動のロボットの制御を試みた。プログラミン
グ言語 Pythonと LeapMotionSDKにより手指のジェスチャーの認識を行い、
Bluetoothを通して Aruduinoにより制御された BoeBotを操作するシステムを開
発した。そのために LeapMotion の認識回数、認識した指の座標の調整を行い、
手指のジェスチャーにより 3輪駆動ロボットを制御することに成功した。また、
LeapMotion 以外の「身体の動きを認識できるデバイス」Kinectと比較するこ
とで、手指ジェスチャーによる入力デバイス LeapMotion の長所と短所を明ら
かにした。
以上のように、本研究では LeapMotion をユーザー面と開発面の両面から考
察することで LeapMotion の可能性を考察した。入力デバイスとしてはとても
魅力的であるが、マウスとして使う試みでは、十分な精度を出せず、既存のマ
ウスの方が使いやすいと感じた。またキーボードとしての使用でも、
LeapMotion が 2次元ではなく 3次元で指を認識するため、位置の感覚にズレが
生じることがあるのが問題であると感じた。これからの研究で、問題点を明確
にし、LeapMotion のよりよい使用可能性を考えていきたい。
目次
第 1章 はじめに 1
第 2章 LeapMotion 3 2.1 LeapMotion の概要 3
2.2 LeapMotionの特徴 3
2.3 LeapMotion SDK 4
第 3章 LeapMotion を使用する 5
3.1 LeapMotion を使用してのリモートコントロール 5
3.2 Python 5
3.3 Blue-tooth 5
3.4 Arduino 5
3.5 Boe-Bot 6
3.6 リモートコントロール 7
第 4章 他のデバイスとの比較 8
4.1 Kinect for windows 8
4.2 LeapMotion との比較 8
4.2.1 ソフトウェア面 8
4.2.2 ハードウェア面 9
4.3 本研究において 9
第 5章 考察 10
5.1 ユーザー面 10
5.2 開発面 10
第 6章 結論 11
6.1 マウスへの応用 11
6.2 キーボードへの応用 11
第 7章 可能性 12
7.1 ロボットチェス 12
7.2 展望 13
参考文献 14
謝辞 15
付録1 Boe-Botの移動プログラム 16
付録2 Pythonの認識プログラム 19
第 1 章 はじめに
本研究は、次世代型の入力デバイスとして開発された LeapMotion を対象と
して、ユーザー面から実際に利用し、また開発者の立場からこれを用いたアプ
リケーション開発を行うことにより、LeapMotion の利用可能性を明らかにする
ことを目的としたものである。LeapMotion を研究対象とした理由は、そもそ
も身体の動きを利用した機器の制御に関心があり、実用的にどのような場面で
この機器を活かすことができるのか考えたかったからである。
LeapMotionはコンピュータの手前に置かれるように設計された小型USB周辺
装置であり、2基の赤外線カメラと赤外線照射 LEDから構成されている。これに
より赤外線 LEDに照らされた手や指を赤外線カメラで撮影し、画像解析により
3D空間での手や指の位置を割り出すことができる。現在 LeapMotion の主たる
使用例はそのほとんどがゲームであり、日常で使用例を見る機会はない。そこ
で普段利用するマウス・キーボードに代わる入力デバイスとしてのアプリケー
ション開発を手がかりにして LeapMotion のいろいろな可能性を考えようとし
た。
まず LeapMotion による 3輪駆動のロボットの制御を試みた。プログラミン
グ言語 Pythonと LeapMotionSDKにより手指のジェスチャーの認識を行い、
Bluetoothを通して Aruduinoにより制御された BoeBotを操作するシステムを開
発した。そのために LeapMotion の認識回数、認識した指の座標の調整を行い、
手指のジェスチャーにより 3輪駆動ロボットを制御することに成功した。また、
LeapMotion 以外の「身体の動きを認識できるデバイス」Kinectと比較するこ
とで、手指ジェスチャーによる入力デバイス LeapMotion の長所と短所を明ら
かにした。
以上のように、本研究では LeapMotion をユーザー面と開発面の両面から考
察することで LeapMotion の可能性を考察した。入力デバイスとしてはとても
魅力的であるが、マウスとして使う試みでは、十分な精度を出せず、既存のマ
ウスの方が使いやすいと感じた。またキーボードとしての使用でも、
LeapMotion が 2次元ではなく 3次元で指を認識するため、位置の感覚にズレが
生じることがあるのが問題であると感じた。これからの研究で、問題点を明確
にし、LeapMotion のよりよい使用可能性を考えていきたい。
本論文の構成は以下の通りである。第2章では本研究で用いる LeapMotionの特徴など概要について述べる。また、LeapMotion による開発を行うために必
須な LeapMotion SDK について説明する。第3章では LeapMotion を実際に使
用して 3 輪駆動ロボットの制御を行うシステム開発の経験について述べる。ま
1
たその開発に使用したソフトとハードの説明をする。第4章では、Kinect のよ
うに身体の動きを認識できるデバイスと LeapMotion とを比較することで
LeapMotion の長所と短所をはっきりさせる。第5章では経験に基づき、
LeapMotion に対してユーザー面と開発面の両面からその特徴を考察する。第6
章では第 5 章の考察を元に、既存の入力デバイスに代わるものとしての使用可
能性について考察する。第7章では LeapMotion を使ったアプリ開発を踏まえ
て、LeapMotion の可能性について議論する。なお、実際に作成したプログラム
は付録として載せた。
2
第2章 LeapMotion
本研究は身体の動きを新たな入力デバイスとして使用する可能性について考
えるものである。そこで、本章ではその前提知識として LeapMotion の概要と
その特徴について説明する。
図 2.1 LeapMotion
2.1 LeapMotion の概要
LeapMotion は、2012年 5月(日本では 2013年 7月)に LeapMotion 社から
販売されたデバイスである。マウスや画面タッチを用いずに手指のジェスチャ
ーによりコンピュータ操作ができる体感型のシステムであり、直観的な操作が
可能である。
図 2.2 LeapMotion の配置
2.2 LeapMotion の特徴
LeapMotion は図 2.2のようにコンピュータの手前に置いて使用する小型 USB
周辺装置である。2基の赤外線カメラと赤外線照射 LEDから構成されている。赤
外線 LEDに照らされた手や指を赤外線カメラで撮影し、画像解析により3D空間
での手や指の位置を検出する。両手と 10 本の指をそれぞれ独立して 0.01mm の
精度で認識が可能であり、手指の様々なモーションを読み取ることができる。
3
また、認識可能な範囲として、デバイスの 2.5cm上方、約 60×60×60cmの逆ピ
ラミッド型の3D空間の中で、手と指の動きを感知する。
2.3 LeapMotionSDK
LeapMotionSDK とは LeapMotion を使ったアプリケーションを開発するため
の SDK(Software Development Kit ソフトウェア開発キット)である。これは
C言語を始め、多くのコンピュータ言語の環境をサポートすしており、2014年 5
月には v2.0となり更に詳細な環境を整えることが可能となっている。
4
第3章 LeapMotion を使用する
本章では、LeapMotion を使用したロボットのリモートコントロールをシステ
ムの開発を行い、その開発経験を通して開発者の面から LeapMotion について
考察する。
3.1 LeapMotion によるリモートコントロール
LeapMotion から得た手指ジェスチャー認識を元に、無線通信(Bluetooth)
により Arduinoをベースとした移動ロボット(Boe-Bot)をコントロールするこ
とを考える。このロボット・コントロールに使用する手指ジェスチャーとロボ
ットの動作は以下のとおりである:
「パー」→前に進む
「グー」→後ろに下がる
「スワイプ」→右回転
「手指を認識させない」→停止
3.2 Python
Python とは広い範囲で使われるスクリプト言語であり、LeapMotionSDK によ
ってサポートされるプログラミング言語の一つである。本研究では Pythonを使
ってロボットのリモートコントロール・システムを作成した。
図 3.1 Pythonのマーク
3.3 Bluetooth
Bluetoothとは数mから数十m程度の距離の間を、電波により簡易な情報のや
り取りを行うのに使用されるデジタル機器用の近距離無線通信規格の1つであ
る。本研究では Bluetooth を用いてパソコンからロボットへの指令を送信して
いる。
5
図 3.2 PCの Bluetoothドングルの例
3.4 Arduino
Arduinoとは、AVRマイコン・入出力ポートを備えた基盤であり、パソコン
で Cに似た言語でプログラミングが可能である。パソコンでコンパイルした後、
USBケーブルにより、オブジェクトを転送することが可能である。また同じ USB
ケーブルを用いてパソコンとシリアル通信をしたり、シールドという追加ボー
ドにより Bluetoothや Wifiの機能を持たせることもできる。本研究では、ロボ
ットの制御とパソコンとの通信のために図 3.3に示す Arduino Unoを使用した。
図 3.3 Arduino Uno
3.5 Boe-Bot
Boe-Botとは Parallax社が開発した小型の 3輪ロボットである。メイン回路
基盤、マイクロコントローラとしての Aruduino、2つのサーボモータ、接触セ
ンサ、光センサ、赤外線センサなど様々な部品から構成され、容易に組み立て
ることができる。Arduinoシールドを追加することで Bluetoothなどの機能を追
加することができる。本研究ではリモートコントロール対象として Boe-Botを
使用した。なお、本研究ではロボットのリモートコントロール制御だけが目的
であるため、種々のセンサは使用していない。
6
図 3.4 Boe-Bot(青色の基板はメイン回路基盤、緑色の基板は Bluetoothシールド)
3.6 リモートコントロール
Boe-Botをリモートコントロールする仕組みは次のとおりである。
まず CPUである Arduinoに、あらかじめ特定のコマンドをシリアル通信によ
り受信すると、それに応じた行動を起こすようなプログラムをアップロードし
ておく。
Arduinoとコマンドを送信するパソコンとの間はBluetoothを通じてシリアル
通信を行う。
パソコン側では Pythonを使用し LeapMotion によって手指の3次元でのデー
タの処理により、例えば手を広げれば(パーの形)Bluetoothを通して「前進」と
いう特定のコマンドを送信するようなプログラムを走らせる。この「手指ジェ
スチャーの認識-命令送信」という一連の情報のやりとりは、1秒間に 10回程
度行うことでより人間の感覚に合わせている(これより前に作ったプログラム
では 1秒間に 100回程度処理するものであったが、ちょっとした手指ジェスチ
ャーにも反応しすぎてしまったため、1秒間に 10回に抑えた)。
このシステム開発は成功し、問題なく LeapMotion で得た手指ジェスチャー
により Boe-Botロボットを動かすことができた。
7
第4章 他のデバイスとの比較
LeapMotion 以外の人の動きを認識できる機器との比較を行うことで、ハード
ウェアとしての面からの可能性を考える。その一つの例として Kinect for
Windowsを取り上げる(図 4.1)。
図 4.1 Kinect for Windows
4.1 Kinect for Windows
Kincet fot Windows(以降、Kinectと呼ぶ)は距離センサとして Light Coding
という方式を採用している。これは、赤外線プロジェクタから無数のランダム
ドットパターンを照射し、ドットパターンが人に当たった時の変化量を赤外線
カメラで読み取る方式である。Kinect は、このドットパターンのズレから、人
のシルエットや動きの検出、距離の計測を行っている。この方式は検出範囲が
広く、中距離で人物の全身の動きをセンシングするような使い方に向いている。
逆に、近距離での細かなセンシングを苦手とし、最低 40cm離れた位置でなけれ
ば認識ができない。最大の特徴は、全身 20点の骨格位置を追跡できることであ
る。これにより人の位置や動きのデータを使用したアプリケーションを可能と
している。
4.2 LeapMotion との比較
身体の動きが認識可能なデバイスである LeapMotion と Kincet の大きな違い
は、認識する対象が身体の一部か全体か、という違いである。この違いは、そ
れぞれの機器が認識可能な範囲と精度の違いに反映されている。
4.2.1 ソフトウェア面
Kincet の分解能は 30fps であるが、LeapMotion の分解能は 200fps である。
数値上 LeapMotionの方がかなり優れているようにみえるが、人の動きを認識す
るのにはこれほどの精密さは必要ないと考える。その根拠は、3輪駆動のロボッ
トをコントロールするソフトウェア開発の時の経験によるものである。最初、
LeapMotion のデフォルトの設定でプログラムを作成したところ、微妙な手指の
動きに反応してしまい、人間の感覚に合わないロボットの動きとなってしまっ
8
た。そのため、わざわざ sleep をコマンドにより、時間分解能を下げてプログ
ラムを作成したのである。また、視覚に限定して情報を取得しながらイメージ
を形成するのに必要十分な分解能が 30fpsとされている。これらのことからも、
このことは言えよう。
4.2.2 ハードウェア面
ハードウェア面として Kinectと LeapMotionの使用法には大きな違いがある。
Kincet は設置された場所から床に対して並行に対象を捉えるのに対し、
LeapMotion では設置された場所から垂直上方向に対象を捉えている。これによ
り Kincetでは全身の動きの認識が得意であるが近距離での細かな動きの認識を
苦手とし、LeapMotionでは近距離での手指の動きの動きの認識が得意である。
4.3 本研究において
本研究の目的とする入力デバイスには LeapMotionが優れていると考えている。
その理由として目的としている必要な動作がマウス・キーボードで行う手指の
細かな動きなためである。Kincet でも手指の骨格を細かく認識させることは可
能であるがその認識の精度では LeapMotionが優ると言える。
LeapMotion KINECT
認識する対象 指先~手首(両手可能) 身体全体(複数可能)
フレームレート 200fps 30fps
精度 最大0.01mm単位で取得 1mm単位で取得
距離センサー方式 ステレオカメラ方式 Light Coding方式
視野角 垂直上方 150度 垂直43度/水平57度
有効距離 2.5~60cm 最大10m
SDK LeapMotionSDK Kinect for Windows SDK
9
第5章 考察
これまでの経験と調査を踏まえて、ユーザー面と開発者面の両方の視点で、
次世代の入力デバイスとして LeapMotionにどのような可能性があるか考察する。
5.1 ユーザー面
3D ゲームで LeapMotion を使用してみたところ、3D での手や指の認識はと
ても詳細なものであると思えた。しかしそれを反映させるソフトの方面でズレ
があるようにも感じた。それは、より正確な動きを人間が行わなければソフト
が反応しない点が多かったためである。プログラムの方でもより正確なデータ
を設定できてしまうため。人間の曖昧なズレを許容できるプログラムが必要だ
と考えられる。
5.2 開発面
LeapMotionSDKによっていろいろな言語がサポートされている。本研究で使っ
た Pythonを含め、特にゲーム開発のような環境で応用の幅が広がり、将来的に
は PCにもマウスなどと同様に標準で取り入れられるのではないかと考えられる。
また、マウス・キーボードに限らず3Dモジュールを利用した架空のモノを擬
似的に触れることができる。
10
第6章 結論
LeapMotion は手指のジェスチャーの認識によって、機器を制御することが可
能である。また、3次元でのデータを取得することで、擬似的にジェスチャー
を作ることもできる。しかし、1 秒に最大 200 回の認識を行っていることから、
ジェスチャーの途中で例えば手を開いているか閉じているかを判断してしまう
場合があり、人間の認識とのズレが生じる可能性がある。このような場合には
調整が必要となるだろう。
6.1マウスへの応用
LeapMotionSDKに含まれる手指ジェスチャーの認識を使うことで、現実のマウ
スと同様に手指ジェスチャーによるマウス操作ができる。しかし、手や指の認
識において、人間の感覚とのズレが生じることがあり、調整が必要となるであ
ろう。
6.2キーボードへの応用
特定の3次元座標をスイッチボタンとして設定することで、架空のキーボー
ドを作ることができるので、それを並べてキーボードを仮想的に作ることがで
きる。しかし、それはあくまで仮想的なものであり、ユーザーが触ることはで
きない。また、精密に座標設定を行う必要がある。そのため、LeapMotion を用
いた仮想的キーボード応用には工夫が必要となるだろう。また、スマートフォ
ンのように2次元で認識するものではなく 3 次元で認識し解析することから普
段使用するモノとのズレを感じる。
11
第7章 可能性
LeapMotionの公式サイトでは、LeapMotionを使ったアプリが配布されている。
その主だったものはゲームや遊びに使われるものである。その一つとして本章
ではロボットチェスを取り上げる。これは架空の空間でロボットとチェスを行
うものである(図 7.1)。またこのアプリを例に第 6 章での述べた結論を含め
LeapMotionの可能性を述べる。
図 7.1 ロボットチェスの起動画面
7.1 ロボットチェス
ロボットチェスというアプリを挙げた理由は、必要な動作がマウス・キーボ
ードと似ているからである。ゲームプレーヤーは正確に3Dモジュールの駒を掴
み、目的の位置に置かなければならない。この動作はキーボードの操作として
見た場合、特定の3D座標をスイッチとして指で叩く動作であり。マウスの操作
としていた場合は目的の位置へとカーソルを動かす動作とみなせる。
実際にこのアプリを動してみたところ、駒を動かす場面において、ユーザー
のイメージと認識したソフトの解析とでズレが生じた。このことから本研究の
第6章で挙げられた問題点と同じ点が挙げられる。そのため現状では既存の入
力デバイスからの制御の方が精度が高く、ユーザー面からしても LeapMotionを
実用として使用するためには不十分だと考えられる。
12
7.2 まとめ
本研究から LeapMotionの性能はソフト、ハード共に次世代型入力デバイスと
しての性能を持っていると考えられる。しかし実用上で性能がデバイスとして
利用することを重視し開発されたアプリと使用するユーザーとの間でズレが生
じる。この問題を克服することで、LeapMotion はマウスやキーボードの代用と
して使えるのではないかと考える。また、LeapMotion の利便性が確かなものに
なることで遠距離でのジェスチャーによる制御も可能となり人の入り込めない
場所での感覚的な動作による制御、ゲームに限らず入力デバイスとしての多様
化が可能だと考えている。
13
参考文献
中村 薫(2014).『LeapMotion プログラミングガイド』.株式会社工学社
LeapMotion(2014)- https://www.leapmotion.com/ (2014 年 4 月 1 日アクセ
ス)
Parallax(2004).Robotics with the Board of Education Shild For Arduino.
http://learn.parallax.com/activitybot (2014年 4月 1日アクセス)
Arduino(2014)-http://Arduino.cc/ (2014 年 4月 1日アクセス)
Python(2014)- https://www.python.org/ (2014 年 4月 1日)
MONOist(2014)『「どのデバイスが最適化?」 ―モーションセンサ 3 機種を
徹底比較!!』.
http://monoist.atmarkit.co.jp/mn/articles/1402/24/news086.html
(2014年 4月 1日アクセス)
14
謝辞
本研究において指導していただいた白井英俊教授ならびに、様々なアドバイ
スをしていただいた白井研究室の皆様に感謝致します。
15
付録1
Boe-Botの移動プログラム
#include <Servo.h>
Servo servoLeft;
Servo servoRight;
void setup()
{
servoLeft.attach(11);
servoRight.attach(10);
Serial.begin(9600);
//pinMode(13, INPUT); pinMode(12, OUTPUT);
//pinMode(3, INPUT); pinMode(2, OUTPUT);
//pinMode(9,OUTPUT); pinMode(8, OUTPUT);
}
void f(){
// int irLeft = irDetect(12, 13, 38000);
//int irRight = irDetect(2, 3, 38000);
servoLeft.writeMicroseconds(1700);
servoRight.writeMicroseconds(1300);
}
void b(){
servoLeft.writeMicroseconds(1300);
servoRight.writeMicroseconds(1700);
}
void s(){
servoLeft.writeMicroseconds(1500);
servoRight.writeMicroseconds(1500);
}
void tr(){
servoLeft.writeMicroseconds(1700);
16
servoRight.writeMicroseconds(1700);
}
void tl(){
servoLeft.writeMicroseconds(1300);
servoRight.writeMicroseconds(1300);
}
void r(){
servoLeft.writeMicroseconds(1700);
servoRight.writeMicroseconds(1450);
}
void l(){
servoLeft.writeMicroseconds(1550);
servoRight.writeMicroseconds(1300);
}
void loop() // Main loop auto-repeats
{
int irLeft = irDetect(12, 13, 38000); // Check for object
int irRight = irDetect(2, 3, 38000);
digitalWrite(9, !irLeft); // LED states opposite of
IR
digitalWrite(8, !irRight);
//Serial.println(irLeft); // Display 1/0 no
detect/detect
//Serial.print(" ");
//Serial.println(irRight);
delay(100);
if(Serial.available()>0){
char c=Serial.read();
if(c=='f'){
f();
}else if(c=='b'){
17
b();
}else if(c=='s'){
s();
}else if(c=='d'){
tr();
}else if(c=='a'){
tl();
}else if(c=='q'){
l();
}else if(c=='e'){
r();
}else {
}
}
}
int irDetect(int irLedPin, int irReceiverPin, long frequency)
{
tone(irLedPin, frequency, 8);
delay(1); // Wait 1 ms
int ir = digitalRead(irReceiverPin); // IR receiver -> ir
variable
delay(1); // Down time before
recheck
return ir; // Return 1 no detect, 0
detect
}
18
付録2
Pythonの認識プログラム
import Leap,sys,thread,time,visual,serial
from Leap
import CircleGesture,KeyTapGesture,ScreenTapGesture,SwipeGesture
class LeapMotionListener(Leap.Listener):
finger_names= ['Thumb','Index','Middle','Ring','Pinky']
bone_names= ['Metacarpal','Preximal','Intermediate','Distal']
state_names=['STATE_INVALID','STATE_START','STATE_UPDATE','STATE_
END']
#
def on_init(self,controller):
print "Initialized"
#
def on_connect(self,controller):
print "Motion Sensor Connnected"
controller.enable_gesture(Leap.Gesture.TYPE_CIRCLE)
controller.enable_gesture(Leap.Gesture.TYPE_KEY_TAP)
controller.enable_gesture(Leap.Gesture.TYPE_SCREEN_TAP)
controller.enable_gesture(Leap.Gesture.TYPE_SWIPE)
controller.config.set("Gesture.Circle.MinRadius", 10.0)
controller.config.set("Gesture.Circle.MinArc", .5)
controller.config.set("Gesture.Swipe.MinLength", 200.0)
controller.config.set("Gesture.Swipe.MinVelocity", 750)
controller.config.set("Gesture.KeyTap.MinDownVelocity", 40.0)
controller.config.set("Gesture.KeyTap.HistorySeconds", .2)
controller.config.set("Gesture.KeyTap.MinDistance", 1.0)
controller.config.set("Gesture.ScreenTap.MinForwardVelocity",
30.0)
controller.config.set("Gesture.ScreenTap.HistorySeconds", .5)
controller.config.set("Gesture.ScreenTap.MinDistance", 1.0)
controller.config.save()
19
#
def on_disconnect(self,controller):
print "Motion Sensor Disconnected"
#
def on_exit(self,controller):
print "Exited"
#
def on_frame(self,controller):
frame=controller.frame()
hands = frame.hands
leftmost = hands.leftmost
rightmost = hands.rightmost
fronmost = hands.frontmost
hand = frame.hands.rightmost
position = hand.palm_position
velocity = hand.palm_velocity
direction = hand.direction
left_pointable = hand.pointables.leftmost
right_finger = hand.fingers.rightmost
front_finger = hand.fingers.frontmost
farthest_left = frame.hands.leftmost
furthest_right = frame.hands.rightmost
finger_with_smallest_x= frame.fingers.leftmost.tip_position.x
finger_with_largest_x= frame.fingers.rightmost.tip_position.x
for hand in frame.hands:
hand_x_basis = hand.basis.x_basis
hand_y_basis = hand.basis.y_basis
hand_z_basis = hand.basis.z_basis
hand_origin = hand.palm_position
hand_transform = Leap.Matrix(hand_x_basis, hand_y_basis,
hand_z_basis, hand_origin)
hand_transform = hand_transform.rigid_inverse()
for finger in hand.fingers:
transformed_position=hand_transform.transform_point(finge
20
r.tip_position)
transformed_direction=hand_transform.transform_direction(
finger.direction)
print"min :" + str(finger_with_smallest_x)\
+" mix :" + str(finger_with_largest_x)
if(finger_with_largest_x - finger_with_smallest_x <= 60):
return("b") #gu
time.sleep(5.0)
elif(finger_with_largest_x - finger_with_smallest_x >=
50):
return("f") #pa
time.sleep(5.0)
for gesture in frame.gestures():
if gesture.type is Leap.Gesture.TYPE_CIRCLE:
circle = Leap.CircleGesture(gesture)
centerPoint = circle.center
diameter = 2 * circle.radius
if (circle.pointable.direction.angle_to(circle.normal)
<= Leap.PI/2):
clockwiseness = "clockwise"
else:
clockwiseness = "counterclockwise"
elif gesture.type is Leap.Gesture.TYPE_SWIPE:
swipe = Leap.SwipeGesture(gesture)
start = swipe.start_position
current = swipe.position
direction = swipe.direction
velocity = swipe.speed
swipper = swipe.pointable
return("q")
time.sleep(1.0)
elif gesture.type is Leap.Gesture.TYPE_KEY_TAP:
key_tap = Leap.KeyTapGesture(gesture)
return("e")
elif gesture.type is Leap.Gesture.TYPE_SCREEN_TAP:
21
screen_tap = Leap.ScreenTapGesture(gesture)
return("a")
elif gesture.state is Leap.Gesture.STATE_START:
id = gesture.id
microseconds = gesture.duration
seconds = gesture.duration_seconds
owning_frame = gesture.frame
gesturing_hands = gesture.hands
gesturing_pointables = gesture.pointables
return("s")
def main():
a = serial.Serial('COM41',9600)
listener = LeapMotionListener()
controller= Leap.Controller()
controller.add_listener(listener)
scene = visual.display(title='Leap Motion Example',
x = 0, y = 0, width = 600, height = 600,
center = (5, 0, 0), background = (0, 0, 0),
visible = True,
scale = (0.005, 0.005, 0.005),
autoscale = False)
balls=[visual.sphere(radius=13,color=visual.color.white,visible=
False)
for _ in range(10)]
print "Press enter to quit"
try:
i = 0
while True:
visual.rate(100)
i += 1
for idx, ball in enumerate(balls):
if idx < len(controller.frame().fingers):
ball.visible = True
ball.pos =
(controller.frame().fingers[idx].tip_position.x,
22
controller.frame().fingers[idx].tip_position.y,
controller.frame().fingers[idx].tip_position.z)
else:
ball.visible = False
if (i == 10):
i = 0
message = listener.on_frame(controller) # calling
LeapMotion on_frame
print message # for debug
a.write(message) # send the command to BoeBot
except KeyboardInterrupt:
pass
finally:
controller.remove_listener(listener)
if __name__=="__main__":
main()
23