STM32F4へmicro-ROSを実装してみる

micro-ROS

micro-ROS puts ROS 2 onto Micro-controllers = マイコン版のROS2と言って良い。これまで高性能SOCボードやPCをターゲットにするしかなかったROSは、一気に組み込みシステムまで広がりそうになる。stm32cubemx_utilsはSTM32CubeMX/IDEプロジェクトにとってmicro-ROSを容易に実装することを目的とするROSパッケージとなる。それでは、STM32CubeIDEプロジェクトでstm32cubemx_utilsを使ってmicro-ROSを、STM32ファミリーのミドル級マイコンSTM32F4に組み込む手順を確かめてみよう。

確認環境

・micro-ROS側 NUCLEO-F446RE(MB1136)、本文のターゲットボードとなる
・ROS2側 ROS2(humble) & STM32CubeIDE 1.12.0インストール済み@UBUNTU 22.04
・接続 micro-ROS側とROS2(humble)側と、通信用シリアルケーブル(UASRT TX/RX TTL-USBコンバータ付)で接続済み、別途NUCLEO-F446REへオンボードデバッガーよりUSB給電&プログラム書き込み

micro_ROS_stm32cubemx_utils_testset
micro_ROS_stm32cubemx_utils_testset

実装手順

以下Dockerインストール→プロジェクト作成→utils入手(humble)→ハードウェア設定→ソース手入れ→agent作成→接続確認の順で説明していく。

Dockerインストール

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce=5:24.0.1-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.1-1~ubuntu.22.04~jammy containerd.io docker-compose-plugin
sudo groupadd docker
sudo usermod -aG docker $USER
sudo chmod 666 /var/run/docker.sock

stm32プロジェクト作成

STM32CubeIDEでプロジェクトを作成しておく。

stm32cubemx_utilsクローン

上記プロジェクトフォルダの直下にmicro_ros_stm32cubemx_utilsを、Cloneしておく。

git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_stm32cubemx_utils

STM32CubeIDE設定

ピン、転送などハードウェアに関わる設定や、FreeRTOS、コンパイラ、リンカーに関わる設定については、参考資料2のいうとおりに設定しておく。コンパイルやリンクエラーの要因になる、とくに「絶対パス」の記述はミスないよう注意する。

コード生成&手入れ&ビルド&ラン

micro_ros_stm32cubemx_utils/sample_main.cと、main.cと比較して、その差分をmain.cに追加する。
ビルドの際にワーニングがいくつか出たが、前向きにOKにしておく。

micro_ros_setupビルド

source /opt/ros/$ROS_DISTRO/setup.bash
mkdir ~/uros_ws && cd uros_ws
git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup
rosdep update && rosdep install --from-paths src --ignore-src -y
colcon build
source install/local_setup.bash

micro_ros_agentビルド

source ~/uros_ws/install/local_setup.sh
ros2 run micro_ros_setup create_agent_ws.sh
ros2 run micro_ros_setup build_agent.sh
source install/local_setup.sh

接続確認

source ~/uros_ws/install/local_setup.sh
ls -l /dev/ttyUSB*
sudo chmod 1666 /dev/ttyUSB0
ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyUSB0
ros2 topic list
ros2 echo /cubemx_publisher

蛇足:USBポートのデバイス名は、TTL-USBコンバータはFTDI/CP(Silicon Labs)/CH(Qinheng Microelectronics)製TTL-USB IC使用の場合、/dev/ttyUSB*となり、マイコン内蔵USBコントローラ使用、つまりCDC/HIDなどのバーチャルCOMポートの場合、/dev/ttyACM*となる。

以下のような結果が出てれば、micro-ROS@STM32F446REからのメッセージは届いたら確認完了とする。

micro_ROS_stm32_test_result
micro_ROS_stm32_test_result

プロジェクト

STM32プロジェクトはgithub.com/soarbear(ROBOSHO)に預かっておく。

参考資料

1・https://micro.ros.org
2・https://github.com/micro-ROS/micro_ros_setup
3・https://github.com/micro-ROS/micro_ros_stm32cubemx_utils

あとがき

micro-ROSは、設計要件次第、クロック周波数100〜200MHzのSTM32F4、STM32G4にも有用&可用であることが分かった。Docker、Micro XRCE-DDSは、ROS2とは少し違和感が感じさせられて、これからドンドン進化していくと思われる。

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア