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?

Unreal EngineとROS2連携(turtlebot3-UEを用いたROS2通信チュートリアル解説)

Last updated at Posted at 2025-09-17

はじめに

昨今ROS2を使用したシミュレーション環境としてはIsaac Simがありますが、Unreal EngineでもROS2連携用のプラグインが公開されており、Unreal Engineを使用したROS2シミュレーションを行うことが可能です。
今回はROS2とUnreal Engineの連携用チュートリアルリポジトリであるturtlebot3-UEを使用してUnrealEngineとROS2の連携方法について解説していきたいと思います。

対象読者

  • ROS2を触ったことがある人
  • ROS2シミュレーション環境としてUnreal Engineを使用したいと考えている人。

Unreal Engineについて

Unreal Engineはゲームエンジンとして高度なグラフィック表現を行うことが可能なツールです。このUnreal Engineにrapyuta-roboticsさんが提供しているrclUEというプラグインを用いることでUnreal Engine(以下UE)上で高度なグラフィック環境でのシミュレーションを実行できるようになっています。また物理エンジンも搭載しているため、高グラフィック環境での物理演算シミュレーションが強みかなと思います。

実行環境

turtlebot3-UEに記載がありますが、バージョン互換性があります。今回私はROS2 HumbleUE5.3.2でセットアップしました。

  • UE: 5.3.2
  • Ubuntu: 22.04
  • ROS2: Humble
  • rclUE: UE5_devel_humble
  • RapyutaSimulationPlugin: UE5.3
  • turtlebot3-UE: jammy_UE5.3

Setup

次にセットアップ方法を記載します。ROS2 Humbleはインストール済みとして進めさせていただきます。

UE install

UEは5.3.2-linux版をダウンロード、インストールしてください。
https://dev.epicgames.com/documentation/ja-jp/unreal-engine/linux-development-quickstart-for-unreal-engine?application_version=5.3
インストール完了後、パスを通しておきましょう。

$ echo "export UE5_DIR=/home/<user>/UnrealEngine" >> ~/.bashrc

turtlebot3-UE Setup

セットアップ方法はREADME.mdに記載されています。ビルド前にrclUERapyutaSimulationPluginturtlebot3-UEのブランチを合わせておきましょう。

$ git clone --recurse-submodules git@github.com:rapyuta-robotics/turtlebot3-UE.git
$ git-lfs pull && git submodule foreach git-lfs pull
$ cd turtlebot3-UE
$ git checkout jammy_UE5.3
$ git -C Plugins/rclUE checkout UE5_devel_humble
$ git -C Plugins/RapyutaSimulationPlugins checkout UE5.3
$ ./update_project_files.sh
$ make turtlebot3Editor

このままUEプロジェクトを起動すると、DDSバージョンの違いによるエラーなのか、DDSサーバの起動に失敗するので、以下のxmlファイルに内容を差し替える必要があります。
以下の中身をdiff.patchとして保存してください。

diff --git a/fastdds_config.xml b/fastdds_config.xml
index b4f4509..9c01387 100644
--- a/fastdds_config.xml
+++ b/fastdds_config.xml
@@ -8,31 +8,27 @@
             </transport_descriptor>
         </transport_descriptors>
         <participant profile_name="super_client_profile" is_default_profile="true">
-            <userTransports>
-                <transport_id>UdpTransport</transport_id>
-            </userTransports>
-            <useBuiltinTransports>false</useBuiltinTransports>
             <rtps>
                 <userTransports>
                     <transport_id>UdpTransport</transport_id>
                 </userTransports>
                 <useBuiltinTransports>false</useBuiltinTransports>
-                   <builtin>
-                        <discovery_config>
-                           <discoveryProtocol>SUPER_CLIENT</discoveryProtocol>
-                           <discoveryServersList>
-                               <RemoteServer prefix="44.53.00.5f.45.50.52.4f.53.49.4d.41">
-                                    <metatrafficUnicastLocatorList>
-                                        <locator>
-                                            <udpv4>
-                                               <address>127.0.0.1</address>
-                                                   <port>11811</port>
-                                               </udpv4>
-                                        </locator>
-                                     </metatrafficUnicastLocatorList>
-                                </RemoteServer>
-                           </discoveryServersList>
-                      </discovery_config>
+                <builtin>
+                    <discovery_config>
+                        <discoveryProtocol>SUPER_CLIENT</discoveryProtocol>
+                        <discoveryServersList>
+                            <RemoteServer prefix="44.53.00.5f.45.50.52.4f.53.49.4d.41">
+                                <metatrafficUnicastLocatorList>
+                                    <locator>
+                                        <udpv4>
+                                            <address>127.0.0.1</address>
+                                            <port>11811</port>
+                                        </udpv4>
+                                    </locator>
+                                </metatrafficUnicastLocatorList>
+                            </RemoteServer>
+                        </discoveryServersList>
+                    </discovery_config>
                 </builtin>
             </rtps>
         </participant>

