# 結果：20261107_109_mechArmの関節電流を読めるか確かめ測る道具を作る

- 状態：完了
- 始めた時刻：2026-11-07 13:36
- 終わった時刻：2026-11-07 14:22（46分）
- 作業フォルダ：/Users/shimazueiichi/r2r2r-scripts
- この続きを Claude Code で話すとき：作業フォルダで `claude --resume b52fc320-86d1-4d80-8096-a72c0f952cd9`

## Claude Code の報告

## 依頼109の報告：mechArm の関節と爪の電流が読めるかの確かめと、測る道具づくり

**やったこと**

- **A（読めるかの調べ）:** Pi につながらなかったので（192.168.2.1 の22番がタイムアウト）、Pi と同じ pymycobot 2.9.6 を手元に取り寄せ、ソースを読んで確かめました。11-03 の servo_check の結果も合わせて見ました。実機の値はまだ1つも読めていません。
- **B（道具づくり）:**
  - daemon（tools/pi/mecharm_daemon.py）に、読むだけの命令 read_servo を足しました。消した行は0で、今までの命令は変えていません。
  - Pi へ置くスクリプト tools/daemon_add_read_servo.sh を作りました。Pi の今の版を KIOXIA に写してから入れ替え、起動し直して返事を確かめます。まだ流していません。
  - 測る道具 tools/servo_current_probe.py を作りました。
    - アームには何も送りません。キーで印（1 静止／2 空で閉じた／3 つかんだ／4 引っ張った／5 離した／6 押した／0 そのほか）が入ります。p で読むのを止めたり再開したりできます。
    - --with-pad を付けると gamepad_teleop を同じプロセスで動かし、パッドの命令ごとの待ち時間を pad_rpc.csv に残します。
    - 出力先は KIOXIA の r2r2r-data/diag/servo_current_{日付}/ です。KIOXIA がマウントされていなければ止まります。
  - 新しいテストを2本足しました。daemon の偽物で確かめるもの12件と、道具のもの11件です。
- **daemon のレビュー:** codex に3回通しました。1回目の必須2件（始めの読み取りが3秒を超えうる、返事なしを成功の値として返す）と、2回目の必須1件（始めの読み取りの間、ゲームパッドの停止を受け付けない）を直しました。3回目は必須なしで、推奨1件も直しました。依頼文と結果は docs/ に3組あります。
- **D:** 学習のテストの偽物のチェックポイントの assets 名を、作るモデルの学習データ（corr: corr_v3、corr2: corr_v4b、corr3: corr_v5）に合わせました。本番の流れは変えていません。
- **静止10秒の確かめ:** Pi に届かないので、していません。下の手順に回しました。
- 作業記録を logs/20261107_1420.md に書き、個別にファイルを指定してコミットしました（32a4280）。

**結果**

- **関節の電流:**
  - 2.9.6 に get_servo_currents があります。単位は mA（0〜3250）ですが、説明には「mycobot 350 だけ」とあります。新しい 4.0.5 の MechArm270 にはこの関数がないので、この機体が答えるかは分かりません。
  - 返事がないと 0.1 秒待って空（[]）を返します。read_servo では、これを値なし（エラー "no reply"）として返します。
  - 11-03 の温度の読みは、1関節1バイトの返事を2.9.6が読み違えた形でした（[6425, 5654, 6421] は 25,25,22,22,25,21 ℃）。電流も同じ形で返ると読み違えるので、始めの1回で生のバイト列も残します。
- **異常の印:** get_servo_status は使えます。11-03 の値は [0, 0, 0] でした。
- **サーボの番地:** 11-03 の値は、番地62（電圧）が72〜74で約7.4V、番地63（温度）が21〜26℃でした。Feetech STS の並びに合うので、番地69/70（電流。STS3215 なら1 = 6.5mA）と60/61（負荷）も読める見込みです。2.9.6 は1バイトずつしか読めないので、下位と上位を分けて読みます。
- **爪の電流:**
  - 6関節と同じ get_servo_currents には入りません（返るのは6個だけ）。爪は id 7 の番地69/70を読む方法しかなく、未確認です。
  - 爪の保護電流を読む関数は 2.9.6 にありません。
