Unity+RasPi with ROSに挑戦
一つ前の記事と内容が少し被っているが、今回は大学院の講義で購入したRaspberry Pi 400を使って何か出来ないか調べてみたところ、以下の記事を見つけたので、今回はこちらをアレンジしてRasPi上にROS2をインストールして、WindowsのUnityと通信してみたいと思う。
実行環境
・Windows側
Windows11 Pro
Unity 2022.3.7f1
ROS-TCP-Connector v0.7.0
・Raspberry Pi 400側
Ubuntu Desktop 22.04 (64bit)
ROS2 Humble
ROS-TCP-Endpoint v0.7.0
RasPi側のセットアップ
まず最初にRasPiのOSのセットアップを行う。micro SDカードを準備し、Raspberry Pi ImagerでOSの書き込みを行う。今回はUbuntu Desktop 22.04 (64bit)を利用する。
次にRasPiを起動して、以下の初期設定を行う。詳細は割愛。
・ユーザー設定
・Wifi設定
・apt update & apt upgrade
・SSHの設定
RasPiのセットアップが完了したら、ROS2のインストールを行う。今回はOSがUbuntu 22.04なので、それに対応するROS2 Humbleをインストールする。Ubuntuのバージョンに応じてサポート対象のROS2のバージョンも異なるようなので、詳細は以下の画像とリンクを参照。
公式のインストール手順に従って進めていく。
まずはLocaleの確認、UTF-8になっていることを確認。
Ubuntu Universe repositoryをenabledにする。
sudo apt install software-properties-common
sudo add-apt-repository universe
ROS 2 GPG keyを追加する。
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
リポジトリをsources listに追加する。
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
上記の作業を実施した後に、apt update & apt upgradeを行う。
sudo apt update
sudo apt upgrade
ros-humble-desktopをインストールする、結構時間がかかるので注意。
sudo apt install ros-humble-desktop
環境設定を実施して、動作確認。
次に作業用のワークスペースの作成するため、colconをインストール。
sudo apt install python3-colcon-common-extensions
ワークスペース用のディレクトリを作成。
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
ROS-TCP-Endpointをワークスペースにcloneする。ここでの注意点としてはmain-ros2のブランチを指定する。
cd ~/ros2_ws/src
git clone -b main-ros2 https://github.com/Unity-Technologies/ROS-TCP-Endpoint
ワークスペースをビルドする。
cd ~/ros2_ws
colcon build
source ~/ros2_ws/install/setup.bash
Windows側のセットアップ
3Dのテンプレートを利用して、Unityの新規プロジェクトを作成。Package ManagerのAdd package from git URLより、ROS-TCP-ConnectorのGitリポジトリへのURLを最新のタグを指定して入力し、AddをクリックしてROS-TCP-Connectorをインポートする。
ROS-TCP-Connectorの設定を確認する。ROS IP AddressはRasPiのローカルIPアドレスを指定する。
次にC#スクリプトを作成し、コードの中身を以下に変更する。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Robotics.ROSTCPConnector;
using StringMsg = RosMessageTypes.Std.StringMsg;
public class Subscriber_Test : MonoBehaviour
{
void Start()
{
ROSConnection.GetOrCreateInstance().Subscribe<StringMsg>("test", Callback);
}
void Callback(StringMsg msg)
{
Debug.Log(msg.data);
}
}
Hierarchyウィンドウを右クリックしてCreate Emptyを作成し、Subscriberにリネームする。そして作成したSubscriber_Testをアタッチ。
通信の実行
ROS2側でターミナルを開き、エンドポイントの実行。
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=192.168.1.14
Unity側にメッセージを送信。
ros2 topic pub /test std_msgs/String "data: Hello!"
ターミナル上でメッセージがPublishされているのが確認出来る。
Unityを実行すると、Consoleでログが出力されているのが確認出来る。