30
19

AndroidをROS2ノードにしてロボットのコントローラを作る

Last updated at Posted at 2023-03-19

GUI付きのロボットのコントローラ

ROSで動くロボットを作ったときに下記のようなコントローラ作りたくなることがあると思います。

image.png
↑Boston DynamicsのSpot Tablet

今回はROS2で使えるAndroid用のコントローラアプリをUnityで作る方法を紹介します

これまでのROS+Android

Android端末でROSを動かす

こちらはAndroid端末にターミナルアプリを入れてUbuntuを動かす方法です
UbuntuPCで作業する時と同様にターミナルにコマンドを打ち込んでノードを起動したりrvizを起動したりします

Android端末をROSノード化する

こちらはAndroidアプリを使ったり作ったりしてROSと通信するための方法です
ロボットのコントローラを作るのはこっちのほうが近い

ROS2+Unityの選択肢

Android上で動かすことを考えなかったときにros2-for-unityというUnity用のパッケージが存在します。

これは先に紹介したUnity Robotics Hubと比べてUbuntu・Android端末間で余計なデータ変換が入らず高パフォーマンスで通信が可能です。
詳しくは下記の記事で紹介されています。

ros2-for-unityはRobotec.aiによって開発されたUnityとROS2間の通信を行うライブラリです。
ROS2 C#クライアントライブラリをネイティブライブラリとしてUnity Projectに取り込み、DDSのプロトコルで他のROS2アプリケーションと通信します。
OSはWindowsとUbuntuをサポートしています。
無駄な変換が一切挟まっていないため、これより早いプロセス間通信の方法は存在しないと言えます。

ros2-for-unityはかなり整備されていてhumbleでもしっかり動くため、これがそのままAndroid端末でも動けば嬉しいなと思って動くようにしました。

動作確認がhumbleでしかできていませんがリポジトリを以下に公開しました
Releasesからunitypackageをダウンロードできます

ジョイスティックのアプリを作ってTurtlesimを動かす例

  1. Unityでプロジェクトを作成する
    Input Systemを使用するので導入します
    (見づらいのでMain Camera -> Camera -> Clear FlagsをSolid Colorにしました)
    image.png

  2. https://github.com/Kotakku/ros2-for-unity-android-package からunitypackageをimportする
    image.png

  3. ジョイスティックになるImageを追加してOn-Screen Stickを追加する
    Source ImageKnobにしました
    image.png

    image.png
    サイズ、Movement RangeControl Pathは適当に設定してください
    今回はControl PathLeft Stick[Gamepad]に設定しました

  4. スクリプトを書く

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.InputSystem;
    using ROS2;
    
    public class TwistPub : MonoBehaviour
    {
        private ROS2UnityComponent ros2Unity;
        private ROS2Node ros2Node;
        private IPublisher<geometry_msgs.msg.Twist> twist_pub;
    
        // Start is called before the first frame update
        void Start()
        {
    #if UNITY_ANDROID && !UNITY_EDITOR
            // ROS_DOMAIN_IDを使う場合はこの行で設定する
            Environment.SetEnvironmentVariable("ROS_DOMAIN_ID", "1");
    #endif
            TryGetComponent(out ros2Unity);
        }
    
        // Update is called once per frame
        void Update()
        {
            if (ros2Unity.Ok())
            {
                if (ros2Node == null)
                {
                    ros2Node = ros2Unity.CreateNode("ROS2UnityTalkerNode");
                    twist_pub = ros2Node.CreatePublisher<geometry_msgs.msg.Twist>("/turtle1/cmd_vel");
                }
    
                geometry_msgs.msg.Twist msg = new geometry_msgs.msg.Twist();
                var current = Gamepad.current;
                var input_vec = current.leftStick.ReadValue();
                msg.Linear.X = input_vec.x;
                msg.Linear.Y = input_vec.y;
                twist_pub.Publish(msg);
            }
        }
    }
    
  5. ROS2UnityComponent.csと作ったスクリプトを貼り付ける
    image.png

    ここまで来るとUnity editer上で動作確認ができます。
    Turtlesimを起動します

    ros2 run turtlesim turtlesim_node
    

    Unity editerで実行してジョイスティックを動かしたら亀が移動することを確認します
    image.png

  6. ビルド用の設定をする
    PlatformをAndroidに変更します
    image.png

    Player Settings...からScripting BackendIL2CPPに変更します
    image.png

    Target ArchitecturesARM64にチェックを入れます
    image.png

    Internet AccessRequireに変更します
    image.png

  7. ビルドして実行する
    Androidタブレットのジョイスティックを動かしたら亀も動きます
    image.png

これでROS2用のAndroidアプリを作ることができました

30
19
5

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
30
19