まず、基本的にはMbed開発環境にmROS2ライブラリを組み込む、という手順であるが!
mROS2がかなり特殊でなかなか環境が限定される。
Mbedは
・オンライン環境(KeilCloudStudio)(おそらくこれがARMの基本推奨環境)
・ローカル環境
・Docker
があるが
mROS2は(開発リソースの兼ね合いだと思うが)ローカルとDockerしか対応していない。
最新のmROSは基本Docker環境でしか対応していない。(ローカル環境が置いてきぼり気味?)
私が現在使っているFoxy世代のmROS2 0.5.2は両方使えており、私はローカル環境で使っている。
(普段はVM上のLubuntu20.04を使っているが、ラズパイにも同じ環境が構築してある。)
構築の手順は以下の2ステップ
①Mbedコンパイル環境の整備(基本的にMbedCL2)
②mROS2ワークディレクトリの設定(mROS2の特殊な手順)
①Mbedコンパイル環境のセットアップ
$sudo apt-get install python3-pip
$pip3 install future
$echo "export PATH=~/.local/bin:${PATH}" >> ~/.bashrc
$source ~/.bashrc
●ST-Linkのツール類インストール
$sudo apt install cmake libusb-1.0-0-dev
$mkdir ~/bin
$cd bin
$git clone https://github.com/texane/stlink.git
$cd stlink
$make
$cd build/Release
$sudo make install
$sudo ldconfig
※su権限が必要なbinだかどこかへのコピーが含まれるのでmake install はsudoさんです
●mbed-toolsのインストール
いわゆるMbed CLI2です。https://os.mbed.com/docs/mbed-os/v6.16/build-tools/install-or-upgrade.html
$sudo apt install pip
$python3 -m pip install mbed-tools
$echo "export PATH=~/.local/bin:${PATH}" >> ~/.bashrc
$source ~/.bashrc
●Ninjaのインストール
sudo apt install ninja-build
python3 -m pip install intelhex prettytable
●cmake 3.24.2 をsnapインストール
$sudo snap install cmake --classic
$echo "export PATH=/snap/bin:${PATH}" >> ~/.bashrc
$source ~/.bashrc
※systemdがないと苦難しそう(snapがsystemd依存)>手動でインスコ手段は以下
(インスコ作業用フォルダから
wget https://cmake.org/files/v3.24/cmake-3.24.2.tar.gz
tar xvf cmake-3.24.2.tar.gz
./bootstrap — -DCMAKE_USE_OPENSSL=OFF && make && sudo make install
ブートストラップからコンパイルする。OPENSSLを使わない・)
※うまくいかないときは事前にapt-get purge cmake で余計なバージョンは除去しておけー
●GCC-ARMのインストール
GCCのコンパイラが使用するので今後消せない。フォルダ名はよく考えるように。
$cd ~/bin
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.07/gcc-arm-none-eabi-10.3-2021.07-aarch64-linux.tar.bz2
$tar -xjvf gcc-arm-none-eabi-10.3-2021.07-aarch64-linux.tar.bz2
$echo "export MBED_GCC_ARM_PATH=`pwd`/gcc-arm-none-eabi-10.3-2021.07/bin/" >> ~/.bashrc
$source ~/.bashrc
$echo "export PATH="${PATH}:${MBED_GCC_ARM_PATH}"" >> ~/.bashrc
$source ~/.bashrc
※赤字部分については、VMなんかに入れるときは処理系によって変更すること。
例:wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.07/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2
【参考】 https://packages.debian.org/bullseye/gcc-arm-none-eabi
http://ftp.debian.org/debian/pool/main/g/gcc-arm-none-eabi/
https://www.fedora.is/debian/pool/main/g/gcc-arm-none-eabi/
※インストール後はgcc-arm-none-eabi-10.3-2021.07-aarch64-linux.tar.bz2・・・は消して大丈夫
●シリアル通信用のpicocomのインストール
$sudo apt install picocom
②mROS2ライブラリのワークディレクトリの設定
公式は以下ですが、正直結構説明がつらい、公式解説を頑張ってやってもらうか、こちらで用意したパッケージでやってほしい。
公式:こちらから環境一式をダウンロード
公式:こちらからライブラリダウンロード
上述パッケージでやる場合は、mROS2のワークフォルダ一式をダウンロードし①で環境作成したラズパイのホームディレクトリ(~/)に内容物を入れてください
tar.gzはUbuntuのデスクトップ環境(Lubuntuとか)があれば簡単に解凍できるはずです
設置後の荷姿は以下のとおりです
~/mros2-mbed/
├build.bash
├CMakeLists.txt
├LICENSE
├mbed_app.json
├mbed-os.lib
├mros2.lib
├README.md
├cmake_build/ ・・・(中身は空)
├mros2/ ・・・(中身は略)
├platform/ ・・・(中身は略)
└workspace/ ・・・(中身は略)
├00_mbed_rpi_min/
├custom_msgs/
│ ├mbed2rasppi_msgs/msg/Mbed2rasppi.msg
│ ├rasppi2mbed_msgs/msg/Rasppi2mbed.msg
│ ├・・・
│ ├・・・
├・・・
├・・・(以下略)
この赤いファイルないしフォルダーが、改造時によく変更する場所になります。
こちらで準備したデモを動かすだけならばこのまま
cd ~/mros2-mbed/
./build.bash all NUCLEO_F746ZG 00_mbed_rpi_min native
とすれば、ビルドが始まる。
最終的に
上のような各フォルダの前回からの使用量変化みたいな画面が出ればまずは成功ってことです。
ここまえくれば、
~/mros2-mbed/cmake_build/NUCLEO_F746ZG/develop/GCC_ARM/
に「mros2-mbed.bin」というファイルができていて、そのままMbedとUSB接続してドラッグ&ドロップでリプロ完了、なのですが、以下、フォルダ構成を軽く解説。
ここでのミソは赤のフォルダです
「00_mbed_rpi_min/」については、中にいわゆるmain.cpp(実際は諸事情によりapp.cppという名前)が入っていて、これを変更すればMbedの挙動を変えることができるんだなというのが分かると思います。
もう1か所いじる場所があります。
メッセージを定義する場所です。
どういう信号を通信するかの定義(メッセージの定義)は「custom_msgs/(メッセージ名)/msg/」フォルダ内の.msgファイルに記載してあります。
で!このファイルはROS2側のメッセージの設定をするときに使ったファイルと全く同一のフォームです。(なので、ファイル名の一文字目は大文字です。しつこいですが。)
ですから、基本的には「作り直す」ものではなく、流用しましょう。
今回使用するのは、
…/custom_msgs/mbed2rasppi_msgs/msg/Mbed2rasppi.msg
…/custom_msgs/rasppi2mbed_msgs/msg/Rasppi2mbed.msg
です。
しかしこのままではC言語的には何の意味もないものですから、mROS2付属のツールを使い自動変換します。
例えば以下の通り。
$cd ~/mros2-mbed/workspace/
$python3 ../mros2/mros2_header_generator/header_generator.py mbed2rasppi_msgs/msg/Mbed2rasppi.msg
これは「メッセージ定義を変えるたびに」行う必要があることはわかるかと思います。
(パッケージ内のものはすでにやってあります)
(ちなみに、このフォルダには#includeのパスが通っていますので、ライブラリ化したソースの一部をこの中に入れて、ソースコードを整理するのに使えたりします)
いきなりはむつかしいので、小改造をしながら、だんだん慣れてていってみるといいと思います