フィジカルAI研究室を作る Log#23 | 手応えを学習に足すため、mechArm 270 の電流を読んだ

この記事の素材(コード・ログ・データ 9ファイル・まとめてダウンロードあり)
AIで読む ChatGPT・Claude などで、この記事に質問できます

小型ロボットアーム mechArm 270 のサーボの電流は、用意された関数(get_servo_currents)では答えず、サーボの中の電流の番地を直接読むと1秒に約10回取れました。爪の値は、空のまま閉じると15前後、ブロックをつかむと870前後(つかんだ直後は993)で、つかめたか空振りかは、カメラを見なくても値だけで分かりました。 力センサーは付けていません。

この回でやったことで、次の3つが変わりました。

  • 良くなること:つかめたかどうかを、爪の値だけで見分けられる(空で閉じた15前後に対し、つかむと870前後で、50倍以上の差)。肩の値も、つかんだブロックを手で引いた間は11から9へ、アームを手で押すと0〜3へ動いた
  • もたらされること:Physical Intelligence の π0.5(ロボット用の AI のモデル)に学ばせるお手本と、実機で動かしたときの記録に、爪と肩の値の列を足す依頼(依頼116)を出した。人の力加減を学習に入れるための入口ができた
  • 時間・費用:読む道具づくりは依頼箱の Claude Code が46分(コード・テスト・外部のレビュー3回を含む)。実機での測定は、アームの中のプログラムの入れ替えから3回の計測まで約7分(17:56〜18:03)。力センサーは買っていないので、機材の費用は0円。クラウドの GPU は使っていない

きっかけは、筑波大学の境野翔さんの X の投稿です(投稿)。力制御を使った模倣学習なら、3D プリンタで作った1自由度の手でも豆腐をつかめること、手応え(物から返ってくる力)は力センサーや触覚センサーを使わず、関節の角度とモーターの電流から見積もっていることが紹介されていました。もとの研究は、論文 Soft and Rigid Object Grasping With Cross-Structure Hand Using Bilateral Control-Based Imitation Learning(Yamane・Saigusa・Sakaino・Tsuji、2023)にまとまっています。

実は mechArm 270 の電流は、5月(LOG203〜209 のころ)に一度、読む関数があることを資料で確かめていました。そのときは「つかんで置く動き(PICK&PLACE)を終えてから」として保留し、そのまま忘れていました。境野さんの投稿を調べているうちにそれを思い出し、この回で実機で読むところまで進めました。

やったことの全体は次のとおりです。

段階やったこと結果
境野さんの投稿と論文を調べる(12:46〜)
力センサーなしで手応えを見積もる仕組みと、論文の数字を読んだ
20種類の物をつかむ試験で、力制御ありの成功率は95%、位置だけだと49%。卵とクラッカーは0%から100%に
5月の記録を探す
過去のチャットから、電流を保留した経緯を探した
読む関数の存在は確かめたが、実機では一度も読んでいなかった
読む道具を作る(依頼109・13:36〜14:22)
アームの中のプログラム(daemon)に読むだけの命令を足し、読み続けて記録する道具を作った
テスト23件、外部のレビュー(codex)3回。Pi に届かず実機では未確認
実機1回目(17:56)
daemon を入れ替え、触らずに10秒、電流の関数で読んだ
81回とも返事なし。毎回0.1秒待たされ、1秒に約7.9回
実機2回目(17:57)
ゲームパッドをつないで同じ読み方
731回中730回返事なし。この回は HOME に戻しただけで、操作の印は入れていない
実機3回目(18:00〜18:03)
関数をやめ、肩と爪の電流の番地を直接読み、つかむ・引く・押すを試した
1,492回読んで読めなかった回0。爪と肩の値が操作に合わせて動いた
お手本の記録に足す(依頼116)
爪と肩の値を、お手本と実機推論の記録に足す依頼を出した
依頼箱で順番待ち

次は、依頼116 で記録に足した爪と肩の値が、π0.5 で動かしたときにも同じように読めるかを確かめます。値がたまったら、学習に入れるかを決めます。

GPU を買うか借りるかの判断は、Runpod で実際に借りて学習させた費用をもとに、別のページにまとめています。

導入比較ガイドロボットAIの学習用GPU、買うか借りるか実際に借りて学習させた費用と、損益分岐の計算機で決められます

この回の作業は、Claude(調べものと分析と依頼文を一緒に組み立てた AI)と進めました。アームとゲームパッドの操作と、目で見た判断はこちらで行い、読む道具づくりは Claude Code(プログラムを書く AI)に依頼箱を通して頼んでいます。ここから下は、調べた内容・依頼文と報告・コードの差分・端末の出力・測定データを全量で載せた作業ログです。値の数字は記録から数えたもので、見込みのものは見込みと書いています。鍵(アクセストークンなど)は、どこにも載せていません。

作業ログ ― 境野翔さんの研究を調べ、mechArm 270 の爪と肩の電流を読んで、お手本の記録に足すまで

この回で使う言葉

言葉意味
手応え(反力)
ロボットが物に触れたときに、物から押し返される力。豆腐をつぶさずにつかむには、これを感じて力を加減する必要がある
バイラテラル制御
人が動かす側(リーダー)と、作業する側(フォロワー)の2台のロボットを、位置と力の両方でつなぐ遠隔操作。フォロワーが受けた手応えがリーダーに返るので、人は物の硬さを感じながら操作できる。境野さんの研究室は、これで集めたお手本で模倣学習をしている
模倣学習
人のお手本の動きを AI に学ばせる方法。このシリーズで π0.5 に使っているのもこれ
外乱オブザーバ・反力推定オブザーバ
モーターに流した電流から出るはずの力と、角度から計算した動きとの差を、外から受けた力とみなして見積もる計算の仕組み。力センサーの代わりになる
サーボ
角度を指令すると、その角度まで自分で回って止まるモーター。mechArm 270 の6つの関節と爪は、それぞれサーボで動く
サーボの番地
サーボの中の小さな記憶の場所。角度・電圧・温度・電流などが番号の付いた場所に入っていて、番号を指定して読める。この回で読んだのは番地69(電流の下位)と番地70(電流の上位)
爪の値・肩の値
番地69と70から組み立てた数。値 = (番地70 の最上位ビットが立っていればマイナス)×(番地69 + 256 ×(番地70 の残り))。単位は確かめていないので、この記事では値のまま書く
daemon(デーモン)
アームの中の小さな計算機(Raspberry Pi)で動き続け、Mac からの指令を受けて関節を動かしたり値を読んだりするプログラム
read_servo
この回で daemon に足した、読むだけの命令。角度・電流・異常の印・爪の開き・指定した番地を、1回の問い合わせでまとめて読む
印のキー
測る道具の上で押すキー。1 静止・2 空で閉じた・3 つかんだ・4 引っ張った・5 離した・6 押した。押した時刻が記録に残る

