メインコンテンツまでスキップ

Reachy Mini × XIAO 画面モーションコントロール

Reachy Mini ロボットと XIAO ESP32-S3 Plus タッチディスプレイ を組み合わせ、内蔵 IMU センサ(LSM6DS3)を使って画面を傾けることで、ロボットの体のスway、頭のヨー(左右回転)、頭のピッチ(うなずき)を制御します。

Reachy Mini × XIAO Screen Motion Control Demo

PlatformControllerSensorLanguage


デモ​

操作ロボットの反応画面表示
画面を左右に傾ける体のスway + 頭のヨー(左右)顔文字が傾き方向に合わせて傾く
画面を前後に傾ける頭のピッチ(上下のうなずき)—
画面を静止させるロボットも静止(手動トリガー)顔文字が中央に戻る

画面には ≧∇≦ の顔文字が 90° 回転して縦向きに表示され、傾き方向に合わせて揺れます。XIAO 画面の表示パターンはカスタマイズ可能です — 独自パターンをコンパイルして書き込むには、1.47 inch Touch Display Getting Started チュートリアルを参照してください。


ハードウェア​

ハードウェア説明
Reachy Mini Wireless KitUSB で PC に接続
1.47 inch Touch Display — XIAO ESP32-S3 PlusLSM6DS3 IMU センサ内蔵
PC(Windows)Python 3.11 以上
USB-C ケーブル ×21 本は画面用、1 本はロボット用

ソフトウェアセットアップ​

Step 1. Arduino CLI をインストール​

Arduino CLI Releases からダウンロードしてインストールします。

Step 2. ESP32 ボードサポートをインストール​

arduino-cli config init

~/.arduino15/arduino-cli.yaml を編集し、board_manager.additional_urls の下に ESP32 ボード URL を追加します:

board_manager:
additional_urls:
- https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

ESP32 コアをインストールします:

arduino-cli core install esp32:esp32
ヒント

画面用のボードターゲット(fqbn)として XIAO_ESP32S3_Plus を選択してください。

Step 3. Seeed GFX ライブラリをインストール​

画面表示は Seeed_GFX ライブラリに依存しています。GitHub からダウンロードし、Arduino のライブラリディレクトリにインストールしてください。

Step 4. Python 依存パッケージをインストール​

pip install reachy-mini pyserial numpy

Step 1: プロジェクトコードを取得​

git clone https://github.com/Genie-INSPIRE/reachy-mini-sway-screen.git
cd reachy-mini-sway-screen

プロジェクト内容:

ファイル目的
reachy_sway_screen/reachy_sway_screen.ino画面ファームウェア:IMU 読み取り + シリアル出力 + 顔文字描画
reachy_sync/sway_follow.pyメイン制御プログラム:シリアル読み取り + ロボット制御
reachy_sync/start_daemon.pyReachy Mini デーモン起動スクリプト

Step 2: 画面ファームウェアを書き込む​

1. 画面の COM ポートを確認​

画面を USB 接続し、デバイスマネージャー を開いて、USB-Serial/JTAG の COM ポート(VID 0x303A)を探します。

注記

画面は VID によって自動検出されるため、COM ポート番号が変わっても問題ありません。

2. コンパイルして書き込み​

arduino-cli compile --fqbn esp32:esp32:XIAO_ESP32S3_Plus -u -p COM9 --warnings none reachy_sway_screen

COM9 を実際の画面の COM ポートに置き換えてください。

3. ニュートラル位置のキャリブレーション​

  1. 画面を机の上に水平に置きます(できるだけ水平を保つ)
  2. 2 秒待ちます(画面に hold neutral と表示されます)
  3. 自動で 0.5 秒間サンプリングし、ニュートラル値を NVS に保存します(電源を切っても保持されます)
  4. 再キャリブレーションするには:シリアルツール(115200 ボー)から画面に文字 c を送信します
注意

初回使用時や画面を交換したときは必ずニュートラル位置をキャリブレーションしてください。そうしないと傾き角度がずれてしまいます。


Step 3: ロボットデーモンを起動​

1. ロボットの COM ポートを確認​

ロボットを USB 接続し、デバイスマネージャーで CH343 チップ の COM ポート(VID 0x1A86)を探します。

2. COM ポートを設定​

reachy_sync/start_daemon.py を編集し、COM14 を実際のロボットの COM ポートに変更します:

