メタバースを開発する企業でロボットを制作した話──エイプリルフールメイキング

はじめに

クラスター社の2023年エイプリルフール企画は「『あ~んVR』発売決定」と題し、バーチャル空間と連動して食事を食べさせてくれる物理デバイスを開発・販売する、という内容でした。

もちろん発売というのはジョークなのですが、エイプリルフールに本気で取り組むクラスター社では動画撮影のため実際にバーチャル空間と連動するハードウェアを用意しました。
今回はその開発過程について紹介します。

あいさつ

こんにちは、クラスターでインターンをしている滝竜三です。
普段は主にCluster Creators Guideの記事執筆や、クリエイター向けイベントの会場制作などを担当しています。

3DやUnityに関する制作・発信が今の仕事ですが、もともとは大学院修士までロボット制御を専攻しており、その経歴から今年のエイプリルフール企画にロボット制作担当として参加しています。
ちなみに嬉しかったのが企画にあたってCEOの加藤さんから直々に指名をいただいたことで、専攻を覚えていてくれたことにびっくりしました。

僕が担当したのは主にソフトウェア側で、ロボットアームを目標位置に移動したり、clusterアプリと連動して制御したりといった部分になります。
個別の技術として特段珍しいものはあまりないのですが、Unityとロボットを連携させる一事例として、実際の構成やハマったポイントなどを書いてみます。

実装概要

最初に全体の構成についてざっとまとめます。

メインのハードウェアとしてはElephant Robotics社が販売しているアームロボット「myCobot」と専用グリッパーを利用しています。

ロボット制御にはWindows Subsystem for Linux(WSL)上に構築したROSを使い、IK計算はROSパッケージの「MoveIt!」でおこなっています。
Unityとの連携には「ROS#」アセットを利用し、開発版のclusterアプリに特別に機能を追加して通信する仕組みをつくりました。

ちなみにそれぞれのバージョンはUbuntu 20.04LTS + ROS noetic + Unity 2021.3.4f1です。

環境構築

VR空間とロボットの連動を想定して一台の端末内でVRアプリとROSが同時に使えるよう、WSL(Windows上でLinux環境を扱う機能)を使ってWindowsマシン上でROSを動かすことにしました。

ROSというのはロボット制御用のフレームワークです。Linux上で動作し、C++とPythonで開発ができます。
独立したプログラムや別端末との間で通信する仕組みが提供され、公開されているパッケージを簡単に連携させて再利用できることなどが特徴です。
後継のROS2というのも開発されているのですが、今回は短期開発ということもあり、知見が貯まっていてライブラリも充実しているROSを採用しました。

ROSでロボットを制御するための要件として「GUIが使える」「USBデバイスにアクセスできる」という点があり、WSLの導入にあたってはこのあたりに特に気を付けました。

GUIについてはWSL2を使うことでクリアできました。以前のWSLでは別途X Serverの構築などが必要でしたが、現在デフォルトとなっているWSL2の最新版では手順通り導入するだけでWindowsネイティブアプリと同じような感覚でLinuxのGUIアプリが使えます

learn.microsoft.com

要は最新の環境であれば何も考えず簡単にできるという話なのですが、古い情報が混在しており振り回されました……。

ROSの機能の中でもRViz(ビジュアライズ機能)を使う場合にはもうひとつトラップがあります。このまま使おうとすると、RVizの3Dビュー上にロボットのモデルが正しく表示されませんでした。
これはどうやらWSLでのOpenGLの扱いに起因するようで、~/.bashrcに以下の行を追加して再度読み込むことで解消しました。

export LIBGL_ALWAYS_SOFTWARE=1

もうひとつUSBへのアクセスですが、こちらは以下のリンクで解説されている設定になります。

learn.microsoft.com

Windows側とLinux側にそれぞれusbipというパッケージを導入し、Windows側からWSLにデバイスをアタッチしてやることで、WSLからデバイスにアクセスできるようになります。

目標位置制御の実装

とりあえずミニマムの実装要件としては目標位置へのシンプルなIK制御※なので、そこから開発を進めました。
※アバター関連等の文脈で使われるIKと同じ意味。アーム先端の目標姿勢からそれを満たす関節角を求めること。

最初はRVizによるシミュレーション上で動けばいいので、MoveIt!パッケージのチュートリアルにあるC++サンプルの一部をほぼそのまま、モデルをmyCobotに差し替えて調整しただけのものでテスト。