境野翔さんの投稿:3D プリンタの1自由度の手で豆腐をつかみ、手応えはセンサーなしで見積もる

境野さんの投稿の要点は3つでした。力制御を使って模倣学習をすると、3D プリンタで作った硬い手でも豆腐ぐらいは扱えること。お手本(教師データ)はじゃがいもだけだったはず、という記憶。そして、手応えは関節の角度と電流の値から見積もっていて、力センサーも触覚センサーも使わず、サーボモーターが1つあるだけ、ということ。引用されていたのは、2022年の国際ロボット展で、3D プリンタの硬い1自由度の手がいろいろな物をつかむ様子を紹介した投稿です。

返信の欄では、海外の研究者から「論文では位置の情報と電流の指令だけを使い、外からの力は加速度の変化から見積もっているのでは」という問いがありました。境野さんの答えは、制御器が使うのは電流の指令と関節の角度だけ、ただしモーターのドライバが電流を見ながら制御しているので、指令どおりの電流が流れていると信じてよい、つまり全体としては角度のセンサーと電流のセンサーの両方が要る、というものでした。

この2人の話は食い違っていません。見積もりの式には、角度から計算した加速度が入っています。そして、その式が成り立つのは、ドライバの中の電流のセンサーが、指令どおりの電流を流してくれているからです。電流を読めるだけでは足りず、狙った電流を確実に流せることが前提になっている、というのがこのやり取りの要点でした。

別の返信では、消耗品だからこそ手は簡単にしないとコストが合わない、センサーは指先ではなく関節に付けるべき、という意見もありました。

論文で確かめた数字(交差構造の手と、20種類の物をつかむ試験)

もとの論文(arXiv:2311.09555、IEEE Robotics and Automation Letters 2023)で確かめたことを並べます。

項目論文の内容
アーム
RT 社の CRANE-X7(7自由度)。手を自作の1自由度の手に替えた
手
指の先が交互に入れ違う交差構造。FDM 方式の3D プリンタでポリカーボネートを出力。指の幅 9.4mm・すき間 10.4mm。指先は爪の形
手応えの見積もり
トルクのセンサーはなく、外乱オブザーバと反力推定オブザーバで見積もる。制御は1秒に500回
お手本の集め方
4チャンネルのバイラテラル制御。フォロワーの手の力を、リーダーの10分の1に縮めて集めた
お手本に使った物
スポンジ9種類(幅 10・20・30mm、材料3種類)とアルミのパイプ3本(直径 8・10・12mm)。1つにつき2回
学習のモデル
LSTM(時系列を覚えるニューラルネットワーク)。1秒25回に間引いたデータで学習
試験
学習に使っていない20種類の物を、各5回つかんで別の皿へ移す
成功率
力制御あり 95%、位置だけ(力の制御を切った同じモデル)49%

20種類のうち、差がはっきり出た物と出なかった物です(成功率、力制御あり/位置だけ)。

物重さ力制御あり位置だけ
卵49.1〜54.4g100%0%
クラッカー3.4〜3.5g100%0%
ペン7.8g60%0%
ポテトチップス0.8〜1.8g100%20%
じゃがいも93.7〜131.1g100%40%
豆腐60.0〜70.0g100%100%
ブルーベリー1.1〜2.4g60%100%

豆腐は、位置だけでも100%でした。論文によると、学習に使った物と幅が近い物は位置だけでも成功し、幅が違う物は失敗しました。力制御があると、位置の指令と物の幅の差を力で埋めるので、多くの物で成功しています。力が効いた証拠は、豆腐よりも、卵とクラッカーが0%から100%になったことのほうでした。ブルーベリーは指のすき間(10.4mm)より小さく、手の形の限界として書かれています。投稿の「じゃがいもだけ」は、論文とは別の、2022年の展示のデモの記憶だと思われます。

その後の流れ:Transformer への置き換え、VLA との組み合わせ、安いアームでの試み

  • 大阪大学のグループは、バイラテラル制御のお手本で ACT(動きを一続きのまとまりで出す Transformer の模倣学習)を学ばせる Bi-ACT を出し、安い材料で作った2本腕の ALPHA-α で、卵を扱うなどの作業を試しています(arXiv:2411.09942)
  • 境野さんの研究室は、力センサーのない安い腕でも、動きの模型を正確に作れば4チャンネルのバイラテラル制御ができ、力の情報を学習の入出力に入れると模倣学習の成績が上がることを示しています(arXiv:2507.06174)
  • 2026年度のムーンショット型研究開発(目標3)では、境野さんが PM となり、VLA(画像と言葉から動きを出す AI のモデル)による認識・判断と、バイラテラル制御の力制御を組み合わせる計画が始まっています(JST の概要)
  • SO-101(安く作れるオープンなアーム)で、爪のモーターの電流を ACT の入力に足しただけで、柔らかい立方体と硬い立方体の仕分けの正しさが 77.5% から 95% に上がった、という報告もあります(ポスター)

mechArm 270 に当てはめると:指令は角度だけ、電流は読むだけ

mechArm 270 は、関節に角度の指令しか送れません。境野さんの研究のように、狙った電流を流して力を制御することはできません。できるのは、電流を読むことだけです。それでも、電流を記録に残して学習の入力に足すだけなら、動きを一切変えずに始められます。SO-101 の報告は、まさにその形でした。

  • ねらい:π0.5 のお手本と実機推論の記録に、手応えの代わりになる値を足す
  • 変わったこと:力の制御は目指さず、電流を観測として読むところから始めると決めた
  • 見込める効果:つかめたか・引かれたかを、カメラの画像だけに頼らず記録できる見込み(実機でどこまで読めるかは、このあとの測定で確かめた)

5月に一度調べて保留していた mechArm 270 の電流(LOG203〜260)

過去のチャットを探すと、電流の話は5月に一度出ていました。

