はじめに
昨今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 Humble
のUE5.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に記載されています。ビルド前にrclUE
、RapyutaSimulationPlugin
、turtlebot3-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
から
BP_ROS2PublisherNode
をドラッグアンドドロップでシミュレーション上に配置してください。
OutlinerからBP_ROS2PublisherNode
が確認できれば問題なしです。BP_ROS2SubscriberNode
も同様にして配置し、再度シミュレーションモードを実行すると
トピックがPublishされ、それを受け取ったSubscriberによってprint出力されていることが見て取れます。
ターミナル上でもトピックの出力が確認できました。
$ 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の設定なども同じ欄にありますね。
Service Request/Response
サービスについても手順は同じです。左下Content Drawer
からBP_ROS2ServiceClientNode
、BP_ROS2ServiceServerNode
をドラッグ・アンド・ドロップでシミュレーション環境に配置し、シミュレーション開始でサービスリクエスト、レスポンスのやり取りが確認できます。
もちろんros2 service listでも確認できますね。
$ ros2 service list
/Attach
/DeleteEntity
/GetEntityState
/SetEntityState
/SpawnEntities
/SpawnEntity
/bp/add_two_ints
サービスの中のA、Bのデフォルト値は以下から変更できるようです。
サービス名は以下で変更できるようです。特にビルドも必要なく、シミュレーション開始でサービス名も変更されているのは楽で良かったです。
しっかりターミナルからの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自体の操作はまだ詳しくないので、そのあたりも勉強してみようと思います。
最後までご覧いただきありがとうございました。