26
2014 年度 入力デバイス LeapMotion の可能性 指導教員 白井英俊 教授 中京大学 情報理工学部 機械情報工学科 学籍番号 H411007 石田 晃基 (2015 1 )

LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

2014 年度

卒 業 論 文

入力デバイス LeapMotion の可能性

指導教員 白井英俊 教授

中京大学 情報理工学部 機械情報工学科

学籍番号 H411007 石田 晃基

(2015 年 1 月)

Page 2: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

卒業論文要旨

題目 入力デバイス 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 のよりよい使用可能性を考えていきたい。

Page 3: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発された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

Page 4: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

第 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

Page 5: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

たその開発に使用したソフトとハードの説明をする。第4章では、Kinect のよ

うに身体の動きを認識できるデバイスと LeapMotion とを比較することで

LeapMotion の長所と短所をはっきりさせる。第5章では経験に基づき、

LeapMotion に対してユーザー面と開発面の両面からその特徴を考察する。第6

章では第 5 章の考察を元に、既存の入力デバイスに代わるものとしての使用可

能性について考察する。第7章では LeapMotion を使ったアプリ開発を踏まえ

て、LeapMotion の可能性について議論する。なお、実際に作成したプログラム

は付録として載せた。

2

Page 6: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

第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

Page 7: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

また、認識可能な範囲として、デバイスの 2.5cm上方、約 60×60×60cmの逆ピ

ラミッド型の3D空間の中で、手と指の動きを感知する。

2.3 LeapMotionSDK

LeapMotionSDK とは LeapMotion を使ったアプリケーションを開発するため

の SDK(Software Development Kit ソフトウェア開発キット)である。これは

C言語を始め、多くのコンピュータ言語の環境をサポートすしており、2014年 5

月には v2.0となり更に詳細な環境を整えることが可能となっている。

4

Page 8: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

第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

Page 9: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

図 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

Page 10: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

図 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

Page 11: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

第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

Page 12: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

た。そのため、わざわざ 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

Page 13: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

第5章 考察

これまでの経験と調査を踏まえて、ユーザー面と開発者面の両方の視点で、

次世代の入力デバイスとして LeapMotionにどのような可能性があるか考察する。

5.1 ユーザー面

3D ゲームで LeapMotion を使用してみたところ、3D での手や指の認識はと

ても詳細なものであると思えた。しかしそれを反映させるソフトの方面でズレ

があるようにも感じた。それは、より正確な動きを人間が行わなければソフト

が反応しない点が多かったためである。プログラムの方でもより正確なデータ

を設定できてしまうため。人間の曖昧なズレを許容できるプログラムが必要だ

と考えられる。

5.2 開発面

LeapMotionSDKによっていろいろな言語がサポートされている。本研究で使っ

た Pythonを含め、特にゲーム開発のような環境で応用の幅が広がり、将来的に

は PCにもマウスなどと同様に標準で取り入れられるのではないかと考えられる。

また、マウス・キーボードに限らず3Dモジュールを利用した架空のモノを擬

似的に触れることができる。

10

Page 14: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

第6章 結論

LeapMotion は手指のジェスチャーの認識によって、機器を制御することが可

能である。また、3次元でのデータを取得することで、擬似的にジェスチャー

を作ることもできる。しかし、1 秒に最大 200 回の認識を行っていることから、

ジェスチャーの途中で例えば手を開いているか閉じているかを判断してしまう

場合があり、人間の認識とのズレが生じる可能性がある。このような場合には

調整が必要となるだろう。

6.1マウスへの応用

LeapMotionSDKに含まれる手指ジェスチャーの認識を使うことで、現実のマウ

スと同様に手指ジェスチャーによるマウス操作ができる。しかし、手や指の認

識において、人間の感覚とのズレが生じることがあり、調整が必要となるであ

ろう。

6.2キーボードへの応用

特定の3次元座標をスイッチボタンとして設定することで、架空のキーボー

ドを作ることができるので、それを並べてキーボードを仮想的に作ることがで

きる。しかし、それはあくまで仮想的なものであり、ユーザーが触ることはで

きない。また、精密に座標設定を行う必要がある。そのため、LeapMotion を用

いた仮想的キーボード応用には工夫が必要となるだろう。また、スマートフォ

ンのように2次元で認識するものではなく 3 次元で認識し解析することから普

段使用するモノとのズレを感じる。

11

Page 15: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

第7章 可能性

LeapMotionの公式サイトでは、LeapMotionを使ったアプリが配布されている。

その主だったものはゲームや遊びに使われるものである。その一つとして本章

ではロボットチェスを取り上げる。これは架空の空間でロボットとチェスを行

うものである(図 7.1)。またこのアプリを例に第 6 章での述べた結論を含め

LeapMotionの可能性を述べる。

図 7.1 ロボットチェスの起動画面

7.1 ロボットチェス

ロボットチェスというアプリを挙げた理由は、必要な動作がマウス・キーボ

ードと似ているからである。ゲームプレーヤーは正確に3Dモジュールの駒を掴

み、目的の位置に置かなければならない。この動作はキーボードの操作として

見た場合、特定の3D座標をスイッチとして指で叩く動作であり。マウスの操作

としていた場合は目的の位置へとカーソルを動かす動作とみなせる。

実際にこのアプリを動してみたところ、駒を動かす場面において、ユーザー

のイメージと認識したソフトの解析とでズレが生じた。このことから本研究の

第6章で挙げられた問題点と同じ点が挙げられる。そのため現状では既存の入

力デバイスからの制御の方が精度が高く、ユーザー面からしても LeapMotionを

実用として使用するためには不十分だと考えられる。

12

Page 16: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

7.2 まとめ

本研究から LeapMotionの性能はソフト、ハード共に次世代型入力デバイスと

しての性能を持っていると考えられる。しかし実用上で性能がデバイスとして

利用することを重視し開発されたアプリと使用するユーザーとの間でズレが生

じる。この問題を克服することで、LeapMotion はマウスやキーボードの代用と

して使えるのではないかと考える。また、LeapMotion の利便性が確かなものに

なることで遠距離でのジェスチャーによる制御も可能となり人の入り込めない

場所での感覚的な動作による制御、ゲームに限らず入力デバイスとしての多様

化が可能だと考えている。

13

Page 17: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

参考文献

中村 薫(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

Page 18: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

謝辞

本研究において指導していただいた白井英俊教授ならびに、様々なアドバイ

スをしていただいた白井研究室の皆様に感謝致します。

15

Page 19: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

付録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

Page 20: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

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

Page 21: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

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

Page 22: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

付録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

Page 23: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

#

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

Page 24: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

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

Page 25: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

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

Page 26: LeapMotion の可能性 - SIRAI's Weblang.sist.chukyo-u.ac.jp/classes/seminar/Papers/2014/Ishida2014GradPaper.pdf · 俊 本研究は、次世代型の入力デバイスとして開発されたLeapMotion

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