秋月ヘッドトラッカーの製作


ヘッドトラッカーとは

フライトシミュレータのような乗り物ゲーでは、プレイヤーの頭の動きを検出して視点変更することが没入感に繋がる。
また周囲を見回すことで情報量が増え、より楽しめるゲームが多い。
マニアの間では頭の動きを検出するデバイス(ヘッドトラッカー)が多数試されており、自作する方法も色々ある。

頭の動きを検出するデバイスは大別すると光学式と慣性式の2方式に分けられる。

光学式

出典:http://n.camil.chez-alice.fr/

頭に付けたマーカーをカメラで撮影することで頭の動きを検出する方法。
TrackIRを2万円出して買うか、Freetrackというフリーソフトを使い写真のようなLED付き帽子を自作する方法がある。
長所:頭の回転方向検出が正確で、平行移動も検出可能。
短所:部屋の明るさによっては誤検出があるのと、馬鹿みたいな帽子をかぶらなければならない(失礼)

慣性式

出典:https://moderndevice.com/tag/mpu9250/

ジャイロスコープ、加速度計、地磁気センサの3つを組み合わせて頭の回転方向を検出する方法。
長所:明るさに影響されない。コンパクトに作れるため見た目もそこまで馬鹿ではない。
短所:キャリブレーションに失敗するとドリフトが発生し出力がずれていく。平行移動は検出できない。

どちらも一長一短といった感じではあるが、慣性式はキャリブレーションが正確ならばドリフトもなく明るさの変化に影響されないため使いやすさで勝る。
何より馬鹿みたいな帽子をかぶらなくて済むのが大きい。
よってこの記事では慣性式ヘッドトラッカーを秋月電子で手に入るパーツで自作する方法を紹介する。

情報源

Easier, Better, Arduino IMU Head Tracker
この記事から着想を得て作り始めた。

headtracking-from-kris
上の記事のコードを改良したもの。
このプログラムをベースにして、使用されているセンサが秋月電子で手に入らなかったためセンサの値を取得するコードを書き直した。

madgwick_internal_report.pdf
頭の動き検出に使われているアルゴリズム(madgwick algorithm)開発者の論文。
概要
このアルゴリズムは、低速なマイコンで実行するために計算コストが低くなっており、なおかつサンプリングレートが低くても動くようになっている。
センサの出力には必ずノイズとドリフトが含まれるため、センサ・フュージョンと言って多数のセンサを組み合わせてフィードバックし精度を上げることがよく行われる。
このアルゴリズムはジャイロスコープだけでなく、加速度計と地磁気センサを組み合わせドリフトをキャンセルさせている。
ノイズとドリフトを取り除くにはカルマンフィルタを使ってもいいが、計算コストが重く非力なマイコンでは辛いのとパラメータが多く調整が面倒という欠点がある。
madgwick algorithmは勾配降下法を使うシンプルなフィードバックを使っているため計算コストが低くパラメータが1つだけで少ない利点がある。

Arduino Leonardo/Micro As Game Controller/Joystick
Arduino leonardo/microの機能を利用し簡単にUSBジョイスティックとしてPCと接続する方法。

opentrack
Arduinoから送られてきた値をフィルタして実際にゲームで使えるように変換してくれるプログラム。
headtracking-from-kris/opentrack/
opentrackで使えるコンフィグファイル。

部品選定

使用例が多くヒットしプログラムのコピペが楽そうな部品を選んだ。

ジャイロスコープ

出典:http://akizukidenshi.com/catalog/g/gK-06779/

STマイクロL3GD20使用 3軸ジャイロセンサーモジュール
¥750

加速度計

出典:http://akizukidenshi.com/catalog/g/gK-06791/

3軸加速度センサモジュール LIS3DH
¥600

地磁気センサ

出典:http://akizukidenshi.com/catalog/g/gK-09705/

HMC5883L使用 デジタルコンパスモジュール 3軸地磁気センサ DIP化キット
¥600

Arduino micro

出典:http://akizukidenshi.com/catalog/g/gM-08286/

Arduino micro
Arduino leonardoでも可。
USBジョイスティック機能を使うためArduino UNO等は不可。
今回はeBayで買った互換機(パチモノとも言う)を使用した。
¥500

他には長いmicroUSBケーブルが必要。ちゃんとした品質のものを使うこと。
トータルで¥3000~5000円くらいになる。

配線

モジュールは全てI2C接続のため、ArduinoのI2Cバスに繋ぐだけと簡単。
注意点として、普通の電子部品を配置するのと違ってセンサは向きが重要となる。
モジュールの説明書やデータシートを見て、座標系を調べ間違えないように配置する必要がある。
今回使用したコンパスモジュールはブレッドボードに刺すとジャイロや加速度計と90度向きが異なるからコードで修正する必要がある。

プログラム

既存のライブラリを使いつつ作例をコピペして作った。
https://github.com/adafruit/Adafruit_Sensor
https://github.com/adafruit/Adafruit_LIS3DH
加速度センサのライブラリ
https://github.com/jarzebski/Arduino-HMC5883L
コンパスモジュールのライブラリ
https://github.com/pololu/l3g-arduino/blob/master/L3G.h
ジャイロのライブラリ

headtracker-akiduki.ino
作ったプログラム。ライブラリをすべて揃えないと動かないので注意。

キャリブレーション

地磁気センサは使用環境に合わせてキャリブレーションが必須である。
キャリブレーションが正確でないとヘッドトラッカーを動かしていないのに視点が勝手にドリフトしていく。

最小二乗法による球面フィッティングを用いた磁気センサのオフセットの計算[C言語,Arduino]
この記事を参考にキャリブレーションを行うプログラムを作製した。
HMC5883L_calibrate_sphere_fit.ino
このプログラムを実行した状態でヘッドトラッカーを動かすことで、X,Y,Zの各軸の出力最大値/最小値が求められる。
この値をヘッドトラッカーのプログラムに書くことでキャリブレーションを行う。
なお、地磁気は同じ部屋の中でも場所により大きく変わるため使用環境で必ずキャリブレーションを行うこと。場所さえ変わらなければ時間変化はないためキャリブレーションは一度で済む。

完成!


適当なケースに収め、ヘッドホンにくくりつけた。
キャリブレーションが正確ならば何時間ゲームで使っていてもヘッドトラッカー自体はドリフトしない。
しかしながらヘッドホンが頭の動きによって微妙にずれるために若干ドリフトするという残念な結果になった。視点リセットボタンを10分に1回くらい押しながら使っている。

今後の改良案

キャリブレーション
ボタンを押すだけで簡単にキャリブレーションして使い始められるようにしたいが、ヘッドトラッカーのプログラムは既にarduino microのフラッシュメモリを8割以上使っているため統合が難しい。
力技だがArduino M0 Pro等の高性能ボードに取り替える方法がある。

無線化
ヘッドホンがずれる原因のひとつとしてUSBケーブルが引っ張られることがある。
ヘッドトラッカーと無線モジュールを使って無線化することで解決可能だが、バッテリーの充電の問題が発生する。

小型化
9DoF Razor IMU M0
6000円以上するがこれは全てのセンサとマイコンが一体化していて配線の必要がない。
このサイズならばヘッドホンだけでなくメガネに貼ったりもできるだろう。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です