にわかプラス

にわかが玄人になることを夢見るサイトです。社会や国際のトレンド、プログラミングや電子工作のことについて勉強していきたいです。

UnityでRos2の環境構築(できなかった話)【Ubuntu18.04,Windows10】

sponsor

UnityでROS2を使いたくて、環境構築したけど、Unityで使うところでコケてしまった話です。 うまく動かせたよ、などありましたらぜひ教えてください

環境

  • OS
    • Ubutnu18.04
    • Windows10
  • ROS2 eloquent
  • ROS2 for .NET
  • Unity
    • 2018.4.23f1LTS
    • 2019.3.15f1
    • 2020.2.0a13

Window10では、デスクトップ版とUWP版があります。 デスクトップ版はROS2 for .netのインストールに成功して、サンプルは動かせましたが、Unityではエラーが出て使えませんでした。 UWP版はインストールの途中でエラーが出て断念しました。

Unityで動かすための試行錯誤はUbuntu18.04環境下で行っています。

ROS2インストール

ROS2 for .NETの対応の関係でROS2 eloquentをインストール

公式を見ながら行いましょう。 index.ros.org

ROS2インストール時につまずいたエラー

Windows10
C:\>ros2 run demo_nodes_cpp talker
failed to create process.

ros2-script.pyに記載されているPythonのPathが違うのでエラーが出ていた。記述を修正するか、PythonをこのPathに再インストールすればOK

D:\dev\ros2>ros2 run demo_nodes_cpp talker
Failed to load entry point 'test': No module named 'yaml'
Failed to load entry point 'launch': No module named 'yaml'
Failed to load entry point 'info': No module named 'numpy'
Failed to load entry point 'list': No module named 'numpy'
Failed to load entry point 'send_goal': No module named 'numpy'
Failed to load entry point 'show': No module named 'numpy'

No Module named・・・の部分が無いために起こっている。 pip install で一つづつ潰していく。 ちなみに、Yaml はpyyaml、Larkはlark-parkでインストールできます。

Ubuntu

公式通りに行ったたら特につまづくことはなかった。

ROS2 for .NETのインストール

github.com

上記公式を参照しながら行えばいいが、Ubuntuなら一発で環境構築できるDockerFileを作って作ってくれた先達がいたので、これを使いましょう。 一発でできて本当に便利。

  • Docker Imageをビルド
sudo sh build.sh
  • Docker Imageを実行
sudo docker run -it イメージ名
  • Dockerが起動したら、Ctr+P,Qで一旦イメージから抜け出す

  • 作成されたROS2 for .NetのライブラリをホストPCにコピー

docker cp <container_id>:/UnityRclDotnet UnityRclDotnet

ついでにこのとき調べたDockerのコマンドを以下にメモ。

コンテナの削除

sudo docker rm -f イメージID

イメージの削除

sudo docker rmi イメージID

実行中のコンテナを確認

sudo docker ps -a

イメージの確認

sudo docker image

Windowsの場合は公式通りにインストールします。

公式通りにやったときにつまずいたエラー

VCSがない

Windows:

pip install vcstool

Ubuntu:

sudo apt install python3-vcstool

Colconがない

Windows10:

pip install -U colcon-common-extensions

Ubuntu:

sudo apt install python3-colcon-common-extensions 

colcon build --merge-installが失敗する

Widnowsの場合、コマンドプロンプトでやると失敗することがある。 代わりに管理者権限でVisual Studio 2019 Developer コマンドプロンプトでビルドすると成功した。Visual Studio2017のコマンドプロンプトでも成功した。

Multiple executables found

ROS2 for .NETのインストールが完了しても、Windowsの場合このエラーが出る(多分必ず)。

C:\dev\ros2_dotnet_ws>ros2 run rcldotnet_examples rcldotnet_talker
Multiple executables found:
- C:\dev\ros2_dotnet_ws\install\lib\rcldotnet_examples\rcldotnet_talker.bat
- C:\dev\ros2_dotnet_ws\install\lib\rcldotnet_examples\dotnet\rcldotnet_talker.exe

複数の実行可能なものがある、というエラーが出ているので、 rcldotnet_talker.batをrcldotnet_talker.bat.bakのようにして使えないようにリネームする。

以上でROS2 for .NETのインストールは完了です。

Unityで動かす

ここからはうまく行かなかった話をします

  • UnityにROS2 for .Netをインポート
    • Assets以下の任意の場所に、生成されたDLL(Windows,Ubuntu)と.soファイル(Ubuntuのみ)を D&Dでコピーする。

ここから、使用しているUnityのバージョンによって異なるエラーが出ました。

Unity 2020.2.0a13

Loading assembly failed:"Assets/rcldotnet_assembliesd.dll"
Loading assembly failed:"Assets/geometry_msgs_assemblies.dll"
・・・

インポートしたDLL分だけ、Loading assembly faildが出る。 このエラーが消せず断念。

Unity 2018.4.23f1(LTS), 2019.3.15f1

先程のLoading assembly failedは出ないので、動作確認用のTalker.csを用意する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Threading;

using ROS2;
using ROS2.Utils;

public class Talker : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {
        RCLdotnet.Init();
        node = RCLdotnet.CreateNode("talker");
        pose_pub = node.CreatePublisher<geometry_msgs.msg.Pose>("pose");
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private IPublisher<geometry_msgs.msg.Pose> pose_pub;
    private INode node;
}

どうやら、ライブラリの名前空間はROS2となっているようなので、usingでROS2から始まるものを使えるようにしてあげる必要があるみたい。

これを適当なオブジェクトにくっつけて実行すると以下のエラーが出る。

UnsatisfiedLinkError:Librcldotnet_native.so

以下のようなありがたい助言を頂いたので、これを試す。 (文章中にあるLoad Start Timeは.soを選択したときにInspectorウインドウに表示されるLoad on startupのこと)

2018.4.23f1LTSではこのLoad on startupは存在しなかったため、2019.3.15f1でためす。 しかしエラーは消えず。

同様のエラーを解決された先人は、先程のDockerFileを作成してくれた方のサンプルプロジェクトを流用したらうまく行ったとのこと。環境はUbuntu18.04だそうです。

自分も同様に上記のプロジェクトをダウンロードし、Assets以下のROS2 for .netのライブラリをD&Dで自分のUnityにコピーして試してみたが、どのバージョンでもエラーは消えず。

4日くらいかけてこれ以上進展できなかったので、残念だけどこれにて断念しました。

おわりに

ROS2 for .netのGithubのIssuesを見ると、UnsatisfiedLinkErrorのエラーの報告が上がっているけど、解決しているようには見えない・・・

うまく行った環境がありましたらぜひ教えてください。

f:id:hiddenvally333:20200610004328j:plain