2012-06-13

脳波ヘッドセットでハンズフリーウェブブラウジングシステムを作る

両手が塞がる食事中でも,快適にインターネットができる仕組みが求められている.そこで手元にあったEmotiv EPOC HeadsetとEmotiv SDK付属ツールを使って実験した.



手法

今回はeclipseを起動するのが面倒だったので,プログラミングはせず,SDK付属ツールだけで実験した.

マウス操作

EmotivControlPanelからMouse Emulaterというツールが起動できるので,これを使う.Mouse Emulaterはヘッドセットのジャイロセンサの値を使ってマウスカーソルを動かすツール.感度が良くブレも無いので思い通りにマウスカーソルを動かせる.

キーボード操作

SDK付属のEmoKeyを使う.EmoKeyはEmotiv SDKで取得した値を条件にキーボードイベントを生成できる.まずEmotiv SDKで取得できる値は次の通り.上手く翻訳できないので原文ままの単語も載せる.

感情 (それぞれ 0.0 ~ 1.0の値)

  • Engagement/Boredom
  • Frustration
  • Meditation
  • Instantaneous Excitement
  • Long Term Excitement

表情

  • Blink: まばたき
  • Wink: ウィンク (Right | Left)
  • Look: 視線の動き (Right | Left)
  • Brow: 額の動き (Rise | Furrow)
  • Smile: 笑顔
  • Clench: 歯を食いしばる
  • Smirk: 頬を吊りあげる (Right | Left)
  • Laugh: 笑い
  • Natural: 標準

カスタム(トレーニングデータ使用)

  • Push
  • Pull
  • Down
  • Up
使える値はEmotiv Composerを見るとだいたいわかる



食事中を想定しているので,口の周りの動きに影響を受けるClenchやSmirkは使えない.Blinkは使えそうだが,これは抑制が難しくしばしば誤発動する.個人的には額の動きが簡単だったので,これを左クリックにマッピングした.スクロールのためのjkキーはウィンクにした.

結果

Chrome拡張のkeyconfig等と組み合せると割と使える事がわかった,ドラッグも不可能では無くマウスの移動精度にストレスは感じない.逆に悪い点としては,味覚がまったく機能しなくなり,何を食べているのかわからなくなる.実験にはモスバーガーを用いたのだが,随分と勿体無い事をした.ハンズフリーインターネット時には100円程度のジャンクバーガーで十分だった.

番外編,感情の値を使った自動リブログ

せっかくの脳波ヘッドセットなので,感情の値も使ってみたい.なので,Instantaneous Excitement (瞬間的興味?) の値が上昇したらリブログするパターンもやってみた.即ち,自分の興味関心のあるコンテンツを自動でリブログしてくれる夢のシステムである.

設定はこんな感じ






Instantaneous Excitementの値が上下するのにやや時間がかかるため,高速でフィードを消化するような場面には適用できないが,何かに使えるのかもしれない.

次回はちゃんとEmotiv SDKを使ってコードを書いてやります.

このエントリーをはてなブックマークに追加

2012-05-28

新たなKineticデバイス「LEAP」の注文をするなど


彗星の如く登場して各界を賑わせているLEAPについて.

Leap Motion
https://live.leapmotion.com/index.html



D

公式サイトから読み取れる事

  • マウスの代りになるデバイスである
  • iPodサイズでUSBでコンピューターに接続して使う
  • 小売価格は69.99USドル
  • 既存の3Dセンサーの100倍以上の精度
  • MaxOS, Windows7, Windows8 に対応

今できる事

  • プレオーダー (発送は 2012年12月か2013年1月)
  • 開発者登録
日本への発送だと,送料込みで82.98USDになります.とりあえず一台注文して開発者登録をしておきました.SDKの入手には開発者登録が必要の様です.


このエントリーをはてなブックマークに追加

2012-04-16

Struct.js ver. 0.3をリリースしました

欲しかった機能が実装できたのでタグを切りました。

主な機能追加

  • ネストした構造のサポート
  • nullableオプションの追加
  • カスタムバリデーション関数のサポート
  • 設定で全チェックを無効化する機能を追加
  • 初期作成時の値チェックを追加
