LoginSignup
24
8

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-08

はじめに

 今回@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

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

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

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

image.png

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

$ sudo apt install python3.7

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

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

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

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

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

$ sudo apt install python3-venv

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

$ sudo apt install python3.7-venv

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

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

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

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

今度こそ。。。
image.png

そろそろ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/

をしましょう。

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

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

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

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

image.png

はいクソー。(口が悪い
/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でも使っても良いライセンスをくれても良い頃です。

image.png

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

調べたところ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

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

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

できたああああああ。

よくみると、カレントフォルダに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を入れましょう(うそやろ。。。。

24
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
8