0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【UnityでROS】UnityとROSを連携するための初期セットアップ

0
Last updated at Posted at 2026-05-03

こちらは「UnityでROS」シリーズの記事になります。

  • 前回:なし
  • 次回:移動ロボットをcmd_velで動かす

各記事をまとめた目次は

を参照ください。

お疲れ様です。秋並です。

今回は、UnityとROSを連携するための初期セットアップについて解説します。


全体概要図(詳しい解説は各章にて)

image.png

目次

Docker環境構築

Dockerのインストール

Dockerをインストールします。

windows, Mac,Ubuntuで手順が違うため、それぞれ下記記事を参考にしてください

Visual Studio Codeのインストール

次に、下記サイトからVisual Studio Code(VS Code)をダウンロード、インストールします。

Dockerの使用にVS Codeは必須ではありませんが、今後の開発に便利なのでここでは、VS Codeを使用する前提で話を進めます。

WSL関連設定(Windowsのみ)

Windowsの場合、WSLに入った状態で作業する必要があるので、拡張機能でWSLをインストールします。

image.png


拡張機能のインストールが完了したら、

  1. 「><」マークをクリック
  2. 「Connected to WSL」をクリックしてください。

image.png


画面左下に「WSL:Ubuntu」と表示されていればOKです。以降は、このウインドウにて作業してください。

image.png

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」をインストールします。

image.png


拡張機能のインストールが完了すると、コンテナボタンが追加されるので、

  1. 左バーのコンテナボタンをクリック
  2. 起動したコンテナ名を右クリック
  3. 「Attach Visual Studio Code」をクリックします。

image.png


新規で表示されたウィンドウの左下に「Container ros-non-root:jazzy(ros-jazzy)」と記載してあればOKです。以降で記載するコマンドはこのコンテナ内で実行します。

image.png

Windows, Mac, Ubuntuにおける構成の違いのイメージ図は以下になります。

image.png

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からプロジェクトを作成してください。

image.png


次に、プロジェクトを作成します。

  1. Project nameはなんでもOKです(ただし、パス関連でエラーが出ることがあるため、日本語のプロジェクト名は避けた方が良いです)。
  2. プロジェクトの種類は、「3D (Built-In Render Pipeline)」に設定してください。

image.png

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間で通信できるようにします。

image.png

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」を開きます。

image.png


次に、「+」→「Add package from git URL…」を選択してください。

image.png


「Add package from git URL…」下のテキストボックスに、以下のgitリポジトリのURLを入力してください。

image.png

https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector

上部バーに「Robotics」が追加されるので

  1. 「Robotics→ROS setting」を選択
  2. 「Protocol」を「ROS2」に設定してください。

image.png

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することになります。

image.png

トピックなどのROS 2の基本的な概念については、以下記事を参考にしてください。

https://qiita.com/akinami/items/e9ce87c1859209a02776

準備(Unity側)

最初に、Hierarchyタブから「+」→「Create Empty」ボタンを押下し、空のオブジェクトを作成してください。オブジェクトの名称はなんでも良いですが、ここでは「ROS Global Manager」としました。

image.png


今回は、Unity公式が提供しているリポジトリ「Robotics-Nav2-SLAM-Exampla」のサンプルプログラムを使用するので、

をzipでダウンロードし、任意の場所に解凍してください。

image.png


解凍した「Robotics-Nav2-SLAM-Example/Nav2SLAMExampleProject/Assets/Scripts」内にある「Clock.cs」「ROSClockPublisher.cs」をUnity側にコピーします。

なお、ここでは↓のような、一般的なUnityプロジェクトの構成に準拠して各種ソースコードなどを配置しています。

Assets/
 ├── Scripts/
 │    ├── Clock.cs
 │    ├── ROSClockPublisher.cs
 ├── Scenes/
 └── Resources/

image.png


最後に、ROSClockPublisher.csをROS Global Managerにアタッチしてください。

image.png

動作確認

実際に、ROS2 ↔︎ Unity間で通信できるかを確認します。

まず、Unity側で「Playボタン」を押下します。

image.png


次に、コンテナのターミナルにて、以下コマンドにより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で動かす

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?