return to SSR TOP
return to Daemon Lab TOP

劇安高速アイトラッカー(速報)


last update:2003/11/17

概要

アイトラッカー(アイマークレコーダ)を作成しました。特徴としては

原理

強膜反射法を使っています。詳しい所はgoogleってみてください。
東海大学の山田研究室様の解説がわかりやすいのかも

で?どんな感じ?

回路としては、TinyH8マイコン(秋月)のA/DコンバータにJFET入力のOPアンプで バッファリングして、フォトトランジスタの電流量を入力する。
可変抵抗で明るさを変えられる赤外線LEDをPort8(マイコンのLEDドライブ用ポート) につないでるだけです。
フォトトランジスタはTPS603A、赤外線LEDはジャンクなので型番不明です。

ただし、LEDには改造が必要です
というのも普通のLEDは指向性が強いので、一部分しかてらされなかったり、ちょっとした振動でLEDが動いただけで、光の強さがかわってしまい使いにくいです。
そこで、LEDの頭をけずってたいらにするという作業が必要です。(実はこのアイディアはLED萌えの重機研の人が昔おしえてくれた)
ついでに、私の場合は光量が足りなかったのでさらに削りこんで光量アップもしてます(^^;
あとはLEDとフォトトランジスタを水中眼鏡に取り付けてハードウェアは完成です。(とっても簡単)
あとはシリアルでパソコンにつなぐだけ。半田付初心者の練習にもってこいですね

それだけでうまくいくの?

それで、馬鹿みたいに二つのフォトトランジスタの出力を足したり引いたりするだけで 目の位置がわかるのは、真っ暗な部屋で運用したときのみです。
世の中そんなに甘くありません。
でもそれに対抗するためのノイズリダクションアルゴリズムはとっても簡単です。 以外と世の中甘いものかもしれません

ノイズリダクション(その1)

まず、入力される光を

f(t)=r+C
(r:LEDからの反射光、C:外部からの光(定数))
ここで外部からの光を定数として仮定しているのは。 計測にかかる時間に比べて頭の動くそくどは非常に遅いので外乱光は常に一定の方向から一定の量あるものと考えています。
ここで、LEDをON/OFFすることを考えます。
t1のときLEDはON,t2のときLEDはOFF
f(t1)=r+C
f(t2)=C

なのでf(t1)-f(t2)=r
てなかんじで、2回計測するだけで、外乱光の影響をけせるじゃん!
とおもったけど世の中そんなに甘くない。
蛍光灯のノイズがあるんですね。
この方法でも、数値をめでみてると大体このへんがみてる場所だなーってはわかるし、 適当に移動平均をとればよさげな値がでるんでしょうけど。
そのんなの、女神様がゆるしてもDaemon Labが許しません
だって、数値の統計的処理って苦手なんだもん。

ノイズリダクション(その2)

さて、次の敵は蛍光灯です。
さくっとモデル化しましょう。・・・・・と思ったけどぶっとばして、結論から。
蛍光灯の明るさの変化をsin波と仮定すると、非常に短い時間でなら、線形(y=ax+b)に近似できます。
じゃ、短い時間で計測して線形成分を叩き消せばいいのです。
要領は(その1)と大差ないです。

t1,t2,t3は0.1msごとの時間でその時の明るさをf(t,ON/OFF)で示します。
ON/OFFはLEDのON/OFFを示します
無論、この短い時間に眼球移動はないものと仮定しています

f(t2,ON)-(f(t1,OFF)+f(t3,OFF))=2r
上の式を適当に蛍光灯の光をa*sin(wt)とでもおいてグラフを書いてみてください。
LEDの明るさが適当あれば約2rとなって反射光の明るさだけを取り出せてるはずです。
tinyH8のタイマ割り込みをつかってさくっと実装してみます。
かなりいいかんじです。計測の生データは思いっきり蛍光灯の光ひろって値が鳶まくってるのに。
計算後はわずかにびく付いてるていどです。

ただ、0.1msという速度はLEDドライブ回路かフォトトランジスタの動作速度には酷らしく、ON/OFFの遷移過程だろ?っていう電圧値が観測できました。
だから実際には1*r-0*rをやっているつもりが0.7r-0.2rとかやってるかもしれません。
んなもんだから微妙なタイミング電圧の変動で逆にノイズをのせてるかも。
速い応答速度が得られるような回路でくみなおせば更にノイズを減らせるかも知れません
まぁ、べつにこれで満足行ける性能でてるのでいいんですが。

ノイズリダクション(番外)

このほうほうはさすがにTinyH8単体では実行できません。また、私もまだためしていません
(石川県にいると、電子パーツ地元でうってないからねぇ)
まず、ハードウェア構成構成が変わります。3chのフォトトランジスタの内容を同時にとりこむ必要があります。
TinyH8付属のA/Dコンバータだと1つのA/Dをスイッチで切替えてつかうのでだめです。
さて、(その2)の問題点をかんがえてみましょう。
0.3ms以内で線形に近似できるような低周波はたしかにカットできます。 しかし、センサーが感知できる最高周波数よりも十分遅い周波数をカットすることしか できなさそうなのは上のアルゴリズムから容易に推測できますね?
推測できないひとは、後日報告をまとめるのでそちらを読んでください
さて、どうしましょう。
ここで3本目のセンサーが登場です。
まず前提として、センサーの追従できる最高周波数より十分高い周波数でデータをサンプリングできるものとします。
(そういう速度で、サンプリングしないと高周波数のノイズの影響をうけてしょぼーそのはず)
そして3本目のセンサーはLEDの光だけが入るように細工をしてLEDの明るさをはかります。
3本のセンサーにLEDの光に入るのに距離/光速の時間差がありますが、これは十分無視できるように設計するものとします
あとは、2本のセンサーとled光量センサーの相関を見てあげればLEDの反射光成分のみを切り出すことができます。
フーリエ変換で習いましたよね?ある周波数のsin波と同じ周波数を持つ物の振幅しりたければ、そのsin波を得られたデータに掛算していって和をとればいいのです。
同じことはsin波だけじゃなくて任意の波形でもよさげなのはフーリエ展開を考えると容易に想像できますね?
直観的な理論としてはそんなかんじです。(私も直観的にしかしらない(ぉ))
この際LEDに単純な一つの周波数の矩形波かけると、たまたま同じ周波数成分を含む データを持つ信号原のノイズを強くうけてしまうので、いろいろな周波数を含むような信号をLEDに加えればいいかんじになるでしょう。

とりあえず、この方法はまだ試していないのでだれか試してくれると嬉しいです。
でもこんなことすると15K円はかかりそうなので(汗

注意事項

光センサーが光量に対して線形な出力をすることを仮定しています。
線形じゃない時は変換関数を前段に噛ませる必要があります。
LEDの明るさはダイナミックレンジと外部の明るさを考えて適当に設定してください。
私の場合LEDがonの時の明るさがoffの時の2倍になるようにしました。
あと、LEDの出力をがんがんにあげて目玉焼きをつくらないように気を付けてください

この報告はあくまで速報です、間違っててもしりません