MATLAB/SimulinkでROS2ノードを動かしたかった


はじめに

 今回@hakuturu583氏に煽られてROS2 Advent Calenderを書くことになったわけですが、予定ではRaspberry Pi4でSimulinkからROS2のノードを自動コード生成機能を使って動かす方法について書く予定でした。
 しかし、残念ながらまさかのHardware Support PackageがROS2に対応しておらず、MATLAB Homeでコード生成できないので諦めたのですが、マイクロマウス2019用のMATLABのライセンスがなんとMATLAB Coder/Simulink Coder/Embedded Coderを含んでいたので、これを使ってSimulinkからROS2ノードを生成する方法について書きたいと思います。

前提

 以下の環境でこの記事は書いています。

  • Ubuntu 18.04
  • ROS2 Dashing
  • MATLAB 2019b Update2(マイクロマウスのライセンス)

それではやってみます

 まずは、MATLABのサイトなどを参考に、以下のようなROS2のBlockを使ったPublishするだけのモデルを作成します。

設定は以下の感じでROS2を選択しておきます。

ソルバー関連は以下のようにしておきます。

普通は、ここでBuild Modelをクリックすれば、自動でコード生成が行われてビルドまで終わるはずなのですが、、、、

はいだめです。
Pythonのバージョンがだめだと言っています。
普通にUbuntu18.04をインストールした場合、Python3.6とPython2.7が入っているますが、ここではPython3.7を要求しています。
なので、仕方なくインストールします。

$ sudo apt install python3.7

あと、MATLAB側でPythonを指定する必要があります。

pyversion('/usr/bin/python3.7')

(普通こんなん気づかんやろ。。。)

気を取り直して、もう一度ビルドします。

まだだめです。
そろそろ、嫌になってきました。
しかし、くじけずに

$ sudo apt install python3-venv

してみます。
が、デフォルトでは、3.6が選ばれているので、python3.6-venvがインストールされてしまいます。なので、

$ sudo apt install python3.7-venv

として、3.7用をインストールします。

さて、今度こそ行けるでしょう。

キレるでしかし、、、
そこを抑えて、とりあえずファイルがないっぽいことを言っているので、

$ touch ~/.matlab/R2019b/ros2/python_venv/bin/activate

今度こそ。。。

そろそろMathworksは私にライセンスを無料で提供しても良いのでは、と思えてきます。
アクセス権がないというので、権限を与えて、pipがないとか言っているので、

$ chmod 777 -R ~/.matlab/R2019b/ros2/python_venv/bin/activate
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python3.7 ./get-pip.py

でpipを入れます。

でここあたりで気づいたのですが、いろいろと環境を変更しているので、MATLABの設定も随時消して、毎回再生成しないといけないぽいので、定期的に

$ rm -rf ~/.matlab/R2019b/ros2/

をしましょう。

もう、さすがに今度こそ行けるでしょう。

もうMathworksは私にCoder系含めて、永続ライセンスを付与すべきです。

$ sudo apt install python3.7-dev libpython3.7-dev

もうこれでだめならキレても良いはず。。。。

はいクソー。(口が悪い
/usr/lib/の下にlibpythonはそもそも置かれないのにコピーしたがってます。ほんとあほでしょ。

$ sudo ln -s /usr/lib/x86_64-linux-gnu/libpython3.7m.a /usr/lib/libpython3.7m.a
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libpython3.7m.so /usr/lib/libpython3.7m.so
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1 /usr/lib/libpython3.7m.so.1
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0 /usr/lib/libpython3.7m.so.1.0

そろそろ、Mathworksさんは私にMATLAB自由にいつでもどんなPCでも使っても良いライセンスをくれても良い頃です。

いやもう流石に勘弁してください。
これサポートしてるって言えないでしょ。。。

調べたところMATLAB内のlibexpatが悪さをしているらしいので、

$ sudo mv /usr/local/MATLAB/R2019b/bin/glnxa64/libexpat.so.1.5.0  /usr/local/MATLAB/R2019b/bin/glnxa64/libexpat.so.1.5.0.bak
$ sudo mv /usr/local/MATLAB/R2019b/bin/glnxa64/libexpat.so.1  /usr/local/MATLAB/R2019b/bin/glnxa64/libexpat.so.1.bak

で退場していただきます。

そして、もう一度ビルドすると。。。

できたああああああ。

よくみると、カレントフォルダにbuildとかinstallとかのフォルダができていますので、

$ source ./install/setup.bash
$ source ./install/local_setup.bash

ROS_DISTRO was set to 'dashing' before. Please make sure that the environment does not mix paths from different distributions.

あれれ、、、、、、まさか。。。。

$ source /opt/ros/dashing/setup.bash

ROS_DISTRO was set to 'bouncy' before. Please make sure that the environment does not mix paths from different distributions.

ぎゃああああ
ということで、MATLAB 2019bに入っているROS2はbouncyでした。。。

そのまま実行して見たものの

Dashingから

$ ros2 topic echo /my_topic

をした瞬間に

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
中止 (コアダンプ)

となります。。。。
ちなみにSimulink上での実行でも強制終了してしまいます。(先に気づけ)

なんか言ってら↓
https://jp.mathworks.com/matlabcentral/answers/409134-plans-to-support-ros-2-0

そもそもBouncyのEOLはJul 2019・・・・・・・・
https://index.ros.org/doc/ros2/Releases/

EOLの後にサポートしたMATLABは一体。。。。。

なので、MATLABでROS2を使うときはbouncyを入れましょう(うそやろ。。。。