フィジカルAI研究室を作る Log#35 | mechArm 270 の推論の待ちを削り、144秒が54秒に

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

小型ロボットアーム mechArm 270 で、Physical Intelligence の π0.5 にブロックをつかんで箱へ入れさせる1回は、待ちを削ると144秒から54〜95秒に縮んだ。縮んだのは、最初の推論にかかっていた57秒と、人が Enter を押すまでの待ち(1回で約32秒)で、アームを止めずに流す送り方や動く速さを20から30に上げることは、1回分の動きの時間(2.2〜2.4秒)をほとんど変えなかった。 実物のアームで、Runpod の GPU に置いた π0.5 を動かした8回の記録から分かったことです。

この回の直しで、次のことが変わりました。

  • 1回の試行が短くなった:直す前の1回は144秒。直したあとは、置いたあとに動き続けた1回を除いて54〜105秒(中央90秒)
  • 人が付きっきりで Enter を押さなくてよくなった:前は1回の中で15回ほど押していた。直したあとは、1回目の試行の始めに1回だけ。補正や巻き戻しをしたいときは、スペースキーを押せば止まる
  • 置いたあとに動き続ける問題が見つかり、自動で終わる形を足した:1回は、箱に置いたあとも π0.5 が動き続け、何もない所で爪を閉じて箱まで運んだ。置き終えたら HOME に戻って終わる形を足し、記録の上ではこの空振りの前に終わることを確かめた(実機ではまだ試していない)
  • 費用:この回の GPU(Runpod の A40)は39分で約61円

前の回(LOG504)で、電源を12V・5A に替えると、π0.5 は位置5 のブロックを5回とも箱に入れました。ただ、その1回の記録を時間で分けると、アームが動いていたのは全体の46%だけでした。LOG490 でも、20本の実機の記録で動いていたのは44%と測っています。残りは、AI が考えている時間と、人が「進めて」の合図を出すまでの時間でした。試す回数を増やすほど、この待ちが積み重なります。

そこで、待ちを1つずつ削り、実機で比べました。

やったことなぜ結果
最初の推論を、アームを動かす前に1回空打ちする(依頼176)
最初の推論だけ57秒かかっていた
2回目以降と同じ0.6〜1.2秒になった
途中の点で止まらずに次を送る --flow と、速さ --speed を足す(依頼176)
1回分(お手本で1秒の動き)に2〜4秒かかっていた
1回分の動きは2.2〜2.4秒のまま。速さ30でも同じ
始めの Enter を、1回目の試行だけにする(依頼177)
1回目の推論のあとの Enter 待ちが20.9秒
2回目からは待たずに始まる
推論ごとの Enter をやめ、スペースで止める(依頼178)
1回分ごとの Enter 待ちが合わせて約11秒
1回の中の Enter 待ちは、始めと止めるときだけになった
実機で8回比べるどれが効いたかを分ける
144秒が54〜95秒に。動いた時間の割合は46%から70%前後に
置き終えたら自動で終わる(依頼181)
1回、置いたあとに空振りした
記録の上で、置いてから5〜7回分で終わると確かめた
1回分を送る点の数を変えられるようにする(依頼182)
時間は点を送る間隔で決まっていた
点を4つから2つにする設定を足した(実機はまだ)

試行の記録は KIOXIA の runs/pi05_policy/pi05_20261114_*、ターミナルの出力とこの回の材料は lab/Log35/ に入れています。

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

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

作業ログ ― 推論の1回の待ちを測り、4つの依頼で削って実機で比べるまで

ここから下は作業の記録です。依頼文・報告・コードの差分・ターミナルの出力は全量で載せます。効果を書いた所のうち、数字で書いたものは測った値、「見込み」と書いたものはまだ確かめていない値です。

この回で何度も出てくる言葉を先に言い換えておきます。

  • π0.5:Physical Intelligence が公開しているロボット用の AI。上カメラの画像と関節の角度を見て、次の動きを出す。この回は、位置ごとに10本そろえた50本のお手本で学習したモデル deep1 を使った
  • 推論:π0.5 に今の画像と角度を渡して、次の動きを答えさせること。答えは Runpod で借りた GPU のマシン(Pod)の上で出し、Mac から通信で受け取る
  • チャンク:π0.5 が1回の推論で出す、この先の動きのひとまとまり。0.1秒ごとの姿勢が並んでいて、この回は10個(お手本で1秒ぶん)を1チャンクとして動かした
  • 中継点:1チャンクの動きを、アームに送るためにいくつかの姿勢に分けたもの。今までは4つ(10個の姿勢のうち3番目・6番目・9番目・10番目)に分け、1つ送るたびに着くまで待っていた
  • Enter 待ち:推論のたびに出る入力欄で、人が Enter を押すまでの時間。この入力欄は、ゲームパッドでの補正(p)・巻き戻し(b)・爪の締め直し(r)・HOME(h)・終わる(q)の入口も兼ねている
  • 依頼箱:Claude Code への依頼をファイルで置いておく Mac のフォルダ。置くと見張り係が順に Claude Code に渡し、結果を書き戻す
  • 位置5:赤いブロックを置く5つの場所のうちの1つ。この回は全部この場所で動かした

1回の推論の144秒を、推論・Enter 待ち・動きに分けた

LOG504 の推論のうち1回(pi05_20261113_193254)のターミナルを読み直し、1チャンクごとに時間を足し合わせました。

中身秒見えたこと
推論70.3
1回目だけ57.5秒。2回目からは0.6〜1.8秒
人の Enter 待ち31.7
チャンク0 のあとが20.9秒。ほかは1回0.5〜1.6秒
アームが動いた40.8
1チャンクに2.0〜2.6秒。お手本では1秒の動き
そのほか1.6角度の読み取りと撮影
合計144.4
動いていたのは全体の28%(チャンク0 の推論を含む)

1チャンクの動きに2秒以上かかるのは、4つの中継点を1つずつ送り、着いたのを確かめてから次を送っていたからです。アームは中継点ごとに止まり、カクカクと動いていました。

ここから、待ちを削る手を3つ考えました。

  1. 最初の推論の57秒をなくす:Pod を立てた直後に1回だけ空打ちしておけば、本番の1回目も速く返るはず
  2. 中継点で止まらずに流す:途中の中継点は、着くのを待たずに近づいたら次を送る。速さも上げられるようにする
  3. 推論しながら動く:今の動きの間に次を推論しておく。2より作りが大きいので、2の結果を見てから

1と2を依頼176として依頼箱に入れました。0.1秒ごとに次々と送る形は、前にアームのコントローラーに無視された記録があるので使わず、1つずつ送る今の形のまま、着くのを待つ所だけをなくすように頼んでいます。

依頼176:最初の推論を空打ちし、中継点で止まらずに流す

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

ファイルの一覧(12本)

01_sec03.txt ― 依頼176 で Claude Code が返した報告・6,129字

02_sec03.txt ― 依頼176 のコードの差分(コミット 0383893)・69,450字

03_sec05.txt ― 依頼177 のコードの差分(コミット 2da2f61)・16,371字

04_sec06.txt ― 依頼178 で Claude Code が返した報告・4,311字

05_sec06.txt ― 依頼178 のコードの差分(コミット 047e472)・52,268字

06_sec07.txt ― `chunk_timing.py` で8回を並べた出力・20,887字

07_sec07.txt ― 1回目の起動(`--flow`・速さ20)のターミナル・70,619字

08_sec07.txt ― 2回目の起動(今までの送り方・速さ20)のターミナル・64,066字

09_sec07.txt ― 3回目の起動(`--flow`・速さ30)のターミナル・74,947字

10_sec09.txt ― 依頼181 で Claude Code が返した報告・4,641字

