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するだけのモデルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/817ab76a-7c9c-19f4-fdee-bcee13b611bb.png)

設定は以下の感じでROS2を選択しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/bd47fbf2-2afb-bfb1-8456-3c434c629abe.png)

ソルバー関連は以下のようにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/04c9e325-955b-8499-9724-cc77d4e7f7e0.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/f2b3c1cd-e2e8-f5c0-e2fb-af717c275be8.png)

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

```console
$ sudo apt install python3.7
```
あと、MATLAB側でPythonを指定する必要があります。

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

（普通こんなん気づかんやろ。。。）

気を取り直して、もう一度ビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/403525bd-95e5-f423-f57b-616b9e58fa57.png)

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

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

```console
$ sudo apt install python3.7-venv
```
として、3.7用をインストールします。


さて、今度こそ行けるでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/63b08923-4efd-5158-d5b3-bd287c98a61c.png)

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

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

今度こそ。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/6abd97a2-4988-8700-8793-2597ad6e5d7a.png)

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

```console
$ 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の設定も随時消して、毎回再生成しないといけないぽいので、定期的に

```console
$ rm -rf ~/.matlab/R2019b/ros2/
```
をしましょう。

もう、さすがに今度こそ行けるでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/9c5ed7b4-b07a-9fbf-14da-40adf4cbc15b.png)

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/9c5ed7b4-b07a-9fbf-14da-40adf4cbc15b.png)

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

```console
$ 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でも使っても良いライセンスをくれても良い頃です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/f7bea43b-c1e2-096b-f9bd-80b1b5fcb9a7.png)

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

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

```console
$ 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
```

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

そして、もう一度ビルドすると。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/34cab5cf-53f3-38a7-7837-947b1eb819de.png)

できたああああああ。

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

```console
$ 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.
```

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

```console
$ 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から

```console
$ ros2 topic echo /my_topic
```
をした瞬間に

```console
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を入れましょう（うそやろ。。。。