以下のコマンドでパッチを適用できます。

patch -p1 < diff.patch

以下のコマンドでturtle_botのUEプロジェクトを起動してDDSサーバ関連のエラーが出なければサーバの起動成功です。

$ cd turtlebot3-UE
$ ./run_editor.sh

そのまま三角ボタンのシミュレーション開始を行い、ターミナル上で以下のようなトピックが確認できればUE上でのROS2通信セットアップは完了です。

$ ros2 topic list
/clock
/cmd_vel
/collisions
/odom
/parameter_events
/rosout
/scan
/tf
/ue_joint_commands
/ue_joint_states

トピックが確認できない場合、ROS_DOMAIN_ID=0の設定ができているか、<ROS2_ws>/install/setup.bashを実行しているか確認してください。

Topic Publish/Subscribe

ROS2トピックのpub/sub通信の実行方法です。左下のContent Drawerから
image.png

BP_ROS2PublisherNodeをドラッグアンドドロップでシミュレーション上に配置してください。
image.png

OutlinerからBP_ROS2PublisherNodeが確認できれば問題なしです。BP_ROS2SubscriberNodeも同様にして配置し、再度シミュレーションモードを実行すると
image.png

トピックがPublishされ、それを受け取ったSubscriberによってprint出力されていることが見て取れます。
image.png

ターミナル上でもトピックの出力が確認できました。

$ ros2 topic list
/bp/test_topic
/clock
/cmd_vel
/collisions
/odom
/parameter_events
/rosout
/scan
/tf
/ue_joint_commands
/ue_joint_states
$ ros2 topic echo /bp/test_topic
data: Hello from BP fron non loop publisher
---
data: Hello from BP from custom publisher
---
data: Hello from BP 2
---
data: Hello from BP 3
---
data: Hello from BP from custom publisher
---
data: Hello from BP from custom publisher
---
data: Hello from BP 4

自作のカスタムノードを作りたいときは、BP_ROS2PublisherNodeをコピーして編集するのが良さそうです。

トピック名の変更

トピック名の変更はOutlinerからBP_ROS2PublisherNodeを選択し、それぞれのROS2Componentを選択すると変更可能です。見つけるのに苦労しました。QoSの設定なども同じ欄にありますね。
image.png

Service Request/Response

サービスについても手順は同じです。左下Content DrawerからBP_ROS2ServiceClientNodeBP_ROS2ServiceServerNodeをドラッグ・アンド・ドロップでシミュレーション環境に配置し、シミュレーション開始でサービスリクエスト、レスポンスのやり取りが確認できます。
image.png

もちろんros2 service listでも確認できますね。

$ ros2 service list
/Attach
/DeleteEntity
/GetEntityState
/SetEntityState
/SpawnEntities
/SpawnEntity
/bp/add_two_ints

サービスの中のA、Bのデフォルト値は以下から変更できるようです。
image.png

サービス名は以下で変更できるようです。特にビルドも必要なく、シミュレーション開始でサービス名も変更されているのは楽で良かったです。
image.png

しっかりターミナルからのService Requestも実行できることが確認できました。

$ ros2 service call /bp/add_two_ints example_interfaces/srv/AddTwoInts "{a: 10, b: -10}"
waiting for service to become available...
requester: making request: example_interfaces.srv.AddTwoInts_Request(a=10, b=-10)

response:
example_interfaces.srv.AddTwoInts_Response(sum=0)

アクションについてはほとんど同じだと思いますので省略します。

終わりに

今回はturtlebot3-UEのサンプルコードと使い方のチュートリアルを実践してみました。

GUI上での変更が必要だったりで割とハマりどころ多いですが、こちらをベースに自作のノードを作成してシミュレーション環境を作成、ROS2連携できそうです。

次はService/Actionとかを使ってオブジェクトの移動とかさせてみても面白そうです。そのためにはblueprintの作成、変更が必要になってくるのでより一層難易度が高そうです。

Unreal Engine自体の操作はまだ詳しくないので、そのあたりも勉強してみようと思います。
最後までご覧いただきありがとうございました。

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?