時期出てきたこと
LOG203〜209 のころ(5月)
Boston Dynamics の Atlas の記事(体の中の感覚で重い物を運ぶ話)から、mechArm 270 で電流が取れるかの話になった。公式の資料で、関節の電流を mA で読む関数、異常の印を返す関数、爪の保護電流の関数があることを確かめた。使い道の候補は、降りるときの接触の検知、つかめたかの判定、運ぶ途中の落下の検知、関節ごとの負荷の見える化。「動的追従の PICK&PLACE を終えてから」として保留した
LOG205
単腕で試すことの一つとして、電流での力の検知を挙げた
LOG217
放す動きを「面から数mm上で離す(接触なし)」と決めたときに、電流の話は別のシリーズで、取れるかの確かめから入る順番のまま残した
LOG260
持ち上げ直すと爪が緩む件の原因を、サーボの保持や電流の側に探すべきだと書いたところで止まった

どの時期も、実機で値を読んだ記録はありませんでした。保留の条件だった PICK&PLACE は、台帳付きの通しの実行まで動いていて、受け渡しの動きや π0.5 のお手本集めも始まっています。条件はもう満たしていると見て、再開しました。

依頼109:daemon に読むだけの命令を足し、読み続けて記録する道具を作った(13:36〜14:22)

この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。

ファイルの一覧(9本)

01_sec04.md ― 依頼109 の報告・4,626字

02_sec04.txt ― commit 32a4280 の差分(daemon の read_servo・入れ替えのスクリプト・測る道具・テスト・codex のレビュー)・87,786字

03_sec05.txt ― 端末の出力(daemon の入れ替え・1回目・2回目・3回目の打ち間違い)・22,353字

04_175645_solo_first_read.json ― 175645_solo/first_read.json(1回目の始めの1回)・8,870字

05_175645_solo_samples.csv ― 175645_solo/samples.csv(1回目の読み取り81回)・12,682字

06_175706_pad_first_read.json ― 175706_pad/first_read.json(2回目の始めの1回)・8,868字

07_175706_pad_samples.csv ― 175706_pad/samples.csv(2回目の読み取り731回)・115,768字

08_180051_pad_first_read.json ― 180051_pad/first_read.json(3回目の始めの1回)・8,870字

09_180051_pad_samples.csv ― 180051_pad/samples.csv(3回目の読み取り1,492回)・282,501字

依頼箱(Claude Code への依頼を Mac の見張り係が自動で渡す仕組み・LOG390)に、次の依頼を置きました。アームを動かす指令は送らない依頼にし、実機での測定はこちらでやる形にしています。

依頼109 の依頼文

---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 90
---
# 依頼:mechArm の関節と爪の電流が読めるかを確かめ、エイイチが実機で測るための道具を作る(2026-11-07)

## なぜやるか

5月(DAY203〜209のころ)に、pymycobot に関節の電流を mA で読む関数(get_servo_currents)、異常の印を返す関数(get_servo_status)、爪の保護電流の関数があることを資料で確かめた。そのときは PICK&PLACE を終えてから、として実機では一度も読んでいない。

筑波大の境野翔さんの研究(バイラテラル制御による模倣学習)では、力センサーなしで、モーターの電流と関節角から物に当たった力を見積もり、人の力加減ごと学ばせている。3D プリンタの1自由度の手で豆腐をつかめる。
- 投稿:https://x.com/shosakaino/status/2118312642431570242
- 論文:https://arxiv.org/abs/2311.09555
SO-101 で爪の電流を ACT の入力に足しただけで、柔らかい/硬いの仕分けの精度が上がった例もある。

mechArm は電流の指令は出せない(角度の指令だけ)ので、まずは電流を「観測」として読み、π0.5 のお手本の記録に足せるかを見たい。この依頼はその手前の、読めるか・どれだけ速く読めるか、を確かめる道具づくり。

## A. 読めるかを調べる(読むだけ・アームは動かさない)

- Pi の pymycobot(古い版。Python 3.6、MyCobot クラスで使っている)に、電流を読む関数があるかをソースで確かめる。get_servo_currents・get_servo_status・get_servo_data など。戻り値の形と単位、読めないときの値(-1・None・空)も
- mecharm_daemon.py に電流を読む命令があるか。なければ、読むだけの命令を足す案を作る。daemon がシリアルを握っているので、別のプロセスから直接ポートを開かない
- 爪の電流が、6つの関節と同じ読み方で取れるか。取れないなら、爪の電流や保護電流をどう読むか
- 今動いている読み取り(run_policy_client.py の記録スレッド、gamepad_teleop.py)と、電流の読み取りがぶつからないか。daemon への問い合わせが増えると、角度の記録や指令が遅れないか

## B. 測る道具を作る

- 電流(と同じ時刻の角度)を、読める限り速く繰り返し読み、CSV に残すスクリプト。アームへの指令は一切送らない
- 1回の読み取りにかかる時間と、実際に何 Hz で取れたかを表示する
- エイイチがキーを押すと、その時刻に印(例:空で閉じた/つかんだ/引っ張った/離した)が入る形
- アームと爪の動かし方は今あるもの(ゲームパッドの gamepad_teleop.py など)をそのまま使う。同時に動かしたとき、ゲームパッドの指令が遅れないかも測れるようにする
- 出力先は保存先テーブルどおり KIOXIA の `r2r2r-data/diag/servo_current_{日付}/`。書く前にマウントを確かめ、無ければ止める

## C. お手本の記録に足す案(案だけ・実装しない)

- run_policy_client.py の記録(states.csv など)に電流の列を足すなら、どこに、どの頻度で足すか。角度の記録の頻度を落とさずに済むか
- 測った結果しだいで決めるので、ここでは案と、決めるのに要る数字を書くだけ

## D. ついでに直すこと

- 依頼97の決めてほしいこと3(エイイチ決定済み):学習のテスト(lab_train_fakes.sh / test_lab_train.sh)の偽物のチェックポイントの assets 名が v3 のまま。corr3 の流れに合わせて直す。本番の流れは変えない

## 確かめ

- 既存のテストが全部通ること
- daemon に手を入れたら、codex のレビューを通す(docs/ に依頼文と結果を残す)。今までの命令の動きは変えない
- アームを動かす指令は送らない。daemon が起動していてアームの電源が入っているときに限り、静止したまま10秒だけ読む確かめはしてよい(読む命令だけ)。起動していなければ、それはエイイチの手順に回す
- 測定データ(runs/・datasets/・checkpoints/ の既存のもの)は上書き・移動・削除しない
- git は個別ファイルを指定して add・commit する(git add . は使わない)