11_sec09.txt ― 依頼181 のコードの差分(コミット 68f514a)・56,694字

12_sec10.txt ― 依頼182 のコードの差分(コミット b3f290a)・15,100字

依頼176 の依頼文

---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 120
---
# 依頼176:実機推論の最初の待ちをなくし、チャンクの中で止まらずに流す

実機は動かさない(実装・テスト・レビューまで)。実機での試しはエイイチが行う。Log35。

## なぜ
LOG504(Log34)の推論 pi05_20261113_193254(位置5・deep1・閉じる値25・12V 5A)の log.jsonl を見ると、87 秒のうち
- 1 回目の推論が 57.5 秒(2 回目からは 0.6〜1.8 秒)。チャンク 0 から 1 までは 28.7 秒かかっている
- 1 チャンク(お手本で 1 秒ぶん・中継点 4 つ)を動かすのに 3〜4 秒。中継点ごとに _send_and_wait_arrival で 3° に入るまで止まって待つため、カクカクして遅い
- 推論の 0.6 秒ほどはアームが止まっている
12V 5A に替えてアームの動きがキビキビしたので(2026-11-13)、速さと滑らかさを上げたい。

## やること
1. **最初の待ちをなくす(既定で入れる)**
   - lab_start.sh:サーバーが 8000 番で待ったあと、アームを動かす前に、お手本と同じ形の観測(上カメラの画像の大きさ・state 7 つ・prompt)で 1 回だけ空の推論を投げて捨てる。かかった秒を [WARM  ] の行に出す。失敗しても止めずに 1 行出して続ける
   - --serve-only のときも空打ちまで行う
   - チャンク 0 から 1 までの 28.7 秒のうち、推論 57.5 秒が終わってから動き終わるまでの 26.9 秒に何が入っているか(HOME・爪・位置合わせ・録画の立ち上げなど)を log と lab_start のターミナル(KIOXIA lab/Log34/lab_start_20261113_192747.txt)から調べて報告に書く。直せるものは案だけ書く(直さない)

2. **チャンクの中で止まらずに流す(--flow。既定は今までどおり)**
   - run_policy_client.py に --flow を足す。中継点(--via-stride)の途中の点は、3° に入るまで待たず、次の点へ進める条件(たとえば 今の点まで --flow-tol 度以内に近づいた・または見込みの時間がたった)で次を送る。チャンクの最後の点は今までどおり 3° の到着確認をしてから次の推論へ
   - 送り方は今の単発の send_angles のまま(0.1 秒ごとの連打は DAY287 以前にコントローラーに無視された記録があるので使わない)。送る間隔の下限をどこに置いたかと理由を報告に書く
   - --speed N を足す(既定 20 のまま)。log.jsonl の頭(type=model)に flow・flow_tol・speed を残す
   - 中継点ごとに、送った時刻と次を送った時刻(または着いた時刻)を log.jsonl に残す(あとで比べるため)
   - 補正(ゲームパッド・巻き戻し)の送り方は変えない
   - 今ある守り(max_move・関節の範囲・安全範囲)は変えない。新しい確認や停止条件は足さない

3. **チャンクごとの時間の内訳を出す道具**
   - pi05/chunk_timing.py <試行のフォルダ> [<試行のフォルダ> ...]:チャンクごとに 推論の秒・動いた秒・合計 と、試行全体の合計・中央値を表で出す(読むだけ・何も書き出さない)。flow の試行なら中継点ごとの待ちも出す
   - 実データで pi05_20261113_193254 を流した結果を報告に貼る

4. **お手本の再生の速さ**
   - record_teach_demo.py の再生がどの速さ(speed)・どの待ちで動いているかを調べて報告に書く。推論の --speed を上げたとき、お手本の速さとどれくらいずれるかの見込みも書く(変えない)

5. テスト:--flow なしで今までと同じ送り方・同じ log になること、--flow で途中の点を待たずに次へ進むこと(daemon をまねたもので)、空打ちが失敗しても lab_start が続くこと。既存のテスト(test_lab_start.sh・pi05/ のもの)も通す
6. codex で差分を見てもらう。指摘を直して通るまで
7. 変えたファイルだけを指定して git add・commit(git add . と git clean は使わない)

## 報告
- エイイチが実機で比べるためのコマンド(位置5・閉じる値25で、今まで/--flow/--flow --speed 30 を 1 回ずつ)と、比べ方(chunk_timing.py)
- 1 の 26.9 秒の中身と直し方の案、4 の調べた結果

依頼176 で Claude Code が返した報告

依頼箱は11月13日21:15に始め、22:01に終えました(46分)。

01_sec03.txt6,129字・110行・text
依頼176 報告:実機推論の最初の待ちをなくし、チャンクの中で止まらずに流す(Log35)

■ やったこと
1. 空打ち(既定で入れた)
- pi05/policy_warmup.py を新しく作った。お手本(lab_start の $RAW_RANGE)の最初のエピソードの 1 枚目(384x216)・state[0](7 つ)・prompt で 1 回だけ推論させて、答えを捨てる。
- lab_start.sh では、トンネル(5)のあと・デーモンやアームより前に「5b. 空打ち」として流す。--serve-only のときも行う。
- かかった秒は [WARM  ] の行に出す。時間の上限は、つなぐところから合わせて 300 秒。
- 失敗・答えない・Ctrl-C のときは [WARM  ] を 1 行出して、そのまま続ける(lab_start は止まらない)。
別のタブで開く保存

報告で分かったことのうち、大きかったのはチャンク0 のあとの26.9秒の中身でした。20.9秒は人が Enter を押すまでの待ちで、機械の待ちではありませんでした。3.1秒は始めに爪を開く時間で、案の1つに「すでに開いているなら省く」がありました。これは採らず、毎回開くことにしています。爪が開いていない、アームが HOME にいない、ということが実際にあるからです。案の (b)(Pi のデーモンの2秒の待ちを短くする)は、前に起きた不具合(LOG175)が戻るおそれがあるので見送りました。

--flow で途中の中継点から次へ進む決まり(5° まで近づいた・送る間隔は0.4〜1.5秒)は、Claude Code が仮に決めた値です。実機で比べてから決めることにしました。

依頼176 のコードの差分(コミット 0383893)

02_sec03.txt69,450字・1,388行・diff
commit 0383893682aaa5e56e618ff6be55c67431d00304
Author: Eiichi Shimazu <studio@adaptdesign.jp>
Date:   Fri Nov 13 22:00:26 2026 +0900

    実機推論の最初の待ちをなくし, チャンクの中の途中の点で止まらずに流せるようにする (依頼 176・Log35). lab_start.sh はトンネル (5) のあと・アームの前に 5b で pi05/policy_warmup.py を流し, お手本 ($RAW_RANGE) の 1 枚目と state[0] と prompt で 1 回だけ推論させて捨てる (つなぐところから --timeout 300 秒. かかった秒を [WARM  ] に. 失敗・Ctrl-C でも 1 行出して続ける. --serve-only でも行う). run_policy_client.py に --flow (途中の点は単発の send_angles を 1 回送り, --flow-tol (既定 5°) 以内に近づくか見込みの時間 (0.15 秒 + 角度 ÷ 25°/秒×speed/20) で次を送る. 送る間隔は 0.4 秒以上・1.5 秒まで. 最後の点は今までどおり 3° の到着確認. 送る直前の読み直しと守りは今までどおり) と --speed N (既定 20. チャンクと settle だけ. 補正・巻き戻し・HOME は 20 のまま) を足す. log.jsonl の頭に flow・flow_tol・speed, --flow の中継点ごとに送った時刻・次を送った時刻・進んだわけ. 既定では送り方・log の中身・出力は今までと同じ. lab_start.sh に --flow / --speed N を足しクライアントに渡す. チャンクごとの 推論・確認待ち・動いた・合計 を表で出す pi05/chunk_timing.py (読むだけ) を足す. テストを足す (test_flow_send 16・test_chunk_timing 6・lab_start 210. test_rewind_correct は新しい 3 項目を比べる対象から外す) (依頼 176. codex 4 回)
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---
別のタブで開く保存

