ROS2とUnityの連携 - URDFのインポートと簡易シミュレーション
(掲載 2025年12月24日)
本記事のゴール
本記事ではROS2とUnityを連携させることで、URDFで記述されたTurtleBot3のロボットモデルをUnity内で動作させることをゴールとしています。
なお、今回のロボットの動作は物理的に正確な差動駆動ではなく、簡易的なルート移動になります。
前提条件
本記事は以下を前提としています。
- ROS2をインストール済み
- Unityをインストール済み
- 本記事ではUnity 6.3 LTS(6000.3.2f1)を利用します
Unity側の設定
プロジェクトの作成
シミュレーションを行うUnityプロジェクトを新規作成します。
テンプレートは「Universal 3D」を選択します。
ここではプロジェクト名は「TurtleBot3-Demo」とします。
プロジェクト作成後、EditメニューのProject
Settingsを開き、以下の設定を変更します。
- Active Input HandlingをBothに変更

- Run In Backgroundにチェックを入れる

ROS関連パッケージを導入
メニューからWindow→Package Management→Package
Managerを選択し、Package Managerウィンドウを表示します。
ROS-TCP-Connectorの導入
Package Managerウィンドウの左上の+ボタンをクリックし、「Add package
from git URL…」を選択します。
表示されたURL入力欄に対し、https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connectorを入力し、「Install」ボタンを押します。
インストール後、メニューのRoboticsからROS
Settingsを開き、以下のように設定します。
- Protocol : ROS2
- ROS IP Address : ROS2を動作させているマシンのIPアドレス
- ROS Port : 10000

URDF Importerの導入
同様に、Package Managerの「Add package from git
URL…」でhttps://github.com/Unity-Technologies/URDF-Importer.git?path=/com.unity.robotics.urdf-importer#v0.5.2を入力、「Install」ボタンを押します。
URDFをインポートする
TurtleBot3のURDFを含むリポジトリをクローンします。
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
UnityのプロジェクトでAsset以下にTurtleBot3フォルダをつくり、そこにturtlebot3_description/urdf以下にあるURDFをドラッグ&ドロップします。ここではwaffle_piのURDFを利用します。
同様にturtlebot3_description/meshesをフォルダごとAssetのTurtleBot3フォルダにドラッグ&ドロップします。
この操作でAssetsは以下のようになります。

Assetに登録したURDF内の<mesh>タグでメッシュデータ(STL)を参照していますが、Asset内での相対パスとなるよう、package://で参照しているパスを以下のように変更します。
変更前
filename="package://turtlebot3_description/meshes/bases/waffle_pi_base.stl"
変更後
filename="meshes/bases/waffle_base.stl"
次にAssetのURDFを右クリックし、「Import Robot from Selected URDF
file」を選択します。
「URDF Import Settings」ウィンドウが表示されるので、そのまま「Import
URDF」ボタンを押します。
これでUnityへのURDFのインポートが完了しました。Sceneビューにロボットが見えていない場合はマウススクロール等で拡大してください。
Sceneビューでは以下のようにロボットが表示されます。

なお、今回は簡易的なシミュレーションのため、ロボットのインスペクタで「Use
Gravity」をDisableに変更します。重力シミュレーションを有効にする場合は、重力による落下を防ぐため平面の追加等の対応を行ってください。
スクリプトの作成
UnityからROS2のトピック/cmd_velを購読し、シミュレーション空間内のロボットモデルを動作させるようにします。
Hierarchyで+ボタンを押して「CreateEmpty」を選択し、空のゲームオブジェクトを作成します。追加したゲームオブジェクトのインスペクタで「Add
Component」を押し、New scriptでスクリプト「Simple
Controller」を追加します。
AssetsからSimpleControllerを選択してエディタを開き、以下の内容に変更します。
このコードはROS2の/cmd_velトピックを購読し、Unity内のロボットを移動させます。
using UnityEngine;
using Unity.Robotics.ROSTCPConnector;
using RosMessageTypes.Geometry;
public class SimpleController : MonoBehaviour
{
public ArticulationBody root;
public float linearScale = 1.0f;
public float angularScale = 1.0f;
float v = 0f;
float w = 0f;
void Start()
{
ROSConnection.GetOrCreateInstance().Subscribe<TwistMsg>("/cmd_vel", msg =>
{
v = (float)msg.linear.x;
w = (float)msg.angular.z;
});
}
void FixedUpdate()
{
Vector3 pos = root.transform.position;
Quaternion rot = root.transform.rotation;
float dt = Time.fixedDeltaTime;
Vector3 forward = rot * Vector3.forward;
Vector3 nextPos = pos + forward * (v * linearScale * dt);
Quaternion nextRot = Quaternion.AngleAxis(w * Mathf.Rad2Deg * angularScale * dt, Vector3.up) * rot;
root.TeleportRoot(nextPos, nextRot);
}
}
スクリプト作成後、作成した空のゲームオブジェクトのインスペクタを開き、Rootをbase-linkに紐づけます。

以上でUnity側の設定は完了です。
ROS2側の設定
ROS2側でROS-TCP-Endpointを起動
ROS2側でROS-TCP-Endpoint
を導入します。
以下のようにビルド・実行します。
cd ~/colcon_ws/src
git clone -b main-ros2 https://github.com/Unity-Technologies/ROS-TCP-Endpoint
cd ..
colcon build
source ~/colcon_ws/install/setup.bash
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0
動作確認
Unityのプロジェクトを実行し、ROS2側で以下のコマンドを実行します。
ros2 run teleop_twist_keyboard teleop_twist_keyboard
teleop_twist_keyboard実行中の端末でキー入力することで/cmd_velトピックを配信することができます。
teleop_twist_keyboardの主なキーの割り当ては以下の通りです。
| 操作 |
キー |
| 前進 |
i |
| 後退 |
, |
| 左旋回 |
j |
| 右旋回 |
l |
| 停止 |
k |
| 移動速度を上げる |
w |
| 移動速度を下げる |
x |
teleop_twist_keyboardでの操作によってUnityのGameビューでロボットが移動することを確認できます。
まとめ
ROS2とUnityを連携させる場合、プラグイン導入等の追加手順が必要になりますが、高品質なグラフィックでのシミュレーションを実現できます。
また、本記事では購読したトピックからロボットの座標を直接移動させる簡易的なシミュレーションとなっていますが、ホイールの回転に紐づけて差動駆動させることで、よりリアルな動きをシミュレーションすることもできます。
SRAでは、ROSの環境構築から各種開発まで幅広く支援いたします。(お問い合わせはこちら)
- 本ページには、弊社独自の考察・見解を記述している箇所がございます。
- 本ページの利用によって生じたいかなるトラブル・損害等について当社は一切責任を負わないものとします。
- 本ページは予告なく内容の変更や削除を行う場合があります。