テレプレゼンスPJ インターン参加レポート

はじめに

こんにちは、2月14日から2月25日までNTTコミュニケーションズの職場体験型インターンシップに参加させていただきました関根です。インターンシップにはテレプレゼンスエンジニアとして参加し、VR酔いを軽減するテーマに取り組みました。この記事では、私が体験したインターンシップの内容について紹介できればと思います。

テレプレゼンスロボットとは

テレプレゼンスロボットとは、遠隔操作技術や映像転送技術などを組み合わせることにより、遠隔地であっても、まるでその場にいるように活動できるロボットです。

参考: テレプレゼンスのイメージがわかる動画

今回扱ったテレプレゼンスロボットは、HMD(ヘッドマウントディスプレイ)を使用してカメラの向きの操作と、HMDへのリアルタイム映像表示ができるロボットです。3つのサーボモータによりカメラの姿勢をHMDの姿勢と同期させることができ、2つのカメラの映像をネットワーク経由でHMDの右目と左目それぞれの画面に表示することで、ロボット視点の映像を立体的に表示できます。この技術を使うことで、遠く離れた場所で点検作業やケーブルの差し替えのような簡単な作業をしたいときに、現地に行かなくても自分でロボットを操縦して対応できるようになります。

www.youtube.com

課題

一般的なVRゲームでは、HMDのジャイロセンサ等をもとに自己位置推定を行い、仮想空間上のカメラの位置・姿勢を更新しレンダリングすることで、ユーザーの動きに応じた映像変化を実現しています。

f:id:NTTCom:20220330183340p:plain

対してテレプレゼンスロボットでは、遠隔地のロボットから映像を得る必要があります。 まず、HMDで得られたユーザーの動きを、ネットワーク経由でロボットの姿勢データとして送信します。 次に、この姿勢データに合わせ、カメラの位置と姿勢を内蔵のサーボモータで変更します。 その後、得られたカメラ映像をエンコードし、ネットワーク経由でHMDに送信することでようやくHMD内に映像が表示されます。 このため、テレプレゼンスロボットでは、VRゲームと比べて大きな遅延が発生します。

f:id:NTTCom:20220330183347p:plain

通信遅延については経路や通信環境に依存しますが、例えば日本にいるオペレータがアメリカにあるロボットを操縦する場合、遅延時間は往復で200msほどになります。エンコードについては使用するハードウェアにもよりますが30〜70msほどになります。また、通信やエンコードの遅延時間だけでなく、ロボットがHMDと同じ姿勢になるまでのモータの駆動時間も遅延に含まれます。なお、今回用いたハードウェア構成では、国内ということもあり、合計すると約120msほどの遅延となりました。

カメラの映像は、HMDの左右の液晶にそのまま表示しています。そのため、HMDを被って左右に頭を動かすと、遅延時間の分だけ向いている方向と映像がズレることになります。この遅延は、HMDの動きに対する映像の遅延であるため、実際にHMDを被らないと認識が難しいです。そこで、分かりやすく可視化するために、シミュレータを作成し動画を作成しました。

www.youtube.com

この動画では、遅延がある場合と遅延がない場合を比較しています。 HMDを瞬間的に動かすと、200msの間は画面が固定されたままになります。 逆に200ms後には、何もしていないのに勝手に映像が動くことになります。 これにより、VR酔いと呼ばれる乗り物酔いに近い現象が発生してしまいます。 一度VR酔いが発生すると、テレプレゼンスロボットの使用継続が困難となるため、この課題を解決することは重要です。 応答性の高い高価なモータを用いて抑えることも考えられますが、 今後テレプレゼンスロボットを多用途に普及させる上では、なるべく安価なハードウェアで長距離でも使えるように実装したいところです。 一般的に200msを超えるとVR酔いに耐えられなくなるため、日米間の通信遅延は200msであることを考えると、 遅延時間を減らすアプローチには限界があります。 そこで本インターンシップでは、遅延を許容しつつ映像のズレを軽減できるアプローチを模索しました。

検討手法

テレプレゼンスの場合でも、一般的なVRゲームと同様に、操縦者側のPC内だけで映像の描画ができれば酔いが軽減できると考えられます。 VR酔いの原因は操縦者の姿勢と描画される映像の位置のズレに酔いの原因があるため、 操縦者側のPC内に存在する情報を加工し、この差分を埋めることにしました。

今回は、既に受信済みの映像をリアルタイムに補正することで、遅延がない場合の映像に近づけることにしました。 ロボットからの映像が届いていない状態でも、操縦者の姿勢情報に合わせて映像の描画位置を補正してあげることで、頭部方向と映像のズレを緩和できます。 ただし、カメラの位置のズレに映像の補正で対応するためには、物体との距離が必要となります(カメラを一定量動かした場合、物体が近いほど大きく動きます)。 対して、姿勢のズレに映像の補正で対応する場合、物体との距離は関係ないので、カメラ映像を射影変換するだけで対応可能です。 そこで、今回のインターンシップでは、第一段階として姿勢のズレを低減する方法を提案して設計・実装しました。この射影変換を使った姿勢のズレ補正を可視化した動画が次の通りになります。

