はじめに
概要
数ヶ月前にスタックチャンをmicro-ROSとArduinoで動かすパッケージを作成しました。 課題として、使いづらい部分があったり、トピック通信の周期が不安定だったりしたので、 Claudeを使ってパッケージ全体を修正しました。 この記事ではパッケージの説明や使い方の紹介をします。
GitHub - YusukeKato/stack-chan_micro-ros_arduino

過去の記事
前回の記事はこちらです。
スタックチャンをmicro-ROSで動かす - Arduino編
それ以外にもスタックチャンをmicro-ROSで動かす記事を書いています。
スタックチャンをラズパイマウスに搭載してカメラを使った顔の検出と追従
スタックチャンにシンプルなText-to-Speech機能を実装して喋ってもらう
パッケージ説明
パッケージ作成方針:ハードウェアとROS 2の橋渡し
このパッケージにいろいろ機能を追加していこうと思っていたのですが、 スタックチャンのハードウェアとROS 2をつなぐ部分だけに集中する方針へ変更しました。 アプリケーション部分はPCのROS 2側で動かす想定です。
主な更新内容
パッケージを使いやすくするために下記の変更を加えました。
- ファイル構成をモジュール(
src/*.h/.cpp)ごとに分割 - 設定を
config.hに分離(Wi-Fi、Agentのアドレス、機能のオン/オフ) - モータのトピックを
sensor_msgs/msg/JointState(単位はrad)に変更 - センサ系トピックのQoSをbest effortに変更
- スピーカで音を鳴らす機能を追加
- 顔表示をやめて画面へのログ出力に変更
- Text-to-Speech機能を削除(ベース機能としては不要だったため)
- カメラ画像の調整(JPEG品質の自動調整など)
- IMUの加速度の符号を修正
ファイル構成
バージョン2.0.0時点では下記のようなファイル構成になりました。
stack-chan_micro-ros_arduino.ino # main: Wi-Fi, micro-ROS node, executor
config.h.example # copy to config.h
src/
motor.h/.cpp # joint_states, joint_commands
camera.h/.cpp # camera/image/compressed
battery.h/.cpp # battery_state
touch.h/.cpp # touch_intensities
imu.h/.cpp # imu
speaker.h/.cpp # tone
display_log.h/.cpp # logs to Serial and the screen
ros_utils.h/.cpp # stamp, string, publish and check helpers
wifi_transport.h/.cpp # Wi-Fi UDP transport to the micro-ROS Agent
トピック一覧
ノード名はstackchan_nodeです。
バージョン2.0.0の時点で下記のトピックを用意しています。
| トピック | 型 | 方向 | 周期 | QoS |
|---|---|---|---|---|
/stackchan/joint_states | sensor_msgs/msg/JointState | publish | 10 Hz | best effort |
/stackchan/joint_commands | sensor_msgs/msg/JointState | subscribe | - | reliable |
/stackchan/camera/image/compressed | sensor_msgs/msg/CompressedImage | publish | 5 Hz | reliable |
/stackchan/battery_state | sensor_msgs/msg/BatteryState | publish | 1 Hz | best effort |
/stackchan/touch_intensities | std_msgs/msg/Int32MultiArray | publish | 10 Hz | best effort |
/stackchan/imu | sensor_msgs/msg/Imu | publish | 10 Hz | best effort |
/stackchan/tone | std_msgs/msg/Float32MultiArray | subscribe | - | reliable |
開発環境
- PC
- Ubuntu 24.04 LTS
- ROS 2 Jazzy
- Docker 29.9.3
- Arduino IDE 2.3.9 / arduino-cli 1.6.0
- Arduino IDE - Boards
- M5Stack(
m5stack:esp32)3.3.7 - ボード:M5CoreS3(
m5stack:esp32:m5stack_cores3)
- M5Stack(
- Arduino IDE - Library
- micro_ros_arduino 3.0.0-iron
- M5StackChan 1.0.1
- M5Unified 0.2.16
- M5GFX 0.2.22
Ubuntu 26.04 + ROS 2 Lyricalの環境で、 Arduino側のライブラリもすべて最新の状態だと、 ビルドはできましたがうまく動きませんでした。 上記の動作確認済みの環境に合わせていただくと動かしやすいかと思います。
インストール方法と動作方法
インストール方法は下記の記事やGitHubリポジトリのREADMEをご参照ください。
1つ抜けている補足情報として、
Arduinoでのビルド時に esp32s3 がないというエラーが出た時は下記コマンドでフォルダをコピーしておきます。
cp -r ~/Arduino/libraries/micro_ros_arduino/src/esp32 ~/Arduino/libraries/micro_ros_arduino/src/esp32s3
動作確認
スタックチャンへプログラムを書き込んで再起動し、 PCでmicro-ROSのDockerコンテナを起動すると、 スタックチャンとPCでROS通信ができるようになります。
スタックチャンの画面にログが表示されて ROS 2 ready! と表示されたら正常に動作しています。

Claudeがすごい
すべてClaudeに実装してもらって私はレビューしただけでパッケージ更新が完了しました。 もともとカメラトピックの配信周期が遅くて困っていたのですが、Claudeが原因を発見してくれました。 micro_ros_arduinoのビルド設定で使えるタイマーの数に上限があり、上限を超えた分の初期化に失敗していたようです。 それをClaudeがいい感じに修正してくれました。 Claude凄いです。
おわりに
スタックチャンをmicro-ROSで動かすパッケージを更新しました。 Claudeがどんどん進めてくれるのでかなり楽に実施できました。 AIを活用すれば既存のソフトウェアもどんどん更新できて嬉しいですね。 スタックチャンをもっと活用していきたいので、AIと一緒に引き続き遊びたいと思います。 それでは、また。