コンテンツにスキップ

SO-ARM101 / Feetech STS3215 ドライラン手順書

配線と電源投入の前に、公式仕様の確認、Linux での udev 設定、Python 依存の解決、現行テーブル配置(2026-10-26)との一致、購入済み機材の一覧を整える。物理駆動はせず、ソフトウェアの接続確認にとどめる。

公式仕様と参照ドキュメント

  • Assemble SO-101(組立手順)
  • SO-101(モータ初期設定 lerobot-setup-motors およびキャリブレーション手順)
  • SO-100(ソフトウェア構成の共通仕様)

サーボモータの ID(1〜6)と関節名の対応は、本リポジトリの configs/contract.yaml における robot.joint_names の定義と一致させる。

  • 割り当て順序: shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper
  • LeRobot におけるロボット識別名: so101_follower(リーダー側を使用する場合は so101_leader)

ホスト Python 依存パッケージの導入

cd /path/to/lerobot-so101-pick-and-place
python -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -e "port_pick_align/[training,feetech,dev]"

機材非接続状態におけるモジュール読み込みテスト:

python -c "import lerobot; print('lerobot OK', lerobot.__version__)"
# Feetech モータバス実装の依存関係解決を確認
python -c "from lerobot.motors.feetech import FeetechMotorsBus; print('feetech OK')"

読み込み時に ImportError が発生した場合は、pip install -e "port_pick_align/[feetech]" を再実行して C++ 拡張モジュールやシリアル通信ライブラリの導入状況を確認する。

シリアル通信ポートの識別

Linux 環境

ls -l /dev/ttyACM* /dev/ttyUSB* 2>/dev/null
# アダプタの属性(vendor / product / serial)の確認
udevadm info -a -n /dev/ttyACM0 | head -n 40

macOS 環境

macOS では udev による静的シンボリックリンク生成が行えないため、接続時に割り当てられたデバイスファイル名を直接確認する。

ls /dev/tty.usbmodem* /dev/tty.usbserial* 2>/dev/null

LeRobot の実行引数には、検出されたパス(例: /dev/tty.usbmodem585A0076841)を直接指定する。

udev ルールの適用(Linux 環境)

設定テンプレート: deploy/udev/99-feetech-so101.rules

  1. udevadm info を実行し、使用する USB シリアル変換器の idVendor, idProduct, serial を取得する。
  2. テンプレート内の REPLACE_*_SERIAL および SYMLINK 名を実際の機材シリアル番号に合わせて更新する。
  3. ルールファイルをシステムへ配置し、反映する。
sudo cp deploy/udev/99-feetech-so101.rules /etc/udev/rules.d/
# ルール反映(権限は MODE=0660 / GROUP=dialout)
sudo udevadm control --reload-rules && sudo udevadm trigger
# dialout グループ必須(未所属なら追加後、一度ログアウト→再ログイン)
sudo usermod -aG dialout $USER
# 再ログイン後に固定シンボリックリンクの生成を確認
ls -l /dev/ttyUSB_so101_*

実機接続時の初期設定コマンド(参考仕様)

モータ ID の割り当て(各ポート名は使用環境のデバイスファイル名に置換する):

lerobot-setup-motors \
  --robot.type=so101_follower \
  --robot.port=/dev/ttyUSB_so101_follower

lerobot-setup-motors \
  --teleop.type=so101_leader \
  --teleop.port=/dev/ttyUSB_so101_leader

キャリブレーション処理(実機の組み立ておよび 12V 電源投入後に実施):

# 公式ドキュメントの calibrate / control_robot 手順に準拠して実行する
# 例: python -m lerobot.scripts.control_robot calibrate ...

電源仕様上の注意: Follower 側 Feetech STS3215(C018)の駆動電圧は 12V である。USB バスパワーのみでは駆動しないため、キット付属の 12V アダプタを接続する。Leader 側 STS3215(7.4V 仕様)は 5V で駆動し、付属の 5V アダプタ(30W)を接続する。品目は「購入済み機材」を参照する。カメラ画像転送とシリアル通信の帯域競合を避けるため、USB ホストコントローラの分離または規格に適合した USB ハブを経由して接続する。

購入済み機材

実機はキッチンのテーブルに置く。配置の数値は「現行テーブル配置(2026-10-26)」に従う。