www.youtube.com

この動画では、遅延している映像を射影変換によって、遅延がない映像に変換できることを示しています。カメラの視野角を超える範囲は表示できませんが、見えている範囲に関しては遅延がない映像と全く同じになります。この射影変換の処理はクライアントPC(HMDのつながっているPC)内で完結するので、通信遅延やエンコードの遅延の影響を受けることはありません。よって、仮に通信遅延が200msあったとしても、姿勢に関して遅延のない映像にできます。

1.カメラの姿勢の取得

この手法で姿勢のズレを無くすためには、HMDから得られる目標の姿勢と、映像の各フレームで撮影されたタイムスタンプにおけるカメラの姿勢を取得し、姿勢のズレだけ映像を回転する必要があります。単純化すると、HMDの角度がαでカメラの角度がβの場合は、α-βだけ画像を回転すれば良い、ということになります。

f:id:NTTCom:20220330183355p:plain

カメラの角度を取得するためには、ジャイロセンサ等を用いて姿勢推定を行う必要があります。また、得られた姿勢データは、映像の各フレームでのタイムスタンプと同期して、ロボットからクライアントPCに送信する必要があります。最後に、クライアントPCではHMDの姿勢とカメラの姿勢の差分をもとに映像を射影変換することになります。そのため、今回は新しくハードウェア・ソフトウェアの設計・実装をネットワークも含めて行うことになりました。

2.ロボットの姿勢の取得と修正

この手法を実装するにあたり新しく出てきた課題として、ロボットに加わる外力への対応があります。従来の実装では、外力によってロボット本体が回転した場合、HMDが止まっていても映像が勝手に動いていました。しかし、今回の手法では映像が動かない代わりに、映像の表示領域が動くようになります。この現象をシミュレーションした動画が次の通りです。

www.youtube.com

動画では、HMDを動かさずにロボットを外力によって回転させています。従来の補正がない場合では勝手に映像が動きますが、今回の補正では映像自体が動かない代わりに映像の表示枠が動きます。これにより、ロボットを外力で回転したままにすると、射影変換によって動かされた映像の枠が中心からズレて戻らなくなります。テレプレゼンスロボットは、車輪などでロボットごと移動するので、こういった外力への対処は避けて通れません。そこで、カメラの姿勢を一定に保つ姿勢制御(スタビライザのようなもの)を実装することにしました。

www.youtube.com

この姿勢制御では、カメラとは独立して、ロボット台座の姿勢推定を行い、ロボットが外力で動かされた分だけ映像を回転させています。 これにより、外力がある状況でも、HMDの姿勢とロボットの姿勢を同期させられます。 (従来は、ロボット台座に対するカメラ姿勢とHMD姿勢が同期していたが、今回は地面に対するカメラ姿勢とHMD姿勢が同期している)。

テレプレゼンスロボットでは、基本的には室内での利用を前提としていることが多いですが、室内でもコンセントボックスやケーブルをロボットが踏むことで揺れてしまうケースは多いです。 特に、ロール軸(視線の方向)で回転させられた場合、地面が傾くような感覚となり、平衡感覚を失ってVR酔いしやすくなります。こういったVR酔いについては、姿勢制御で根本的に改善できます。次の動画は、頻繁に揺らされる場合のシミュレーションですが、姿勢制御があると映像は全く動くことはなく非常に安定しています。

www.youtube.com

実装

今回のインターンシップでは、2週間で部品の選定からコーディングまで実装する必要があったため、なるべく短期間で高い性能を出せる実装方法を模索しました。ハードウェアなので調達に時間がかかり、破損のリスクも高いため、保険となる代替プランも立てつつ、なるべく予定通りに進められるよう心がけました。

f:id:NTTCom:20220330183403p:plain

1.姿勢推定

姿勢推定は様々なアプローチがあり、突き詰めれば良い性能が期待できますが、短期間のインターンシップのため、姿勢データが直接得られるジャイロセンサBWT901CLを選定しました。BWT901CLは、カルマンフィルタが実装されている9軸センサであり、クォータニオンの姿勢データを200Hzで取得できます。また、バッテリーが内蔵されている他、BluetoothのSPP(Serial Port Profile)によりPCからキャリブレーションや取得データの設定が可能です。

ジャイロセンサの取り付けについては、ロボットにある程度しっかりと固定するため、新しくロボットのカメラとジャイロセンサを取り付けるための治具を設計して3Dプリントしました。テレプレゼンスPJのオフィスに3Dプリンタがあったため、設計データを自宅から送り、社員の方に印刷していただいて、うまく取り付けられるかチェックしてを繰り返しての実装となりました。

f:id:NTTCom:20220330183412j:plain

2.ネットワーク通信