## 報告に書くこと

- 電流が読めるか(関節・爪それぞれ)、単位、読めないときの値。静止で読めたならその値
- 1回の読み取りの時間と、取れた Hz。記録やゲームパッドへの影響の見込み
- エイイチが実機で測る手順。5分ほどで終わる形で、打つコマンドと、やること(例:静止10秒 → 爪を空で閉じる → ブロックをつかむ → つかんだブロックを手で軽く引く → 放す → アームを手で軽く押す)を順に短く
- C の案
- 最後の1行に「判定:合格/止めた(決めてほしいことあり)/失敗」

Claude Code は Pi に届かなかったので(Pi の電源が入っていなかった)、Pi と同じ版の pymycobot(2.9.6)を手元に取り寄せて、ソースを読んで確かめました。分かったことは、関節の電流を読む関数は 2.9.6 にあるが、説明には別の機種だけと書いてあり、mechArm 270 が答えるかは分からない、ということでした。もう1つの手として、サーボの中の電流の番地(69と70)を直接読む方法も入れてもらいました。11月3日に、同じ読み方で電圧(番地62)と温度(番地63)が読めていたからです。

依頼109 の報告

01_sec04.md4,626字・94行・markdown
# 結果: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`
別のタブで開く保存

決めてほしいことの5つには、次のように答えました。daemon の入れ替えは行う(読むだけの命令を足しただけで、今までの命令は変えていないため)。爪の保護電流は読まない(その命令の番号が別の機種では動かす命令と同じで、危ないわりに得るものが少ないため)。ゲームパッドの鍵の件は、電流を記録に足すときに一緒に直す。テストの時間の件は次の依頼で確かめる。記録に足すかは、測ってから決める。

commit 32a4280 の差分(daemon の read_servo・入れ替えのスクリプト・測る道具・テスト・codex のレビュー)

02_sec04.txt87,786字・1,796行・diff
commit 32a42803fea52e2b745d1fb51aa69232fe06a4f7
Author: Eiichi Shimazu <studio@adaptdesign.jp>
Date:   Sat Nov 7 14:21:21 2026 +0900

    daemon に電流などを読むだけの read_servo を足し (tools/pi. Pi へは tools/daemon_add_read_servo.sh で置く. まだ置いていない), 関節と爪の電流と角度を読める限り速く読んで KIOXIA の diag/servo_current_{日付}/ に残す tools/servo_current_probe.py を作る (印のキー・--with-pad で gamepad_teleop を同じプロセスで動かしパッドの命令の鍵の待ちを残す). 学習のテストの偽物のチェックポイントの assets 名を作るモデルの学習データに合わせる (lab_train_fakes.sh・test_lab_train.sh. 本番の流れは変えない) (依頼 109. codex 3 回)
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
別のタブで開く保存

実機1回目と2回目:電流を読む関数は、mechArm 270 では一度も答えなかった(17:56〜17:58)

アームのところに戻ってから、ターミナルで3つのコマンドを打ちました。daemon の入れ替え(tools/daemon_add_read_servo.sh)、触らずに10秒読む、ゲームパッドをつないで読む、の順です。

入れ替えのあとの確かめで、もう結果が出ていました。角度(16ms)・異常の印(15ms)・爪の開き(19ms)は読めたのに、電流だけは 115ms 待って返事がありませんでした。触らずに10秒読んだ回は81回とも返事なしで、毎回約0.11秒待たされるため、1秒に約7.9回しか読めませんでした。始めの1回では、7つのサーボの番地60・61(負荷)と69・70(電流)も読んでいて、肩(2番)の番地69が1、番地70が128だった以外は、すべて0でした。

ゲームパッドをつないだ2回目も、731回中730回が返事なしでした(残りの1回は、Ctrl+C で止めたときにつながりが切れた分)。この回は、起動したときの肩 j1 が 92.37° で、ゲームパッドの守りの外だったため、肩を含む操作は送られない状態でした。HOME の長押しで HOME に戻したところ(ずれ 1.31°)で、印は入れずに Ctrl+C で終えています。読み取りの間にゲームパッドの指令が待たされた時間は、11回で中央 42ms、最大 140ms でした。

関節の電流を一度に読む関数は、mechArm 270 では答えないと分かったので、3回目は関数をやめ、番地を直接読む読み方に切り替えました。

  • ねらい:電流を読む手段を、返事のない関数から、読めると分かっている番地の読み方に替える
  • 変わったこと:電流の関数をやめ(--no-currents)、肩と爪の番地だけを指定して読む(--regs)ようにした
  • 見込める効果:1回の読み取りが短くなり、記録の10回/秒に届く見込み(3回目で、平均10.3回/秒を確かめた)

端末の出力(daemon の入れ替え・1回目・2回目・3回目の打ち間違い)

03_sec05.txt22,353字・266行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro _制作ベース % cd ~/r2r2r-scripts && bash tools/daemon_add_read_servo.sh
今の daemon の写し: /Volumes/KIOXIA/r2r2r-data/archive/mecharm_daemon_premerge_readservo_20261107_175619/mecharm_daemon.py
--- 差分
66a67,187
> # ---- 2026-11-07 依頼 109: 電流などを読むだけの命令 read_servo (純追記) ----------------------
> # アームと爪には何も送らない. pymycobot の読む関数 (get_angles / get_servo_currents / get_servo_status /
> # get_gripper_value / get_servo_data) だけを, 頼まれた順に 1 回ずつ呼ぶ. 読み直さない・待たない.
> # 読めなかった項目は値 None と error を返す (ok=True のまま. get_angles_once と同じ. 呼び出し側が例外にしないため).
別のタブで開く保存

175645_solo/summary.json(1回目のまとめ)

