津山高専の井上恭輔こと、きょろと申します。
この度、ご要望を頂きました
『どこでもペンタブレット』のプログラムとソースコードを
公開させて頂こうと思います。
ご興味のある方はご自由にお持ち下さい。
汚いソースコードですが、何かのお役に立てれば幸いです。
どうぞよろしくお願い致します♪
【ダウンロード】
どこでもペンタブレット Ver 0.02(zip圧縮/488KB)
ご意見・ご感想もお待ちしております。
お気軽にコメント欄へどうぞ♪
【紹介ビデオの再掲】
http://www.nicovideo.jp/watch/sm1819990
↑ニコニコ動画の方が圧倒的高画質です。
アカウントがある方はこちらをオススメ!
http://jp.youtube.com/watch?v=eAqfhhJ7_9g
一応ようつべ板も。
以下、同封の「うp主のヒトリゴト」からのコピペです。
----
『どこでもペンタブレット』はWiiリモコンと
独自設計の赤外線ペン、ソフトウェアを使用して
普通のモニタやプロジェクタの投影画面を
液晶タブレットみたいに操作可能にする実験システムです。
カーネギーメロン大学ジョニー・リーさんの
Wiiリモコン関連作品に感動したので、
高専だって負けねーぞ!!と無謀にも
独自実装にチャレンジしてみました。
このシステムの特徴はとっても安く作れちゃうという事です。
Bluetooth機能はノートパソコン側に付いているものとして、
Wiiリモコンが3,800円、
そして、私の作った『どこでもペン』は材料費150円くらいです。
もう本当にワクワクさんレベルですね(笑)
この値段であれだけ遊べるのであれば、
私的にはかなり幸せです♪
私はめちゃくちゃ数学が苦手な高専生なわけなんですが、
今回は明確な目的(どこでもペンタブレットの開発)があったので、
頑張って行列やらアフィン変換やらに挑戦してみました。
でも、自分で何か目的をもって実装していると勉強も苦じゃないというか、
こういう数学チックな事も意外に楽しいものだなと思いました(笑)
アフィン変換とかの実装は初めてでしたが、
計算がちゃんと出来てバッチリ動いた時はすごく嬉しいです!!
ガウス・ジョルダン法とかも、
初めて授業で習ったことが役にたった感じです。
ニコニコ動画のコメントで一番「日本語でおk」が多かった
ガウス・ジョルダン法を用いたアフィン変換行列パラメータの算出ですが、
ちょっとだけ解説してみたいと思います。
今回はアフィン変換行列{ {a,b,c} , {d,e,f} , {0,0,1} }の
各パラメータを求めたいわけですが、
この行列を普通に展開すると、
x' = ax + by + c
y' = dx + ey + f
(x,yは画面上の座標、x',y'はカメラ上の座標)
という感じになります。(ここまでは高校数学でおkなのかな?)
xとy、つまり、1つの点から2つの方程式を作る事ができるわけです。
ここで、各方程式の未知のパラメータはa〜fの6つです。、
3つの点から6つの方程式を作る事ができれば、
理論的には値が求まるはずです。
(式と方程式の次数が一致すれば解が求まるというのがあります)
ですが、これを人間が計算していたのでは大変杉なので、
コンピュータに答えを解かせます。
その解かす方法の1つが、ガウス・ジョルダン法というアルゴリズムです。
そして、この方法で答えを出した後に、
求まった変換行列から逆行列を計算します。
逆行列ってのは、要するに掛けたら元の値に戻る逆の行列の事で、
つまりは変換行列の逆行列を掛ける事で、
「逆アフィン変換」ができるというわけです。
逆アフィン変換と言っても、
結局やってることは上記の掛け算だけなので超簡単&高速です。
これをペンの位置が変わるたびに高速で繰り返して
座標を計算しているというわけです。
この方法を用いた主な理由は
1.俺が線形代数(ベクトルとか)が超苦手
2.なんとかアフィン変換行列を出せば全て解決だと思い込んでいた
3.とりあえず連立方程式と言えば
最近授業でやったガウスジョルダンでいいんじゃね?ってノリ
4.お!ガウスジョルダンの計算サンプル転がってるじゃんwwwうめぇwwww
などです(笑)
ですが、アフィン変換に関しては動画公開後に頭の良い方々から意見を頂き、
どうやらがガウス・ジョルダン法使わなくても
変換行列をベクトル的に出すことができるんだそうです。
ほんとマジスカ!!って感じです(笑)
ですが、私は線形代数さっぱりなので、
とりあえず問題なく動くし、現在の実装でいいやwwwと思ってます。
最後に、こうやって紹介映像にした理由ですが、
一般的に外から観ていても全然楽しくないソフトウェア開発も、
ちゃんと編集と演出を加えた映像作品にすることで、
あまり興味が無い人にも楽しんで頂けたら嬉しいなぁという思いからです。
そのため、あえて詳細な情報は間引いて作っています。
「技術をあまり知らない人には概略が分かって楽しい」
& 「技術を知ってる人にはその先が知りたくなる」
っていうレベルを演出の目標にしました。
顔出しはかなり勇気が要りましたが、
(外見に悲しいほど全く自信ないんで…^^;)
ちゃんと顔出しして解説した事を、
ポジティブな印象で評価して頂ける人がいたので、
とても嬉しかったです。
どうもありがとうございました。
映像の方も、少しでも楽しんで頂けていたり、
興味を持って頂けていれば、作者として本当に嬉しい限りです。
このソフトは思ったより本当に簡単にできちゃうので、
興味のある方はぜひ実装に挑戦してみてください。
ちなみに私はペンの部品集めや設計・制作に1時間、
関連技術の収集と動作実験、プログラムの設計・開発で
大体3時間、合計4時間弱くらいで最初のテストランまでできました。
アフィン変換を図書館で調べた時間があるので、
合計すると開発期間は5時間弱くらいです。
本当に日曜プログラミングでできる範囲です。
ちなみに私の卒研はネットワークコミュニケーション系なので、
「どこでもペンタブレット」は完全に趣味&ネタでやってます。
Wiiリモコンはとても面白い技術なので、
興味がある方はぜひ一歩を踏み出してみて下さいね♪
何か解らないこと&お力になれる事があれば、
私の方までお気軽にご連絡ください。
それでは以上、どうもありがとうございました。
くわしい解説ありがとうございますた(^ω^)★
いま受験なんですが余裕ができたらやってみます。
二番煎じなのは否めないですが、1から組み立てて分かりやすく解説した事には凄く意味があると思います。
早速楽しませて頂こうかと思います。
ご感想どうもありがとうございます!!
受験生さんですか、今は追い込みの時期で
忙しそうですね。お疲れ様です!!
ひと段落ついたらぜひ遊んでみてくださいね☆
# 同じ『いのうえ』さんでなんか嬉しいw
>>フミさん
ありがとうございます!!!
そう言って頂けると映像を作って良かったなぁと嬉しく思います。
オリジナルを作られた本家のジョニーさんはマジですごいと思います。
フミさんも面白いものができたらぜひ教えてくださいね♪
科学カテゴリ5位に入ってたので動画を見てみたら…スゲー!
オリジナルの人のも前に見てたんですが、さっそくやってみるという機動力は本当に素晴らしいと思います。
解説も分からんなりに楽しめますし、なによりニコニコには字幕職人さんもいますしねw
さっそくソフトのほうをDLさせていただきました。
僕は現状ではペンの回路図を見ても記号の意味さえわからないんですが、どこかで調べて作ってみようと思います!
ありがとうございました。
http://picasaweb.google.com/nekomataqookun/NOqZjH
100円ショップのペンライトを使って、こんなのを作ってみた。…のはいいんですが、いかんせん電池の持ちが非常に悪い。
むずかしいもんですね。
早速とりあえずzipはおもちかえりぃ〜☆したわけですが、
今度の休みにアキバあたりで道具買い揃えてみます。
しかしながら実装するにはまだまだ勉強不足なので今度姉貴(SE)に相談しつつ作って見ますwww
ソースのキレイキレイ化、おつかれさまでしたww
コメントどうもありがとうございます!すっごく嬉しいです。
そして、ちょっと所用で返信遅くなってごめんなさ!!
>>thomas30さん
ありがとうございます!!!!
そうですね、字幕職人さんや、
あとニコニコの科学タグには、意外に技術力を持たれた方が多いので
いろいろとご指摘やアドバイスを頂いて役立たせてもらっています。
回路はとっても簡単です。ようするにLED(発光ダイオード)が光れば良いというレベルです(笑)
ちなみに足が長いほうが+なんで気をつけてくださいね。
分からない事があったらまたこちらで質問して頂ければと思います。
頑張ってくださいね!!
>>猫又くぅくん
はじめまして!!
ってかスゲーwwwプラケースに入ってますね!!
私のワリバシ製より全然持ち運びやすそうだ(笑)
電池は、私の作った奴はそれなりに持ってる感じです。
何が違うのかな??
たぶん抵抗の入れ具合で変わってくるのかもしれません。
私の場合は電流は100mA流してます。
LED直結だと電流流れまくりますから、
もしかすると、電池も早く無くなるかもしれません。
>>まみでつ。さん
コメントありがとうございます!!
おもちかえりぃ〜☆しましたかwありがとうございます。
かぁいいどこでもペンを頑張って作って見てくださいね(笑)
ペンさえ作れれば、とりあえずは問題なく動くとは思います。
プログラムはキレイキレイ化でかなり簡素になりましたので、
SEのお姉様(羨ましいなw)であれば問題なく理解できると思います。
やってみてください。
部品は
・赤外線LED2個
・トグルスイッチ、またはその代用品1個
・押しボタンスイッチ1個
・電池ケース
・ワリバシ
・抵抗
です。150円くらいで手に入るはずです。
抵抗は、定格1.2VのLEDなら5Ω、
1.5VのLEDなら1Ωくらいがオススメです。
あと、可能であればLEDの拡散キャップというゴムの部品が10円くらいで売っていますので、それを被せると精度が上がります。
また完成したら教えてくださいね!頑張ってください。
制作された写真を見ると、ボタン電池みたいですね。
たしかにボタン電池だと確かに負荷が重いかもしれません。
私の場合は単三電池を使っています。
意外に電源によってLEDの光量が安定するかどうか決まるので、オキシライドまで行かなくても金パナくらいだとベストだと思います。
あと、↑の書き込みで「さん」が抜けてました。ごめんなさい。
早速使ってみたのですが、LEDの2をつけてもいないのに認識されてしまうときがあります。
映像ではそのようなことが起っていなかったので、きっと自作のペンが良くないのだと思いました。
そこで、うp主様のペンのLEDの間がどれくらいになっているかお教え下さいませんでしょうか。よろしくお願い申し上げます。
はじめまして!!!
コメントを頂き、どうもありがとうございます!
LEDペン自作されたんですね!!
その行動力は素晴らしいと思います。
LED2が勝手に認識される問題は、私が最初に作った時も起こりました。
Wiiリモコンは、とりあえず赤外線を認識できる点を2つ見つけると「LED2が点灯した」と誤認識してしまうので、
たとえば、LEDが壁に反射したり、プラスチック樹脂の中で乱反射したりすると、LED1の発光もLED2として認識してしまいます。
LEDは照射角が15度程度しかないので、LEDがそのままだと、カメラの向きとLEDの向きをシビアに気にしないいけなく、意外に厄介です。
一番の解決方法はLED光拡散キャップ
http://akizukidenshi.com/catalog/items2.php?q=%22I-01120%22&s=popularity&p=1&r=1&page=&cl=1
を付ける事です。これで精度が恐ろしく上がります。
ですが「こんなん持ってねーよww」という場合の方が多いでしょうから、丁寧にヤスリ掛けをしてみると同じ効果が得られますので、今よりは良くなると思います。
あとは、LEDの間隔は2センチ〜3センチ程度がベストです。
映像に出てきたペンの位置関係では、やはり誤認識が多かったので私も感覚が短くなるように改良しました。
最後に、回路設計を少しだけ見直すと、かなり誤認識は解消します。
映像の回路では抵抗を2つのLEDで共有しているので、LED2を点灯すると、電流量が半減し、LED1が暗くなってしまいます。
そのため、Wiiリモコンが誤認識し、LED1がLED2の場所に移動したと認識する場合があります。
解決方法としては、抵抗を2つに分けて、電源からLEDへの電力供給を別系統で行う方法がベストです。これで動作がさらに安定すると思います。
以上、いろいろ長文になりましたが、よかったら試してみてくださいね!!
私も成功されるのを楽しみにしております。
例のペンをしばらくして気づいた事。
電池の持ちが悪かったのは、勘違いのようでした。
どうやら、元々入っていた(アクリルケースは、100円ショップで売ってたLEDイルミネーションランプのもの)テスト電池がヘタってただけだったのが原因で。電池交換をして数時間使用後も問題なく使えてます。(定格が5Vなので、抵抗無しで繋いでますが、問題はなさそうです。)
>>ともゆき さん
LEDの表面加工ですが、自分の場合、ハサミの刃をミカンの皮を剥く感じで撫でつけてやってました。(きれいに磨りガラス状になります)
1燈目と2燈目の間は、人差し指の第2間接分位離して作ってますが、認識不良とかはなく、快適に使えてますよ。
あと、LEDの周りに、2cm円のシールにパンチで穴を開けた物を貼ってます。(どうしても、ペンというと先端にLEDが付いてると思ってしまいがちなので、目印にしてます。)
ちと質問なんですが、キャリブレーションで
左右上側2点を採っているようなんですが、
扱う画面の縦横の比率を、固定しているから
なのですか?
こんにちは!
コメントどうもありがとうございます!!
お正月で帰省していたため、
お返事が遅くなってしまってごめんなさい。
>ちと質問なんですが、キャリブレーションで
>左右上側2点を採っているようなんですが、
>扱う画面の縦横の比率を、固定しているから
なのですか?
いいえ、実は映像では編集の関係で
2点しか写していないんですが、
実際にはテロップの説明にあるように
3点の座標からキャリブレーションを行います。
3点のX、Yそれぞれの座標から、
3 x 2 = 6つの方程式を作って、
アフィン変換時のaからfの変数の値を
求めています。
このシステムは座標を変換するだけの単純なシステムなので、
縦横の比率は計算に使わなくても大丈夫なんです☆
以上、ご参考になれば幸いです。
何かわからない事があれば、またお聞きください♪
母語の日本語での解説というだけで早口の英語よりもハードルは低いですw
元ネタがあろうと、ちゃんと明記されているわけですから、自分で理解し、実装し、発表しているわけですからこれはこれで素晴らしいと思います。
使い道は思いつかないのですが、コントローラを買って来ようかと思ったりしてますw
とてもすばらしいソフトウェア、動画解説に感謝です。
早速、LED&拡散キャップでペン作りましたが、家の大画面のテレビでやったら、光量が足りないらしく、LED1、LED2が勝手に入れ替わったりして誤作動してしまいます。
Wiiリモコンのカメラ感度の調整ってできるんですかね??
(PCの画面でやったらうまくいきました。)
USBのバスパワーを利用してペンをつくると便利かもw
久しぶりにとても興味深いものを見た気がします。
ソフトウェアを公開していただいたことに感謝しております。
私の場合工作が苦手なこともあって、LEDを1つだけ載せてクリック機能はワイヤレスマウスで…、と考えました。しかしこれではキャリブレーションができないことに、試してみて気づきました。お時間がありましたら、2つめのLEDを点灯させなくても、マウスのクリックでキャリブレーションが行えるように改良していただけないでしょうか。m(o)m
ちなみに、こんなもの(↓)で実験しています。
http://sakuratan.ddo.jp/imgboard/img-box/img20080130225004.jpg
Logicoolの(プレゼン用)ワイヤレスマウス+割り箸+LED+電池+抵抗です。目処がついたら、さすがにワニ口クリップはやめて半田付けする予定です。
「どこでもペンタブレット」へのコメントを頂き、
どうもありがとうございます!!
また、1月後半は学校関係でとても多忙だったので、
せっかく頂いたコメントを見落としてしまっていて、
お返事が大変遅くなってしまいました。
本当に申し訳ございませんでした。
>>Pochi さま
ありがとうございます!!
作り始めたのは私の趣味レベルでの知的探究心からなので、
本家のジョニーさんのように作品の出来は決して高くはないのですが、
この動画をきっかけに、特に私のような英語が超苦手な学生さんたちにも、
何か情報科学に興味を持ってもらえるきっかけになれば
嬉しいなぁと思っています!
>>NK さま
コメントどうもありがとうございます!!
そう言って頂けるととても嬉しいです。
また、実際に作成して頂いたという事で、
大変嬉しく思っております。重ねて御礼申し上げます。
LEDが入れ替わっちゃうのは、実は私の回路設計が甘いからなんです(^^;)
動画に掲載している回路では、LED2を点等すると、
LED1の電流が半減し、光量が落ちてしまうんです。
解決するには抵抗をそれぞれのLED用に2つ用意し、
電池から直接、並列に繋ぐようにすれば解決するかと思います。
不勉強のせいでご迷惑をおかけしてしまって本当にごめんなさい!
Wiiリモコンの感度は、実はリモコン側のハードウェア処理なので、
プログラム側からではどうにも制御できないようになっています。
なので、認識条件を細かくしてやることで対応するしかありません。
USBバスパワーは素敵ですね!有線になっちゃいますが、
ノートパソコンとかには便利かもですね。
どうもありがとうございました!!
>>こういち さま
コメント頂きありがとうございます!!
すごい!ワイヤレスマウスと組み合わせるとはオリジナリティが出てますね!
動画を見ていただいた方がこういう風に自分なりに技術を
アレンジして興味を持って頂けると言うのは、作者としても嬉しい限りです。
1つのLEDであれば、キャリブレーションだけを通過すれば、
現状のコードでも問題なくマウスと組み合わせて併用できると思いますが、
キャリブレーションが2LED用のコードなので、
たしかにそのままでは使えませんね。
ちょっと現状は卒業を控えて論文執筆や試験&レポートなどで
手一杯なので、修正までもう少しお時間をいただけないでしょうか?
出来る限り要望にはお答えしたいと思いますので、
申し訳ないのですが、何卒よろしくお願いいたします。
または、公開しているプログラムにはソースコードが付属しています。
VBの基本がわかれば処理内容を理解できるように
気合を入れてコメントを入れておりますので、
もしご興味があれば、アレンジにチャレンジして見てください♪
キャリブレーション部のif文を修正するだけでいけると思います。
技術課題は、左クリックの検知部分かな?と予想しています。
C#版で作ってみました。
とにかく動かすことが主でしたので、
LEDは、1個にしました。
ところで逆行列の生成ですが、
(取得する座標) * (アフィン変換行列) =
(スクリーン座標)
で求めれば、最初に求めるアフィン変換行列が求めたい逆行列と一致するのはないでしょうか?
私の場合は、これで動作させてます。
仕事で専門学校の講師もやっているので、
これをもうちょい作り込めば、プロジェクターで投影している画面を直接操作できるようになりとっても便利です。
有り難う御座いました。
プログラマーしていて久々に興奮しながら
組みましたw
天才だ。
早速、いただきますっと...
うーん、ウチの環境ではキャリブレーションマークの出るあたりはカーソルとほぼ一致するけど右下や左下だとかなりズレるな。
他の皆さんはどうでしょ?
プログラム頂戴いたします。
早速ペンを開発しなきゃw
ありがとうございました m(_ _)m
本当にすごいですねぇ・・・
明日はペン作っておかなきゃ・・・
ずっと、
x' = Rz(γ)Rx(β)Ry(α)x+a
(偶然にも、定数は3+3=6)
をイメージしてたけどこっちだと赤外線で距離まで測れないといけないんだな。無茶ぶり
アフィン変換ちゃんはできる子だな。