はじめに

概要

数ヶ月前にスタックチャンを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_statessensor_msgs/msg/JointStatepublish10 Hzbest effort
/stackchan/joint_commandssensor_msgs/msg/JointStatesubscribe-reliable
/stackchan/camera/image/compressedsensor_msgs/msg/CompressedImagepublish5 Hzreliable
/stackchan/battery_statesensor_msgs/msg/BatteryStatepublish1 Hzbest effort
/stackchan/touch_intensitiesstd_msgs/msg/Int32MultiArraypublish10 Hzbest effort
/stackchan/imusensor_msgs/msg/Imupublish10 Hzbest effort
/stackchan/tonestd_msgs/msg/Float32MultiArraysubscribe-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)
  • 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と一緒に引き続き遊びたいと思います。 それでは、また。