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?

ros2-for-unityを使ってunity上で自作メッセージをpub/sub

Last updated at Posted at 2025-02-24

ros2-for-unityとは

  • unityでros2のtopicを送受信するためのパッケージです

  • DDSネイティブな通信ができるので早いらしいです

  • 自作メッセージを使用するには自分でビルドする必要があるため,手順を残しておきます

    r24u.gif

使用方法

  • ROS2 Humble (Ubuntu 22)環境での手順を示します

【重要】ROS2 Foxy(Ubuntu 20)を使用する場合

  • Humbleの場合と手順が異なります
  • Foxyの場合のみ実行に書かれている手順を必ず実行してください

1. ビルド環境をセットアップ

初回のみ実行します.
ros2csPrerequisitesに示されている手順を実行します.

  • 依存パッケージをインストール
    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/
    

  • ビルドします
    • --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での作業です
  1. Unityでテスト用のシーンを作成します

  2. オブジェクトを追加します
    image.png


  3. オブジェクトに新しいスクリプトをアタッチします
    image.png
    image.png


  4. 作成したスクリプトに以下を記述します
    image.png

    動作確認用スクリプト
    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);        
        }
    }
    

  5. シーンを再生します
    image.png


  6. Unityからtopicがpublishされているか確認します

    • コマンドから確認
      • ros2 topic echo /my_unity_pose
    • rviz2でも確認できます
      r24u.gif

5. スクリプトの書き方

メッセージ内のフィールドへのアクセス

  • 基本的には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;
    
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?