Claude の障害で、Mac への接続と Claude Code のログインが切れた

依頼176 が終わったころ、Anthropic の側で Claude の障害が起きていました。11月13日の日本時間22時ごろから、claude.ai・Claude の API・Claude Code でエラーが増え、claude.ai は大きな障害と出ていました。

この作業をしていた Claude のチャットでは、22時27分から Mac につながらなくなりました。Mac は「接続済み」と出ていて、ほかのチャットからは使えていました。チャットの作業場所を調べると、22時27分に作業場所が作り直されたあと、Mac やほかのつなぎ先へ渡す中継だけが立ち上がらず、どのつなぎ先にも同じエラーを返していました。ウェブにつなぐ道は正常でした。その夜は作業を止め、翌朝4時すぎに同じチャットからつなぎ直すと、Mac に届くようになっていました。

ただ、依頼箱に入れた依頼177は、始まってすぐ止まりました。Mac の Claude Code のログインが切れていたためです。

依頼177 の1回目(04:18)の結果

# 結果:20261114_177_実機推論の確かめのEnterを1回目だけにする

- 状態:失敗
- 始めた時刻:2026-11-14 04:18
- 終わった時刻:2026-11-14 04:18(0分)
- 作業フォルダ:/Users/shimazueiichi/r2r2r-scripts
- この続きを Claude Code で話すとき:作業フォルダで `claude --resume 9875e223-00a2-49ee-8914-099e6c088673`

## Claude Code の報告

Failed to authenticate: OAuth session expired and could not be refreshed

Mac のターミナルで、いつもの作業フォルダ(~/r2r2r-scripts)で claude を起動し、/login でログインし直しました。ホームのフォルダで起動すると、ホーム全体を信用するかを聞かれるので、そこでは開かずに作業フォルダへ移ってから起動しています。ログインは、契約しているプランのアカウント(1番の「Claude account with subscription」)を選びました。ログインし直したあと、同じ依頼を入れ直すと04:23に動き始めました。

依頼177:始めの Enter を、1回目の試行だけにする

依頼176 の報告で、チャンク0 のあとの20.9秒が人の Enter 待ちだと分かったので、lab_start.sh を1回起動した中で、1回目の試行だけ始めの Enter を待ち、2回目からは待たずに始める形にしました。HOME へ戻る・爪を開く・上カメラの位置合わせは、毎回これまでどおり行います。

依頼177 の依頼文

---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 60
---
# 依頼177:実機推論の始めの確かめ(Enter)を、lab_start の1回目の試行だけにする

実機は動かさない(実装・テスト・レビューまで)。Log35。

## なぜ
依頼176 の報告で、Log34 の pi05_20261113_193254 のチャンク0 のあと 20.9 秒が確かめの Enter 待ちだった。エイイチの決め(2026-11-13):1回目だけ確かめて、2回目からは自動で進む。

## やること
1. lab_start.sh を1回起動した中で、1回目の試行の始めの確かめは今までどおり Enter を待つ。2回目からの試行は、その確かめを待たずに進む
2. 始めに爪を開く・HOME へ動かすのは、今までどおり毎回行う(省かない。開いていない・HOME にいないことがあるため)
3. 確かめを飛ばしたときは、画面に1行出し、log.jsonl の頭にも残す
4. 補正(ゲームパッド・キー)・巻き戻し・止める操作は変えない。ほかの動きも変えない
5. テストを足し、既存のテスト(test_lab_start.sh・pi05/ のもの)も通す。codex で差分を見てもらい、直して通るまで
6. 変えたファイルだけを指定して git add・commit(git add . と git clean は使わない)

## 報告
どこを変えたか、2回目からどう出るかの画面の例

依頼177 で Claude Code が返した報告

04:23に始め、04:46に終えました(24分)。

依頼177 報告:実機推論の始めの確かめ(Enter)を、lab_start の1回目の試行だけにする(Log35)

■ やったこと
1. run_policy_client.py に --skip-first-confirm を足した。
- 最初に実行する推論(チャンク0)の前の確かめだけを待たずに実行する。
- 2回目からの推論の確かめ・補正(キー・ゲームパッド)・巻き戻し・止める操作(q / h)は今までどおり。
- 始めに爪を開く([GRIP  ] 開始時にグリッパーを開く)は今までどおり行う。
- 飛ばしたときは画面に [CONFIRM] の1行を出す。log.jsonl の頭(type=model)に skip_first_confirm(true / false)、飛ばしたチャンクの行に confirm_skipped: true を残す。
- --auto のときは、もともと確かめがないので何も出さない。
2. lab_start.sh:1回の起動の中で、2回目からの試行(もう1回やりますか? で y のあと)にだけ --skip-first-confirm を渡す。
- 7 の HOME・爪を開く・位置合わせは毎回行う(変えていない)。
- --dry-run のときも同じ(2回目から渡す)。
3. テスト
- 新しく足したもの:pi05/test_skip_first_confirm.py 6件(1回目だけ飛ばす・付けなければ今までどおり・飛ばしたあとの c と b・2回目の確かめで q・--dry-keys・--auto)
- test_lab_start.sh:4項目を足した(1回だけなら渡さない/端末を作って y・y・n で3回まわし、2回目・3回目だけに渡す/実機の 8 にも渡す・7 は毎回)。全部で OK 214 / NG 0。
- pi05/ のテスト:全部通った(test_rewind_correct 81 は、頭の新しい1項目 skip_first_confirm を比べる対象から外した)。
4. codex:1回。指摘なし(必須・推奨とも)。
5. コミット 2da2f61(5ファイルを個別に add)。

■ 2回目からの画面の例(偽のアームで流したもの)
[000] 推論 0ms  10ステップ先  Δ=+10.0  +5.0  +0.0  +0.0  +0.0  +0.0
       [VIA   ] 中継点 4 点: step 2, 5, 8, 9
       [CONFIRM] 2 回目からの試行なので始めの確かめ (Enter) を待たずに実行します (次の推論からは今までどおり確かめます)
[GRIP  ] 開始時にグリッパーを開く
       [VIA   ] step  2 …… 着いた
       ……
[001] 推論 ……
       Enter=実行 / s=送らず次へ / b=巻き戻し / p=ゲームパッドで補正 / c=キーで補正 / ……   ← ここからは今までどおり待つ

lab_start.sh の 8 で渡す引数は、2回目から最後に --skip-first-confirm が付く(ほかは1回目と同じ)。

■ 変えたファイル
- 修正:pi05/run_policy_client.py、lab_start.sh、test_lab_start.sh、pi05/test_rewind_correct.py
- 新規:pi05/test_skip_first_confirm.py

■ 決めてほしいこと
なし

依頼177 のコードの差分(コミット 2da2f61)

