はじめに
こんにちは。
茨城高専でNHKロボコンに参加していたものです。この記事では今年のNHKロボコンで作成したMetaQuestVisualizerについて紹介します。

概要
下記の環境で開発を行いました。
- MetaQuest3s
- Unity 2022.3.62f1
- ros2-for-unity
- meta xr sdk v69.0.1
NHKロボコンでMetaQuest3Sを使用しようと思った経緯は、当時スマートフォンコントローラーとして使用するため6GHz帯のwifiが使用できるandroidスマホを探していたところMetaQuest3,3Sが当てはまることに気づきロボコンでの採用に至りました。
機能
- ロボットモデル,path,goalの表示
- 速度,角速度の表示
- バッテリー電圧の監視
- behabior,緊急停止状態の表示
- コントローラーでの原点合わせ
- ハンドジェスチャーでのUI操作
- コート壁の表示
利点
- マウス操作などなく、現実を歩いて視覚的に3Dの情報をえられる
- ハンドジェスチャーのみで操作や設定の変更が可能
- はじめに原点まわりの壁のみ設置して原点合わせを行うことで残りの壁をmrのオブジェクトに沿って置くことにより短時間でコート設営が可能
原点合わせについて
MRゴーグルであるMetaQuest3sでは本体にある複数のカメラとimuなどにより自己位置推定を行っており、開始位置からの相対的な位置と回転を取得できます。MRやARでは仮想空間と現実空間がずれていると違和感を覚えてしまうため、これを合わせることが必要になってきます。qrコードやARマーカーを用いるなどの位置合わせの手法があります。今回はMetaQuestの本体に加えてコントローラーの相対位置姿勢を取得できる機能を使用して原点合わせを行いました。

これがコントローラーと位置合わせのための治具です。直方体にコントローラーを埋め込んだ形を3dプリンターで作成しました。はじめに左右対称の治具とコントローラーをくっつけて取得した相対位置から治具との角度の差と治具の端からの距離を測定し、実際に原点合わせを行う際はこれをコートのスタートゾーンの壁に押し当てて仮想空間と現実を合わせます。スタート地点の端をrosの原点としているため、これでunityとrosの座標を合い、以降送られてきたtopicの座標にオブジェクトを表示すると現実にあった場所に表示されます。
ロボットモデルについて
関節ごとに分割された3dモデルを用いて、rosのtopicからunity内のロボットモデルを動かせるようにしています。このモデルをゴール位置と現在位置に表示し、姿勢と同時に現在と目標のロボットの関節の状態を見てわかるようになっています。実際にはこのモデルに透明なマテリアルを適用して背景を透過し、完全に視界を遮ることを防いでいます。他のUIや表示するオブジェクトなども視界を遮らないことを意識して作成しています。現実の物体との距離を測定する等のことはしていないため、表示は仮想空間のものが優先されます。透明度の低いオブジェクトを設置すると違和感と現実のものをとらえられない危険が発生します。
オーバーレイUIについて
常に目前に表示されるパネルを設置し、常にみたい情報を表示しています。左に3本のバッテリー電圧、その下に速度加速度、一番下にbehavior、右上に緊急停止と自動運転許可の状態を評ししています。電圧と速度は数値に加えて円形のメーターのようなUIで全体的に意識しなくてもわかることを意識しています。このUIはキャンバスごと取得される本体に追従させることで常に目前に表示しています。情報の黒背景も透明度を上げ、すべてを視界の端に置くことで視界が遮られず、現在は機能していませんが、この追従を少し遅延させることでmrゴーグルによる酔を軽減できます。
空間に浮くUIについて
オーバーレイUIと別に、空間に浮いているUIを作成しました。下段にあるボタンで設定パネル、チェックリストパネル、pc状態パネルの3つを選択可能です。この選択や設定パネルでの空間に表示する情報の表示非表示のトグルは全てコントローラーか、人差し指と親指をつまむハンドジェスチャーで行えます。pc状態パネルにはオーバーレイUIに入り切らなかったPCのcpu,ram使用率,温度,ネットワークの上り下りを表示しています。
その他
他にも足回りの各目標速度やpath,lookaheadの表示などを行っていました。
地区大会でMetaQuest装着者が見ている画面を他の人と共有するために、背中にモニターを背負って表示していました。Meta公式の画面共有の方法ではインターネット接続が必要だったためandroid用のscrcpyを使用してMetaQuestから有線接続でpcに接続し、pcからモニターをはやして画面を共有していました。
さいごに
開発の中でコントローラーとハンドジェスチャーを両立させることが大変でした。これからはunityシミュレーターやそれとMR/VRを組み合わせたものを作成しようと考えています。