品目 数量 用途・備考
WowRobo「SO-ARM101 DIY Kit & Assembled Version」Package 3(Assembled SO-101 Arm、Black) 1 Leader 1、Follower 1、カメラ 1。ベンダーが組立・校正済み
Follower 用 Feetech STS3215 12V(C018) 6 Follower の関節サーボ。キット同梱
Follower 用バスサーボドライバ(Waveshare / Feetech、DC ジャック 5.5×2.1 mm) 1 Follower のサーボバス。キット同梱
12V DC 電源アダプタ(UK 3 ピンコード付き) 1 Follower の駆動電源。キット同梱
Leader 用 Feetech STS3215 7.4V(5V 駆動) 6 Leader の関節サーボ。キット同梱
Leader 用バスサーボドライバ基板 1 Leader のサーボバス。キット同梱
5V 電源アダプタ(30W、UK 3 ピンコード付き) 1 Leader の駆動電源。キット同梱
USB-C ケーブル(白) 2 各ドライバ基板と Mac を接続。キット同梱
手首カメラモジュール(ハウジング付き、ネジ同梱) 1 手首カメラ。グリッパへ固定する。キット同梱
DELIXI C クランプ 4 アーム基部をテーブルへ固定する。キット同梱
3D プリント部品(橙・黒)および小物 一式 キット付属の造形部品とアクセサリ
Feetech 小箱 1 予備サーボ STS3215。電圧は箱のラベルで確認。キット同梱
VIJIM LS08(C クランプ式フレキシブルカメラアーム) 1 上カメラをテーブル右端、手前から 16 cm に固定し、紙・スポンジ・Follower が画角に入る向きにする。取付ネジは 1/4 インチ。以前の真下向き (25, 0) cm は廃止
Logitech C920 1 上カメラ(USB)

まだ購入が必要なもの

  • 延長コードまたは電源タップ。シンガポールの Safety Mark 付き、UK プラグ、差込口 3 口以上。12V アダプタ、5V アダプタ、予備をキッチンのテーブルで使う。

現行テーブル配置(2026-10-26)

使用する機材は「購入済み機材」に示す。本節が bring-up と live eval における実機配置の正本である。テーブル寸法は 140 × 70 cm であり、旧配置のテープ印や簡易 MuJoCo シーンの座標は使用しないこと。

手順と live-eval チェックリストは real_robot_bringup.md。

テーブル: 幅 140 cm × 奥行 70 cm。

対象 配置 備考
Leader 基部 左から 27 cm / 右から 101 cm 5V。二つの距離は基部の両端
Follower 基部 左から約 68 cm / 右から 61 cm 12V。左からの距離は概数
上カメラ(C920) テーブル右端、手前から 16 cm 紙・スポンジ・Follower が写る向き。高さは今回未計測
紙(ゴール) 右から 69 cm、手前から 27 cm 縦置き 幅 20 cm × 奥行 30 cm
スポンジ 右から 54 cm、手前から 44 cm 縦置き 幅 6 cm × 奥行 11 cm
手首カメラ Follower のグリッパ OpenCV index 0
上カメラ index OpenCV index 1 2026-10-25 のケーブル交換後も同じ

現行テーブル配置(2026-10-26)

印刷用 PDF: so101_layout_guide.pdf。再生成は python scripts/draw_layout_guide.py。出力先は docs/images/。

定数: port_pick_align/src/port_pick_align/simulation/table_layout.py。

sim 座標系への写像

sim の軸は従来のアーム基部と同じである。原点は Follower、+x は前方(手前縁から奥へ)、+y は左、+z は上。

2026-10-26 の記録は基部の一点を指定しておらず、基部の手前からの奥行きも再計測していない。写像は次の二つの規約による。

  • 基部の参照点は、両端の距離が示す区間の中点である。Leader は左から 27 cm 〜 39 cm(中点 33 cm)。Follower は左から 68 cm 〜 79 cm(中点 73.5 cm)。区間幅は両端から求めたものであり、別計測の幅ではない。
  • Follower 原点はその中点を手前縁(v = 0)に置いた点である。後から手前オフセットが測れれば、すべての x に同じ定数が足され、y は変わらない。

紙・スポンジ・上カメラは実測点を使う。記録はその点と縦置きサイズであり、点が角であるとは書いていない。図はサイズが見えるよう、各外形を実測点中心に描いている。

対象 左から u(cm) 手前から v(cm) sim (x, y) cm sim (x, y) m
Leader 中点 33 0 (0, 40.5) (0, 0.405)
Follower 原点 73.5 0 (0, 0) (0, 0)
紙の実測点 71 27 (27, 2.5) (0.27, 0.025)
スポンジの実測点 86 44 (44, −12.5) (0.44, −0.125)
上カメラ 140 16 (16, −66.5) (0.16, −0.665)

u = 140 −(右からの cm)。手前縁規約では x = v。y = 73.5 − u。

カメラ

ACT の入力は上カメラ(/camera/top/image_raw)と手首カメラ(/camera/wrist/image_raw)の両方である。解像度は各 640×480、30 fps(configs/contract.yaml)。C920 は VIJIM LS08 で右端、手前から 16 cm、紙・スポンジ・Follower が写る向きに固定する。手首カメラはキット同梱のモジュールを Follower のグリッパへ取り付ける。OpenCV index は wrist 0、top 1。手首画像が無い状態は学習時の分布の外である。