03_sec05.txt16,371字・293行・diff
commit 2da2f61bc875e51d5b4c790147fb558fbde63a41
Author: Eiichi Shimazu <studio@adaptdesign.jp>
Date:   Sat Nov 14 04:46:33 2026 +0900

    実機推論の始めの確かめ (Enter) を, lab_start の 1 回目の試行だけにする (依頼 177・Log35). run_policy_client.py に --skip-first-confirm を足す (最初に実行する推論の前の確かめだけ待たずに実行し, 画面に [CONFIRM] の 1 行・そのチャンクの行に confirm_skipped. 2 回目からの確かめ・補正 (キー・ゲームパッド)・巻き戻し・止める操作・開始時に爪を開くのは今までどおり). log.jsonl の頭 (type=model) に skip_first_confirm. lab_start.sh は 1 回の起動の中の 2 回目からの試行 (round 2 から) にだけ --skip-first-confirm を渡す (7 の HOME・爪を開く・位置合わせは毎回). テストを足す (test_skip_first_confirm 6・lab_start 214. test_rewind_correct は新しい 1 項目を比べる対象から外す) (依頼 177. codex 1 回)
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---
別のタブで開く保存

依頼178:推論ごとの Enter をやめ、スペースを押したときだけ止める

依頼177 の報告にあった画面の例で、2回目以降の推論でも、1チャンクごとに Enter を待つ作りになっていることに気づきました。依頼176 の表でも、1チャンクごとに0.5〜1.5秒の Enter 待ちがあり、チャンク0 を除いても合わせて約11秒でした。

この Enter をなくす案を出したとき、先に Claude が「止めたいときは q や h で止める形になります」と説明していました。確かめるとこれは間違いで、推論ごとの入力欄が、ゲームパッドでの補正(p)・巻き戻し(b)・爪の締め直し(r)・HOME(h)・終わる(q)の入口そのものでした。Enter 待ちをただなくすと、途中で補正に入る入口もなくなります。補正を入れた試行も学習のお手本に使っているので、入口は残す必要があります。

そこで2つの案を出しました。

案中身よいところ気になるところ
A. 今のまま
1チャンクごとに Enter を押す
補正・巻き戻しはそのまま待ちが約11秒残る
B. 止まらずに進み、キーを押したときだけ止まる
動いている間にスペースを押すと、今のチャンクを最後まで動かしてから、次の推論のあとで今までの入力欄を出す
待ちがなくなり、補正の入口も残る
作り直しが要る

B を選び、依頼178 にしました。物理的なリスクのある変更なので、codex のレビューを必ず通す依頼にしています。

  • ねらい:人が付きっきりで Enter を押さなくても、π0.5 の試行が最後まで流れるようにする
  • 変わったこと:推論ごとの入力欄が出なくなり、スペースを押したときだけ、次の推論のあと(送る前)で入力欄を出す。始めの Enter・補正・巻き戻しは今までどおり
  • 見込める効果:Enter 待ちは、直す前の1回で31.7秒あった。直したあとの7回では、始めの Enter と止めるときを合わせて0〜28.4秒(中央2.2秒)になった

依頼178 の依頼文

---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 120
---
# 依頼178:実機推論をチャンクごとの Enter で止めず、キーを押したときだけ止める

実機は動かさない(実装・テスト・レビューまで)。Log35。物理的なリスクのある変更なので codex を必ず通す。

## なぜ
依頼176 の表(pi05_20261113_193254)で、チャンクごとの確かめ待ちが 0.5〜1.5 秒あり、最初の 1 回を除いても合わせて約 11 秒あった。
エイイチの決め(2026-11-14):止まらずに進み、キーを押したときだけ止まる形にする(案B)。
チャンクごとの入力欄(CONFIRM_PROMPT)は Enter だけでなく、補正 p・c、巻き戻し b、締め直し r、HOME h、終わる q などの入口でもある。補正入りの試行は学習データに使うので、この入口は必ず残す。

## やること
1. run_policy_client.py に --no-step-confirm を足す(付けなければ今までどおり)
   - チャンク 0 の始めの確かめは今までどおり(1 回目の試行は Enter を待つ。依頼177 の --skip-first-confirm もそのまま効く)
   - チャンク 1 からは入力欄を出さずに次の推論・実行へ進む
   - 推論中・中継点を送って待っている間・到着の確かめの間に、端末でスペースキー(Enter も可)が押されたら「止める予約」をし、今のチャンクを最後まで動かしたあと、次の推論の前で止めて、今までと同じ入力欄(CONFIRM_PROMPT)を出す。そこからの p・c・b・r・h・q・Enter の動きは今までと同じ。Enter で進めば、また止まらずに進む形に戻る
   - 動いている途中では止めない(今のチャンクを送り終えるまで待つ)。キーを読むのは、ブロックしない読み方(termios の cbreak と select など)で行い、入力欄を出す前・終わったあとに端末の設定を必ず元に戻す(Ctrl-C・例外のときも)
   - 未到達・関節角が読めない・安全範囲の外 などのときの扱いは、今の --auto なしのときと同じにする(--auto のように終了コード 1 で止める形にはしない。入力欄を出して人に任せる)
   - 止める予約が入ったとき・入力欄を出したときに 1 行出し、log.jsonl に type=pause の行(何を押したか・どのチャンクのあとか・時刻)を残す
   - 待っている間の recorder のモードは今までどおり wait にする
   - ゲームパッドのボタンでも止められるようにできるかを調べ、案と手間を報告に書く(今回は作らない。補正の pygame は別のプロセスに分けてあるので無理に足さない)
2. lab_start.sh:既定で --no-step-confirm を渡す。--step-confirm で今までどおりチャンクごとに確かめる形に戻せるようにする。起動時に [CONFIRM] の行でどちらかを出す
3. chunk_timing.py:止める予約で止まった時間は「確認待ち」の列に入るようにする(今の表と比べられるように)
4. テスト:--no-step-confirm なしで今までと同じ送り方・同じ log になること(git HEAD の版と比べる)、キーなしで最後まで入力欄が出ないこと、途中でスペースが押されたら次の推論の前で入力欄が出て p・b・q が今までどおり動くこと、端末の設定が元に戻ること。既存のテスト(test_lab_start.sh・pi05/ のもの・tools/test_gamepad_teleop)も通す
5. codex で差分を見てもらい、指摘を直して通るまで
6. 変えたファイルだけを指定して git add・commit(git add . と git clean は使わない)

## 報告
- 画面の例(キーなしで流れるとき・途中でスペースを押したとき)
- ゲームパッドのボタンで止める案
- エイイチが実機で比べるときのコマンド

依頼178 で Claude Code が返した報告

07:01に始め、07:44に終えました(43分)。

04_sec06.txt4,311字・65行・text
依頼178 報告:実機推論をチャンクごとの Enter で止めず、スペースを押したときだけ止める(Log35)

■ やったこと
1. run_policy_client.py に --no-step-confirm を足した(付けなければ今までと同じ)。
- 始めの確かめ(1回目の推論の前の Enter)は今までどおり。--skip-first-confirm もそのまま効く。
- そのあとは入力欄を出さずに次の推論・実行へ進む。
- 推論中・中継点を送って待つ間・到着の確かめの間にスペース(Enter も可)を押すと「止める予約」になる。今のチャンクは最後まで送り、次の推論を出したところ(送る前)で今までと同じ入力欄を出す。推論中に押したときは、その推論を送らずに入力欄を出す。
- 入力欄からの p・c・b・r・h・q・s・Enter は今までどおり。Enter で実行すると、また止まらずに進む。s・b・c・p のあとは止めたままにし、次の推論でも入力欄を出す(始めの確かめで s・b・c・p を選んだときも同じ)。
別のタブで開く保存

報告の「決めてほしいこと」の3つは、どれもそのままにしました。止まる場所は「次の推論を出したあと、送る前」で、どちらの位置でもアームは止まっています。推論の途中でスペースを押したときは、その推論を送らずに入力欄を出します。推論の始めに関節の角度が読めないときは、今までどおり止まって終わります。

依頼178 のコードの差分(コミット 047e472)

