ros2-for-unityとは
使用方法
- ROS2 Humble (Ubuntu 22)環境での手順を示します
【重要】ROS2 Foxy(Ubuntu 20)を使用する場合
- Humbleの場合と手順が異なります
-
Foxyの場合のみ実行
に書かれている手順を必ず実行してください
1. ビルド環境をセットアップ
初回のみ実行します.
ros2csのPrerequisites
に示されている手順を実行します.
- 依存パッケージをインストール
sudo apt install ros-${ROS_DISTRO}-test-msgs sudo apt install ros-${ROS_DISTRO}-fastrtps ros-${ROS_DISTRO}-rmw-fastrtps-cpp sudo apt install ros-${ROS_DISTRO}-cyclonedds ros-${ROS_DISTRO}-rmw-cyclonedds-cpp
- vcstoolをインストール
curl -s https://packagecloud.io/install/repositories/dirk-thomas/vcstool/script.deb.sh | sudo bash sudo apt-get update sudo apt-get install python3-vcstool
- patchelfをインストール
sudo apt install patchelf
-
.NET 6.0をインストール
Foxyの場合のみ実行
wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb
sudo apt-get update sudo apt-get install apt-transport-https sudo apt-get update sudo apt-get install dotnet-sdk-6.0
2. ros2-for-unityをビルド
ros2-for-unityのドキュメントに従います.
- リポジトリをクローンします
git clone -b humble https://github.com/RobotecAI/ros2-for-unity.git cd ros2-for-unity
- 依存リポジトリを自動でクローンします
./pull_repositories.sh
Foxyの場合のみ実行
-
example-interfaceを手動インストールします
sudo apt install ros-foxy-example-interfaces* git clone -b foxy https://github.com/ros2/example_interfaces.git src/ros2cs/src/ros2/
-
共有ライブラリがなぜかテキストファイルになっているので置き換えます
wget -O ./src/ros2cs/resources/foxy/Linux/x86_64/librcpputils.so https://github.com/RobotecAI/ros2cs/raw/refs/heads/master/resources/foxy/Linux/x86_64/librcpputils.so
-
- カスタムメッセージを配置します
- 使用したいカスタムメッセージを含むROS2パッケージをすべて
./ros2-for-unity/src/ros2cs/custom_messages/
の中にコピーします
mkdir -p .src/ros2cs/custom_messages cp -r ROS2パッケージのパス ./ros2-for-unity/src/ros2cs/custom_messages/ # 例 cp -r ~/my_workspace/src/my_msg ./ros2-for-unity/src/ros2cs/custom_messages/
- 使用したいカスタムメッセージを含むROS2パッケージをすべて
- ビルドします
-
--standalone
オプションをつけると,環境依存性を排除したパッケージが生成されます
./build.sh --standalone
-
- 完了後,
Ros2ForUnity
ディレクトリが./install/asset
内に生成されていることを確認してください
3. Unityにインストール
-
./install/asset/Ros2ForUnity
をUnityプロジェクト内Assets/
に配置します - CLIの場合
cp -r ./install/asset/Ros2ForUnity Unityプロジェクト/Assets/ # 例 cp -r ./install/asset/Ros2ForUnity ~/MyUnityProject/Assets/
- ファイルマネージャで上記フォルダを見つけてドラッグアンドドロップしても良いです
- このような構造が正しいです.正しくない場所に配置するとエラーが出ます.
. └── MyUnityProject/ ├── Assets/ │ ├── Ros2ForUnity <--- ここに配置 │ └── ... ├── Packages └── ProjectSettings
4. 動作確認
- 以降,Unityでの作業です
-
Unityでテスト用のシーンを作成します
-
-
-
動作確認用スクリプト
using UnityEngine; using ROS2; using Unity.VisualScripting; public class TestRos2ForUnity : MonoBehaviour { /* ***************************************************************************** * メンバインスタンス ***************************************************************************** */ private ROS2UnityComponent _r24u; // ros2-for-unityコンポーネント private ROS2Node _node; // ros2ノード private Publisher<geometry_msgs.msg.PoseStamped> _publisher; // パブリッシャ /* ***************************************************************************** * 初期化処理 ***************************************************************************** */ void Start() { // ros2-for-unityコンポーネントを追加 _r24u = this.AddComponent<ROS2UnityComponent>(); // ノードを作成 _node = _r24u.CreateNode("my_unity_node"); // パブリッシャを作成 _publisher = _node.CreatePublisher<geometry_msgs.msg.PoseStamped>("my_unity_pose"); } /* ***************************************************************************** * 自身の位置をros2にパブリッシュ ***************************************************************************** */ void Update() { // メッセージを生成 geometry_msgs.msg.PoseStamped msg = new geometry_msgs.msg.PoseStamped(); msg.Header.Frame_id = "map"; // 自身の位置姿勢を取得 Vector3 pos = this.transform.position; Quaternion rot = this.transform.rotation; // メッセージに位置姿勢を設定 msg.Pose.Position.X = pos.x; msg.Pose.Position.Y = pos.z; msg.Pose.Position.Z = pos.y; msg.Pose.Orientation.X = rot.x; msg.Pose.Orientation.Y = rot.z; msg.Pose.Orientation.Z = rot.y; msg.Pose.Orientation.W = rot.w; // メッセージをパブリッシュ _publisher.Publish(msg); } }
-
-
Unityからtopicがpublishされているか確認します
5. スクリプトの書き方
- subscriberのサンプルやpublisherのサンプルを参考にしましょう
メッセージ内のフィールドへのアクセス
-
基本的にはC++におけるそれを,C#の記法に直すだけです
// C++におけるそれ geometry_msgs::msg::PoseStamped msg; msg = geometry_msgs::msg::PoseStamped(); msg.pose.position.x = 1.0;
↓
// ros2-for-unity geometry_msgs.msg.PoseStamped msg; msg = new geometry_msgs.msg.PoseStamped(); msg.Pose.Position.X = 1.0;
- 命名規則がややこしいですが,私はIntelliSense様に教えてもらってどうにかしています
-
自作メッセージを使用している場合も,正しくビルドできていればビルトインメッセージ型と同じように扱うことができます
my_msgs.msg.MyCustomMessage msg; msg = new my_msgs.msg.MyCustomMessage(); msg.MyScholarField = 1.0;