ここから目標位置をトピック(ROSで使えるプログラム間での通信機能)として入力できるようにし、続いてUnityとの連携部分をつくっていきました。
ちなみにこの時点では撮影用に簡単なVRアプリか何かをつくれたらいいなぁくらいには考えていましたが、cluster自体と連携させることは想定していませんでした。

Unity-ROS間の通信にはUnity Asset Storeで提供されているROS#というアセットを利用しました。ROS#を使うとUnityアプリからROSのトピックをやりとりすることができます(ROS側にはrosbridgeというパッケージが必要です)。
通信先のURLを設定する必要があり、通常はROSが実行されている端末のIPアドレスを入力しますが、今回は同じ端末内でUnityとROSが動くのでlocalhostを指定しておきます。

ちなみに現在clusterのワールド制作に対応しているUnity2021では、ROS#をそのままインポートするとエラーが発生します
ROS#はNewtonsoft.Jsonに依存しておりDLLが同梱されているのですが、Unity2021には同じものが最初から組み込まれているため衝突が起こるようです。Assets/RosSharp/Plugins/ExternalにあるNewtonsoft.Json.dllを削除すると直ります。

UnityからROSにトランスフォーム情報を送る際は座標系の違いにも注意が必要です。今回はUnity側の送信スクリプトで、座標系を変換してからROS側に発行するようにしました。

実機との接続

実機への指令にはmyCobot用のPythonパッケージであるpymycobotを利用しています。
動作計画の関節角情報をpymycobotを通してロボットに送信するだけのシンプルな実装です。

clusterアプリとの連携

VR側の開発のためエンジニアチームと相談し「clusterアプリと本当に連動したら面白いのでは?」ということに。
エンジニアのねおりんさんの協力で、上で実装したROS通信機能を特別に開発版clusterアプリに組み込んでいただきました(もちろん正式リリースには含まれていません)。

机と食べ物を設置したロケ地用ワールドを制作し、Grabbable Item(ワールド内で手に持てるアイテム)としてつくったフォークのTransformにロボットの目標姿勢が追従するようにして撮影に臨みました。

実際の撮影では…...

撮影準備の段階で、VR側と現実側の同時撮影が技術的に難しいことが分かり、結局別撮りすることに。 別撮りであれば連動する意味もあまりないので、安定性を優先してロボットは手動操作で撮影しました。

撮影のため即席で手動コントロール用のプログラムを用意。仕組み的にはキーボードの特定のキー(WASD等)が押されたときに、現在値から一定だけ変化したトランスフォームを目標値として発行するだけの物です(トピックに流し込むだけで別ルートからの指令を与えられるのはROSの便利な部分です)。

本番でのロボット操作も僕が担当。ロボットの速度や動作範囲を制限するなど安全対策はしていましたが、HMDで視界をふさがれているCEO・CTOの口にロボットアームでフォークを突っ込むのはめちゃくちゃ緊張しました。

今後の展望(?)

今回はあくまでエイプリルフール企画ということで動くこと優先の短期開発でしたが、もし今後も開発を続けていけるなら結構面白い研究ができるのではと思っています。

勘のいい方は気づいているかもしれませんが、ここまでに動画等で映っていたRealSense(深度カメラ)の話が出てきていません。
当初はこれで口を認識して位置補正などに利用したいと思っていたのですが、今回は十分に活用するところまで手が回りませんでした。このあたりは今後の課題にしていきたいです。

他にもclusterアプリとの連携も急造で、GameObjectのTransform情報を送って目標姿勢に設定するだけのシンプルなものなのですが、こちらももう少し細かく情報をやりとりできると面白いと思っています。

また今回の記事では書ききれなかったのですが、動画で紹介している筋電刺激による開口なども本当に制作しています。
こちらはハードウェア寄りの話になるので、開発を担当したメタバース研究所の平木さんなどが別の機会に紹介してくれるかと思います。

おわりに

クラスター社は毎年エイプリルフールに力を入れてきましたが、今年はバーチャル空間を飛び出して物理ハードウェアにまで手を出したということで、なかなかインパクトがあったのではないかと思います。

また個人的な感想として、もう今後ロボット開発に関わる機会はないだろうと思っていたので、今回の開発に参加できてとても楽しかったです。大学院での研究とは別に習得したUnity関連の技術と組み合わせられたのも面白かったですね。

今回の企画はあくまでエイプリルフールですが、メタバース研究所も発足したことですし、もしかしたら今後研究が加速して本当にハードウェア開発・販売する…なんてこともあるかもしれません。
いちファンとしても、これからのクラスターがどうなっていくか楽しみです。