{
 "started_at": "2026-11-07T17:56:45",
 "argv": [
  "tools/servo_current_probe.py",
  "--seconds",
  "10"
 ],
 "mode": "solo",
 "cmd": {
  "cmd": "read_servo",
  "angles": true,
  "currents": true,
  "status": false,
  "gripper": false,
  "regs": [],
  "raw": false
 },
 "gap_sec": null,
 "daemon": "192.168.2.1:5555",
 "sends_to_arm": "none (read only)",
 "end_reason": "seconds",
 "ended_at": "2026-11-07T17:56:56",
 "probe": {
  "n": 81,
  "n_error": 0,
  "n_item_error": 81,
  "n_currents_6": 0,
  "hz": 7.88,
  "rtt_ms": {
   "n": 81,
   "median": 127.13,
   "p95": 129.08,
   "max": 166.33,
   "min": 111.19
  },
  "pi_total_ms": {
   "n": 81,
   "median": 125.36,
   "p95": 127.04,
   "max": 129.72,
   "min": 109.91
  },
  "item_ms": {
   "angles": {
    "n": 81,
    "median": 17.8,
    "p95": 23.91,
    "max": 25.7,
    "min": 8.38
   },
   "currents": {
    "n": 81,
    "median": 108.91,
    "p95": 111.63,
    "max": 112.03,
    "min": 100.63
   }
  }
 }
}

175645_solo/first_read.json(1回目の始めの1回)