- **速さ（見込み。実機では測っていません）:**
  - 11-06 の記録では、send_angle の往復が 0.032 秒、set_gripper_value が 0.013 秒でした。1回読むのに15〜20ms ほどです。
  - 電流が答えれば、角度と電流の1回が30〜45ms で、20〜30Hz の見込みです。答えなければ毎回0.1秒待つので、7Hz ほどになります。
  - ゲームパッドの命令は、読んでいる途中の1回が終わるまで待ちます。待つのは最大でその1回分で、答えれば約40ms、答えない項目があれば1つにつき0.1〜0.2秒です。
  - 一緒に動かすときは、1回に読む数を4までにしました。
- **ぶつかり:** daemon は1本ずつしかつながりを受けないので、別のプロセスからは同時に読めません。ゲームパッドとは同じプロセスにして、鍵を共有する形にしました。
- **テスト:**
  - 通ったもの: test_lab_train.sh 216件（足した2件を含む）、test_lab_start.sh 153件、pi05 のテスト9本、place_modules のテスト4本、test_provenance、test_servo_check_pi、新しい2本。
  - 落ちたもの: tools/test_gamepad_teleop.py が90件中1件 NG です。「1秒より短く終わる」という時間の確かめで、3回流して3回とも1.03〜1.04秒でした。このテストが読むファイルには触っていません。ただ、手を入れる前の版（git の最新コミットの写し）で比べようとしたところ、git に入っていないファイル（auto_detect_cameras.py）がなくて動かず、確かめきれていません。

**エイイチが実機で測る手順（5分ほど）**

1. ゲームパッドなど daemon を使うものを止め、アームを HOME にします。
2. `tools/daemon_add_read_servo.sh` を流します。daemon が入れ替わり、最後に電流・状態・爪の値が出ます。
3. `python3 tools/servo_current_probe.py --seconds 10` で、アームに触らず10秒読みます。始めに出る表示で、電流が6個の数か、servo 7 の番地69/70に値があるかを見ます。
4. `python3 tools/servo_current_probe.py --with-pad` を動かします。電流が読めなかったときは、後ろに `--no-currents --regs 7:69,7:70` を足します。
5. 次の順に操作します。
   1. キー1を押して静止10秒
   2. ×で空のまま閉じてキー2、○で開く
   3. ブロックを×でつかんでキー3
   4. 手で軽く引いてキー4
   5. ○で放してキー5
   6. アームを手で軽く押してキー6
   7. pで読むのを止め、同じ十字キーを数回押す（読んでいる間との待ちの比べ）
   8. 窓を閉じる
6. 結果は summary.json に出ます（回数、Hz、往復の中央値、パッドの待ちの中央値と最大）。

**C の案（実装していません）**

- **足す場所:** policy_recorder の角度の記録（10Hz）で、get_angles の代わりに read_servo（角度と電流）を1回呼びます。daemon への問い合わせの数は今と同じなので、角度の頻度は落ちない見込みです。
- **書く先:** states.csv の列は変えません（学習データを作る側が読むため）。同じ時刻の電流は別の currents.csv に書きます（時刻、関節6つ、爪）。
- **決めるのに要る数字:**
  - 角度と電流の1回が50ms 以下か（10Hz に収まるか）
  - 静止のときの電流の揺れの幅と、つかんだ・引いたときの差
  - 爪の電流が取れるか
  - 読んでいるときのパッドの待ちの増え方

**変えたファイル**

- 変更: tools/pi/mecharm_daemon.py、lab_train_fakes.sh、test_lab_train.sh
- 新規:
  - tools/daemon_add_read_servo.sh、tools/servo_current_probe.py
  - テスト: tools/test_daemon_read_servo.py、tools/test_servo_current_probe.py
  - docs/ の codex の依頼文と結果（3組）
  - logs/20261107_1420.md

**決めてほしいこと**

1. Pi の daemon を、daemon_add_read_servo.sh で入れ替えてよいか（起動し直すとアームの初期化が走ります）。
2. 爪の保護電流を読むかどうか。読む関数は新しい版にしかなく、命令の番号（0x37）が別の機種では動かす命令と同じです。なので、生の0x37は送らない形にしてあります。読むならファームの版を確かめるのが先です。
3. gamepad_teleop を単独で動かすと、送り口を鍵をかける前に読み込むので、send_angle・stop・get_angles が鍵を通りません。範囲の外なので直していません。直すかどうか。測る道具のほうは、先に鍵をかけるので問題ありません。
4. test_gamepad_teleop の時間の確かめの NG（1.03〜1.04秒）をどう扱うか。
5. C を実装するかどうか（実機で測った結果を見て）。

判定：止めた（決めてほしいことあり）
