1. 概要
以下のような記事です(*´v`)
-
Unity
を初めて触るITエンジニアが、Windows WSL2 でUnity-Robotics-Hub
を試してみた - Unity の
公式ツール
及び公式手順
を利用 - 環境構築には
docker
を使用 - 高速と言われている
ROS
通信の中でも、ROS2
を使う
他にも類似記事はありますが、この記事は「余計なものを一切インストールせずに、公式手順に沿った最低限のものをインストールする手順を知りたい」という方にとって嬉しい内容になっていると思います。
補足
「5. 関連記事」の 3. ros2-for-unity-について で少し触れているのですが、どうやら、「Unity-Robotics-Hub」よりも 3rd パーティツールの「ros2-for-unity」の方が速度面では有利?と言われています。
速度をゴリゴリに重視したい人は「ros2-for-unity」を使っていただいた方が良いのかもしれません|qд・,,)...
2. イメージ
2-1. 通信のイメージ図
正確ではないかもしれませんが、概ねこのようなネットワーク構成になるように目指します。
2-2. 作業完了後の動作イメージ
以下のような動作を確認できます。
実は、ロボットや固定の置物は Unity のチュートリアルで自動生成できるのですが、今回チャレンジするデモでは、宙に浮いているブロックの位置や姿勢の情報が ROS2
経由で Unity-Robotics-Hub
へと送信されていることを確認することができます。
ここまで頑張っていきましょう!(*˘︶˘*)
3. 前提
3-1. 対象者
「Unity を全く触ったことがない」というシステムエンジニア向けの記事です。
Linux コマンドや Docker の扱いにはそこそこ慣れている前提で記事が書かれています。
一方、 Unity に関する知識はゼロという前提なので、 Unity 周りの操作はウザイくらいに細かく手順を記載しています。
3-2. 実行環境
私が各作業を実施した環境です。
Tool | Version |
---|---|
OS | Windows 11 Home |
Windows | 24H2 |
プロセッサ (CPU) | AMD Ryzen 7 4700U with Radeon Graphics 2.00 GHz |
WSL | 2 |
3-3. Dependencies
WSL 上に以下の package をインストールしておく必要があります。
- git
- docker
これらのインストール方法は割愛します。
4. 手順
4-1. Unity インストール
Unity インストール済みの人は、「2.」へ飛んでください( *¯ ꒳¯*)✨
Unity のインストール手順を見る
インストーラのダウンロード
以下の公式サイトにアクセスすると、
以下のような画面が現れますので、真ん中の「ダウンロード」をクリックしましょう。
次に「DOWNLOAD FOR WINDOWS」をクリックします!
すると、UnityHubSetup.exe
というファイルがダウンロードされます。
Unity インストール
downloadした UnityHubSetup.exe
を実行しましょう!
実行すると以下のような window が現れます。
同意すると、以下の画面に切り替わります。
「インストール」をクリックしましょう。
待ちます...c(⌒(_*˘ㅿ˘)_スヤァ
「Unity Hub を実行」と書かれたチェックボックスをオンにしたまま「完了」ボタンをクリックすれば、Unity が起動されます。
4-2. Unity の基礎セットアップ
「アカウント作成」と「Unity Editor」のインストールを行います!
これらが済んでいる方は、次の「3.」へ移動してください。
Unity の基礎セットアップ手順を見る
Unity を起動したところ、「Sign in」と書かれたボタンが現れました。
Unity のソフトウェアを使うためには、アカウントが必要なようです。
「Create account」からアカウントを作成します。
アカウントを作成したら、今度は「Sign in」ボタンをクリックします。
今度は「Unity Editor」のインストール画面が現れます。「Install Unity Editor」と書かれたボタンをクリックします。
「Agree」!
Unity Editor のインストールが始まります。
注意:UAC:ユーザーアカウント制御のポップアップが出てきたら適宜承認して下さい。
このインストール、結構時間がかかります!( *`ω´*) ≡3≡3ふんす!
私の場合は、10~20分くらいかかった気がします。もしかしたら、気長に待つ必要があるかもしれません(ネットワーク環境次第か?)
上記のように、「Install complete」と表示されれば、インストール完了の合図です!
4-3. Unity-Robotics-Hub の準備 (In WSL)
ここまでは Windows の UI 上での作業でしたが、この項目では、WSL 内で作業をしていきます。
以下の Unity 公式の GitHub のドキュメントに従って作業していきます。
まず、 Unity-Robotics-Hub
のリポジトリをクローンします。
# repository をクローン
$ git clone https://github.com/Unity-Technologies/Unity-Robotics-Hub.git
# Dockerfile のあるディレクトリへ移動
$ cd Unity-Robotics-Hub/tutorials/ros_unity_integration
# Docker image 作成
$ docker build -t foxy -f ros2_docker/Dockerfile .
# Docker コンテナ起動
$ docker run -it --rm -p 10000:10000 foxy /bin/bash
# コンテナ内で、 Unity-Robotics-Hub のサーバを起動
root@c1630e8588aa:/home/dev_ws# ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0
# 実行結果
[INFO] [1746270912.834092684] [UnityEndpoint]: Starting server on 0.0.0.0:10000
[INFO] [1746270912.834092684] [UnityEndpoint]: Starting server on 0.0.0.0:10000
のようなメッセージが現れれば、ひとまず「4-3.」は成功です。
4-4. Project の作成
ここからは、 Windows UI 側での操作です。
Unity におけるもっとも大きな管理対象は Project
と呼ばれているようです。
そのプロジェクトの中に、物体やキャラクター、音声などが作成されます。
「4-4.」では、この最も基本的な単位である Project
を作成します。
作成済みの方は「4-5.」へスキップして下さい。
Unity Project 作成手順を見る
まず、「New project」をクリックします。
次に、どれか一つ template を選択して、「Download template」を選択します。
私は、一番基礎のチュートリアルが入っていそうな、「Get Started With Unity」を選択してダウンロードしました。
「Projet name」の欄は自由に変えられるようなので、これを更新して、「Create project」をクリックします。
すると、Project 作成が始まります。
ちょっとカッコイイロゴと、プログレスバーが表示されます(赤色矢印の先がプログレスバー)
地味に待ち時間が長いですが、しばらくすると、以下のように Get started With Unity と書かれたポップアップウィンドウが現れました。これは選んだ template によって違うと思いますが、これで Project 作成は成功です。
ちなみに、「Start the tour」をクリックすると、 Unity のチュートリアルを受けることができます。すぐに終わるので、初めて Unity に触る人は見ておいて損はないと思います。
4-5. ROS2 通信用のセットアップ
「4-3」起動した Unity-Robotics-Hub
のサーバに対して、 Unity からアクセスできるようにします。
GitHub の以下のリンク先の記載に従って、ROS2 通信を行うために、 Unity 側の設定を行います。
私の場合、 Version が変わっていたのか、GitHub のドキュメントとは若干差異がありました。
4-5-1. ROS-TCP-Connector のインストール
ROS 通信を行うためのモジュールである、 ROS-TCP-Connector
を git を利用して Unity 内に install します。
以下の添付画像の通り、メニュー内の「window」-->「Package Management」-->「Package Manager」の順にクリックしてください。
すると、次の画像のようなポップアップメニューが現れますので、やはり画像の通り、「+」ボタン -->「Install package from git URL ...」の順にクリックしてください。
次に、「Install package from git URL」というテキストの下にある入力フォームに、公式ドキュメント に記載されている通り、 https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/setup.md#-unity-setup
と入力し、「install」ボタンをクリックします。(以下の画像を参照)
すると、以下のように待機中のメッセージやプログレスバーなどが表示されますが...
やがて、以下のように「ROS-TCP-Connector」という表示が現れます。
これで、「4-5-1. ROS-TCP-Connector のインストール」は完了です。
4-5-2. ROS 通信の設定
引き続き Unity の UI 画面から設定の変更を行っていきます。
以下の画像の通り、「Robotics」-->「ROS Settings」の順にクリックしていきましょう!
すると、以下のようなウィンドウが現れますので、「Protocol」を「ROS2」に変更します。
今回は docker で ROS-Robotics-Hub を構築しているので、それ以外の変更は不要です。
プルダウンを「ROS2」に変更したら、「ROS Settings」はもう「x」ボタンで閉じてしまって大丈夫です。
4-6. デモによる動作確認
ここまでの設定が全て正しく行えているかを確認するため、デモプロジェクトを用意して動かしてみます。楽しみですね!(*>ᴗ<*)
4-6-1. デモのインストール
今度は UI ではなく、 WSL の中での操作になるので、コマンドをぽちぽちしていきます。
項目としては、以下のリンク先の「Install Unity Robotics Demo」の作業を進める形になります。
ここからはちょっと、WSL や docker の操作に慣れていないと難易度高いかもですが、頑張りましょう(; ・`д・´)
まず、 Docker コンテナの中に入ります。
以下の、「1. Docker コンテナを起動する」か「2. Docker コンテナ内へアクセスする」のうち、どちらかのみを実施します。
# Dockerfile のあるディレクトリへ移動
$ cd Unity-Robotics-Hub/tutorials/ros_unity_integration
# ----------- 1. Docker コンテナを起動する(起動前の場合) -----------
$ docker run -it --rm -p 10000:10000 foxy /bin/bash
# ----------- 2. Docker コンテナ内へアクセスする(起動済の場合) -----------
# 起動されているコンテナ名を確認
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e960f81518b9 foxy "/ros_entrypoint.sh …" 4 minutes ago Up 3 minutes 0.0.0.0:10000->10000/tcp, :::10000->10000/tcp hardcore_johnson
# 確認した Name のコンテナへアクセス
$ docker exec -it hardcore_johnson /bin/bash
# 結果
root@e960f81518b9:/home/dev_ws#
上記のように、root
アカウントでコンテナ内へログインできていれば、ここまで成功です。
次は、ディレクトリ位置はそのまま変更せずに、 colcon build
と source install/setup.bash
を実行します。
root@e960f81518b9:/home/dev_ws# colcon build
Starting >>> ros_tcp_endpoint
Starting >>> unity_robotics_demo
Starting >>> unity_robotics_demo_msgs
Finished <<< ros_tcp_endpoint [1.35s]
Finished <<< unity_robotics_demo_msgs [1.33s]
Finished <<< unity_robotics_demo [1.36s]
Summary: 3 packages finished [1.65s]
root@e960f81518b9:/home/dev_ws# source install/setup.bash
source install/setup.bash
を実行しても何も起きませんが、これで成功のようです。
次は UI から Unity を操作していきます。
まず、以下のように「Robotics」-->「Generate ROS Messages..」の順にクリックしましょう(*´v`)
次に、以下の画像に表示されている「ROS message path」の部分に WSL の中にあるディレクトリである、 tutorials/ros_unity_integration/ros_packages/unity_robotics_demo_msgs
ディレクトリへのフルパスを記載する必要があります。これがちょっと難しいですが、集中していきましょう。
「ROS message path」の横の「Browse」ボタンをクリックしてください。
そうすると、以下のような Windows のエクスプローラが起動します。
ここでヒントなのですが、 Windows UI 側から WSL 内のディレクトリにアクセスする方法は以下の記事に書かれているのですが、パス入力の際に \\wsl$
を先頭に渡すとよいです。
具体的にどうするかというと、一つ上の画像において赤丸で囲んだパス入力欄に、 \\wsl$
と入力して Enter キーを押下します。すると、以下のように、あなたの WSL に用意されている Linux Distribution の名前が表示されると思います。
上記のような状態になったら、今回使用している Linux を選択してダブルクリックすると、もうそこは WSL の中のディレクトリになっています。
あとは、 tutorials/ros_unity_integration/ros_packages/unity_robotics_demo_msgs
ディレクトリまでたどって、「フォルダーの選択」ボタンをクリックすればOKです!
ちなみにですが、私の場合は「フォルダーの選択」をクリックしたところ、以下のようなパスになりました。
\\wsl.localhost\Ubuntu/home/user_name/unity_dev/Unity-Robotics-Hub/tutorials/ros_unity_integration/ros_packages/unity_robotics_demo_msgs
あとは、以下の画像の通り、「unity_robotics_demo_msgs」の横の三角、その下の三角を順にクリックし、その後、「Build 2 srvs」「Build 2 msgs」をクリックしましょう。
すると、以下の画像のように Unity のプロジェクト画面の Project タブ - Assets 以下に、「RosMessages/UnityRoboticsDemo/msg」などが生成されています。
これで、ここまでの操作が成功していることが確認できます。
4-6-2. Publisher によるデモ動作確認
ここまでお疲れさまでした( *¯ ꒳¯*)✨
遂にデモ動作の確認です!
引き続き、公式 GitHub ドキュメントの以下の手順に従ってやっていきます。
上記リンク先の「Setting Up」は既にこれまで実施してきているので、そこはスキップしましょう。
ここでは、「GameObject の位置と姿勢を publish する」ということをやるようです。何が起きるのか楽しみですね|・`ω・´)
ここからの操作も、 Unity の Project の UI 画面から行っていきます。
4-6-2-1. C# ソースコードの作成
まず空のファイルを作成します。
以下の画像のように「Assets」-->「SourceFiles」-->「Scripts」を開いた状態で、「RosPublisherExample
」という空のファイルを追加します。
ファイルの追加は以下のように行うことができます。
ファイルを追加したいディレクトリの中で右クリックし、「Create」-->「Scripting」-->「Empty C# Script」をクリックすると、空のファイルが作成されます。あとは、ファイル名を RosPublisherExample
へと変更しましょう。
次に、このファイルの中身を編集します。
以下のように、ファイルを右クリックして「Open」をクリックすると、お使いのエディタ上にファイルが開かれます。
ファイルが開かれたら、中身の文字列を消して空ファイルにし、その後、 Unity-Robotics-Hub
のドキュメントに記載されている RosPublisherExample.cs のコード をコピーしてきて貼り付けます。
これを保存すれば OK です。
4-6-2-2. 回転体オブジェクトの追加
デモで操作対象になる Cube
というオブジェクトを Unity のプロジェクトに追加します。
以下のようにして行うことができます。
Unity の Project 画面内左上にある Hierarchy と書かれたタブ内の「+」ボタンを押下し、「3D Object」-->「Cube」の順にクリックします。
すると、以下のように「Cube」という項目が Hierarchy タブに追加されています。
また、画面内にも黒い立方体が追加されています。この状態で、この立方体の位置を移動させることも可能です。
4-6-2-3. C# ソースを Cube オブジェクトにアタッチ
ドキュメントの説明が端折りすぎていて、何をどうすればいいかわからなかったのですが、これもイメージ画像付きで解説します。
まず、「4-6-2-2. 回転体オブジェクトの追加」と同様の要領で、空のオブジェクトを追加します。
以下のように、「+」ボタン -->「Create Empty」の順にをクリックし、オブジェクトの名前を RosPublisher
変えてあげればOKです。
次に、「Hierarchy」タブの中にある Cube をクリックして、 「Inspector」タブの中に Cube の属性情報を表示しておきます。結果は以下のようになればOKです。
今後は、以下のように「Project」タブにある「RosPublisherExample」を「Inspector」タブの中の Cube の属性欄までドラッグ&ドロップします。ドロップできるところは青色に色が変わるので、よく見て作業しましょう。
すると、「Inspector」タブには、「Ros Publisher Example」の項目が追加されます。以下の画像を参照。
その次は、以下の画像のように「Hierarchy」タブの中の Cube を、たった今追加した「Ros Publisher Example」の中の Cube と書かれた入力フォーム(None と表示されている)までドラッグ&ドロップします。
ここまで終わると、「Ros Publisher Example」属性の「Cube」欄に「Cube」と表示されているはずです。
4-6-2-4. ゲーム起動と通信結果の確認
ここまできて、やっとこゲームを起動する時が来ました( *¯ ꒳¯*)✨
Unity のプログラムウィンドウの上部中央にある、「▶」マークのボタンをクリックしましょう!
すると、ゲームが起動すると同時に、「4-3.」で起動していた WSL 側の標準出力に、以下のような文字列が現れるはずです。これで、ROS2 の通信が Unity から WSL 上のサーバに届いていることがわかります。
root@e960f81518b9:/home/dev_ws# ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0
[INFO] [1746359504.808020094] [UnityEndpoint]: Starting server on 0.0.0.0:10000
[INFO] [1746533217.498079298] [UnityEndpoint]: Connection from 172.29.0.1
ros2_container | [WARN] [1746533217.502585318] [rcl.logging_rosout]: Publisher already registered for provided node name. If this is due to multiple nodes with the same name then all logs for that logger name will go out over the existing publisher. As soon as any node with that name is destructed it will unregister the publisher, preventing any further logs for that name from being published on the rosout topic.
ros2_container | [INFO] [1746533217.520611966] [UnityEndpoint]: RegisterSubscriber(/tf, <class 'tf2_msgs.msg._tf_message.TFMessage'>) OK
ros2_container | [WARN] [1746533217.552314796] [rcl.logging_rosout]: Publisher already registered for provided node name. If this is due to multiple nodes with the same name then all logs for that logger name will go out over the existing publisher. As soon as any node with that name is destructed it will unregister the publisher, preventing any further logs for that name from being published on the rosout topic.
ros2_container | [INFO] [1746533217.566740144] [UnityEndpoint]: RegisterPublisher(pos_rot, <class 'unity_robotics_demo_msgs.msg._pos_rot.PosRot'>) OK
ros2_container | [INFO] [1746533217.584309250] [UnityEndpoint]: RegisterPublisher(pos_rot, <class 'unity_robotics_demo_msgs.msg._pos_rot.PosRot'>) OK
最後に、Unity から送られてきたデータの確認を行いましょう!
公式ドキュメントでいうところの、Start the Echo monitor
の部分ですよ。
「4-6-1.」で起動した、Docker コンテナ内にいるターミナルが残っていれば、そこで以下のコマンドを実行します。
source install/setup.bash
ros2 topic echo pos_rot
既にターミナルを閉じてしまっていた場合は、「4-6-1.」と同じ手順で再度立ち上げて Docker コンテナの中に入ってから、上記コマンドを実行しましょう。
すると、公式ドキュメントに添付されている動画のように、座標 (pos) と姿勢 (rot) の値が表示され、以下のようになるはずです。
root@c5e1452e4203:/home/dev_ws# source install/setup.bash
root@c5e1452e4203:/home/dev_ws# ros2 topic echo pos_rot
pos_x: -3.4800000190734863
pos_y: 5.610000133514404
pos_z: -4.300000190734863
rot_x: 0.5852684378623962
rot_y: 0.5256537199020386
rot_z: 0.3468748927116394
rot_w: 0.5107120871543884
---
pos_x: -3.4800000190734863
pos_y: 5.610000133514404
pos_z: -4.300000190734863
rot_x: 0.0844053253531456
rot_y: 0.6478017568588257
rot_z: -0.7427700161933899
rot_w: 0.14670155942440033
---
pos_x: -3.4800000190734863
pos_y: 5.610000133514404
pos_z: -4.300000190734863
...
# 以降繰り返し
これで、「4-6-2. Publisher によるデモ動作確認」は成功です!(*´▽`*)
5. 結果 (再掲)
ここまでの結果は確認できましたか?
これをベースに、どんどん面白いものを作っていきたいですね!
最後まで、お疲れさまでした(´ 。•ω•。)っ🍵~㌧
6. 今後について
記事にするかどうかは別として、まだまだ Tutorial は続くので色々試してみたいと思っています( *˙︶˙*)وグッ!
関連記事
1. Unity インストール手順
UI 側の Unity をインストールするための手順を記載してくれている記事です。「4-1.」「4-2.」の作業は、この記事を頼りにして行いました。
2. Unity-Robotics-Hub 公式 GitHub
WSL 上での作業は、この記事を頼りに行いました。
- GitHub トップページ
- ROS を使った通信に関する README.md
3. ros2-for-unity について
3-1. ros2-for-unity のメリット
以下の記事では ros2-for-unity
のどこが良いのかが明確に記載されているので、気になる方は目を通してみましょう!
3-2. ros2-for-unity の簡易インストール手順
私は実施していませんが、 Unity-Robotics-Hub
ではなく、 ros2-for-unity
を使いたい方は、以下の記事が参考になりそう。
この記事は、 ros2-for-unity
を使う場合の最低限の構成で環境構築しているように見えます。私が ros2-for-unity
を試す時が来たら、この記事でためしたいなとおもっていま
4. Unity 自体の使い方
私はまだ着手できていませんが、 UI 側での様々な操作方法、主にゲーム作りの基本について記載されている記事です。
今後こういった記事を読んで、さらに勉強してみたいなと思っています
5. Navigation 2 SLAM Example
私は SLAM に興味があります!それを Unity 上でお試しできるサンプルがあるらしく、その解説をしている記事になります。