お疲れ様です。秋並です。
今回は、UnityとROSを連携するための初期セットアップについて解説します。
全体概要図(詳しい解説は各章にて)
目次
Docker環境構築
Dockerのインストール
Dockerをインストールします。
windows, Mac,Ubuntuで手順が違うため、それぞれ下記記事を参考にしてください
- Windows(Windowsでは、WSLと呼ばれるWindows上でLinuxを動作可能な環境を使用します)
- WSL2でDocker環境構築(Docker Desktop有料化対策) の「Dockerインストール」の章まで実行してください
- Mac(Docker Desktopをインストールします)
- Mac に Docker Desktop をインストール の「Mac に Docker Desktop をインストール」を実行してください
- Ubuntu(Docker Engineをインストールします)
- Install Docker Engine on Ubuntu の「Installation methods」の章まで実行してください
Visual Studio Codeのインストール
次に、下記サイトからVisual Studio Code(VS Code)をダウンロード、インストールします。
Dockerの使用にVS Codeは必須ではありませんが、今後の開発に便利なのでここでは、VS Codeを使用する前提で話を進めます。
WSL関連設定(Windowsのみ)
Windowsの場合、WSLに入った状態で作業する必要があるので、拡張機能でWSLをインストールします。
拡張機能のインストールが完了したら、
- 「><」マークをクリック
- 「Connected to WSL」をクリックしてください。
画面左下に「WSL:Ubuntu」と表示されていればOKです。以降は、このウインドウにて作業してください。
Dockerイメージの作成
VSCodeのターミナルにて、以下コマンドを実行して、Dockerfileを作成します(WSLの場合、WSL内のターミナルにて)。
code Dockerfile
FROM ros:jazzy
ARG USERNAME
ARG UID
ARG GID
RUN apt update && apt install -y sudo
RUN if ! getent group $GID ; then \
groupadd -g $GID $USERNAME ; \
fi && \
useradd -m -u $UID -g $GID -s /bin/bash $USERNAME && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER $USERNAME
WORKDIR /home/$USERNAME
作成したDockerfileを保存し、以下コマンドでビルドして、Dockerイメージを作成します。
docker build \
--build-arg USERNAME=$(whoami) \
--build-arg UID=$(id -u) \
--build-arg GID=$(id -g) \
-t ros-non-root:jazzy .
補足:ros:jazzyイメージをそのまま使わない理由
ros:jazzyイメージをそのまま使う場合、rootユーザーとしてコンテナに入ることになります。
rootユーザーの場合、権限回りで不都合が生じることが時々あるため、ここではそれを回避するために新規でros-non-root:jazzyイメージを作成しています。
Dockerコンテナの作成、起動
以下コマンドで、コンテナを作成します。
docker run -it -p 10000:10000 --name ros-jazzy ros-non-root:jazzy
ROS 2には、様々なバージョンが存在しますが、ここでは、2026年5月現在で最新のLTSであるjazzyを指定しています。違うバージョンで試したい場合は、jazzyの箇所を任意のバージョンに置き換えてください
拡張機能「Docker」「Dev Containers」をインストールします。
拡張機能のインストールが完了すると、コンテナボタンが追加されるので、
- 左バーのコンテナボタンをクリック
- 起動したコンテナ名を右クリック
- 「Attach Visual Studio Code」をクリックします。
新規で表示されたウィンドウの左下に「Container ros-non-root:jazzy(ros-jazzy)」と記載してあればOKです。以降で記載するコマンドはこのコンテナ内で実行します。
ROS 2 コマンドが認識されるようにするための設定
初期状態では、ROS 2コマンドが認識されないので、以下手順を実行します。
コンテナ内のターミナルにて、以下コマンドを実行し、.bashrcを開きます。
code ~/.bashrc
.bashrcの最下部に以下を追記します。
source /opt/ros/jazzy/setup.bash
ターミナルにて、以下コマンドを実行します。
source ~/.bashrc
Unity環境構築
次に、Unity側の環境構築を行います。
Unity Hubのインストール
下記サイトにて、Unity Hubをダウンロード&インストールします。
Unityプロジェクトの作成
Unity Hubからプロジェクトを作成してください。
次に、プロジェクトを作成します。
- Project nameはなんでもOKです(ただし、パス関連でエラーが出ることがあるため、日本語のプロジェクト名は避けた方が良いです)。
- プロジェクトの種類は、「3D (Built-In Render Pipeline)」に設定してください。
Unity <-> ROS連携 環境構築
ここまでで、Unity側、ROS 2(=Ubuntu OSにROS 2環境がセットアップされたDockerコンテナ)側の環境構築が完了しました。
ここからは、Unity ↔ ROS 2 を連携する手順を解説します。
Unityは、標準ではROS 2の通信方式であるDDSに対応していないため、「ROS TCP Connector」「ROS TCP Endpoint」を使用して、Unity↔ROS 2 Node間で通信できるようにします。
Unity↔︎ROS2 Nodeが直接DDS通信可能なパッケージ「ros2-for-unity」も存在しますが、今回はUnityが公式で提供している、ROS-TCP-Connector, ROS-TCP-Endpointを紹介します。
ROS-TCP-Connectorのインストール(Unity側)
Unity側にROS-TCP-Connectorをインストールします。
上部バーの「window→Package Manager」で「package Manager」を開きます。
次に、「+」→「Add package from git URL…」を選択してください。
「Add package from git URL…」下のテキストボックスに、以下のgitリポジトリのURLを入力してください。
https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector
上部バーに「Robotics」が追加されるので
- 「Robotics→ROS setting」を選択
- 「Protocol」を「ROS2」に設定してください。
ROS-TCP-Endpointのインストール(ROS 2側)
コンテナ内のターミナルにて以下コマンドを実行し、ROS 2のワークスペースを作成します。
mkdir -p ~/colcon_ws/src
ROS-TCP-Endpointのリポジトリをクローンします。
cd ~/colcon_ws/src
git clone -b main-ros2 https://github.com/Unity-Technologies/ROS-TCP-Endpoint.git
以下コマンドでビルドします。
cd ~/colcon_ws
colcon build
ワークスペース内のパッケージが認識されるように以下を実行します。
以下コマンドを実行し、.bashrcを開きます。
code ~/.bashrc
.bashrcの最下部に以下を追記します。
source ~/colcon_ws/install/setup.bash
ターミナルにて、以下コマンドを実行します。
source ~/.bashrc
Unity -> ROS 2への時間の配信
時間の情報は、ロボットの動作を解析(ある動作を行うのに何秒かかったかなど)する際に非常に重要です。
ここでは、Unity → ROS 2へ時間を配信するための手順を解説します。
概要
ROSで扱われる時間には、実時間(Wall Timeと呼ばれる)とシミュレーション時間(ROS Timeと呼ばれる)が存在します。
実機の場合は実時間で問題ないのですが、シミュレーションの場合は処理落ちの発生や、倍速再生の実装などにより
- シミュレーション上の経過時間≠実際の経過時間
となることが少なくありません。
そのため、Unityから送る時間を、ROS Time(スロー、倍速になった場合も、それに応じて加速減速した時間経過となる)とすることで、より現実に近い状態で時間を扱うことができます。
なお、具体的な構成としては、下図のようにUnity側からROS 2側にclockトピックを通じて時間情報をPublishすることになります。
トピックなどのROS 2の基本的な概念については、以下記事を参考にしてください。
準備(Unity側)
最初に、Hierarchyタブから「+」→「Create Empty」ボタンを押下し、空のオブジェクトを作成してください。オブジェクトの名称はなんでも良いですが、ここでは「ROS Global Manager」としました。
今回は、Unity公式が提供しているリポジトリ「Robotics-Nav2-SLAM-Exampla」のサンプルプログラムを使用するので、
をzipでダウンロードし、任意の場所に解凍してください。
解凍した「Robotics-Nav2-SLAM-Example/Nav2SLAMExampleProject/Assets/Scripts」内にある「Clock.cs」「ROSClockPublisher.cs」をUnity側にコピーします。
なお、ここでは↓のような、一般的なUnityプロジェクトの構成に準拠して各種ソースコードなどを配置しています。
Assets/
├── Scripts/
│ ├── Clock.cs
│ ├── ROSClockPublisher.cs
├── Scenes/
└── Resources/
最後に、ROSClockPublisher.csをROS Global Managerにアタッチしてください。
動作確認
実際に、ROS2 ↔︎ Unity間で通信できるかを確認します。
まず、Unity側で「Playボタン」を押下します。
次に、コンテナのターミナルにて、以下コマンドによりROS-TCP-endpointを起動します。
ros2 run ros_tcp_endpoint default_server_endpoint
最後に、別ターミナルにて、以下コマンドで/clockトピックが配信されていることを確認します。
ros2 topic echo /clock
下記のように、時刻情報が取得できれば Unity↔︎ROS 2間で正常に通信できています。
clock:
sec: 27
nanosec: 127217120
---
clock:
sec: 27
nanosec: 137779407
---
最後に
今回は、Unity ↔ ROS 2を連携するための初期設置アップについて解説しました。
次回は、Unity上に移動ロボットを生成し、ROS 2トピックにより制御する方法について解説します。
次回:移動ロボットをcmd_velで動かす




