作業エリア準備チェックリスト

  • [ ] テーブルが幅 140 cm × 奥行 70 cm である
  • [ ] Leader 基部が左から 27 cm / 右から 101 cm(5V)である
  • [ ] Follower 基部が左から約 68 cm / 右から 61 cm(12V)である
  • [ ] 紙が右から 69 cm、手前から 27 cm(縦置き 20×30 cm)である
  • [ ] スポンジが右から 54 cm、手前から 44 cm(縦置き 6×11 cm)である
  • [ ] C920 が右端、手前から 16 cm で、紙・スポンジ・Follower が画角に入る
  • [ ] 手首カメラが Follower のグリッパにあり、OpenCV wrist 0、top 1 を確認した
  • [ ] 下の廃止配置の目印を新しいセットアップに使っていない

廃止した配置

新しい sim 合わせ、bring-up、live eval には使わない。

2026-10-25 ~23:28

テーブルは 140×69 cm と記録されていた。C920 は右から 28 cm。スポンジは右から 70 cm / 手前から 45 cm。紙は右から 82 cm / 手前から 26 cm。Follower は右から 62 cm。

2026-10-22 の収録配置

本収録データセットだけに使った配置である。テーブル幅はおよそ 134 cm。Leader 左端 28 cm。紙は左から 56 cm / 手前から 13 cm。Follower 左端 78 cm。スポンジは左から 81 cm / 手前から 29 cm。上カメラポールは左から 111 cm。詳細は real_robot_bringup.md。

簡易 MuJoCo シーン(2026-10-26 より前の図)

既存の sim 評価を続けるため、リポジトリのシーンは次の geom のままである。これは実機テーブルではない。後の sim 合わせでは、上の sim 座標へ移す。

廃止した作業エリアガイド(簡易 MuJoCo シーン)

PDF: so101_layout_guide_superseded_pre_20261026.pdf。

項目 値 出典
テーブル天板 z = 0.42 m(床を z = 0 とする)。上面 70×60 cm env.py の TABLE_Z。XML table geom 中心 (0.25, 0, 0.40)、half-size 0.35 0.30 0.02
箱 5×4×4 cm、30 g XML box_geom の half-size 0.025 0.02 0.02、mass="0.03"
箱の初期中心 (28, −8) cm。xy を各 ±4 cm、yaw を ±0.3 rad(約 ±17°)で一様乱数 env.py の reset。基準 (0.28, -0.08) に uniform(-0.04, 0.04)、yaw は uniform(-0.3, 0.3)
ゴール target_frame 中心 (35, +12) cm、パッド 8×6 cm、yaw 0 XML target_frame pos 0.35 0.12 0.42、target_pad half-size 0.04 0.03(回転なし)
整列成功 平面位置誤差 25 mm 以内、かつヨー誤差 15° 以内 eval_alignment.py の DEFAULT_ALIGN_POS_MM = 25、DEFAULT_ALIGN_YAW_DEG = 15(いずれも <=)
上カメラ 平面 (25, 0) cm、天板から 63 cm(ワールド z = 1.05 m)、真下向き、垂直 FOV 55°。天板上の視野は約 87×66 cm(推定) XML camera name="top" の pos 0.25 0 1.05、xyaxes="1 0 0 0 1 0"、fovy="55"
手首カメラ グリッパリンク原点から前方 2 cm・上方 4 cm、下向き約 30°、垂直 FOV 60° XML camera name="wrist" の pos 0.02 0 0.04、xyaxes="0 -1 0 0.5 0 0.866"、fovy="60"
到達範囲 約 42 cm(shoulder_pan ±110°。簡易モデルの幾何最大) 上腕 12 cm + 前腕 14 cm + 手首 8 cm + グリッパ 3 cm + 手先サイト 5 cm。pan range は ±1.9199 rad

上カメラの視野約 87×66 cm は、天板からの高さ 63 cm、垂直 FOV 55°、契約画像 640×480 のアスペクトから求めた推定である。x 方向(水平 FOV 約 69°)が約 87 cm、y 方向(垂直 FOV 55°)が約 66 cm である。この推定は廃止した真下向きカメラのものであり、2026-10-26 の右端設置ではない。実機 C920 の高さは 2026-10-26 に再計測していない。XML が持つのはカメラ位置と fovy であり、視野の辺長はそこから計算する。

この廃止シーンだけの出典:

事前準備チェックリスト

  • [ ] 公式 SO-101 および Feetech のセットアップ手順を確認した
  • [ ] port_pick_align/[training,feetech] の依存関係インストールが正常に完了した
  • [ ] lerobot および Feetech motors モジュールのインポート試験に通過した
  • [ ] Linux で、機材固有のシリアル番号に基づく udev ルールを設定した
  • [ ] macOS で、/dev/tty.usbmodem* デバイスの確認手順を把握した
  • [ ] 実機到着後に実行するモータ設定およびキャリブレーションのコマンド仕様を把握した
  • [ ] 実機 SO-101 のデモでは、real_robot_bringup.md の収録前チェックと収録後 QC も実施する