最終的に SkyWay WebRTC Gateway を用いてインターネット上で転送することを考え、 得られた姿勢データは、UDP通信によりロボットからクライアントPCへ送信できるようにしました。 本来であればこの姿勢データを映像と完全に同期させるため、タイムスタンプを用いた実装にする必要がありますが、 今回は試験的な実装ということで、遅延時間(≒エンコード時間)をキャリブレーションして手動入力することにしました。

3.射影変換

もともとHMDへの表示にはUnityが使われているので、単にUnity上でカメラに対して映像が投影された平面を回転させるだけで実装できます。 ただし、厳密に視野角やUnity上の映像の大きさを現実に合わせる必要があったりと細かい調整が求められました。 また、ジャイロセンサも含めて基本的にロボット制御は右手系ですが、Unityは左手系なので、ロボットとクライアントPC間の通信において相互に座標変換の必要がありました。

4.ロボット制御

当初は、3軸の各サーボモータの角度を取得し、カメラに取り付けたジャイロセンサの姿勢と組み合わせることで、ロボットの台座の姿勢を計算しようとしていました。 しかし実装してみると、サーボモータのAPI取得に27ms必要だと分かったため、60FPS出せない事が分かりました。 そこで急遽予定を変更し、ロボットの台座にカメラ側とは別でジャイロセンサを取り付けました。 そして、ジャイロセンサから得られたロボットの台座の姿勢と、ネットワーク経由で得られたHMDの目標姿勢から、サーボモータの目標となる角度計算の処理を実装しました。 最終的にセンサを取り付けて組み上がった、ロボットの写真は次の通りになります。

f:id:NTTCom:20220330183420p:plain

成果物

実装後に、HMD画面も含めて実機の映像を撮影し動画にしたものが次の通りになります。

www.youtube.com

動画の前半では、本体を揺らさずにHMDを様々な角度に動かし、射影変換による補正が効いていることを確認しています。 動画の後半では、社員の方にロボット本体を様々な形で揺らしてもらい、姿勢制御が機能していること、姿勢制御下でもHMDの姿勢変更を反映できることを確認しています。 ロボット本体を揺らされた場合にHMDの画面はほぼ動かなかったため、オペレータ視点だとどのように揺らされているか分からない程にしっかりと補正できていたことは非常に良かったと感じました。 また射影変換による補正については、今回は通信遅延が120msとそこまで大きくなく、さらにチューニングが不完全なため、効果が実感しにくかったです。 但し補正自体は想定通り正しく機能していました。チューニングをしっかりし、遅延によるズレの影響を小さくすれば、VR酔いの解決に大きく近づけられると感じられました。

www.youtube.com

インターンシップを終えた感想

本当にあっという間で非常に密度の高い2週間でした。 今回の実装により、提案した方法を実際に形にして、映像補正によるVR酔い低減の実装例を示すことができたと感じています。 しかしやり残したことも多く、例えば位置に対する補正であったり、映像と姿勢の同期であったり、まだまだやらないといけない事が沢山あるなと思いました。 通信周りは初めての事が多かったですが、テレプレゼンス以外にも幅広く使えそうな知識が身についたので、色々使っていきたいと思います。 また今回はリモートでのロボット開発となったため、ハードウェア周りで難しい局面も多くありましたが、 社員の方がDiscord経由で常にサポートしていただける体制となっていたため、安心して取り組むことができました。 今回のインターンシップで得られた経験を今後の活動に様々な形で活かしていくことができればと思います。 NTTコミュニケーションズのテレプレゼンスPJの皆様、ヒューマンリソース部の皆様、本当にありがとうございました!

 メンターからのコメント

メンターを担当したイノベーションセンターの中蔵です。2週間のインターンシップお疲れ様でした。

今回取り組んでもらったVR酔いの緩和は、単にテレプレゼンスロボットを動かす際に直面する課題というだけではなく、 多くの領域の研究者が長年取り組んでいる大きなテーマです。 短いインターン期間でできることにも限りがあるため、 当初はもっと簡単なゴールラインを設定していました。 しかし、折角やるなら本質的な解決に取り組みたいということで、自ら取組内容を企画・提案してくれました。 初めて触るセンサの挙動を把握した上で、ロボットの適切な位置に取り付けて姿勢情報を取得し、 Unity内の空間座標と照らし合わせながら描画位置を変更するという盛り沢山な内容です。 これを期間内に完成させるだけでなく、デモムービーの撮影まで完了させたのは流石の一言です。

この内容を完成させられたのは、高い技術力を発揮しただけではなく、チーム内の先輩社員とうまく連携できたのも大きいと思います。 要件の聞き取りや既成のロボットの構造把握のために受動的なコミュニケーションをとるだけではなく、 必要に応じて先輩社員に作業を依頼するなど、積極的に周囲を巻き込むことができていました。 今後何をする場合でも活かせる能力なので、ぜひこのまま伸ばしていってほしいと思います。

今回のインターンシップで得た経験が、今後の関根さんの研究や取り組みに役立てば幸いです。 改めて、インターンシップへの参加とご活躍ありがとうございました!

© NTT Communications Corporation 2014