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のインストール
上記公式を参照しながら行えばいいが、Ubuntuなら一発で環境構築できるDockerFileを作って作ってくれた先達がいたので、これを使いましょう。 一発でできて本当に便利。
https://t.co/GEXmOumDvW
— 片岡大哉 (@hakuturu583) May 20, 2020
Unity向けにRclDotnetをビルドするDocker Imageできました。
Dockerfileに追加でほしいmessage typeのcloneとnative_plugin,dllのcopyを追記してdocker buildした後docker cpでホスト側にバイナリ全部持ってきたあとUnityにぶち込めばUnityがROS2を喋るようになります。
- 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のこと)
Unityのnative libraryのリンクの仕様な気がします。
— 片岡大哉 (@hakuturu583) June 7, 2020
native libraryをProjectにimportしたあとで選択してLoad Start Timeみたいなところにチェックを入れてやっとUnity起動時に読まれるようになる仕様だったはずなので、ロードされていなくってビルド時にリンクエラーになったのかと思います
2018.4.23f1LTSではこのLoad on startupは存在しなかったため、2019.3.15f1でためす。 しかしエラーは消えず。
同様のエラーを解決された先人は、先程のDockerFileを作成してくれた方のサンプルプロジェクトを流用したらうまく行ったとのこと。環境はUbuntu18.04だそうです。
かなり空いてしまったけど、原因は自力でNativePluginを作ったのがどうも失敗していたぽい.....
— 3panda@🐼スーパーじゃないエンジニア (@3panda) June 7, 2020
こちら(https://t.co/28dyQp2e5i)のを使わせてもらったらエラー出なかった
自分も同様に上記のプロジェクトをダウンロードし、Assets以下のROS2 for .netのライブラリをD&Dで自分のUnityにコピーして試してみたが、どのバージョンでもエラーは消えず。
4日くらいかけてこれ以上進展できなかったので、残念だけどこれにて断念しました。
おわりに
ROS2 for .netのGithubのIssuesを見ると、UnsatisfiedLinkErrorのエラーの報告が上がっているけど、解決しているようには見えない・・・
うまく行った環境がありましたらぜひ教えてください。