05_sec06.txt52,268字・978行・diff
commit 047e472e7ebbfec537aa3eb5e08c3b1e15571deb
Author: Eiichi Shimazu <studio@adaptdesign.jp>
Date:   Sat Nov 14 07:43:14 2026 +0900

    実機推論をチャンクごとの Enter で止めず, スペースを押したときだけ止める (依頼 178・Log35). run_policy_client.py に --no-step-confirm を足す (始めの確かめは今までどおり・--skip-first-confirm もそのまま. そのあとは入力欄を出さずに次の推論・実行へ進む. 推論中・中継点を送って待つ間・到着の確かめの間に端末でスペース (Enter も可) が押されたら止める予約をし, 今のチャンクを送り終えてから次の推論のあと (送る前) で今までと同じ入力欄を出す. 推論中に押せばその推論は送らない. p・c・b・r・h・q・s・Enter は今までどおりで, Enter で実行するとまた止まらずに進む. s・b・c・p のあとは止めたまま (codex R1). キーは termios の cbreak と select で待たずに読み, 入力欄の前・終わり・Ctrl-C・例外で端末の設定を戻す (戻せてから保存を消す. codex R4). 未到達・関節角を読めない (最後の中継点を送らなかった経路も. codex R3) ときは終了コード 1 にせず入力欄を出す. log.jsonl に type=pause (requested・prompt・resume), 入力欄を出した推論の行に paused と prompt_t, 頭に step_confirm. --auto とは一緒に使えない). lab_start.sh は既定で --no-step-confirm を渡し, --step-confirm で今までどおり. 起動時に [CONFIRM] の行. chunk_timing.py は止めた待ちを確認待ちに入れ (送らなかったチャンクも prompt_t から. 最後のチャンクの終わりにも. codex R5), メモに「止めた(スペース)」・頭に確かめの形. テストを足す (test_no_step_confirm 17・test_chunk_timing 7・lab_start 218. test_rewind_correct は頭の step_confirm を比べる対象から外す) (依頼 178. codex 3 回)
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---
別のタブで開く保存

Runpod の A40 で π0.5 を動かし、送り方を変えて7回比べた

11月14日の夕方、位置5 にブロックを置いて、3回 lab_start.sh を起動しました。Pod は1回目に作り、2回目と3回目はそのままつなぎ直しています。閉じる値はどれも25、モデルは deep1 です。

起動送り方試行結果推論Enter 待ち動いた1チャンクの動き(中央)合計
直す前(LOG504)
今まで・速さ20・毎回 Enter
193254成功70.331.740.82.44144.4
1回目--flow・速さ20180457成功21.24.466.62.2395.2
1回目--flow・速さ20180704成功15.22.144.32.3463.4
2回目今まで・速さ20181057失敗19.128.455.12.46104.9
2回目今まで・速さ20181300成功22.92.262.72.3790.4
3回目--flow・速さ30182039成功13.911.042.02.2968.6
3回目--flow・速さ30182211成功13.01.738.02.3554.1
3回目--flow・速さ30182327置いたあと空振り54.50.0137.02.19198.5

(秒。chunk_timing.py の比べる表から。2回目の起動では、2つ目の試行の始めの Enter を飛ばしている)

縮んだのは待ちで、1チャンクの動きは縮まなかった

  • 空打ちは効いた:1回目の起動の空打ちは52.6秒かかり、本番の1回目の推論は0.69秒で返った。2回目・3回目の起動では、同じ Pod なので空打ちは0.9秒と1.2秒だった
  • Enter 待ちはほぼ消えた:残っているのは、1回目の試行の始めと、止めるときに押した分だけ
  • --flow の差は小さかった:1チャンクの動きは、--flow ありで2.23・2.34秒、なしで2.46・2.37秒。差は0.1〜0.2秒
  • 速さ30も効かなかった:2.19〜2.35秒で、速さ20と変わらない

--flow のログを見ると、途中の中継点はどれも0.4〜0.6秒で「近づいた」として次へ進んでいました。送る間隔の下限を0.4秒にしてあるので、4つの中継点を送ると、それだけで2秒近くになります。アームが速く動いても、次を送るまでの間隔が時間を決めていた、と読んでいます。

--flow のときに関節の角度が読めないことが増えた

--flow ありの試行では、関節の角度が読めない警告(daemon_get_angles failed)が、1回目の起動の2つの試行で4回、3回目の起動で3回出ました。読めないと「見込みの時間」が過ぎるまで次を送れず、180457 のチャンク2 では6.36秒、チャンク12 では3.50秒止まっています。--flow なしの2回目の起動では1回でした。途中で角度を読む回数が増えた分、読み取りが失敗しやすくなっているのかもしれません。ここはまだ推測で、回数を重ねて見ます。

上カメラの傾きは、ソフトでそろえて足りていた

LOG504 では、上カメラの傾きが -6.5° あり、記事の終わりに「iPhone の付け方を見直す」と書いていました。手で ±0.5° に合わせるのは11月10日に試して難しいと分かり、そのあと傾きはソフトで回してそろえる形にしてあります(依頼144)。なので、この回は付け方をやり直さず、大きく傾いていないかだけを見ました。3回の起動とも、推論に渡す前の傾きは -1.87〜-1.99° で、+1.25〜+1.38° 回してそろえています。位置合わせの画面で -10° 前後と出たコマは、アームや手がマットの角を隠したときのものです。

chunk_timing.py で8回を並べた出力

06_sec07.txt20,887字・278行・text
== pi05_20261113_193254  (/Volumes/KIOXIA/r2r2r-data/runs/pi05_policy/pi05_20261113_193254)
   送り方: 記録なし (依頼 176 より前 = --flow なし・速さ 20)  速さ 20  モデル deep1 (PixelstoMotors/pi05-mecharm-deep-even10-lora-v1)  閉じる値 25  確かめ 毎チャンク(記録なし)
     チャンク      推論    確認待ち     動いた     その他      合計  中継点ごと (秒)  メモ
        0   57.53   20.93    5.81    0.13   84.40  0.50 0.92 0.94 0.32  始めに爪を開いた
        1    1.84    0.59    2.46    0.14    5.03  0.52 0.66 0.82 0.32  
        2    0.63    0.56    2.33    0.16    3.68  0.48 0.74 0.64 0.32  
        3    0.64    0.52    2.41    0.13    3.70  0.64 0.64 0.62 0.34  
        4    0.59    0.55    2.03    0.10    3.26  0.64 0.64 0.40 0.14  
別のタブで開く保存

1回目の起動(--flow・速さ20)のターミナル

07_sec07.txt70,619字・1,105行・text
[RANGE ] 安全範囲 (学習データ ±10°) は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_deep_even10_v1/raw_episodes から (--model deep1)
[FRAME ] 写り方の確かめの基準画像は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes の最初のエピソードから (位置合わせと同じ trim2. 依頼 137)
[TILT  ] 上カメラの傾きのお手本 (各エピソードの 1 枚目の中央値) は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_deep_even10_v1/raw_episodes から (安全範囲と同じ. 差だけ画像を回して AI に渡す. 依頼 144)
[GRIP  ] 爪の閉じる値は 25 (--grip-value). 締め直し r はこの値−3 とこの値を交互に送る (依頼 152)
[FLOW  ] 推論の送り方: --flow (依頼 176)
[CONFIRM] チャンクごとには確かめない (--no-step-confirm. 始めの確かめのあとは止まらずに進む. 止めるときはスペース. 依頼 178)
[LAB   ] 2026-11-14 17:58:31  GPU=NVIDIA A40  episode=run_0001_20261019_194818  log=/Volumes/KIOXIA/r2r2r-data/lab/Log35  
[MODEL ] --model deep1: π0.5 base から deep_even10_v1 で新しく学習した 2999 (依頼 133. decay_steps 5000)
別のタブで開く保存