# Open start_daemon.py in an editor, change COM14 to your actual port

3. 起動​

cd reachy_sync
python -u start_daemon.py

Uvicorn running on http://127.0.0.1:8000 と表示されれば成功です!

ヒント

ブラウザで http://127.0.0.1:8000/ を開き、デーモンが動作していることを確認してください。


Step 4: メイン制御プログラムを実行​

cd reachy_sync
python -u sway_follow.py

次のように表示されるはずです:

screen connected on COMx
connected
ready: L/R tilt -> body sway + head yaw. F/B tilt -> head pitch.

画面を傾けると、ロボットがそれに追従して動きます!


動作原理​

データフロー​

Screen IMU (LSM6DS3)
ax = left/right tilt, ay = forward/back tilt
tilt = -asinf(ax), pitch = -asinf(ay)
deadband filter + gain + low-pass filter
Serial output: "sway <value> pitch <value> rad" (115200 baud)
↓
Python (sway_follow.py)
Reads serial data
Two-stage low-pass filter (0.22)
Computes body_yaw, head yaw, head pitch
↓
Reachy Mini Daemon (port 8000)
set_target(body_yaw, antennas, head)
↓
Robot motors execute

画面ファームウェアのパラメータ​

パラメータ値説明
GAIN6.0傾き増幅係数 — 大きいほど感度が高い
FILT0.25ローパスフィルタ係数 — 小さいほど滑らかだが応答が遅い
AMP0.7最大出力振幅(rad)、約 40°
deadband0.008デッドゾーン(rad)、0.5° 未満の傾きを無視

ロボット側パラメータ​

パラメータ値説明
HEAD_K0.40頭のヨーゲイン(左右)
HEAD_PITCH_K0.65頭のピッチゲイン(上下)
フィルタ係数0.22 / 0.222 段ローパス — 小さいほど滑らか

アンテナのミラー構造​

Reachy Mini の 2 つのアンテナモータはミラー配置になっています:

  • 右アンテナ(インデックス 0):正の値 = 左に傾く、負の値 = 右に傾く
  • 左アンテナ(インデックス 1):正の値 = 右に傾く、負の値 = 左に傾く

両方のアンテナを同じ方向に傾けるには、符号を逆にして使います:右は減算、左は加算します。


パラメータ調整​

動きが重く感じる場合​

  • 画面側の FILT を大きくする(例:0.25 → 0.30):画面側のフィルタを強くする
  • ロボット側フィルタ係数を小さくする(例:0.22 → 0.15):より滑らかだが応答は遅くなる

動きが遅い / 大きく傾けないと反応しない場合​

  • 画面側の GAIN を大きくする(例:6.0 → 8.0):小さな傾きで大きく動くようにする
  • ロボット側フィルタ係数を大きくする(例:0.22 → 0.30):応答を速くする

頭の向きが逆になる場合​

問題解決策
左右が逆.ino 内の tilt = -asinf(ax) の符号を反転する
上下が逆.ino 内の pt = -asinf(ay) の符号を反転する

顔文字の向きが合わない場合​

問題解決策
回転角度drawFigure(dyn + 1.5708f) を変更 — 1.5708 = 90°
傾き方向が逆dyn = kaoDev * 2.0f を dyn = -kaoDev * 2.0f に変更

FAQ​

Q: 停電・電源断の後はどうすればいいですか?

A: デーモンを再起動し(python start_daemon.py)、その後 sway_follow.py を起動してください。画面ファームウェアとニュートラルキャリブレーションは NVS に保存されており、失われません。

Q: COM ポート番号が変わってしまいました。

A: 画面は VID(0x303A)で自動検出されるため、設定変更は不要です。ロボットの COM ポートだけ start_daemon.py 内で更新してください。

Q: ロボットが動きません。

A: デーモンがポート 8000 で動作しているか確認してください(ブラウザで http://127.0.0.1:8000/ を開きます)。動作していない場合はデーモンを再起動してください。

Q: 画面が表示されない、またはデータを送っていません。

A: USB ケーブルを確認し、ファームウェアを書き直し、シリアルツール(115200 ボー)を使って sway ... pitch ... rad の出力を確認してください。

Q: 頭の向きが逆です。

A: 左右が逆 → .ino ファイル内の tilt = -asinf(ax) の符号を反転してください。上下が逆 → pt = -asinf(ay) の符号を反転してください。


技術サポート​


参考資料​

Loading Comments...