型チェックのためのコーディングをなるべく増やさない、というポリシーです。なので、素のObjectと同様に扱えるが必要なチェック機構は備えている、という物を目指しています。しかし副作用としてプロパティの有無でそれが何であるかを判定するダックタイピングは不可能になってしまったので、そこだけは Struct.getType(obj) を使います。

リリース用の設定

Proxyオブジェクトを生成しないので、通常のプロパティアクセスのコストだけになる。
Struct.configure({
  // 全てのチェック無効化
  'disable any check': true
});

バリデーション関数のサポート

Struct.define('Size', {
  width:  {type: 'number', cond: 'v >= 0'},
  height: {type: 'number', cond: function(v){return v >= 0} /*same as ↑*/}
});

var size = Struct.create('Size', {
  width: 0,
  height: 0
});

ネスト構造のサポート

Struct.create にネストしたObjectをそのまま食わせても大丈夫。
Struct.define('Position', {
  x: {type: 'number', nullable: false},
  y: {type: 'number', nullable: false}
});

Struct.define('Size', {
  width:  {type: 'number', nullable: false, cond: 'v >= 0'},
  height: {type: 'number', nullable: false, cond: 'v >= 0'}
});

Struct.define('Rect', {
  pos:  {type: 'struct:Position', nullable: false},
  size: {type: 'struct:Size', nullable: false},
  createdAt: {type: 'date', writable: false}
});

var rect = Struct.create('Rect', {
  pos: {x: 0, y: 0},
  size: {width: 100, height: 100},
  createdAt: new Date()
});

rect.pos.x = "200"; // => type mismatch error
rect.size.height = -1; // => condition formula validation error

今後の予定

次は関数呼び出しのパラメータチェックを実装する予定。



このエントリーをはてなブックマークに追加

2012-04-04

JavaScriptでrubyのmethod_missingを実装する

追記: Firefoxの実装で既に有る__noSuchMethod__に名前は合せた方が良い、というコメントを頂いたので名前を変えました。

何の役に立つか不明だけど書いてみた*1。Proxyでプロパティアクセスをフックして、存在しない場合は用意しておいた関数プロキシを返す。

上記の処理が書いてあるのはこの部分。
function enableMethodMissing(obj) {
  // 関数プロキシの作成
  var functionHandler = createBaseHandler({});
  functionHandler.get = function(receiver, name) {
  // プロパティアクセスの場合は何も返さない
    return function(){};
  }

  var calledProperty;
  var trapFn = Proxy.createFunction(functionHandler, function() {
    // 実行の場合は obj.methodMissing を呼び出す
    return obj.__noSuchMethod__(calledProperty, Array.prototype.slice.call(arguments));
  });

  // プロパティプロキシの作成
  var propertyAccessHandler = createBaseHandler(obj);
  propertyAccessHandler.get = function(receiver, name) {
    if (obj[name]) {
      return obj[name];
    } else {
      // 存在しないプロパティへのアクセスは関数プロキシを返す
      calledProperty = name;
      return trapFn;
    }
  }
  return Proxy.create(propertyAccessHandler);

// (略)
method_missing用の関数をわざわざProxy.createFunctionしているのは、プロパティアクセスの時はundefinedを返す、関数呼び出しの時はmethod_missing用の関数実行と処理を分けるため。
Proxyが何に使えるか、というのはこの動画がわかりやすかった。


D



*1:Firefox4以降 or JavaScriptの実験機能を有効にしたChromeでのみ動作します。





このエントリーをはてなブックマークに追加

2012-03-29

ChromeでECMAScript 6のProxyを有効にする

ECMAScript 6(候補)のProxyはChromeのデフォルト状態では使えない、前の記事で紹介したStruct.jsはProxyを使っているため、Chromeでチェック機構を有効にするには設定をいじる必要があります。

手順

アドレスバーからchrome://flagsを開く

f:id:hagino_3000:20120329024105p:image:w360

JavaScript の試験運用機能を有効にする の所で「有効にする」をクリック

f:id:hagino_3000:20120329024104p:image:w360

chromeを再起動

動作確認

こんなコードでOK

> typeof(Proxy); // => object
> typeof(Proxy.create); // => function

ただ、これだけではいろいろと足りない物があるので、同時にECMAScript 6のメソッドを補完してくれる es6-shim.js を使うと良いです。



このエントリーをはてなブックマークに追加