#はじめに
今回@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するだけのモデルを作成します。
普通は、ここで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を入れましょう(うそやろ。。。。