2回目の起動(今までの送り方・速さ20)のターミナル

08_sec07.txt64,066字・819行・text
[RANGE ] 安全範囲 (学習データ ±10°) は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_deep_even10_v1/raw_episodes から (--model deep1)
[FRAME ] 写り方の確かめの基準画像は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes の最初のエピソードから (位置合わせと同じ trim2. 依頼 137)
[TILT  ] 上カメラの傾きのお手本 (各エピソードの 1 枚目の中央値) は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_deep_even10_v1/raw_episodes から (安全範囲と同じ. 差だけ画像を回して AI に渡す. 依頼 144)
[GRIP  ] 爪の閉じる値は 25 (--grip-value). 締め直し r はこの値−3 とこの値を交互に送る (依頼 152)
[CONFIRM] チャンクごとには確かめない (--no-step-confirm. 始めの確かめのあとは止まらずに進む. 止めるときはスペース. 依頼 178)
[LAB   ] 2026-11-14 18:08:39  GPU=NVIDIA A40  episode=run_0001_20261019_194818  log=/Volumes/KIOXIA/r2r2r-data/lab/Log35  
[MODEL ] --model deep1: π0.5 base から deep_even10_v1 で新しく学習した 2999 (依頼 133. decay_steps 5000)
         PixelstoMotors/pi05-mecharm-deep-even10-lora-v1 → /workspace/ckpt/deep_v1_2999  設定 pi05_mecharm_deep_even10_lora  assets local/mecharm_redblock_box_deep_even10_v1
別のタブで開く保存

3回目の起動(--flow・速さ30)のターミナル

09_sec07.txt74,947字・1,015行・text
[RANGE ] 安全範囲 (学習データ ±10°) は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_deep_even10_v1/raw_episodes から (--model deep1)
[FRAME ] 写り方の確かめの基準画像は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes の最初のエピソードから (位置合わせと同じ trim2. 依頼 137)
[TILT  ] 上カメラの傾きのお手本 (各エピソードの 1 枚目の中央値) は /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_deep_even10_v1/raw_episodes から (安全範囲と同じ. 差だけ画像を回して AI に渡す. 依頼 144)
[GRIP  ] 爪の閉じる値は 25 (--grip-value). 締め直し r はこの値−3 とこの値を交互に送る (依頼 152)
[FLOW  ] 推論の送り方: --flow --speed 30 (依頼 176)
[CONFIRM] チャンクごとには確かめない (--no-step-confirm. 始めの確かめのあとは止まらずに進む. 止めるときはスペース. 依頼 178)
[LAB   ] 2026-11-14 18:17:34  GPU=NVIDIA A40  episode=run_0001_20261019_194818  log=/Volumes/KIOXIA/r2r2r-data/lab/Log35  
[MODEL ] --model deep1: π0.5 base から deep_even10_v1 で新しく学習した 2999 (依頼 133. decay_steps 5000)
別のタブで開く保存

Pod を消した lab_stop.sh

[STOP  ] Log35 の Pod: id 9wypmq2uhnx2et  GPU=NVIDIA A40  作った時刻 2026-11-14 17:58:33
[LOG   ] serve.log を持ち帰った → /Volumes/KIOXIA/r2r2r-data/lab/Log35/serve.log (48 行)
[STOP  ] Terminate を送った (18:37:47)
[STOP  ] Pod (id 9wypmq2uhnx2et) が消えたことを API で確かめた
[COST  ] 借りていた時間 39 分 14 秒 (0.65 時間) × 1時間 0.59 ドル = 約 0.39 ドル (約 61 円. 1ドル=158円)
[TUNNEL] 8000 番のトンネルは残っていません

182327:箱に置いたあと、何もない所で爪を閉じて運んだ

3回目の起動の3つ目の試行(pi05_20261114_182327)では、π0.5 はチャンク10 でブロックを箱に置きました。そこまでは成功です。

そのあと HOME の近くで、1チャンクごとに各関節が1〜2°ほどの小さな動きを30回ほど続けました。土台の向き j0 は、そのあいだに -1° から -21° まで少しずつ左へずれていきます。チャンク48 から一気に左へ回り、チャンク51 で j0 が -54° の、何もない所で爪を閉じました。閉じて1秒後の爪の電流は35.5 で、何もつかんでいません(ブロックを押しているときは700〜800)。そのまま箱まで運んで開き、上限の60チャンクで終わりました。

ほかの試行でも、置いたあとは HOME の近くで小さな動きが続き、人が Enter で止めていました。止めるまで10〜30秒かかっています。π0.5 は「置いたら終わり」をお手本から学んでいない、と読むのが近いと思います。お手本は、置いて HOME に戻ったところで記録を切っていたので、その先の動きは何も教えていません。

依頼181:箱に置き終えたら自動で終わる

置き終えたら終わる形を、π0.5 の外側(推論を送るプログラム)に足しました。条件は4つで、すべてそろったら終わります。

  1. この試行の中で、爪を閉じてから開いた
  2. 今、爪が開いている
  3. HOME からの差が、各関節 8° 以内
  4. 推論の答え(10個先まで)の動きが各関節 3° 以内のチャンクが、2回続いた

終わったら、そのチャンクは送らずに HOME へ戻し、結果の入力へ進みます。置いたあとにまた閉じる答えが出たら、送らずに止めて入力欄を出します(182327 の空振りを防ぐため)。

  • ねらい:置き終えたあとの10〜30秒と、182327 のような空振りをなくす
  • 変わったこと:lab_start.sh では最初から自動で終わる形になる。--no-auto-finish で今までどおり
  • 見込める効果:この回の7回の記録にあてはめると、HOME に戻ってから2チャンク目で終わる判定になった。人が止めていた所より早く、182327 は空振りの前(チャンク17)で終わる。実機ではまだ試していない

報告の「決めてほしいこと」のうち、1回目のつかみが空振りで π0.5 がつかみ直そうとしたときも止まる点は、そのままにしました。止まったら Enter で続けられます。

依頼181 の依頼文

---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 120
---
# 依頼181:実機推論で、箱に置き終えたら自動で終わる

実機は動かさない(実装・テスト・レビューまで)。Log35。物理的なリスクのある変更なので codex を必ず通す。

## なぜ
Log35(2026-11-14)の推論で、箱に置いて爪を開いたあとも π0.5 は HOME 近くで小さな動き(1 チャンクの Δ が各関節 2° 前後)を出し続け、エイイチが Enter で止めるまで 10〜30 チャンク(30〜60 秒)続いた。
pi05_20261114_182327 では、置き終えた(チャンク 10 で開いた)あと HOME 近くで 35 チャンクほど小さな動きを続けるうちに j0 が −21° まで流れ、チャンク 47〜57 で何もない所(j0 −54°)へ行って爪を閉じ(閉じて 1 秒後の電流 35.5 = 何もつかんでいない)、箱へ運んで開いた。--max-chunks 60 で終わった。
エイイチの決め(2026-11-14):置き終えたら自動で終わる形にする。

