STM32F7Discovery上でmicro-ros-arduinoを動作させてみました。

STM32 + ROS2
STM32マイコンはArm®Cortex®‑Mをベースとしたマイコンシリーズで、高性能・安価・低消費電力なMCUとして教育用途から産業用途まで広く用いられています。
STMマイコンはチップ単体だけでなく、Arduinoシールドを用いてボードの拡張が可能な「Nucleo」や高性能なSTM32の機能を手軽に体験できるDiscoveryシリーズなどもあり、マイコンを手軽に扱えるラインナップも魅力的です。
一方で、(Arduinoシールドが多く用意されているのにもかかわらず)STM32マイコンといえばSTM32CubeIDEかMbedで開発されることがほとんどで、開発ではあまりArduinoを使用することは無いような気がします。
ROS2 + MCU のライブラリであるmicro-ROSでもSTM32CubeMX仕様のライブラリが用意されています。
Arduinoの方ではmicro-ROSのリファレンスボードであるSTM32-E407で動作することを確認されているそうです。(しかもEthernet!)
ライブラリにおいて「手軽に扱える」ことはとても大切なことなので、ダメ元でビルドしてみることにしました。
STM32F7Discovery
手元に積んでいたSTM32F7Discoveryがあったので、これを使用します。
このボードは5年くらい前に買ってから、少しは触ったもののあまり活用できず積んでいたものです…5年の歳月を経てようやく活躍の時が来たようです。
STM32F7Discoveryは、タッチパネルやカメラコネクタ、オーディオ端子などが揃っており、ボード単体でモバイル機器を作成できるくらいの高スペックなマイコン開発用ボードとなっています。
値段は8000円程度です。
各種ファイルの調整
以下の環境を使用してmicro-ros-arduinoを構成しています。
- micro-ros-arduino
- PlatformIO
platformio.ini
ポイントになるのは、-L ./.pio/libdeps/disco_f746ng/micro_ros_arduino/src/cortex-m4/です。micro-ros-arduinoでは、コンパイル済みのライブラリをリポジトリ内に入れてそこからリンクさせています。
え?STM32F7Discoveryに載っているMCUってCortex®-M7なのでは…
(なぜか互換性があり、そのまま動いてしまいました)
[env:disco_f746ng]
platform = ststm32
board = disco_f746ng
framework = arduino
monitor_speed = 115200
upload_speed = 115200
lib_deps =
;; microros ---------------------------------------------------------------
https://github.com/micro-ROS/micro_ros_arduino.git
stm32duino/STM32Ethernet@^1.3.0
stm32duino/STM32duino LwIP@^2.1.2
build_flags =
-L ./.pio/libdeps/disco_f746ng/micro_ros_arduino/src/cortex-m4/
-l microros
ターゲットの流用
micro_ros_arduinoライブラリ内のmicro_ros_arduino.hとnative_ethernet_transport.cppの1行目に#define TARGET_STM32F4を申し訳なく思いながら追記します。
現在のライブラリではサポートされていない体になっているので仕方ありません。
micro-ros_publisher_ethernet.inoをmain.cppにコピー
#include <Arduino.h>を忘れずに!
timer_callbackはありますが、どう見てもloopからしかpublishされておらず、timerが動いていません。
SubscriberとTimerについては、分かり次第ここに追記していこうと思います。
追記(07/12):Timer・Subscriberどちらも正しく動作しました。(同時実行も可能でした)
接続
Agent起動のオプションはESP32を無線でmicro-rosに接続するのと何ら変わりませんでした。

ここまでで STM32F7Discovery + micro-ros の説明は以上です。
いろいろ設定してビルドしないと動かないと思いきやほとんど設定を変えずにビルドできてしまったので驚きです。
mROSもSTM32F7Discoveryをサポートしているそうで…
STM32 + ROS2といえば高瀬先生の「mROS2」も忘れてはいけませんね…!
STM32F7Discoveryでも動作確認ができているらしく、Agent不要なシステムを組みたいのであればそちらを使用してみてもいいかもしれません。
mROS 2|デザイン/サポート|STM32, STM8ファミリはSTの32bit/8bit汎用マイクロコントローラ製品