SO-ARM 向け Reachy Mini 音声制御
このケースでは、Reachy Mini 会話アプリを使用して、SO-ARM フォロワーアームのグリッパーを音声コマンドで開閉します。これは、公式ソースコードを変更することなく、アプリに組み込まれている外部ツール機構を利用して実現します。

仕組み
Voice command
→ gripper_control external tool (LLM function calling)
→ subprocess runs the driver script: soarm_gripper.py open|close
→ lerobot SOFollower → /dev/ttyACM1 drives the SO-ARM gripper
このフォークで追加されたファイル:
| File | Purpose |
|---|---|
soarm_gripper.py | グリッパードライバースクリプト(lerobot ベース) |
external_content/external_tools/gripper_control.py | LLM に公開される外部ツール |
.gitignore | ツールファイルをコミットできるように ignore を解除 |
前提条件
-
Reachy Mini が接続されており(
/dev/ttyACM0)、デーモンが動作していること。 -
SO-ARM フォロワーアームが接続されていること。本ガイドでは
/dev/ttyACM1として認識されることを前提としています。ls /dev/ttyACM*で確認し、異なる場合はsoarm_gripper.py内のPORTを更新してください。 -
feetech サポート付きの
lerobotconda 環境が作成されていること:conda create -n lerobot python=3.10
conda activate lerobot
pip install lerobot[feetech] -
一度 lerobot でアームのキャリブレーションを行っていること(これにより
~/.cache/huggingface/lerobot/calibration/robots/so_follower/配下にキャリブレーションファイルが生成されます)。スクリプトではARM_ID = "my_awesome_follower_arm"を使用しており、これはあなたのキャリブレーションファイル名と一致している必要があります。
reachy_mini_conversation_app のインストール
注意:このアプリをインストールする前に、まず Reachy Mini SDK をインストールしておく必要があります。
フォークリポジトリをクローンします:
git clone https://github.com/xiehuangbao888/reachy_mini_conversation_app.git
cd reachy_mini_conversation_app
conda を使用する場合
conda create -n reachy_mini python=3.12
conda activate reachy_mini
pip install -e .
(または)uv を使用する場合
# macOS (Homebrew)
uv venv --python /opt/homebrew/bin/python3.12 .venv
# Linux / Windows (Python on PATH)
uv venv --python python3.12 .venv
source .venv/bin/activate
uv sync
このアプリをある conda 環境にインストールし、lerobot が別の conda 環境に存在する場合(前提条件参照)、.env 内の LEROBOT_PYTHON を lerobot 環境の python パス(例:/home/ubuntu/miniconda3/envs/lerobot/bin/python)に設定してください。reachy_mini 環境と混在させないでください。
グリッパー音声制御の設定
リポジトリルートの .env に、次の 2 行を追加します(ファイルが存在しない場合は作成してください):
REACHY_MINI_EXTERNAL_TOOLS_DIRECTORY=external_content/external_tools
AUTOLOAD_EXTERNAL_TOOLS=1
lerobot の python パスが異なる場合は、次も設定します:
LEROBOT_PYTHON=/path/to/lerobot/env/bin/python
実行
.env と相対パスのツールディレクトリを正しく解決するため、必ずリポジトリルートからアプリを起動してください:
cd reachy_mini_conversation_app
reachy-mini-conversation-app
音声コマンド
- 開く: "open the gripper" / "open the claw" / "release" / "let go"
- 閉じる: "close the gripper" / "close the claw" / "grab it" / "hold this"
手動テスト
会話アプリを起動せずに、まずハードウェアとキャリブレーションが正しく動作するか確認します:
/home/ubuntu/miniconda3/envs/lerobot/bin/python soarm_gripper.py open
/home/ubuntu/miniconda3/envs/lerobot/bin/python soarm_gripper.py close
/home/ubuntu/miniconda3/envs/lerobot/bin/python soarm_gripper.py demo # open and close twice
カスタマイズ:アームの他の部分を制御する
全体のチェーンは 2 つのファイルだけで構成されています。ニーズに合う方を変更してください:
1. モーション自体を変更する → soarm_gripper.py(リポジトリルート)
これは実際にアームを駆動するスクリプトです。現在はグリッパーアクションのみを送信します:
robot.send_action({"gripper.pos": target})
SO-ARM フォロワーで利用可能なジョイントキーは、shoulder_pan.pos、shoulder_lift.pos、elbow_flex.pos、wrist_flex.pos、wrist_roll.pos、gripper.pos(正規化 0–100)です。他の部分を制御するには、send_action() に渡す dict に対応するジョイントを追加します。例:
robot.send_action({
"shoulder_pan.pos": 50.0,
"elbow_flex.pos": 70.0,
"gripper.pos": OPEN_POS,
})
また、main() 内で open / close / demo パターンに従って、wave や home など独自のアクション分岐を追加することもできます。
このファイルでよく調整するパラメータ:
OPEN_POS/CLOSE_POS— グリッパーの移動量(正規化 0–100、デフォルトは 60 / 20)。PORT— フォロワーアームのシリアルデバイス。ARM_ID— キャリブレーションプロファイル名。
2. LLM に新しいアクションを呼び出させる → external_content/external_tools/gripper_control.py
これは LLM に公開される外部ツールであり、LLM が「利用可能であると認識している」アクションを決定します。アクションを追加する際は、次を同期して更新してください:
description— ツールの説明。どのようなユーザー発話で呼び出すべきか(いつ呼び出すか)を LLM に伝えます。parameters_schema— 新しいアクション名(例:"wave")をactionのenumに追加します。__call__()— 新しいactionをサブプロセスコマンドcmd = [LEROBOT_PYTHON, GRIPPER_SCRIPT, action]に渡します。
まったく別のデバイスを制御したい場合は、そのディレクトリ内に(例:arm_control.py のような)新しいツールファイルを作成することもできます。同様に reachy_mini_conversation_app.tools.core_tools.Tool を継承してください。AUTOLOAD_EXTERNAL_TOOLS=1 の場合、そのディレクトリ内の有効なツールファイルはすべて自動的に読み込まれます。各ツールクラスは一意の Tool.name を持つ必要がある点に注意してください。
トラブルシューティング
バックエンドが起動しない:Unknown scheme for proxy URL 'socks://...'
このアプリは httpx を使用しており、ALL_PROXY における socks:// スキームを受け付けません(認識するのは http(s)://、socks5://、socks5h:// のみです)。シェル(例:clash)が ALL_PROXY=socks://... を設定している場合は、起動時にこれを解除してください。HTTPS_PROXY=http://... を維持しておけば十分です:
env -u ALL_PROXY -u all_proxy reachy-mini-conversation-app
あるいはプロキシ変数を socks5://127.0.0.1:port/ に変更します(httpx はこの形式を受け付けます。これは socksio を必要としますが、すでに環境にインストールされています)。