## やること
1. run_policy_client.py に終わりの判定を足す(--auto-finish。lab_start.sh は既定で付ける。--no-auto-finish で今までどおり)
   - 条件(すべて満たしたら終わり):
     a. この試行の中で爪を閉じ、そのあと爪を開いた(つかんで放した)ことが 1 回以上ある
     b. 開いたあと、HOME(0,0,0,0,0,-30)からの各関節の差が、すべて N° 以内(既定 8°。--finish-home-tol)
     c. b の状態で、推論の答え(10 ステップ先までの Δ)が各関節 M° 以内(既定 3°。--finish-still-deg)のチャンクが K 回続いた(既定 2。--finish-chunks)
   - 値は Log35 の log.jsonl(pi05_20261114_180457・180704・181057・181300・182039・182211・182327)の、開いたあとのチャンクで実際の値を見て、上の既定で「置いたあと 2〜3 チャンクで終わる」「置く前・運ぶ途中では終わらない」ことを確かめてから決める。違えば既定を直し、その根拠(チャンクごとの値の表)を報告に書く
   - 終わったら、今のチャンクは送らずに HOME へ戻し(今の h と同じ送り方)、結果の入力(y/n/Enter)へ進む。終わったわけを [FINISH] の 1 行で出し、log.jsonl に type=finish の行(どの条件で・何チャンク目で・HOME からの差・Δ)を残す
   - 爪を閉じて開いたあとに、また閉じる答えが出たら(2 回目のつかみ)、そのチャンクは送らずに止めて入力欄を出す(182327 の空振りを防ぐ)。画面に [FINISH] の 1 行
   - 入力欄・スペースで止める・補正・巻き戻しは今までどおり
2. chunk_timing.py:終わり方(自動で終わった・人が止めた・上限)をメモに出す
3. テスト:上の 7 本の log を流して、何チャンク目で終わる判定になるかを表で出す(182327 は 2 回目のつかみの前に終わること)。--no-auto-finish で今までと同じこと。既存のテストも通す
4. codex で差分を見てもらい、指摘を直して通るまで
5. 変えたファイルだけを指定して git add・commit(git add . と git clean は使わない)

## 報告
既定の値と根拠の表、7 本で何チャンク目で終わる判定になるか、画面の例

依頼181 で Claude Code が返した報告

18:30に始め、19:16に終えました(46分)。

10_sec09.txt4,641字・70行・text
依頼181 報告:実機推論で、箱に置き終えたら自動で終わる(Log35)

■ やったこと
1. run_policy_client.py に --auto-finish を足した(付けなければ今までと同じ。log の頭にも何も足さない)
- 終わる条件(すべて):a. 爪を閉じてから開いた(推論・補正のどちらでも。補正の中の g の閉→開も数える。つかんだ区間を巻き戻して開いたら数え直す)/爪が今開いている/b. 推論の前の実測角と HOME の差が各関節 8° 以内(--finish-home-tol)/c. b の状態で、答えの先頭 10 ステップと実測角の差が各関節 3° 以内(--finish-still-deg)のチャンクが 2 回続いた(--finish-chunks)
- 終わったら、そのチャンクは送らずに h と同じ送り方で HOME へ戻し、結果の入力(y/n/Enter)へ進む。[FINISH] の 1 行、log.jsonl に type=finish(event=auto_finish・何チャンク目・条件の値・HOME からの差・Δ)、そのチャンクの行に auto_finish、{run_stem}.json の end_reason=auto_finish(result=completed)。各チャンクの行に finish_check(判定の値)
- 放したあとにまた閉じる答え(2 回目のつかみ)が出たら、そのチャンクは送らずに入力欄を出す([FINISH] の 1 行・type=finish / event=regrasp)。入力欄で Enter を押せば今までどおり送る(人の判断)。--auto のときは入力欄を出せないので送らずに終える(終了コード 1・end_reason=regrasp・アームは動かさない)
- スペースで止める予約があるとき・入力欄で s/b/c/p を選んだあと(Enter で実行するまで)は、終わる条件を満たしても入力欄を優先する(勝手に HOME へ動かさない)
別のタブで開く保存

依頼181 のコードの差分(コミット 68f514a)

11_sec09.txt56,694字・1,005行・diff
commit 68f514a41c129b6fbd2663435a366734e3d374e7
Author: Eiichi Shimazu <studio@adaptdesign.jp>
Date:   Sat Nov 14 19:15:55 2026 +0900

    実機推論で, 箱に置き終えたら自動で終わる (依頼 181・Log35). run_policy_client.py に --auto-finish を足す (つかんで放した (補正の中の g も数える. codex R2) あと, 爪が開いていて, 推論の前の実測角と HOME の差が各関節 --finish-home-tol (既定 8°) 以内, 答えの先頭 10 ステップ (codex R1) と実測角の差が各関節 --finish-still-deg (既定 3°) 以内のチャンクが --finish-chunks (既定 2) 回続いたら, そのチャンクは送らずに h と同じ送り方で HOME へ戻し結果の入力へ. 画面に [FINISH], log.jsonl に type=finish (event=auto_finish), チャンクの行に auto_finish・finish_check, {run_stem}.json の end_reason=auto_finish. 放したあとにまた閉じる答え (2 回目のつかみ) は送らずに入力欄 (type=finish / event=regrasp. --auto なら送らずに終了コード 1). 止める予約・s・b・c・p のあとは入力欄を優先 (確かめの形によらない. codex 2 回目 R1). 付けなければ log の頭も含めて今までと同じ (codex R3)). 既定は Log35 の 7 本で決めた (HOME に戻って止まったチャンクは差 4.1〜5.5°・Δ 1.1〜2.7°. 180457→17・181300→20・182039→15・182327→17 (2 回目のつかみ 51 より前)・180704/181057/182211 は記録の終わりまでに終わらない). lab_start.sh は既定で --auto-finish を渡し, --no-auto-finish で今までどおり (起動時に [FINISH] の行. --help は 2〜64 行). chunk_timing.py に終わり方 (自動・人・上限・2 回目のつかみ) とメモ. テストを足す (test_auto_finish 17・lab_start 222) (依頼 181. codex 3 回)
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---
別のタブで開く保存

依頼182:1チャンクを2つの中継点で送れるようにする

1チャンクの動きを決めていたのが中継点を送る間隔だったので、中継点の数を減らせるようにしました。lab_start.sh に --via-stride を足し、5 にすると、10個の姿勢のうち5番目と10番目の2点だけを送ります。2点なら、1チャンクは1.2秒ほどになる見込みです。お手本の1チャンク(1秒)にかなり近づきます。

中継点を減らすと、1点あたりの動きが大きくなります。今の決まりでは、1回で20°より大きく動かす指令は20°に切って送ります。この回の7回の記録の答えから計算すると、2点にしたときの1点あたりの動きは最大15.8°で、20°を超える点はありませんでした。--flow の遅れ(中央1.4°・最大2.5°)を足しても約18.3°です。2点で動きがカクッとしないかは、実機で見る必要があります。

依頼182 の依頼文

---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 60
---
# 依頼182:実機推論の 1 チャンクを少ない中継点で送れるようにする

実機は動かさない(実装・テスト・レビューまで)。Log35。依頼181 のあとに回す(同じファイルを触るため)。

## なぜ
Log35 で --flow の速さ 20 と 30 を比べたら、1 チャンクの動いた時間の中央値はどちらも 2.2〜2.35 秒で変わらなかった(chunk_timing.py。180457・180704・182039・182211・182327)。
今は lab_start.sh が --via-stride 3 で 1 チャンクを 4 点(step 2, 5, 8, 9)に分けて送り、--flow の送る間隔の下限 0.4 秒と各点 0.5 秒前後で、合わせて 2 秒ほどになっている。お手本の 1 チャンクは 1 秒。
エイイチの決め(2026-11-14):中継点を減らして試す。

## やること
1. lab_start.sh に --via-stride N を足し、run_policy_client.py にそのまま渡す(既定は今の 3 のまま)。起動時に [VIA   ] の行で値を出す
2. --via-stride 5(step 4, 9 の 2 点)で、今の決まり(max_move 20°・安全範囲・--flow の判定)のまま送れることを確かめる。1 点あたりの移動量が大きくなるので、Log35 の 7 本の log.jsonl の答えから、stride 3 と 5 のときの 1 点あたりの最大の移動量を計算して表にし、max_move 20° に引っかかる点があるかを報告に書く(直さない)
3. --speed は 20 に戻して比べる前提で、エイイチが実機で比べるコマンド(stride 3 と 5、どちらも --flow)を報告に書く
4. テスト・codex・変えたファイルだけを指定して commit(git add . と git clean は使わない)

