Featured image of post 自作VR HMD

自作VR HMD

オープンソースのVR HMD(Head Mount Display)を作ってみたので、手順の備忘録です。

イントロ

VR系のゲームをやりたくてHMDを調べていたのですが、既製品だと安い部類に入るMeta Quest 3Sですら4万円を超えるので、 ちょっと手を出しにくいな〜と思っていたところ、「なければ作ってしまえ」という謎の閃きが思い浮かんだので色々と調べてみました。

自作のHMDプロジェクトだと、

  • Relativty
  • Hades VR
  • openVR

が割とポピュラーっぽいです。その中で一番実装が簡単そうな、Relativtyを作ることにしました。

準備

GitHub - relativty/Relativty: An open source VR headset with SteamVR supports for $200

An open source VR headset with SteamVR supports for $200 - relativty/Relativty

GitHub - relativty/Relativty: An open source VR headset with SteamVR supports for $200

RelativtyのGithubを見ると必要な機材は

  • そこそこ高画質なミニディスプレイ(具体的な製品名はHadesVRのページに書いてます)
  • USB HID対応のATmega32U4搭載のマイコン(Arduino Micro, Unoあたり)
  • Fast IMUに対応したジャイロセンサ
  • ハウジング

の4つです。そこで、自分は以下のものを購入しました。

  • デジスプレイ:アリエク産2K LCDディスプレイ + 制御ボード (商品リンク)
  • マイコン:Arduino Micro
  • ジャイロセンサ:アリエク産 MPU9250
  • HMDのハウス:エレコム VRゴーグル

これで準備OKです。

電子系の組み立て

組み立ては難しいことは何もないです。 READMEに書いてある通り、ジャイロセンサとArduinoの指定のピンを繋ぐだけです。

接続図

1
2
3
4
5
Arduino         ジャイロセンサ
VCC         ->  VCC  
GND         ->  GND  
SDA         ->  SDA  
SCL         ->  SCL  

強いていうなら、センサの足がはんだされない状態で届いたので、はんだ付けだけ少々面倒でした。

ハウジングへの組み込み

Relativty本家は、ハウジングも3Dプリンタで制作していましたが、それは面倒なので既製品を流用することにしました。 安価で、両目が独立でピント調節可能で、配線がしやすそうなエレコム製のVRハウジングを購入しました。

スタンダードVRゴーグル

エレコム VRゴーグル スタンダード 4.8~7インチ対応 VR ゴーグル ブラック VRG-M02BK

スタンダードVRゴーグル

問題は、ディスプレイが薄いため、そのままだとハウジングと密着せず光が漏れてしまうこと、センサ部分をどうやってハウジングに接着するかです。

そこで、3Dプリンターで、ディスプレイとセンサ類の台座を作成しました。

台座

ディスプレイの台座はスマホくらいの厚みとヴェゼルが出るようにして、センサやコネクタ類の台座は、粘着テープで固定できるように低面積を稼ぐような設計にしました。

ここで気をつけないといけないのが、センサーの向きがFastIMUの仕様で制限されてしまうので、FastIMUのREADMEを読んで、それに従った向きで取り付けるようにする必要があります。

完成写真

これで、ガワは完成です。組み立てで気をつけないといけない点は以下の2つです。

  • ハウジングが既製品の流用のため、それに合わせて電子部品の治具を作る必要がある
  • センサの向きがFastIMUで決まっているので、Readmeをちゃんと読む必要がある

くらいです。組み立ては難しくなかったです。

Arduinoへの書き込み

Arduino IDEはインストールされているものとします。

ライブラリマネージャーから「Fast IMU」と検索し、インストールします。

インストールが完了すると、「スケッチ例」に「FastIMU」という項目が追加されるので、「Calibrated_relativty」を選択します。

fastIMUのインストール

IDEに出てきたスケッチの中で、13行目あたりに注目してください。

1
2
3
4
5
MPU9250 IMU;                //Change to the name of any supported IMU!

#define IMU_GEOMETRY 0		  //Change to your current IMU geomtery (check docs for a reference pic).

// Currently supported IMUS: MPU9255 MPU9250 MPU6886 MPU6500 MPU6050 ICM20689 ICM20690 BMI055 BMX055 BMI160 LSM6DS3 LSM6DSL QMI8658

IMUの種類と向きによって、ここの定数を変えてねというコメントがあるので、変更します。

向きと番号の関係はFastIMUのREADMEに書いてありますので、確認しましょう。

13行目に //Change to the address of the IMUと書いてありますが、ここは多分変えなくて大丈夫。

自分のセンサの状態に合わせて変更を加えたら、書き込みます。

書き込みに成功している場合、Arduino IDEのコンソールにキャリブレーション実行のメッセージが出てきます。

上手くいかない場合は、エラーメッセージをchatGPTに投げましょう。

steamVRの設定

RelativtyのGitHub通りに設定します。

完成

steamVRを起動してあげて、モニタに映れば完成です。

トラブル

これで完成かと思いきや自分は2つのトラブルが発生しました。

トラブル1:ディスプレイが映らない

HDMIと電源ケーブルをディスプレイに刺しても映像が出力されずにずっと真っ黒な画面のままでした。

でも、windows側に認識はされているし、必要電圧と電流は調べているので問題ないはず…もしや不良品か?と思ったのですが、

業者に聞いてみたところ、HDMIのバージョン指定があるよ、と言われました。

知らなかった…そんなの…

ということで、その辺に落ちていたケーブルではなく、業者に言われたバージョンのHDMIケーブルを刺したところ無事映りました。

トラブル2:ドリフトが発生する

いざ使ってみると、時間がたつにつれて、Z軸中心にちょっとずつ回転し始めてしまいました。

俗にいうジャイロセンサのドリフト問題です。

いろいろコードを弄り回したのですが、まだ解決できていません。

ワンチャン、アリエク品なので不良を引き当てた可能性はあるのですが、Fast IMU対応で、国内販売しているセンサの数が少なすぎて困っています。

直ったら加筆したいと思います。

使ってみての感想

ドリフト問題が直っていないので、100%体感できたわけではないですが、steamVRの最初の部屋と、F1 22をプレイしてみました。

F1 22

感想としては、「ちゃんと3Dになって見えるが、ピントが合わせにくく、すぐに酔いそう」です。

モニターがちっちゃいせいもあるのか、視界がかなり狭く、目の焦点を合わせにくくて、だいぶ疲れました。

また、そのせいで没入感に制限がかかってしまっているのも悔しいところです。

結論

今回、材料費が円安もあって2万くらいかかりました。

確かに既製品と比べると安く済みましたが、ケーブルの取り回しが面倒だったり、動きも制限されていたりと、できることも少ないです。

またジャイロの補正が貧弱なので、ドリフトも発生してしまい、既製品の完成度の高さを感じてしまった側面もあります。

VRのトラッキングや、arduinoとsteamVRの通信まわりを勉強するのにはとても役に立ちましたが、VRを楽しむのが目的ならMeta Quest 3Sを大人しく買うのが最適解です。

ドリフトだけは悔しいので解決できるように試行錯誤します。

終わり

Hugo で構築されています。
テーマ StackJimmy によって設計されています。