5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ROS 2Advent Calendar 2024

Day 15

ros2-for-unity でサクッとROS2 アプリ

Last updated at Posted at 2024-12-14

ros2-for-unity とは?

3D アプリを簡単に作れる Unity で、サクッと ROS2 通信できるようになります。
とても便利!


image.png


Unity で ROS2 と通信する仕組みは主に下記3つがありますが、

パッケージ 通信ベース
Unity-Robotics-Hub (Unity 公式) TCP 通信 Unity-Robotics-Hub
ros2-for-unity DDS ネイティブ ros2-for-unity
ros-sharp json 文字列 ros-sharp

今回の ros2-for-unity は、

・速い (DDS ネイティブ、インストールはディレクトリコピーで、利用コードは簡単に使い始められる)
・安い (Apache-2.0、オープンで無償で使えるという意味で)
・うまい(Win, Linux, あとフォークでAndroidも。)

の3点でオススメと言えます!

しかも
「オープンソースでのリリースは TIER IVとの協力により実現しました(chrome 翻訳)」
などと書かれており、ワクワクしますねw

※参考:片岡さんの記事

ということで

サクッと使ってみましょう。

最初の一歩は

① ダウンロード
② そのフォルダをそのまま Unity プロジェクトの Asset ディレクトリにコピー
③ Empty Object に「ROS2UnityComponent.cs」「ROS2TalkerExample.cs」をアタッチ

コピーしてアタッチ。これだけで自作アプリが Topic を publish するようになります。
簡単すぎィ!


可視化に使うも良し、コントローラアプリにするも良し。
点群出すコードを書いたり、スマホから使ったり。
ChatGPT にコード出させたり、たくさんの入門書のコードを参考にしたり。

自分は rviz より Unity の方がとっつきやすく、便利に使っています♪

環境

ROS2 Humble

① Win 11 (Unity 2022.3.20f1)
② Ubuntu 22.04 (ROS2 Humble)

今回は2つの端末の構成で試しました。
(Unity 2020~、Win10/11、Ubuntu 20.04/22.04 対応とのこと)

手順

一応手順のスクショ残しておきます。

① ros2-for-unity の「ビルド済」 zip を、 Release 一覧からダウンロード。
 (Android で使いたい方はこちらを参考に。)

今回は「 Ros2ForUnity_humble_standalone_windows11.zip 」を使いました。

image.png


② Unity の Asset ディレクトリ内に先ほどダウンロードした zip の中身を解凍してコピーします。
(show in Explorer でエクスプローラでディレクトリを開けます)
(README には unitypackage を作ると書いてありますが、これで動きました。)


③ Unity エディタ上で、Create Empty で空のオブジェクトを作り、そこに「Scripts」内の「ROS2UnityComponent.cs」「ROS2TalkerExample.cs」をアタッチすれば、トピックのパブリッシュが行われるアプリがサクッと完成です。

image.png

image.png

image.png

image.png

image.png

ROS2TalkerExample.cs の中身

とても短いコードです。

ROS2TalkerExample.cs
// Copyright 2019-2021 Robotec.ai.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using UnityEngine;

namespace ROS2
{

/// <summary>
/// An example class provided for testing of basic ROS2 communication
/// </summary>
public class ROS2TalkerExample : MonoBehaviour
{
    // Start is called before the first frame update
    private ROS2UnityComponent ros2Unity;
    private ROS2Node ros2Node;
    private IPublisher<std_msgs.msg.String> chatter_pub;
    private int i;

    void Start()
    {
        ros2Unity = GetComponent<ROS2UnityComponent>();
    }

    void Update()
    {
        if (ros2Unity.Ok())
        {
            if (ros2Node == null)
            {
                ros2Node = ros2Unity.CreateNode("ROS2UnityTalkerNode");
                chatter_pub = ros2Node.CreatePublisher<std_msgs.msg.String>("chatter");
            }

            i++;
            std_msgs.msg.String msg = new std_msgs.msg.String();
            msg.Data = "Unity ROS2 sending: hello " + i;
            chatter_pub.Publish(msg);
        }
    }
}

}  // namespace ROS2

使用例

Unity の画面上の Play ボタン(三角)を押して実行すれば、

ros2 topic list
ros2 topic echo /chatter

でトピックを受信する様子が見れます。

image.png

image.png

image.png

なお、リスナーの方のコードは「ROS2ListenerExample.cs」です。

ROS2ListenerExample.cs
// Copyright 2019-2021 Robotec.ai.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using System;
using UnityEngine;

namespace ROS2
{

/// <summary>
/// An example class provided for testing of basic ROS2 communication
/// </summary>
public class ROS2ListenerExample : MonoBehaviour
{
    private ROS2UnityComponent ros2Unity;
    private ROS2Node ros2Node;
    private ISubscription<std_msgs.msg.String> chatter_sub;

    void Start()
    {
        ros2Unity = GetComponent<ROS2UnityComponent>();
    }

    void Update()
    {
        if (ros2Node == null && ros2Unity.Ok())
        {
            ros2Node = ros2Unity.CreateNode("ROS2UnityListenerNode");
            chatter_sub = ros2Node.CreateSubscription<std_msgs.msg.String>(
              "chatter", msg => Debug.Log("Unity listener heard: [" + msg.Data + "]"));
        }
    }
}

}  // namespace ROS2

引っかかったところ

・Windows ファイアウォールで Unity 通信が遮断されていると、他PCからそのトピックだけ見えなくなったりします。

image.png

image.png
image.png

image.png



・ROS_DOMAIN_ID を各端末で揃えないと、ROS2 通信が端末同士で共有されません。
(特に設定してなければ大丈夫と思いますが)

Unity コード上からなら

using System;
Environment.SetEnvironmentVariable("ROS_DOMAIN_ID", "0");

Windows PowerShell だと環境変数の設定方法は、

$Env:ROS_DOMAIN_ID = 0
echo $Env:ROS_DOMAIN_ID

Ubuntu は、

export ROS_DOMAIN_ID=0
echo $ROS_DOMAIN_ID

参考

これは ros2-for-unity ではなく、Unity 公式の Unity-Robotics-Hub 利用例ですが、
やはり Unity が使えると 豊富な 3D 関連の関数やアセットが使えるので便利ですね…!

URDF Importer は別途個別に使えます。

xacro ファイルは xacro コマンドで一度 URDF にするそうです。

参考:

謝辞

ROS2 コミュニティ界隈の方々、いつもたくさん記事を参考にさせて頂いてます。
この場でみなさんに感謝お伝え申し上げます!

devemin

5
2
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?