依頼182 で Claude Code が返した報告

19:16に始め、19:28に終えました(12分)。

依頼182:実機推論の 1 チャンクを少ない中継点で送れるようにする(実機は動かしていない)

■ やったこと
1. lab_start.sh に --via-stride N(0〜10。既定は今までの 3)を足し、run_policy_client.py にそのまま渡す(実機の 8 とドライランの 2 か所)。起動時に [VIA   ] の行で送る step を出す
   既定 3 → [VIA   ] --via-stride 3: 1 チャンクを step 2, 5, 8, 9 で送る
   5 → step 4, 9 / 0 → 中継点なし。グリッパーが変わるチャンクはその手前まで(run_policy_client.py の plan_vias と同じ)
   run_policy_client.py は変えていない(もとから --via-stride を受ける)
2. stride 5 でも今の決まりのまま送れることを、偽のアームのテストで確かめた(test_flow_send.py に 2 件)
   - --flow:途中の点 step 4 は待たずに 1 回送り、最後の step 9 だけ 3° の到着を待つ。送る間隔の下限 0.4 秒も守る
   - max_move:計画するときと、送る直前に実測から計算し直すときの両方で効く
   - 安全範囲・送る直前の検査は stride 3 と同じ処理を通る
3. Log35 の 7 本の答えから、1 点あたりの最大の移動量を計算した(下の表)
4. テスト:lab_start 237 件(222 から 15 件増)・test_flow_send 18 件(16 から 2 件増)。すべて通った。codex 2 回(1 回目:境界値 1・10・08・09 のテストがない → 足した。2 回目:指摘なし)

■ 1 点あたりの最大の移動量(Log35 の 7 本。実行したチャンクの答えと推論の前の実測角から plan_vias で計算。安全範囲のクランプあり、max_move の制限なし。6 関節の中の最大)
 試行     チャンク  stride3 の点数 / 中央 / 90% / 最大        stride5 の点数 / 中央 / 90% / 最大        20° 超え
 180457    24       94 / 1.7 / 5.5 /  9.8 (j1)               47 / 3.5 /  9.0 / 15.0 (j1)               3:0 / 5:0
 180704    15       57 / 3.3 / 6.5 /  9.1 (j1)               29 / 6.1 / 11.2 / 14.4 (j4)               3:0 / 5:0
 181057    20       75 / 2.3 / 5.7 /  8.3 (j4)               38 / 4.9 /  9.4 / 14.0 (j4)               3:0 / 5:0
 181300    24       92 / 2.0 / 6.6 /  8.1 (j4)               47 / 4.7 / 10.8 / 13.2 (j4)               3:0 / 5:0
 182039    15       59 / 3.2 / 7.4 /  9.2 (j1)               30 / 6.8 / 11.3 / 14.1 (j4)               3:0 / 5:0
 182211    12       47 / 4.1 / 7.9 / 10.0 (j1)               24 / 7.6 / 13.6 / 15.8 (j1)               3:0 / 5:0
 182327    60      232 / 1.1 / 6.3 /  9.3 (j0)              118 / 1.6 / 11.6 / 15.1 (j4)               3:0 / 5:0
 合わせて          656 / 1.9 / 6.7 / 10.0                   333 / 4.6 / 11.6 / 15.8                    3:0 / 5:0(15° 超えは stride 5 で 4 点)
・計画の上では、stride 3・5 とも max_move 20° に引っかかる点はない(stride 5 の最大は 15.8°。182211 のチャンク 11 の step 4、j1)
・実際の stride 3 の記録でも、移動量の制限([LIMIT] 移動量)は 0 回
・注意:--flow では送る直前の実測から計算し直す。Log35 の --flow の途中の点は「近づいた」で次へ進むとき残り 中央 1.4°・最大 2.5°(356 回。時間で進んだのは 5 回)。最大 15.8° + 2.5° ≒ 18.3° で 20° 未満。ただし判定の幅 5° いっぱい残っていれば 20.8° になりうる(そのときは今の決まりどおり 20° に切って送る)
・これは記録の答えから計算したもので、stride 5 で動かしたときに AI が出す答えは変わりうる

■ 実機で比べるコマンド(--speed は付けない = 20。Log35 と同じ deep1・爪 25・--flow。Log の番号は仮)
 stride 3(今まで): ./lab_start.sh --log Log36 --model deep1 --grip-value 25 --flow --via-stride 3
 stride 5:          ./lab_start.sh --log Log36 --model deep1 --grip-value 25 --flow --via-stride 5
 比べ方: python3 pi05/chunk_timing.py <run のフォルダ>(1 チャンクの動いた時間の中央値。Log35 では 2.2〜2.35 秒)

■ 変えたファイル
 lab_start.sh / test_lab_start.sh / pi05/test_flow_send.py(commit b3f290a)

■ 決めてほしいこと
1. 実機での比べ(上のコマンド)。実機は動かしていない
2. stride 5 で 1 点の移動は最大 15.8°(計画)。--flow の遅れを足すと 20° に近づく点がまれにありうる。このまま試すか

依頼182 のコードの差分(コミット b3f290a)

12_sec10.txt15,100字・198行・diff
commit b3f290a88802443e38753323358a75ade1577e03
Author: Eiichi Shimazu <studio@adaptdesign.jp>
Date:   Sat Nov 14 19:27:42 2026 +0900

    実機推論の 1 チャンクの中継点の間隔を lab_start.sh から変えられるようにする (依頼 182・Log35). lab_start.sh に --via-stride N (0〜10. 既定は今までの 3) を足し, run_policy_client.py の --via-stride にそのまま渡す (実機の 8 とドライランの 2 か所). 起動時に [VIA   ] で送る step を出す (3 → step 2, 5, 8, 9 / 5 → step 4, 9 / 0 → 中継点なし. plan_vias と同じ並び). 先頭の 0 は 10 進で読む. --help は 2〜66 行. run_policy_client.py は変えない. テストを足す (lab_start 237 (境界 1・10・08・09. codex R1)・test_flow_send 18 (stride 5 で途中の点 1 つを待たずに送り最後だけ到着を待つ・max_move は計画と送る直前の両方で効く)) (依頼 182. codex 2 回)
    
    Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---
別のタブで開く保存

次に試すこと:自動で終わる形と、2点の中継点を実機で

次に実機を動かすときは、新しい Pod を立てて、位置5 で次の2つを2〜3回ずつ比べます。どちらも、置き終えたら自動で終わる形が最初から入ります。速さは20に戻します。

cd ~/r2r2r-scripts
./lab_start.sh --log Log36 --model deep1 --grip-value 25 --flow --via-stride 3
./lab_start.sh --log Log36 --model deep1 --grip-value 25 --flow --via-stride 5

見るのは、1チャンクの動いた時間が2.2秒から縮むか、置いたあとに自動で終わるか、2点にしてもつかめる割合が落ちないか、の3つです。そのあと、決めた送り方で位置5 のお手本を撮り直し、学習し直します(位置5 の人が直した6本を、教えた動きの再生で撮った6本に入れ替える計画)。

Claude Code の報告には、テストのうち爪の電流を読む部分が、偽のアームを使っていても本物の Pi のデーモンにつながっている、という気づきもありました。アームは動かしませんが、テストを流すたびに実機へつながっています。次の依頼のついでに直します。