04_175645_solo_first_read.json8,870字・724行・json
{
 "cmds": [
  {
   "cmd": "read_servo",
   "angles": true,
   "currents": true,
   "status": true,
   "gripper": true,
別のタブで開く保存

175645_solo/marks.csv(1回目の印)

t_mac,key,name,sample_i

175645_solo/samples.csv(1回目の読み取り81回)

05_175645_solo_samples.csv12,682字・82行・csv
i,t_mac_send,t_mac_recv,rtt_ms,wait_ms,t_pi,pi_total_ms,angles_ms,currents_ms,j0,j1,j2,j3,j4,j5,cur0,cur1,cur2,cur3,cur4,cur5,currents_raw,gripper_value,status,regs,error,mark
0,1794041806.508898,1794041806.630475,121.58,,1665645179.274495,120.51,8.38,112.03,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
1,1794041806.630604,1794041806.758419,127.82,,1665645179.396166,126.83,17.79,108.94,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
2,1794041806.758471,1794041806.886396,127.92,,1665645179.524004,126.98,17.92,108.97,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
3,1794041806.886444,1794041807.014438,127.99,,1665645179.652045,126.94,18.13,108.72,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
4,1794041807.014483,1794041807.142413,127.93,,1665645179.780068,126.91,17.91,108.91,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
5,1794041807.142451,1794041807.271023,128.57,,1665645179.908015,126.97,17.94,108.94,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
6,1794041807.271085,1794041807.402445,131.36,,1665645180.040572,126.42,14.34,111.98,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
別のタブで開く保存

175706_pad/summary.json(2回目のまとめ)

{
 "started_at": "2026-11-07T17:57:07",
 "argv": [
  "tools/servo_current_probe.py",
  "--with-pad"
 ],
 "mode": "pad",
 "cmd": {
  "cmd": "read_servo",
  "angles": true,
  "currents": true,
  "status": false,
  "gripper": false,
  "regs": [],
  "raw": false
 },
 "gap_sec": null,
 "daemon": "192.168.2.1:5555",
 "sends_to_arm": "none (read only); gamepad_teleop sends as usual",
 "teleop_log": "/Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261107_175708/log.jsonl",
 "pad_wait_ms": {
  "reading": {
   "n": 11,
   "median": 41.66,
   "p95": 132.41,
   "max": 139.99
  },
  "paused": null
 },
 "ended_at": "2026-11-07T17:58:57",
 "probe": {
  "n": 731,
  "n_error": 1,
  "n_item_error": 730,
  "n_currents_6": 0,
  "hz": 6.77,
  "rtt_ms": {
   "n": 730,
   "median": 127.81,
   "p95": 132.25,
   "max": 248.7,
   "min": 111.05
  },
  "pi_total_ms": {
   "n": 730,
   "median": 126.32,
   "p95": 129.62,
   "max": 247.45,
   "min": 109.46
  },
  "item_ms": {
   "angles": {
    "n": 730,
    "median": 17.71,
    "p95": 24.66,
    "max": 127.4,
    "min": 8.41
   },
   "currents": {
    "n": 730,
    "median": 108.93,
    "p95": 112.03,
    "max": 127.03,
    "min": 100.4
   }
  }
 }
}

175706_pad/first_read.json(2回目の始めの1回)

06_175706_pad_first_read.json8,868字・724行・json
{
 "cmds": [
  {
   "cmd": "read_servo",
   "angles": true,
   "currents": true,
   "status": true,
   "gripper": true,
別のタブで開く保存

175706_pad/marks.csv(2回目の印。入れていない)

t_mac,key,name,sample_i

175706_pad/pad_rpc.csv(2回目のゲームパッドの指令と待ち)

t_call,cmd,joint_id,wait_ms,rpc_ms,probe_paused,error
1794041828.757123,get_angles,,0.00,21.12,0,
1794041890.611064,get_angles,,19.31,19.10,0,
1794041890.650176,get_angles,,132.41,18.19,0,
1794041890.802264,send_angles,,111.54,29.02,0,
1794041890.942913,get_angles,,139.99,12.20,0,
1794041891.398266,get_angles,,4.37,20.82,0,
1794041891.727436,get_angles,,95.13,20.94,0,
1794041892.148281,get_angles,,0.01,19.12,0,
1794041892.472620,get_angles,,90.03,20.86,0,
1794041892.886245,get_angles,,0.01,24.79,0,
1794041893.213939,get_angles,,41.66,23.21,0,

175706_pad/samples.csv(2回目の読み取り731回)

07_175706_pad_samples.csv115,768字・732行・csv
i,t_mac_send,t_mac_recv,rtt_ms,wait_ms,t_pi,pi_total_ms,angles_ms,currents_ms,j0,j1,j2,j3,j4,j5,cur0,cur1,cur2,cur3,cur4,cur5,currents_raw,gripper_value,status,regs,error,mark
0,1794041829.867833,1794041830.025863,158.03,0.01,1665645202.633966,121.03,11.7,109.22,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
1,1794041830.039029,1794041830.166427,127.40,0.01,1665645202.804850,126.13,17.09,108.95,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
2,1794041830.177184,1794041830.306336,129.15,0.01,1665645202.942942,128.05,18.99,108.96,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
3,1794041830.318918,1794041830.446414,127.50,0.01,1665645203.084590,126.39,17.71,108.59,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
4,1794041830.457058,1794041830.586355,129.30,0.17,1665645203.223906,127.08,18.04,108.94,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
5,1794041830.598790,1794041830.726689,127.90,0.01,1665645203.366001,124.98,15.93,108.96,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
6,1794041830.739254,1794041830.866363,127.11,0.01,1665645203.504972,126.01,16.94,108.98,-0.08,92.37,-5.09,7.47,-89.56,-29.44,,,,,,,null,,,,currents:no reply,
別のタブで開く保存

実機3回目:肩と爪の番地を読み、つかむ・引く・押すで値が動いた(18:00〜18:03)

最初は肩と爪の番地を4つ(69と70を両方)読もうとしましたが、ゲームパッドと一緒に動かすときは、1回に読む数を4までにする決まりにしてあったため(角度で1つ使う)、道具に止められました。読んでいる間はゲームパッドの指令が待たされるので、待ちが長くならないようにした決まりです。そこで、肩は下位の番地69だけにし、爪は69と70を読みました。

python3 tools/servo_current_probe.py --with-pad --no-currents --regs 2:69,7:69,7:70

操作は次の順です。触らずに10秒(キー1)。×で爪を空のまま閉じて(キー2)、○で開く。爪の間にブロックを手で差し込んで×で閉じ(キー3)、つかんだブロックを手で軽く引っ張る(キー4)。○で放す。アームを手で軽く押す(キー6)。キーは操作のあとに押したので、印の時刻は操作より少し遅れています。キー5(離した)は押し忘れました。

1,492回読んで、読めなかった回は0回でした。かかった時間は144.4秒で、平均 10.3回/秒、1回の往復の中央値は 84.7ms でした(ゲームパッドの操作がない間は約69ms)。爪の指令がゲームパッドから送られたとき、読み取りに待たされた時間は 24〜80ms でした。

区間ごとの値です。区間は、値の変わり目と、ゲームパッドの爪の指令の時刻(pad_rpc.csv)から決めました。

区間秒読んだ回数爪の値(中央・最小〜最大)肩の値(中央・最小〜最大)肩 j1 の角度
静止0〜505402(−7〜8)11(10〜11)1.23°
空で閉じた52〜6412715(7〜22)11(10〜11)1.23°
開いた66〜78113−48(−63〜−3)111.23°
つかんだ80〜92.8131870(833〜977)11(10〜11)1.23°
手で引いた(と見られる間)92.9〜96.033824(816〜834)9(9〜11)1.14〜1.23°
引いたあと96.1〜109113804(792〜817)11(10〜11)1.23°
放したあと110〜123135−57(−66〜−42)91.14〜1.23°
押した123.2〜12853−45(−56〜−26)1(0〜7)−0.52〜1.05°
押したあと128〜145179−37(−49〜−24)30.79°

読めたことと、読めなかったことを分けます。

  • 爪の値は、操作にきれいに反応した。空で閉じると15前後、ブロックをつかむと最初に993まで上がり、つかんでいる30秒ほどの間に800前後までゆっくり下がった。開いたり放したりすると −50前後になる。マイナスは向きが逆の値で、開き切った所へ押し当てている分と思われる(確かめてはいない)
  • 手で引いたときの変化は、爪の値には見えなかった。つかんだあとのゆっくりした下がりに埋もれている
  • 肩の値は、手で引いたと見られる3秒ほど11から9に下がり、肩の角度も 1.23° から 1.14° に動いた。アームを押すと0〜3に下がり、角度も −0.52° まで動いて、押し終えたあとは 0.79° で止まった。押されたことは値で分かる。ただし下位の番地しか読んでいないので、向きは分からない
  • 爪を放したあと、肩の値は11に戻らず9のままだった。理由は分かっていない
  • 1回目と2回目では、肩の番地69が始めの1回で1か0だった(腕を上げた姿勢)。3回目の HOME の姿勢では11。姿勢で値が変わるのか、読み方の違いかは、まだ分けていない

この表の数字は、このあとの集計のコード(phase_stats.py)で出したものです。

  • ねらい:お手本に足す値として、爪と肩の値が使えるかを確かめる
  • 変わったこと:爪の値で、空振り(15前後)とつかめた(870前後)が分かれ、肩の値で、引かれた・押されたが出ることを確かめた
  • 見込める効果:π0.5 で動かした記録の中で、つかみに失敗した回を値で見つけられる見込み。学習に入れて効くかは、まだ確かめていない

3回目の端末の出力(チャットに貼った範囲)

(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 tools/servo_current_probe.py --with-pad --no-currents --regs 2:69,7:69,7:70
(この行と、続く objc の警告・始めの 1 回の表示はチャットに貼った範囲の外。以下はチャットに貼られた部分をそのまま)
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261107_180052
[実機] daemon に送ります。起動したときの姿勢: -0.35 +1.23 +0.70 +0.26 -0.26 -29.70
コントローラーを待っています(つないでいなければ、今つないでください)
読み始めます。印はターミナルかゲームパッドの窓で: 1 静止 2 空で閉じた 3 つかんだ 4 引っ張った 5 離した 6 押した 0 そのほか / p 止める・再開 / 終わるときはウィンドウを閉じる
[接続] PS4 Controller  GUID=03008fe54c050000cc09000000016800  軸=6  ボタン=16
[読み] 23 回  10.7 Hz  往復の中央値 69.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 0 回  やりとりの失敗 0 回
[読み] 48 回  11.5 Hz  往復の中央値 68.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 0 回  やりとりの失敗 0 回
[読み] 73 回  11.7 Hz  往復の中央値 68.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 0 回  やりとりの失敗 0 回
[読み] 95 回  11.5 Hz  往復の中央値 69.2 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 0 回  やりとりの失敗 0 回
[読み] 117 回  11.3 Hz  往復の中央値 69.7 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 0 回  やりとりの失敗 0 回
[読み] 140 回  11.3 Hz  往復の中央値 69.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 0 回  やりとりの失敗 0 回
[読み] 162 回  11.3 Hz  往復の中央値 69.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 0 回  やりとりの失敗 0 回

phase_stats.py(区間ごとの値をまとめる集計のコード)

# LOG461: 180051_pad の samples.csv から、爪(7番)と肩(2番)の番地の値を段階ごとにまとめる
# 値 = (番地70 の最上位ビットが立っていればマイナス) × (番地69 + 256 × (番地70 & 127))
import csv, json, statistics as st, sys

path = sys.argv[1] if len(sys.argv) > 1 else 'samples.csv'
rows = list(csv.DictReader(open(path)))
t0 = float(rows[0]['t_mac_recv'])
D = []
for r in rows:
    try:
        g = json.loads(r['regs'])
        d = {(a, b): v for a, b, v, _ in g}
    except Exception:
        continue
    gh = d[(7, 70)]
    gv = (-1 if gh & 128 else 1) * (d[(7, 69)] + 256 * (gh & 127))
    j1 = float(r['j1']) if r['j1'] else None
    D.append((float(r['t_mac_recv']) - t0, gv, d[(2, 69)], j1, float(r['rtt_ms'])))

# 区間の秒は、値の変わり目と pad_rpc.csv の爪の指令の時刻から決めた
W = [('静止', 0, 50), ('空で閉じた', 52, 64), ('開いた', 66, 78), ('つかんだ', 80, 92.8),
     ('手で引いた', 92.9, 96.0), ('引いたあと', 96.1, 109), ('放したあと', 110, 123),
     ('押した', 123.2, 128), ('押したあと', 128, 145)]
print('区間,秒,読んだ回数,爪の中央値,爪の最小,爪の最大,肩の中央値,肩の最小,肩の最大,j1の最小,j1の最大')
for n, a, b in W:
    x = [d for d in D if a <= d[0] < b]
    g = [d[1] for d in x]; s = [d[2] for d in x]; j = [d[3] for d in x if d[3] is not None]
    print(f'{n},{a}-{b},{len(x)},{st.median(g)},{min(g)},{max(g)},{st.median(s)},{min(s)},{max(s)},{min(j)},{max(j)}')
r = [d[4] for d in D]
print(f'読んだ回数 {len(D)}  かかった秒 {D[-1][0]:.1f}  平均 {len(D)/D[-1][0]:.1f} Hz  往復の中央値 {st.median(r):.1f} ms')

phase_stats.py の出力

区間,秒,読んだ回数,爪の中央値,爪の最小,爪の最大,肩の中央値,肩の最小,肩の最大,j1の最小,j1の最大
静止,0-50,540,2.0,-7,8,11.0,10,11,1.23,1.23
空で閉じた,52-64,127,15,7,22,11,10,11,1.23,1.23
開いた,66-78,113,-48,-63,-3,11,11,11,1.23,1.23
つかんだ,80-92.8,131,870,833,977,11,10,11,1.23,1.23
手で引いた,92.9-96.0,33,824,816,834,9,9,11,1.14,1.23
引いたあと,96.1-109,113,804,792,817,11,10,11,1.23,1.23
放したあと,110-123,135,-57,-66,-42,9,9,9,1.14,1.23
押した,123.2-128,53,-45,-56,-26,1,0,7,-0.52,1.05
押したあと,128-145,179,-37,-49,-24,3,3,3,0.79,0.79
読んだ回数 1492  かかった秒 144.4  平均 10.3 Hz  往復の中央値 84.7 ms

180051_pad/summary.json(3回目のまとめ)

{
 "started_at": "2026-11-07T18:00:51",
 "argv": [
  "tools/servo_current_probe.py",
  "--with-pad",
  "--no-currents",
  "--regs",
  "2:69,7:69,7:70"
 ],
 "mode": "pad",
 "cmd": {
  "cmd": "read_servo",
  "angles": true,
  "currents": false,
  "status": false,
  "gripper": false,
  "regs": [
   [
    2,
    69
   ],
   [
    7,
    69
   ],
   [
    7,
    70
   ]
  ],
  "raw": false
 },
 "gap_sec": null,
 "daemon": "192.168.2.1:5555",
 "sends_to_arm": "none (read only); gamepad_teleop sends as usual",
 "ended_at": "2026-11-07T18:03:24"
}

180051_pad/first_read.json(3回目の始めの1回)

08_180051_pad_first_read.json8,870字・724行・json
{
 "cmds": [
  {
   "cmd": "read_servo",
   "angles": true,
   "currents": true,
   "status": true,
   "gripper": true,
別のタブで開く保存

180051_pad/marks.csv(3回目の印)

t_mac,key,name,sample_i
1794042097.898721,1,static,449
1794042118.407143,2,close_empty,663
1794042140.794489,3,grasp,876
1794042154.007000,4,pull,1013
1794042183.396141,6,push_arm,1298

180051_pad/pad_rpc.csv(3回目のゲームパッドの指令と待ち)

t_call,cmd,joint_id,wait_ms,rpc_ms,probe_paused,error
1794042052.606234,get_angles,,0.00,26.73,0,
1794042107.330679,set_gripper_value,,79.99,11.34,0,
1794042121.818129,set_gripper,,30.87,2013.34,0,
1794042135.387035,set_gripper_value,,62.95,1.85,0,
1794042163.666056,set_gripper,,23.99,2019.07,0,

180051_pad/samples.csv(3回目の読み取り1,492回)

09_180051_pad_samples.csv282,501字・1,494行・csv
i,t_mac_send,t_mac_recv,rtt_ms,wait_ms,t_pi,pi_total_ms,angles_ms,currents_ms,j0,j1,j2,j3,j4,j5,cur0,cur1,cur2,cur3,cur4,cur5,currents_raw,gripper_value,status,regs,error,mark
0,1794042056.526342,1794042056.635107,108.77,0.01,1665645429.292696,59.76,9.33,,-0.35,1.23,0.70,0.26,-0.26,-29.70,,,,,,,,,,"[[2, 69, 11, 10.31], [7, 69, 5, 19.97], [7, 70, 128, 19.94]]",,
1,1794042056.645813,1794042056.727582,81.77,0.01,1665645429.412001,80.45,18.44,,-0.35,1.23,0.70,0.26,-0.26,-29.70,,,,,,,,,,"[[2, 69, 11, 21.91], [7, 69, 1, 19.96], [7, 70, 0, 19.97]]",,
2,1794042056.739615,1794042056.807611,68.00,0.01,1665645429.505712,66.73,16.24,,-0.35,1.23,0.70,0.26,-0.26,-29.70,,,,,,,,,,"[[2, 69, 11, 10.4], [7, 69, 6, 19.96], [7, 70, 0, 19.97]]",,
3,1794042056.819025,1794042056.887515,68.49,0.01,1665645429.585035,67.41,16.93,,-0.35,1.23,0.70,0.26,-0.26,-29.70,,,,,,,,,,"[[2, 69, 11, 10.39], [7, 69, 1, 19.97], [7, 70, 0, 19.96]]",,
4,1794042056.900114,1794042056.967651,67.54,0.01,1665645429.666103,66.35,15.86,,-0.35,1.23,0.70,0.26,-0.26,-29.70,,,,,,,,,,"[[2, 69, 11, 10.4], [7, 69, 5, 19.96], [7, 70, 128, 19.97]]",,
5,1794042056.979335,1794042057.047512,68.18,0.00,1665645429.745303,67.15,16.67,,-0.35,1.23,0.70,0.26,-0.26,-29.70,,,,,,,,,,"[[2, 69, 11, 10.39], [7, 69, 3, 19.96], [7, 70, 128, 19.97]]",,
6,1794042057.057600,1794042057.127521,69.92,0.00,1665645429.823557,68.9,18.42,,-0.35,1.23,0.70,0.26,-0.26,-29.70,,,,,,,,,,"[[2, 69, 11, 10.4], [7, 69, 6, 19.96], [7, 70, 128, 19.97]]",,
別のタブで開く保存

依頼116:π0.5 のお手本と実機推論の記録に、爪と肩の値を足す

測った結果を見て、お手本の記録に足すことに決めました。足すのは爪の番地69・70と、肩の番地69・70です。爪は値が255を超えるので上位も要り、肩は向きを取るために上位も読みます。角度の記録の1秒10回を落とさないことを条件にし、4つで収まらなければ、肩の上位だけを数回に1回にする形を Claude Code に選ばせました。学習データを作る側は変えず、値は同じ記録のフォルダに別の表(currents.csv)として残します。学習に入れるかは、記録がたまってから決めます。

依頼116 の依頼文

---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 120
---
# 依頼:π0.5 のお手本と実機推論の記録に、爪と肩の電流の値を足す(2026-11-07)

依頼109の続き。109の決めてほしいこと5(C を実装するか)は、エイイチが実機で測った結果を見て「お手本の記録に足す」と決めた。

## 実機で分かったこと(KIOXIA の diag/servo_current_20261107/)

- 関節の電流を一度に読む関数(get_servo_currents)は、この機体では答えない(175645_solo・175706_pad。毎回 no reply で0.1秒待つ)。使わない
- サーボの番地を直接読む方法は読める(180051_pad。角度+番地3つで11Hz、往復の中央値69ms、読めなかった回0)
- 値は、番地69が下位、70が上位。上位の最上位ビット(128)が向き、残りが大きさ。符号付きの値 = (70の最上位ビットが立っていればマイナス) × (69 + 256 × (70 & 127))
- 爪(7番):静止0前後(±8の揺れ)、空で閉じる15前後、開くと-50前後、ブロックをつかむと990まで跳ね、30秒かけて800まで下がる、放すと-50前後。つかめたかがはっきり分かる。値が255を超えるので上位も要る
- 肩(2番、下位だけ読んだ):静止11、つかんだブロックを手で引くと9、アームを手で押すと0〜3。引かれた・押されたが出ている。向きを取るには上位も要る
- 印の時刻は 180051_pad の marks.csv、値は samples.csv の regs 列

## A. 記録に足す

- 実機推論とお手本集めの記録(policy_recorder の角度の記録)で、get_angles の代わりに read_servo(角度と番地)を呼ぶ。daemon への問い合わせの回数は今と同じにする
- 読む番地:爪 7:69・7:70 と、肩 2:69・2:70
- 角度の記録の頻度(今の10Hz)を落とさないこと。角度+番地4つが1回で収まらない、またはゲームパッドの待ちが増えすぎるなら、肩の上位(2:70)だけを数回に1回にするなど、頻度を守る形を Claude Code が選び、測った数字と理由を報告に書く。爪の2つと肩の下位は毎回読む
- states.csv の列は変えない(学習データを作る側が読むため)。同じ時刻の値は、同じ run のフォルダに currents.csv として別に書く。列は時刻(states.csv と突き合わせられる形)、生の4バイト、爪と肩の符号付きの値、その回に読まなかった番地は空
- 読めなかった回は値を空にして続ける。記録のために推論や補正を止めない
- 依頼109の決めてほしいこと3:gamepad_teleop を単独で動かすと送り口が鍵を通らない件を、ここで直す(同じプロセスで記録とパッドが同時に daemon を使うため)
- 学習データを作る側(build_correction_episodes.py など)は今回変えない。電流を学習に入れるかは、記録がたまってから決める

## B. ついでに

- tools/test_gamepad_teleop.py の時間の確かめが1.03〜1.04秒で NG の件(依頼109の決めてほしいこと4)。手を入れる前の版でも落ちるかを確かめ、前からの揺らぎなら許す幅を直す。auto_detect_cameras.py が git に入っていない件も報告に書く

## 確かめ

- 既存のテストが全部通ること。新しい記録の形のテストを足す(daemon の偽物で、読めた回・読めなかった回・頻度を守る形)
- codex のレビューを通す(実機の経路とゲームパッドの鍵に触るため。docs/ に依頼文と結果を残す)
- アームは動かさない。実機での確かめはエイイチがやるので、手順を報告に書く
- 測定データ(runs/・datasets/・checkpoints/ の既存のもの)は上書き・移動・削除しない。書く前に KIOXIA のマウントを確かめる
- git は個別ファイルを指定して add・commit する(git add . は使わない)

## 報告に書くこと

- 1回の読み取りにかかった時間と、記録の頻度(測った数字)。肩の上位をどう扱ったか
- currents.csv の列
- エイイチが実機で確かめる手順。今までの実機推論の起動(1行)で、ブロックをつかむ・放すを1回やり、currents.csv に爪の値が出ているかを見る形で短く
- 最後の1行に「判定:合格/止めた(決めてほしいことあり)/失敗」

次は依頼116 の記録で、π0.5 の実機推論のつかみを値で見る

依頼116 が戻ったら、π0.5 で実機を動かし、記録に爪と肩の値が出ているかを確かめます。つかみに失敗した回が爪の値で見分けられるか、人がゲームパッドで直した所で肩の値がどう動くかを見て、学習に入れるかを決めます。境野さんの研究のように狙った力を出すことは、この機体ではできません。それでも、手応えを記録に残すところまでは、力センサーなしで届きました。

出典