フィジカルAI研究室を作る Log#25 | 深くつかむお手本へ、mechArm 270 をゲームパッドで教え直した
この記事の素材(コード・ログ・データ 42ファイル・まとめてダウンロードあり)arrow_downwardAIで読む ChatGPT・Claude などで、この記事に質問できます expand_more
小型ロボットアーム mechArm 270 のつかむ姿勢をゲームパッドで作り直すと、ブロックが爪の奥まで入るようになり、浅かった置き場所(位置1)でも使えるお手本が10本撮れました。同じ日に位置2も足し、Physical Intelligence の π0.5(ロボット用の AI のモデル)に学ばせるお手本が、2か所で17本増えました。
この回でやったことで、次のことが変わりました。
- 良くなること:お手本の数が、置き場所ごとにそろい始めた。位置1は0本から10本、位置2は3本から10本になった(どちらも、つかみが深い本だけを数えている)。前回(LOG460)で、π0.5 が浅くつかんで落とす失敗の元は、浅いお手本だと分かっていた
- もたらされること:撮った1本が使えるかを、撮った直後に3つの数字で決められるようになった。つかみの深さ(閉じて1秒後に、ブロックが爪先の印からはみ出した量)、下ろすのにかかった時間、閉じたあとの爪の電流の値
- 時間:つかむ姿勢の作り直しは、ゲームパッドで約6分(09:36〜09:42、押した操作113回)。アームの力を抜いて手で引っ張る教え方は使わずに済んだ(手で教える時間は前に測っていない)。お手本は1本あたり約1分40秒で撮れた
困っていたのは、位置1の教えた記録そのものが浅かったことです。2022年10月に手で教えた姿勢を再生すると、ブロックが爪の先にかかったまま閉じていました(10/19 の1本は38.9px、この日の1本は43.4px で、線の24px を超えていました)。置き方を直しても変わらないので、姿勢のほうを作り直しました。
爪がブロックの上に乗ってしまった回は、ブロックの上からつかむ姿勢まで下ろす時間で見分けられました。 普段は1.1秒で下りきるのに、乗った4本は7.9〜9.1秒かかり、肩の角度も目標の手前で止まっていました。一方、爪と肩の電流の値では見分けられませんでした。
やったことの全体は次のとおりです。
| 段階 | やったこと | 結果 |
|---|---|---|
位置1を前の記録のまま撮る(09:30) | 2022年に手で教えた記録を再生した | つかめたが、はみ出し43.4px で浅い |
ゲームパッドで姿勢を作る(09:36〜09:42) | 爪の奥までブロックを入れて閉じ、そのまま肩を上げて持ち上げた | つかむ姿勢と、ブロックの上の姿勢の角度が取れた |
新しい教えた記録を作る(09:42) | 前の記録の2つの姿勢だけを差し替えた | 箱の側の2つの姿勢はそのまま |
位置1を撮る(09:48〜10:31) | 新しい記録で18本 | 使える10本・浅い5本・爪が乗った3本 |
位置2を撮る(10:21〜10:45) | 前からの記録で8本 | 使える7本・爪が乗った1本 |
| 乗った回を探す | 上カメラの映像・角度・時間・電流を並べた | 下ろす時間と肩の角度で見分けられた。電流では見分けられなかった |
次は位置3(あと8本)と位置4(あと5本)を同じ手順で撮り、5か所を10本ずつにそろえてから学習し直します。
GPU を買うか借りるかの判断は、Runpod で実際に借りて学習させた費用をもとに、別のページにまとめています。
導入比較ガイドロボットAIの学習用GPU、買うか借りるか実際に借りて学習させた費用と、損益分岐の計算機で決められますarrow_forwardこの回の作業は、Claude(手順と数字の確かめを一緒に進めた AI)と進めました。アームとゲームパッドの操作と、目で見た判断はこちらで行い、記録に電流を足す作業は Claude Code(プログラムを書く AI)に依頼箱を通して頼んでいます。ここから下は、依頼文と報告・コード・端末の出力・測定データを全量で載せた作業ログです。数字は記録から数えたもので、見込みのものは見込みと書いています。鍵(アクセストークンなど)は、どこにも載せていません。
作業ログ ― 位置1のつかむ姿勢をゲームパッドで作り直し、深いお手本を2か所で17本撮るまで
この回で使う言葉
| 言葉 | 意味 |
|---|---|
| お手本 | π0.5 に学ばせるための、人が用意した動きの記録。このシリーズでは、手で教えた姿勢をアームに再生させ、上カメラの映像と関節の角度を記録したものを使う |
| 教えた記録 | 手(この回からはゲームパッドも)で教えた姿勢を残した JSON のファイル(drag_v2_….json)。再生のときに使うのは、ブロックの上・つかむ・箱の上・置くの4つの姿勢だけ |
| 位置1〜5 | ブロックを置く5か所。2026-10-19(LOG352)に、それぞれ教えた記録を作った。置き場所ごとにお手本を10本ずつそろえるのが今の目標 |
| はみ出し(px) | 爪を閉じて1秒後に、ブロックが爪先の青い印からどれだけはみ出しているかを、上カメラの画で測った量(pi05/grasp_depth.py)。24px(約9mm)を超えたら浅いとして外す(LOG460 で決めた線) |
| 爪が乗る | 爪を下ろしたときに、爪の先がブロックの上の角に当たって、そのまま下りられなくなること。ブロックが押されてずれるか傾いてから、爪は下りきる |
| 爪の電流の値 | 爪のサーボの電流の番地(69・70)を読んで組み立てた数。空で閉じると15〜22前後、ブロックをつかむと800前後になる(LOG461) |
| ゲームパッド | |
| 依頼箱 | Claude Code への依頼をファイルで置くと、Mac の見張り係が順番に渡して実行させる仕組み |
mechArm 270 は Elephant Robotics の小型の6軸アームで、中に Raspberry Pi が入っています。π0.5 は、カメラの画と指示の言葉から、次の関節の動きを出すロボット用のモデルです。このシリーズでは、Runpod で借りた GPU で mechArm 270 のお手本を学ばせています。
上カメラの位置合わせは、アームを HOME に戻してから行う
撮る前に、上カメラ(スマホ)の写り方を、学習に使っているお手本と同じにそろえます。位置合わせの画面(pi05/camera_align.py。LOG358 で作った)は、ライブの映像に、お手本の最初の1コマを半透明で重ねて、ずれ(dx・dy)と重なりの強さ(response)を出します。重ねる1コマは、位置1のお手本 run_0001_20261019_183454 にしました。
π0.5 のお手本と実機推論の記録は、10/19 からすべて同じ画角で撮っています(マットの上の端が画の外に出ている画角)。新しいお手本もこの画角にそろえるため、位置合わせの画面で重ねて合わせます。
最初に開いたときは NO MATCH(重なりが弱く、ずれが測れない)でした。基準の1コマは HOME の姿勢で撮っていますが、アームは前の作業のまま、ブロックへ腕を伸ばした姿勢でした。

アームを HOME に戻して爪を開いてから開き直すと、dy −0.1・dx +4.3、response 0.57 で OK になりました(いつもの起動の1行 lab_start.sh も、HOME → 爪を開く → 位置合わせの順に動かしている)。この画面では、重なったお手本のブロックに実物のブロックを合わせて置けるので、置き場所もここで合わせます。

位置1を前の教えた記録のまま撮ると、ブロックが爪の先にかかったまま閉じた
最初の1本(run_0001_20261109_093045)は、2022-10-13 に手で教えた記録 drag_v2_20221013_144348.json をそのまま再生しました。つかめて箱にも入りましたが、閉じて1秒後のはみ出しは43.4px で、線の24px を大きく超えていました。10/19 に同じ記録で撮った1本(183454)も38.9px で浅かったので、置き方ではなく、教えた姿勢そのものが浅いと判断しました。

教えた記録の4つの姿勢のうち、つかむ姿勢は [−35.94, 80.59, 7.11, 3.16, −88.68, −30.32] でした(関節 j0〜j5 の角度。度)。手首 j4 が −88.68° と、安全の範囲(−90〜+60°)の端に近く、ドライランでも「j4 の余裕が最小 1.32°」と注意が出ていました。
ゲームパッドで、つかむ姿勢とブロックの上の姿勢を作り直した
この記事のコード・ログ・データは、1ファイルずつ下に置いています。全文はリンク先にあります。
ファイルの一覧(42本)
01_sec04.json ― ゲームパッドの記録(runs/experiments/gamepad_teleop/teleop_20261109_093620/log.jsonl・170行)・100,313字
02_sec04.json ― 新しい教えた記録(mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json)・54,999字
03_runs_table.csv ― runs_table.csv(全量)・4,259字
04_grasp_depth.csv ― grasp_depth.csv(pi05/grasp_depth.py --csv の出力・全量)・5,209字
05_sec08.py.txt ― 表を作るコード(lab/Log25/log25_runs_table.py)・4,072字
06_sec08.py.txt ― 記事の画像を作るコード(lab/Log25/make_images.py)・4,097字
07_sec09.md ― お手本を足す手順書(r2r2r-scripts/pi05/DEEP_DEMOS.md・依頼117・118・121 で作った版)・8,722字
08_sec09.py.txt ― 閉じたあとの爪の値を1行で出すコード(r2r2r-scripts/pi05/grip_current.py)・4,163字
09_1_1_measure.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-01 measure(ブロックと箱の位置を測る)・4,674字
10_1_1_measure.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-02 measure(ブロックと箱の位置を測る)・4,686字
11_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-04 HOME に戻す → 爪を開く → 位置合わせ(--episode 183454)・6,159字
12_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-05 ドライラン(drag_v2_20221013_144348.json)・7,144字
13_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-06 再生 run_0001_20261109_093045(drag_v2_20221013_144348.json)・12,046字
14_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-08 ゲームパッド(daemon を止めたままで、つながらずに終わった)・8,111字
15_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-09 daemon を起動 → HOME → ゲームパッドで姿勢を作る(teleop_20261109_093620)・14,708字
16_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-13 ドライラン(drag_v2_20261109_094222.json)・7,047字
17_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-14 measure → 再生 run_0001_20261109_094839(drag_v2_20261109_094222.json)・16,469字
18_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-16 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095308(drag_v2_20261109_094222.json)・16,770字
19_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-17 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095452(drag_v2_20261109_094222.json)・16,770字
20_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-18 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095630(drag_v2_20261109_094222.json)・17,820字
21_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-19 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095810(drag_v2_20261109_094222.json)・16,770字
22_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-20 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095948(drag_v2_20261109_094222.json)・16,770字
23_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-21 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100126(drag_v2_20261109_094222.json)・16,769字
24_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-22 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100307(drag_v2_20261109_094222.json)・16,769字
25_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-23 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100444(drag_v2_20261109_094222.json)・17,704字
26_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-24 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100716(drag_v2_20261109_094222.json)・16,771字
27_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-25 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100852(drag_v2_20261109_094222.json)・16,771字
28_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-26 位置合わせ(183454)→ measure → 再生 run_0001_20261109_101023(drag_v2_20261109_094222.json)・16,771字
29_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-27 位置合わせ(183454)→ measure → 再生 run_0001_20261109_101157(drag_v2_20261109_094222.json)・16,770字
30_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-28 位置合わせ(183454)→ measure → 再生 run_0001_20261109_101434(drag_v2_20261109_094222.json)・17,507字
31_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-29 位置合わせ(183454)→ measure → 再生 run_0001_20261109_101615(drag_v2_20261109_094222.json)・16,775字
32_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-30 位置合わせ(183454)→ measure → 再生 run_0001_20261109_102715(drag_v2_20261109_094222.json)・24,318字
33_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-31 位置合わせ(183454)→ measure → 再生 run_0001_20261109_102903(drag_v2_20261109_094222.json)・18,131字
34_sec10.txt ― 端末1(位置1・ゲームパッドでの教え直し) / 端末1-32 位置合わせ(183454)→ measure → 再生 run_0001_20261109_103049(drag_v2_20261109_094222.json)・17,188字
35_sec10.txt ― 端末2(位置2) / 端末2-01 位置合わせ(191541)→ measure → 再生 run_0001_20261109_102109(drag_v2_20221013_230205.json)・17,902字
36_sec10.txt ― 端末2(位置2) / 端末2-02 位置合わせ(191541)→ measure → 再生 run_0001_20261109_102248(drag_v2_20221013_230205.json)・16,848字
37_sec10.txt ― 端末2(位置2) / 端末2-03 位置合わせ(191541)→ measure → 再生 run_0001_20261109_102431(drag_v2_20221013_230205.json)・16,774字
38_sec10.txt ― 端末2(位置2) / 端末2-04 位置合わせ(191541)→ measure → 再生 run_0001_20261109_103504(drag_v2_20221013_230205.json)・16,957字
39_sec10.txt ― 端末2(位置2) / 端末2-05 位置合わせ(191541)→ measure → 再生 run_0001_20261109_103804(drag_v2_20221013_230205.json)・17,352字
40_sec10.txt ― 端末2(位置2) / 端末2-06 位置合わせ(191541)→ measure → 再生 run_0001_20261109_103943(drag_v2_20221013_230205.json)・17,142字
41_sec10.txt ― 端末2(位置2) / 端末2-07 位置合わせ(191541)→ measure → 再生 run_0001_20261109_104110(drag_v2_20221013_230205.json)・16,774字
42_sec10.txt ― 端末2(位置2) / 端末2-08 位置合わせ(191541)→ measure → 再生 run_0001_20261109_104517(drag_v2_20221013_230205.json)・16,855字
教え直しは、最初は Pi の上でアームの力を抜いて手で引っ張る形(drag_teach_v2.py teach)で考えていました。ゲームパッドなら、daemon(アームの中で指令を受けるプログラム)を止めずに、1° ずつ確かめながら合わせられるので、そちらに切り替えました。手で教える手順の名残りで daemon を止めたままゲームパッドを起動し、つながらずに終わった1回があります(端末1-08)。
ゲームパッドでやったことは次の順です(09:36:20〜09:42:22。押した操作113回)。
- HOME から、ブロックが爪の奥(爪先の青い印より根元側)に入るまで下ろした。肩 j1 は88°を超えない(LOG352 で、88°を超えた指令をアームが捨てた)。足りない分は肘 j2 と手首 j4 で下げた
- × で爪を閉じ、奥まで入っているかを目で見た
- つかんだまま、十字キーの上で肩 j1 を約14°上げて持ち上げた。落ちないことを確かめてから ○ で開いた
ゲームパッドの記録(log.jsonl)には、押した操作ごとに、送った角度と読んだ角度が残ります。その実測から2つの姿勢を取り出しました。
| 姿勢 | 前の教えた記録 | ゲームパッドで作った姿勢 |
|---|---|---|
| つかむ(PICK) | −35.94, 80.59, 7.11, 3.16, −88.68, −30.32 | −40.51, 79.98, −0.43, 0.43, −73.47, −29.97 |
ブロックの上(APPROACH_PICK・持ち上げも同じ) | −36.12, 65.83, 16.78, 4.39, −86.74, −29.61 | −40.69, 66.09, 1.49, 0.61, −70.48, −29.88 |
根元の向き j0 が 4.6° 違っていました。前の記録は、ブロックの中心から外れた向きで、爪の片側の先でつかんでいた可能性があります。手首 j4 は −88.68° から −73.47° になり、安全の範囲の端から離れました。
- ねらい:位置1のつかむ姿勢を、ブロックが爪の奥まで入る姿勢に直す
- 変わったこと:つかむ姿勢とブロックの上の姿勢を、ゲームパッドで作った実測の角度に差し替えた。箱の側の2つはそのまま
- 見込める効果(この回で測った値):位置1の1本目のはみ出しは43.4px → 16.2px。新しい記録で撮った18本のうち、爪が乗らなかった15本では、使える深さ(24px 以下)が10本だった

新しい教えた記録の作り方(make_teach_v2_20261109.py)
前の記録をコピーし、ブロックの上の範囲(idx 240〜290)とつかむ範囲(idx 291〜469)の角度を、すべて新しい姿勢にそろえました。再生は、その範囲の中から姿勢を1つ選ぶ作りなので、どれが選ばれても同じになります。変わったのは585点のうち230点で、ほかに足したのは由来を書いた derived_from の欄だけです。作ったファイルは KIOXIA の mecharm_calibration/teach_poses_20261109/ に置き、Pi に送りました(端末1-11。鍵を付けずに送ろうとしてパスワードを聞かれ、止めた1回が端末1-10)。
#!/usr/bin/env python3
"""make_teach_v2_20261109.py — 位置1 の教えた記録 drag_v2_20221013_144348.json の「ブロックの上」と「つかむ」の姿勢だけを,
ゲームパッドで作り直した姿勢に差し替えた新しい教えた記録 drag_v2_20261109_094222.json を作る (LOG463・2026-11-09 09:42).
再生 (record_teach_demo.py → waypoint_replay._extract_waypoints) が使うのは 4 つの姿勢だけ:
APPROACH_PICK : phase APPROACH_PICK (idx 240〜290) の中で PICK と差がいちばん大きい姿勢
PICK : PICK phase (idx 291〜469) の中の最後の close の印 (idx 355)
APPROACH_PLACE : phase APPROACH_PLACE (idx 470〜512) の中で PLACE と差がいちばん大きい姿勢
PLACE : PLACE phase の中の最後の open の印 (idx 552)
APPROACH_PICK の範囲を全部「ブロックの上」に, PICK の範囲を全部「つかむ」にそろえれば, どの idx が選ばれても同じ姿勢になる.
箱の側の 2 つ (APPROACH_PLACE・PLACE) と, phases・gripper_events・key_log はそのまま.
姿勢は tools/gamepad_teleop.py の記録 runs/experiments/gamepad_teleop/teleop_20261109_093620/log.jsonl の実測から取った:
つかむ = 爪を閉じた (×) ときに読んだ角度 [-40.51, 79.98, -0.43, 0.43, -73.47, -29.97]
ブロックの上 = つかんだまま j1 を十字キーの上で上げて止めた角度 (seq 169 の measured_after_halt) [-40.69, 66.09, 1.49, 0.61, -70.48, -29.88]
"""
import json, copy
src = "runs/run_pick_place/run_0001_20261109_093045/teach/drag_v2_20221013_144348.json"
d = json.load(open(src)); n = copy.deepcopy(d)
pick = [-40.51, 79.98, -0.43, 0.43, -73.47, -29.97] # teleop_20261109_093620 で爪を閉じた姿勢 (実測)
appr = [-40.69, 66.09, 1.49, 0.61, -70.48, -29.88] # 同じ記録で j1 を上げて持ち上げた姿勢 (実測)
for i in range(240, 291): n['angles'][i] = list(appr)
for i in range(291, 470): n['angles'][i] = list(pick)
n['recorded_at'] = "2026-11-09T09:42:22"
n['derived_from'] = {"teach": "drag_v2_20221013_144348.json", "replaced": {"APPROACH_PICK idx 240-290": appr, "PICK idx 291-469": pick},
"source": "runs/experiments/gamepad_teleop/teleop_20261109_093620/log.jsonl (seq 161 付近の実測・seq 169 の持ち上げ後の実測)",
"reason": "位置1の教えた PICK が浅かった (183454 で 38.9px, 20261109_093045 で 43.4px)。ゲームパッドで奥までつかむ姿勢を作り直した。箱側の 2 姿勢は元のまま"}
out = "mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json"
json.dump(n, open(out, "w"), ensure_ascii=False, indent=1); print(out)
ゲームパッドの記録(runs/experiments/gamepad_teleop/teleop_20261109_093620/meta.json)
{
"run_stem": "teleop_20261109_093620",
"started_at": "2026-11-09T09:36:20",
"execute": true,
"argv": [
"tools/gamepad_teleop.py",
"--execute"
],
"controllers": [
{
"name": "PS4 Controller",
"guid": "03008fe54c050000cc09000000016800",
"instance_id": 0,
"axes": 6,
"buttons": 16,
"hats": 0,
"connected_at": "2026-11-09T09:36:25"
}
],
"python": "3.12.12 | packaged by conda-forge | (main, Oct 22 2025, 23:34:53) [Clang 19.1.7 ]",
"pygame": "2.6.1",
"sdl": "2.28.4",
"platform": "macOS-26.6.2-arm64-arm-64bit",
"start_pose": [
0.0,
1.49,
1.75,
0.26,
-0.26,
-30.23
],
"guards": {
"J1_MAX_DEG": 90.87,
"range": "physical_limits (no base window. 2026-11-03)",
"J4_SAFE": [
-90.0,
60.0
],
"JOINT_LIMITS": [
[
-156.0,
161.0
],
[
-79.0,
123.0
],
[
-177.0,
177.0
],
[
-156.0,
162.0
],
[
-118.0,
118.0
],
[
-177.0,
178.0
]
],
"window": {
"lo": [
-156.0,
-79.0,
-177.0,
-156.0,
-90.0,
-177.0
],
"hi": [
161.0,
90.87,
177.0,
162.0,
60.0,
178.0
]
},
"home_bypasses_range_check": true
},
"motion": {
"speed": 20,
"step_fine_deg": 1.0,
"step_coarse_deg": 2.0,
"reach_tol_deg": 3.0,
"reach_timeout_min_sec": 8.0,
"poll_sec": 0.3,
"gripper_sleep_sec": 0.8,
"grip_close_value": 20,
"send_wait": 0.0,
"home": [
0.0,
0.0,
0.0,
0.0,
0.0,
-30.0
],
"home_hold_sec": 1.0,
"trigger_stop_above": 0.0,
"hold_start_sec": 0.4,
"hold_interval_sec": 0.1,
"hold_ahead_deg": 15.0,
"hold_stall_sec": 1.5,
"ignored_check_sec": 0.5,
"ignored_max_resends": 3,
"j0_left_sign": -1.0,
"up_sign": -1.0,
"select_order": [
1,
2,
3,
4,
5
]
},
"button_map": {
"0": "cross",
"1": "circle",
"2": "square",
"3": "triangle",
"4": "share",
"5": "home",
"6": "options",
"7": "l3",
"8": "r3",
"9": "l1",
"10": "r1",
"11": "dpad_up",
"12": "dpad_down",
"13": "dpad_left",
"14": "dpad_right",
"15": "touchpad"
},
"git": {
"commit": "23ed9141636c183562da3fe515d0fb0b374530d5",
"script_status": "clean"
},
"script_copy": "gamepad_teleop.py",
"script_sha256": "d211064093ab547bb9dac15dfaa53c49c8de77f1ce1b22cf58442fde253dd259",
"ended_at": "2026-11-09T09:42:32",
"end_reason": "ctrl_c",
"n_sent": 61
}
ゲームパッドの記録(runs/experiments/gamepad_teleop/teleop_20261109_093620/log.jsonl・170行)
{"seq": 1, "t": "2026-11-09T09:36:56.220", "t_unix": 1794184616.22, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 1, "held_sec": 0.407, "accepted": true, "measured_before": [0.0, 1.49, 1.75, 0.26, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-15.0, 1.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184616.2420459, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-09T09:36:56.391", "t_unix": 1794184616.392, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 2, "held_sec": 0.578, "accepted": true, "measured_before": [0.0, 2.37, 2.02, 0.26, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 15.0, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.0, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 3, "t": "2026-11-09T09:36:56.494", "t_unix": 1794184616.495, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 3, "held_sec": 0.681, "accepted": true, "measured_before": [-3.51, 2.37, 2.63, 0.26, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 11.49, "sent": false, "why": "lead_ok", "hold_remaining_deg": 11.49, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 4, "t": "2026-11-09T09:36:56.596", "t_unix": 1794184616.597, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 4, "held_sec": 0.783, "accepted": true, "measured_before": [-7.38, 2.37, 2.63, 0.26, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 7.62, "sent": false, "why": "lead_ok", "hold_remaining_deg": 7.62, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-09T09:36:56.699", "t_unix": 1794184616.699, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 5, "held_sec": 0.886, "accepted": true, "measured_before": [-14.85, 2.37, 2.63, 0.17, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 0.15, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-29.85, 1.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1794184616.883944, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-09T09:36:56.987", "t_unix": 1794184616.988, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -15.0, "hold_id": 1, "hold_n": 6, "held_sec": 1.174, "accepted": true, "released_during_job": true, "measured_before": [-14.85, 2.37, 2.63, 0.17, -0.26, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 15.0, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.0, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-09T09:36:57.021", "t_unix": 1794184617.022, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 1, "halt_joint": 0, "measured_at_request": [-14.85, 2.37, 2.63, 0.17, -0.26, -30.23], "t_halt": 1794184617.022624, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-19.33, 2.37, 2.63, 0.17, -0.26, -30.23], "moved_after_request_deg": [-4.48, 0.0, 0.0, 0.0, 0.0, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 8, "t": "2026-11-09T09:36:57.463", "t_unix": 1794184617.464, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -1.0, "hold_id": 2, "hold_n": 0, "accepted": true, "measured_before": [-29.53, 2.37, 2.63, 0.08, -0.26, -30.23], "start_source": "measured", "others_from_measured": [], "cmd_gap_deg": 10.2, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-30.53, 1.49, 1.75, 0.26, -0.26, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1794184617.53143, "measured_before_send": [-29.44, 2.37, 2.63, 0.08, -0.26, -30.23], "resends": [], "reached": true, "reached_angles": [-30.93, 2.37, 2.63, 0.0, -0.26, -30.23], "reach_err": 0.88, "elapsed_sec": 0.09, "grip_state": "unknown", "stopped": false, "stop_reason": null}新しい教えた記録(mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json)
{
"schema_version": 1,
"model": "MyCobot",
"recorded_at": "2026-11-09T09:42:22",
"interval_sec": 0.1,
"count": 585,
"positions": {
"block_xz_m": null,新しい記録で位置1を18本、前からの記録で位置2を8本撮った
撮り方は、1本ごとに同じ1行です。位置合わせの画面でブロックをお手本の位置に戻し、q で閉じると、ブロックと箱の位置を測って(measure)、そのまま再生と記録に進みます。再生の最後にアームは HOME に戻るので、続けて回せます。位置2は、別のターミナルで並べて撮りました。
cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
位置2は --episode 191541、--teach drag_v2_20221013_230205.json に替えて同じ形で撮りました。録画係(recorder.py —top —no-side)は別のターミナルで常駐させ、再生の始まりと終わりの合図で1本ずつ top.mp4 を書き出します。横のカメラは使っていません(π0.5 の学習に使うのは上カメラだけ)。
撮った27本を、つかみの深さ・下ろす時間・爪の値で分けた結果です。
| 位置 | 撮った本数 | 使う | 浅い | 爪が乗った | 教え直す前の記録 |
|---|---|---|---|---|---|
| 1 | 19 | 10 | 5 | 3 | 1 |
| 2 | 8 | 7 | 0 | 1 | 0 |
- 位置1の浅い5本は、はみ出しが24.9〜30.5px で、線のすぐ上でした。新しい記録で深くなっていても、ブロックの置き方の数 mm の差で線を越えます
- 位置1の深い本は、アームの根元からブロックまでが266〜276mm、浅い本は272〜284mm に集まっていました(試行 JSON の block_dist_from_base_mm。赤いケーブルを拾って40〜75mm と出た本は除く)。重なりがあり、距離だけでは決まりません
- 位置2の7本は、はみ出しが −7.8〜10.9px で、どれも深いつかみでした。前からの教えた記録のままで深くつかめています
置き場所ごとの本数は、前回(LOG460・依頼117)で浅いお手本と指の写ったお手本を外した21本と合わせて、次のようになりました。
| 位置 | 前からの21本 | この回で足した本 | 合わせて | 10本まで |
|---|---|---|---|---|
| 1 | 0 | 10 | 10 | 0 |
| 2 | 3 | 7 | 10 | 0 |
| 3 | 2 | 0 | 2 | あと8 |
| 4 | 5 | 0 | 5 | あと5 |
| 5 | 11 | 0 | 11 | 足さない |
1本の撮影にかかった時間は、位置1の続けて撮った9本(09:53〜10:04)で、1本あたり約1分40秒でした。
爪がブロックに乗った4本は、下ろすのに7.9〜9.1秒かかっていた
撮っている途中で、爪がブロックの端に当たって下りなくなり、ブロックがずれてから結局下りきる回がありました。その回が記録から見分けられるかを、27本の上カメラの映像・角度・時間・電流で調べました。


見分けられたのは、ブロックの上からつかむ姿勢まで下ろす区間の時間と、着いたときの肩の角度でした。
| 普段の23本 | 爪が乗った4本 | |
|---|---|---|
| 下ろす区間の時間 | 1.06〜1.10秒 | 7.86〜9.12秒 |
着いた肩 j1(位置1・新しい記録) | 80.50〜80.94° | 79.01〜79.10° |
| 着いた肩 j1(位置2) | 87.89° | 86.74° |
着いた手首 j4(位置1・新しい記録) | −75.32〜−76.02° | −76.46〜−76.99° |
乗った本では、爪がブロックに支えられて肩が目標の手前(約1.5°)で止まり、到達の確かめ(目標から3°以内)に入るまで、上限の8秒近く待っていました。再生は止まらずに閉じて進むので、端末の出力だけでは気づきにくく、区間の時間で見るのが確実です。
爪が乗った4本のうち、102715 と 102903 はブロックをつかめずに空で閉じていました(人の判定も「つかめなかった」)。この2本は、閉じたあとの爪の値が最大22で、空で閉じたときの値(15〜22前後)と同じでした。残りの2本(101434・103504)は、ブロックを押し込んだ形でつかめていて、深さの数字も1.9px・0.2px と深く出ます。深さの数字だけでは、乗ってから押し込んだつかみを、深いつかみと取り違えます。 使うかどうかは、深さと下ろす時間の両方で決めることにしました。
- ねらい:爪がブロックに乗った本を、学習のお手本から外せるようにする
- 変わったこと:判定に、下ろす区間の時間(5秒を超えたら外す)を足した。lab/Log25/log25_runs_table.py の決まり
- 見込める効果:深さの線だけでは使う側に入っていた2本(101434・103504)が外れる。π0.5 が、ブロックに乗ってから押し込む動きを覚えるのを防げる見込み(学習はまだ回していない)
爪と肩の電流の値では、爪が乗った瞬間は見えなかった
爪が乗ったことを電流で見分けられるかも調べましたが、この回の記録では見分けられませんでした。理由は2つです。
- 下ろしている間の値が残っていない。つかむ姿勢へ下ろす命令の返事を待つ約1秒(daemon の send_angles の往復 1.03秒)の間は、電流を読まない作りにしている(依頼121。再生の本体を待たせないため)。下ろす区間の0.7秒ほどが、ちょうどこの間に入る
- 爪の値は、開いている間は変わらない。下ろすときの爪は開いたままで、ブロックに乗っても爪のサーボには力がかからない
肩の値(番地69、下位の値)は、下ろしてから閉じるまでの間で、乗った本が0〜4、普段の本が0〜2でした(乗っていない 101023 だけ6)。差は小さく、重なっています。肩の値で見分けるなら、下ろしている間も1秒10回くらいで読む必要があります。
一方、閉じたあとの爪の値は、つかめたかどうかをはっきり分けました。つかめた25本は最大826〜889、空で閉じた2本は最大22でした。
- 1本あたりの電流の記録は、普段の本で77〜93行、爪が乗った本で147〜163行(1秒に2.2〜3.3行)。爪を開け閉めしている約14秒と、下ろす命令の返事待ちの間は読んでいない
- 読み取りが見込みの時間を超えた回(再生を待たせたかもしれない回)は、26本で0回、爪が乗った 102715 で1回だった。この本は使わない
27本の表(lab/Log25/runs_table.csv から)
下ろす区間は、ブロックの上からつかむ姿勢までの区間の時間(試行 JSON の segment_elapsed_sec)です。着いた j1・j4 は、その区間の終わりに読んだ角度です。
| run | 位置 | 教えた記録 | つかめた/箱 | 閉じる直前 | 閉じて1秒後 | 爪の値 最大 | 下ろす区間 | 着いた j1 | 着いた j4 | 判定 |
|---|---|---|---|---|---|---|---|---|---|---|
20261109_093045 | 1 | 20221013_144348 | yes/yes | 71.4px | 43.4px | 863 | 1.08秒 | 81.47° | -88.15° | 外す:浅い (閉じて 1.0 秒後 43.4px > 24px) / 教え直す前の記録 |
20261109_094839 | 1 | 20261109_094222 | yes/yes | 42.5px | 16.2px | 885 | 1.07秒 | 80.5° | -75.67° | 使う |
20261109_095308 | 1 | 20261109_094222 | yes/yes | 51.9px | 19.6px | 878 | 1.09秒 | 80.59° | -75.58° | 使う |
20261109_095452 | 1 | 20261109_094222 | yes/yes | 59.2px | 29.2px | 881 | 1.07秒 | 80.59° | -75.58° | 外す:浅い (閉じて 1.0 秒後 29.2px > 24px) |
20261109_095630 | 1 | 20261109_094222 | yes/yes | 51.0px | 26.0px | 868 | 1.06秒 | 80.59° | -75.58° | 外す:浅い (閉じて 1.0 秒後 26.0px > 24px) |
20261109_095810 | 1 | 20261109_094222 | yes/yes | 35.8px | 11.2px | 833 | 1.06秒 | 80.59° | -75.49° | 使う |
20261109_095948 | 1 | 20261109_094222 | yes/yes | 50.3px | 19.5px | 863 | 1.08秒 | 80.59° | -75.58° | 使う |
20261109_100126 | 1 | 20261109_094222 | yes/yes | 43.2px | 10.5px | 826 | 1.07秒 | 80.59° | -75.58° | 使う |
20261109_100307 | 1 | 20261109_094222 | yes/yes | 42.4px | 19.2px | 866 | 1.06秒 | 80.59° | -75.67° | 使う |
20261109_100444 | 1 | 20261109_094222 | yes/yes | 39.7px | 12.0px | 828 | 1.07秒 | 80.5° | -75.49° | 使う |
20261109_100716 | 1 | 20261109_094222 | yes/yes | 49.3px | 22.5px | 865 | 1.10秒 | 80.59° | -75.49° | 使う |
20261109_100852 | 1 | 20261109_094222 | yes/yes | 54.5px | 29.4px | 869 | 1.06秒 | 80.59° | -75.67° | 外す:浅い (閉じて 1.0 秒後 29.4px > 24px) |
20261109_101023 | 1 | 20261109_094222 | yes/yes | 59.6px | 30.5px | 864 | 1.08秒 | 80.94° | -76.02° | 外す:浅い (閉じて 1.0 秒後 30.5px > 24px) |
20261109_101157 | 1 | 20261109_094222 | yes/yes | 42.2px | 15.6px | 831 | 1.08秒 | 80.5° | -75.67° | 使う |
20261109_101434 | 1 | 20261109_094222 | yes/yes | 2.7px | 1.9px | 835 | 7.87秒 | 79.01° | -76.46° | 外す:爪がブロックに乗った (PICK の区間 7.9 秒) |
20261109_101615 | 1 | 20261109_094222 | yes/yes | 47.9px | 24.9px | 859 | 1.06秒 | 80.5° | -75.32° | 外す:浅い (閉じて 1.0 秒後 24.9px > 24px) |
20261109_102109 | 2 | 20221013_230205 | yes/yes | 41.0px | 10.9px | 841 | 1.08秒 | 87.89° | -46.49° | 使う |
20261109_102248 | 2 | 20221013_230205 | yes/yes | 31.1px | -0.9px | 833 | 1.07秒 | 87.89° | -46.49° | 使う |
20261109_102431 | 2 | 20221013_230205 | yes/yes | 26.0px | -4.6px | 835 | 1.06秒 | 87.89° | -46.49° | 使う |
20261109_102715 | 1 | 20261109_094222 | no/no | -2.8px | -15.7px | 22 | 8.50秒 | 79.01° | -76.46° | 外す:爪がブロックに乗った (PICK の区間 8.5 秒) |
20261109_102903 | 1 | 20261109_094222 | no/no | 1.1px | -1.9px | 22 | 9.12秒 | 79.1° | -76.99° | 外す:爪がブロックに乗った (PICK の区間 9.1 秒) |
20261109_103049 | 1 | 20261109_094222 | yes/yes | 23.9px | 3.0px | 831 | 1.07秒 | 80.5° | -75.49° | 使う |
20261109_103504 | 2 | 20221013_230205 | yes/yes | 10.4px | 0.2px | 889 | 7.86秒 | 86.74° | -46.14° | 外す:爪がブロックに乗った (PICK の区間 7.9 秒) |
20261109_103804 | 2 | 20221013_230205 | yes/yes | 24.4px | -6.9px | 840 | 1.07秒 | 87.89° | -46.49° | 使う |
20261109_103943 | 2 | 20221013_230205 | yes/yes | 24.3px | -7.8px | 841 | 1.07秒 | 87.89° | -46.4° | 使う |
20261109_104110 | 2 | 20221013_230205 | yes/yes | 26.4px | -2.0px | 832 | 1.07秒 | 87.89° | -46.4° | 使う |
20261109_104517 | 2 | 20221013_230205 | yes/yes | 22.0px | -7.8px | 840 | 1.06秒 | 87.89° | -46.49° | 使う |
runs_table.csv(全量)
run,position,teach,pick,place,before_px,after_px,hand_suspect,grip_max,grip_median,pick_segment_sec,pick_to_close_sec,pick_arrival_max_delta_deg,j1_arrived,j2_arrived,j4_arrived,shoulder_lo_during_pick,block_dist_from_base_mm,block_moved_mm,use,reason
run_0001_20261109_093045,1,drag_v2_20221013_144348.json,yes,yes,71.4,43.4,False,863,854,1.084,2.08,0.88,81.47,7.82,-88.15,5,283.4,,外す,浅い (閉じて 1.0 秒後 43.4px > 24px) / 教え直す前の記録
run_0001_20261109_094839,1,drag_v2_20261109_094222.json,yes,yes,42.5,16.2,False,885,849,1.072,2.07,2.2,80.5,0.43,-75.67,1,269.3,0.37,使う,
run_0001_20261109_095308,1,drag_v2_20261109_094222.json,yes,yes,51.9,19.6,False,878,850,1.087,2.08,2.11,80.59,0.17,-75.58,1/2,272.4,0.01,使う,
run_0001_20261109_095452,1,drag_v2_20261109_094222.json,yes,yes,59.2,29.2,False,881,862,1.068,2.07,2.11,80.59,0.17,-75.58,2,284.1,0.0,外す,浅い (閉じて 1.0 秒後 29.2px > 24px)
run_0001_20261109_095630,1,drag_v2_20261109_094222.json,yes,yes,51.0,26.0,False,868,844,1.063,2.06,2.11,80.59,0.17,-75.58,2,46.4,6.26,外す,浅い (閉じて 1.0 秒後 26.0px > 24px)
run_0001_20261109_095810,1,drag_v2_20261109_094222.json,yes,yes,35.8,11.2,False,833,813,1.056,2.05,2.02,80.59,0.17,-75.49,1/2,268.7,0.0,使う,
run_0001_20261109_095948,1,drag_v2_20261109_094222.json,yes,yes,50.3,19.5,False,863,840,1.085,2.1,2.11,80.59,0.17,-75.58,1/2,269.2,0.66,使う,grasp_depth.csv(pi05/grasp_depth.py —csv の出力・全量)
run,status,reason,t_close,frame_before,frame_after,before_px,after_px,after_gap_px,hand_suspect,pre_px,center_px,center_by,axis_from,max_protrude_px,shallow,grip_status,grip_current_max,grip_current_median,grip_rows,grip_grasped
run_0001_20261109_093045,ok,,1794184266.412,622,653,71.4,43.4,100.5,False,"{""pre1.5s"": 61.2, ""pre0.5s"": 71.2, ""before"": 71.4}","[589, 588]",wide,tips,24.0,True,ok,863,854,16,True
run_0001_20261109_094839,ok,,1794185338.969,596,627,42.5,16.2,99.9,False,"{""pre1.5s"": 39.7, ""pre0.5s"": 42.5, ""before"": 42.5}","[579, 578]",wide,body,24.0,False,ok,885,849,28,True
run_0001_20261109_095308,ok,,1794185607.704,583,613,51.9,19.6,99.9,False,"{""pre1.5s"": 48.2, ""pre0.5s"": 51.9, ""before"": 51.9}","[582, 589]",wide,body,24.0,False,ok,878,850,28,True
run_0001_20261109_095452,ok,,1794185712.025,584,615,59.2,29.2,99.6,False,"{""pre1.5s"": 55.1, ""pre0.5s"": 59.1, ""before"": 59.2}","[574, 597]",wide,body,24.0,True,ok,881,862,20,True
run_0001_20261109_095630,ok,,1794185810.493,582,613,51.0,26.0,99.7,False,"{""pre1.5s"": 47.9, ""pre0.5s"": 51.0, ""before"": 51.0}","[589, 591]",wide,body,24.0,True,ok,868,844,28,True
run_0001_20261109_095810,ok,,1794185909.821,572,603,35.8,11.2,99.6,False,"{""pre1.5s"": 33.8, ""pre0.5s"": 35.8, ""before"": 35.8}","[581, 582]",wide,body,24.0,False,ok,833,813,28,True
run_0001_20261109_095948,ok,,1794186007.998,582,613,50.3,19.5,99.7,False,"{""pre1.5s"": 49.6, ""pre0.5s"": 50.3, ""before"": 50.3}","[574, 581]",wide,body,24.0,False,ok,863,840,28,True表を作るコード(lab/Log25/log25_runs_table.py)
#!/usr/bin/env python3
"""log25_runs_table.py — 2026-11-09 に撮ったお手本 (record_teach_demo.py) 27 本を 1 本 1 行の表にする
(LOG463・フィジカルAI研究室 Log#25).
読むだけ:
runs/run_pick_place/run_0001_20261109_*/run_0001_20261109_*.json (試行 JSON: 人の y/n・区間ごとの到達・ブロックの位置)
runs/run_pick_place/run_0001_20261109_*/recording/states.csv (段階の時刻・読んだ角度・爪の命令)
runs/run_pick_place/run_0001_20261109_*/recording/currents.csv (爪と肩の電流. 依頼 121)記事の画像を作るコード(lab/Log25/make_images.py)
#!/usr/bin/env python3
"""make_images.py — LOG463 の記事に載せる画像を、上カメラの録画 (top.mp4) と横からのスマホ動画から作る (読むだけ).
使い方: python3 make_images.py (B と SIDE のパスを環境に合わせる)
"""
import cv2, csv, os, subprocess
import numpy as np
from PIL import Image, ImageDraw, ImageFont
FP = "/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc"依頼121:教えた動きの再生の記録にも、爪と肩の電流を足した
この回のお手本に電流が残っているのは、撮る前に入れた依頼121 のおかげです。前の依頼116 で電流を足したのは、π0.5 で動かす実機推論の記録だけで、教えた動きを再生して撮るお手本には残らないことが、依頼117 の報告で分かりました。「お手本と実機推論の両方に電流を足す」と決めていたので、撮る前に埋めました。依頼箱で 07:55〜09:14(79分)かかり、外部のレビュー(codex)を3回通しています。
決めたことは次のとおりです。
- 電流を記録しながら撮る(読み取りが長引くと再生が最大1.5秒待つことがあると、codex の3回目のレビューで残った。待ったかもしれない回は記録に残るので、出た本は撮り直す)
- パッドを使っている間に記録が 9.1〜9.5Hz に下がる件(依頼116)は、このまま受け入れる
- read_servo が答えない回の stop の遅れ(最大約2秒)は、今回は手を入れない。依頼109 の測定で、読めない回は0回だった
- 手が写っていそうな本は印を出すだけで、自動では外さない
- 位置1 を教え直したら、新しい記録の名前を本数を数える表(count_by_position.py の TEACH_FILES)に足す。この回の drag_v2_20261109_094222.json は、まだ足していない
依頼121 の依頼文(依頼箱/済み/20261108_121_教えた動きの再生の記録にも爪と肩の電流を足す.md)
---
作業フォルダ: /Users/shimazueiichi/r2r2r-scripts
上限時間: 120
---
# 依頼121:教えた動きを再生して撮るお手本の記録にも、爪と肩の電流を足す(2026-11-08)
依頼116・117・118 の続き。今日エイイチが `pi05/DEEP_DEMOS.md` の手順で、位置1〜4 のお手本を約30本撮る。その前に入れる。
## 背景
- 依頼116 で、実機推論の記録(pi05/policy_recorder.py)に爪と肩の電流が currents.csv として残るようになった(commit f05588c)
- 依頼117 の報告:教えた動きの再生の記録(record_teach_demo.py まわり)には電流が残らない。エイイチの決め(2026-11-07)は「お手本と実機推論の記録の両方に電流を足す」なので、ここを埋める
## A. 再生の記録に currents.csv を足す
- 教えた動きの再生で撮る記録でも、依頼116 と同じ読み方・同じ列の currents.csv を、同じ run の `recording/` に書く。できれば依頼116 の部品をそのまま使い、読み方を2か所に書かない
- 頻度の守り方・肩の上位を5回に1回にする扱い・読めない回は空にして続ける扱いは、依頼116 と同じにする
- states.csv など、今ある記録の列と中身は変えない(学習データを作る側が読むため。build_demo_episodes.py で作り直したデータが今までと同じになることをテストで確かめる)
- 再生の動き(関節の命令・待ち・速さ)は変えない
## B. 手順書 `pi05/DEEP_DEMOS.md` に、爪の電流での確かめを足す
- 1本撮るごとに、閉じたあとの gripper_current を見る手順を足す。116・109 の測定(空で閉じると15前後、ブロックをつかむと数百〜990、放すと −50 前後)を目安に書く
- できれば、run のフォルダを渡すと「閉じたあとの爪の値の最大・つかめたか(目安の線で)」を1行で出す小さな表示を足す(`grasp_depth.py` の深さと並べて出せるとよい)。線は目安として書き、外すかどうかは今まで通り深さ 24px で決める
- 位置1 を教え直したときは、新しい教えた記録のファイル名を `count_by_position.py` の `TEACH_FILES` に位置1として足す、と手順書に書く(依頼118 の決めてほしいこと → エイイチの決め:教え直したら足す)
## C. ついでに
- `auto_detect_cameras.py` を git に入れる(依頼116 の決めてほしいこと3 → 入れる。git から取り出した写しで run_policy_client とテストが動くようにするため)。中に鍵や個人の情報がないか見てから入れる
## 決まっていること(変えない)
- パッドを使っている間に記録が 9.1〜9.5Hz に下がる件は、このまま受け入れる(依頼116 の決めてほしいこと1)
- read_servo が答えない回の stop の遅れ(最大約2秒)は、今回は手を入れない(依頼116 の決めてほしいこと2。109 の測定で読めない回は0回だった)
- 手が写っていそうな本は印を出すだけで、自動では外さない(依頼117 の決めてほしいこと1)
## 確かめ
- 既存のテストが全部通ること。再生の記録に currents.csv が出るテストを足す(daemon の偽物で)
- codex のレビューを通す(再生の経路と daemon の鍵に触るため。docs/ に依頼文と結果を残す)
- アームは動かさない。実機の確かめはエイイチがやるので、手順を報告に書く
- 測定データ(runs/・datasets/・checkpoints/)は上書き・移動・削除しない。書く前に KIOXIA のマウントを確かめる
- git は個別ファイルを指定して add・commit する(git add . と git clean は使わない)
## 報告に書くこと
- 再生の記録の頻度(測った数字)と currents.csv の置き場所
- エイイチが実機で確かめる手順:DEEP_DEMOS.md の1本目を撮ったあと、深さと爪の値を見る形で短く
- 最後の1行に「判定:合格/止めた(決めてほしいことあり)/失敗」
依頼121 の作業の記録(r2r2r-scripts/logs/20261108_0911.md)
依頼箱の結果のファイルには報告の最後の数行しか残らなかったので、Claude Code が書いた作業の記録を載せます。commit は 23ed914 です。
# 2026-11-08 依頼 121:教えた動きの再生の記録にも爪と肩の電流を足す
## A. 再生の記録に currents.csv(pi05/policy_recorder.py・record_teach_demo.py)
- 依頼 116 の読み方(read_servo 1 回・爪 7:69/7:70・肩 2:69 毎回・肩 2:70 は 5 回に 1 回・読めない回は空・unknown cmd ならやめる)を mixin `_ServoCurrents` に出し、PolicyRecorder と新しい `CurrentsRecorder` の両方が使う(読み方は 1 か所)。PolicyRecorder の動きは同じ(test_recorder_currents 15/15)
- 置き場所: `{run}/recording/currents.csv`(列は依頼 116 と同じ)と `currents_meta.json`。試行 JSON の `currents` にも同じ数
- **読むのは再生の本体が daemon を使わずに眠っている間だけ**(`_sleep_open`: 到達・静止の確かめの 0.3 秒の間、settle の読み取りの合間。眠る長さは同じ)。codex R1・R2 で「本体が鍵を待つと到達の確かめの回数が変わる」と指摘 → 偽の腕を動かすテストで実際に actual 行が 1 つ減るのを確かめ、この形に変えた
- 爪の命令〜待ちの終わり・再送の前の待ち(5 秒)は pause(「爪を動かした直後にシリアルを触らない」2026-10-19)。待ちの途中の Ctrl-C では再開しない
- 止め方: stop は スレッド 5 秒 + 閉じる 1 秒 + meta 1 秒までしか待たない。cmd_run の最後(socket を閉じる前)に `_halt_currents`
- `--no-currents` で今までと同じ動き(電流を読まない)
- record_teach_demo.py は git に入っていない。変える前の写し: `record_teach_demo.py.bak_pre_req121_20261108`
## 数字(偽の daemon。send_angles 1.6 秒・腕 10°/秒・角度 18ms・番地 20ms。実機では測っていない)
- 1 本 47 行・記録 35.9 秒(うち爪で止めた 14.1 秒)→ 全体 1.31 行/秒、止めた時間を除く 2.16 行/秒、send_angles の返事待ちと爪の間を除くと 4.7 行/秒
- 閉じてから放すまで 9.3 秒で 14 行(990)
- 本体を待たせた回(overruns)0・再生にかかる時間の差 +0.03〜0.10 秒。通知(states.csv の元)の種類・順、関節と爪の命令、区間ごとの到達・再送・WARN・静止の結果が電流なしと同じ
- 残る場合: read_servo が 0.15 秒より長くかかり本体の眠りの終わりを超えた回は、本体の次のやりとりがその分(最大 1.5 秒)待つ。overruns に数える
## B. 手順書・表示
- `pi05/grip_current.py`(新): 最初に閉じた 1.0 秒後〜次に開くまでの gripper_current の最大・中央値・行数、最大 ≥ 100 で「つかめていそう」(目安だけ)
- `grasp_depth.py` の CLI: 深さの行の下にその 1 行、--csv に grip_* 列(measure_run・judge は同じ)
- `DEEP_DEMOS.md`: 1 本ごとに 2 行目を見る、read_servo の有無、位置 1 を教え直したら TEACH_FILES に位置 1 として足す(元の行は消さない)、4. を書き直し
## C. auto_detect_cameras.py を git に入れた(鍵・個人の情報なし。端末名だけ)
## テスト
- pi05/test_*.py 13 本(新しい test_teach_currents.py 23 件)・tools/test_*.py 5 本・test_provenance.py・place_modules/tests 4 本: すべて OK
- build_demo_episodes: currents.csv・currents_meta.json・試行 JSON の currents があっても npz・meta・画が同じ
- codex 並走中は時間に敏感なテストが落ちることがあった(単独では通る)
## codex
- R1: 必須 4(爪の待ちの途中で再開・再送の待ち・stop が止まる・確かめの時間)→ 反映
- R2: 必須 3(stop の I/O・確かめの時間がまだ・テストの文字列)→ 反映(眠りの間だけ読む形に変更)
- R3: 必須 1(見込みを超えた読み取りは本体を待たせうる)→ 作りでは消せない(daemon を変えるか、確かめの間は読まない=持っている間の値が取れない)。overruns に数え `--no-currents` を足して、決めてほしいことに。推奨 2 は反映
- docs/review_request_20261108_teach_currents{,_r2,_r3}.md・docs/review_result_20261108_teach_currents_codex{,_r2,_r3}.md
## KIOXIA
- テストは一時フォルダだけ。runs/・datasets/・checkpoints/ には書いていない
お手本を足す手順書(r2r2r-scripts/pi05/DEEP_DEMOS.md・依頼117・118・121 で作った版)
# 深いお手本で置き場所ごとの本数をそろえる(位置 1〜5 を各 10 本。2026-11-07 依頼 117・118・121)
学習(`RUNPOD_TRAIN.md`)の前に、LOG352 で教えた 5 か所(位置 1〜5)それぞれで、ブロックが爪の奥まで入ってから閉じるお手本を撮り足し、**どの位置も 10 本**にそろえる手順。**この手順はまだ実機で通していない**(書いただけ)。
**なぜそろえるか**: 今のデータ `mecharm_redblock_box_teach_v1_trim2_corr_v5_deep`(21 本。浅い 7 本・指の写った 2 本を外した版)は半分以上が位置 5 に寄っている。SO-101 で π0.5 を学習した例(LOG443)では、タスクごとの本数の偏りがそのまま失敗の形になり、本数をそろえて直していた。エイイチの決め(2026-11-07): 置き場所ごとの本数をそろえる。目安は各位置 10 本。
## 0. 今の本数と足す本数
閉じたあとの爪の値を1行で出すコード(r2r2r-scripts/pi05/grip_current.py)
#!/usr/bin/env python3
"""grip_current.py — 1 本の記録 (run のフォルダ) で, 爪を閉じたあとの爪の電流の値を 1 行で出す (2026-11-08 依頼 121).
入力 (run のフォルダ. runs/run_pick_place/{run}/ (教えた動きの再生) でも runs/pi05_policy/{run}/ (実機推論) でもよい):
recording/currents.csv gripper_current 列 (依頼 116 の符号付きの値. 爪 7 の番地 69/70)
recording/states.csv 爪の命令 (gripper_cmd) の時刻. 閉じる命令は grasp_depth.close_time と同じ選び方
見る範囲: 最初に閉じた命令の HELD_FROM_SEC 秒後から, 次に開く命令まで (なければ記録の終わりまで).端末の出力(全量)
端末1 は位置1 と教え直し、端末2 は位置2 を撮ったターミナルです。録画係のターミナル(recorder.py —top —no-side)は、待機中の表示のまま動いていたので載せていません。cv2 と pygame がそれぞれ同じ部品(libSDL2)を持っているための注意(objc の Class SDL… の行)が、ゲームパッドを起動するたびに出ていますが、動きには影響していません(LOG419 から同じ)。
端末1(位置1・ゲームパッドでの教え直し)
Last login: Mon Nov 9 09:20:05 on ttys003
端末1-01 measure(ブロックと箱の位置を測る)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro ~ % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):
[RTD ] HOME 2.5° ← rpp.TOL_HOME(stage1_to_home / HOME 復帰)
[RTD ] APPROACH_PICK 2.0° ← rpp.TOL_APPROACH(approach 系)
[RTD ] PICK 3.0° ← rpp.TOL_PICK_PLACE(stage4_pick)
[RTD ] APPROACH_PICK (lift) 3.0° ← rpp.TOL_LIFT_BACK(lift の残差 2.19° を吸収)
[RTD ] APPROACH_PLACE 3.0° ← rpp.TOL_APPROACH_PLACE(stage7)
[RTD ] PLACE 3.0° ← rpp.TOL_PICK_PLACE(stage8_place)端末1-02 measure(ブロックと箱の位置を測る)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):
[RTD ] HOME 2.5° ← rpp.TOL_HOME(stage1_to_home / HOME 復帰)
[RTD ] APPROACH_PICK 2.0° ← rpp.TOL_APPROACH(approach 系)
[RTD ] PICK 3.0° ← rpp.TOL_PICK_PLACE(stage4_pick)
[RTD ] APPROACH_PICK (lift) 3.0° ← rpp.TOL_LIFT_BACK(lift の残差 2.19° を吸収)
[RTD ] APPROACH_PLACE 3.0° ← rpp.TOL_APPROACH_PLACE(stage7)
[RTD ] PLACE 3.0° ← rpp.TOL_PICK_PLACE(stage8_place)端末1-03 位置合わせ(アームが HOME でなく NO MATCH)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= -34.0 dx= +4.7 response=-0.021 → 測れない (相関が弱く dx/dy が当てにならない (response=-0.021 < 0.20))
[ALIGN ] dy= -36.3 dx= +8.5 response=-0.013 → 測れない (相関が弱く dx/dy が当てにならない (response=-0.013 < 0.20))
[ALIGN ] dy= -34.7 dx= +4.6 response=-0.022 → 測れない (相関が弱く dx/dy が当てにならない (response=-0.022 < 0.20))
[ALIGN ] dy= -36.4 dx= +12.7 response=-0.009 → 測れない (相関が弱く dx/dy が当てにならない (response=-0.009 < 0.20))
[ALIGN ] dy= -37.4 dx= +18.0 response=-0.006 → 測れない (相関が弱く dx/dy が当てにならない (response=-0.006 < 0.20))
[ALIGN ] dy= -34.3 dx= +4.3 response=-0.022 → 測れない (相関が弱く dx/dy が当てにならない (response=-0.022 < 0.20))
[ALIGN ] dy= -35.4 dx= +3.8 response=-0.021 → 測れない (相関が弱く dx/dy が当てにならない (response=-0.021 < 0.20))
[ALIGN ] dy= -34.3 dx= +3.0 response=-0.031 → 測れない (相関が弱く dx/dy が当てにならない (response=-0.031 < 0.20))
[DONE ] 終了 (何も書いていません)
端末1-04 HOME に戻す → 爪を開く → 位置合わせ(—episode 183454)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/place/place_modules/08_home_from_anywhere.py && python3 -c "from visual_servo_pick import get_daemon_socket, daemon_set_gripper, close_daemon_socket; get_daemon_socket(); daemon_set_gripper(0); close_daemon_socket()" && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7
[INIT] daemon 接続中...
[Pi] fresh_mode=1
[INIT] fresh_mode=1
[PRE] 現在姿勢: [-0.70, 93.60, 8.08, 0.61, -104.32, -29.09]
[SEND] HOME へ移動指令
[WAIT] t=0.6s max_err=89.29°
[WAIT] t=1.1s max_err=73.56°端末1-05 ドライラン(drag_v2_20221013_144348.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_144348.json
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):
[RTD ] HOME 2.5° ← rpp.TOL_HOME(stage1_to_home / HOME 復帰)
[RTD ] APPROACH_PICK 2.0° ← rpp.TOL_APPROACH(approach 系)
[RTD ] PICK 3.0° ← rpp.TOL_PICK_PLACE(stage4_pick)
[RTD ] APPROACH_PICK (lift) 3.0° ← rpp.TOL_LIFT_BACK(lift の残差 2.19° を吸収)
[RTD ] APPROACH_PLACE 3.0° ← rpp.TOL_APPROACH_PLACE(stage7)
[RTD ] PLACE 3.0° ← rpp.TOL_PICK_PLACE(stage8_place)端末1-06 再生 run_0001_20261109_093045(drag_v2_20221013_144348.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_144348.json --execute
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):
[RTD ] HOME 2.5° ← rpp.TOL_HOME(stage1_to_home / HOME 復帰)
[RTD ] APPROACH_PICK 2.0° ← rpp.TOL_APPROACH(approach 系)
[RTD ] PICK 3.0° ← rpp.TOL_PICK_PLACE(stage4_pick)
[RTD ] APPROACH_PICK (lift) 3.0° ← rpp.TOL_LIFT_BACK(lift の残差 2.19° を吸収)
[RTD ] APPROACH_PLACE 3.0° ← rpp.TOL_APPROACH_PLACE(stage7)
[RTD ] PLACE 3.0° ← rpp.TOL_PICK_PLACE(stage8_place)端末1-07 daemon を止めた(手で教える手順の名残り。ゲームパッドでは不要だった)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && tools/daemon_ctl.sh stop
--- process
(なし)
--- 5555
(LISTEN なし)
--- systemd
enabled: enabled
active: inactive
端末1-08 ゲームパッド(daemon を止めたままで、つながらずに終わった)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 tools/gamepad_teleop.py --execute
/opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/pkgdata.py:25: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
from pkg_resources import resource_stream, resource_exists
objc[10160]: Class SDLApplication is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc52c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0890). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLAppDelegate is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5318) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c08e0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLTranslatorResponder is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5390) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0958). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDLMessageBoxPresenter is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc53b8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c0980). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[10160]: Class SDL_cocoametalview is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102dc5408) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x10b9c09d0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.端末1-09 daemon を起動 → HOME → ゲームパッドで姿勢を作る(teleop_20261109_093620)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && tools/daemon_ctl.sh start && python3 dynamic_tracking_limits/place/place_modules/08_home_from_anywhere.py && python3 tools/gamepad_teleop.py --execute
--- process
19535 /usr/bin/python3 -u /home/ubuntu/mecharm_daemon.py
--- 5555
LISTEN 0 1 0.0.0.0:5555 0.0.0.0:*
--- systemd
enabled: enabled
active: active端末1-10 新しい教えた記録を Pi に送る(鍵なしでパスワードを聞かれ、止めた)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % scp /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/
ubuntu@192.168.2.1's password:
端末1-11 新しい教えた記録を Pi に送る(鍵つき)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % scp -i ~/.ssh/id_rsa_pi /Volumes/KIOXIA/r2r2r-data/mecharm_calibration/teach_poses_20261109/drag_v2_20261109_094222.json ubuntu@192.168.2.1:r2r2r-scripts/dynamic_tracking_limits/drag_teaching/
drag_v2_20261109_094222.json 100% 54KB 5.2MB/s 00:00
端末1-12 HOME に戻す → 爪を開く → 位置合わせ(—episode 183454)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/place/place_modules/08_home_from_anywhere.py && python3 -c "from visual_servo_pick import get_daemon_socket, daemon_set_gripper, close_daemon_socket; get_daemon_socket(); daemon_set_gripper(0); close_daemon_socket()" && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7
[INIT] daemon 接続中...
[Pi] fresh_mode=1
[INIT] fresh_mode=1
[PRE] 現在姿勢: [-40.86, 66.35, 2.10, 0.87, -71.36, -29.97]
[SEND] HOME へ移動指令
[WAIT] t=0.6s max_err=56.95°
[WAIT] t=1.1s max_err=41.22°
[WAIT] t=1.6s max_err=25.13°
[WAIT] t=2.1s max_err=9.84°
[WAIT] t=2.6s max_err=1.49°
[DONE] HOME 到達 max_err=1.49°
[POST] 最終姿勢: [-0.26, 1.23, 1.49, -0.87, -0.08, -29.88]
[Pi] fresh_mode=0
[EXIT] fresh_mode=0, socket close
[Pi] GRIPPER: OPEN result= None
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.6 dx= +2.9 response=0.680 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
端末1-13 ドライラン(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):
[RTD ] HOME 2.5° ← rpp.TOL_HOME(stage1_to_home / HOME 復帰)
[RTD ] APPROACH_PICK 2.0° ← rpp.TOL_APPROACH(approach 系)
[RTD ] PICK 3.0° ← rpp.TOL_PICK_PLACE(stage4_pick)
[RTD ] APPROACH_PICK (lift) 3.0° ← rpp.TOL_LIFT_BACK(lift の残差 2.19° を吸収)
[RTD ] APPROACH_PLACE 3.0° ← rpp.TOL_APPROACH_PLACE(stage7)
[RTD ] PLACE 3.0° ← rpp.TOL_PICK_PLACE(stage8_place)端末1-14 measure → 再生 run_0001_20261109_094839(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):
[RTD ] HOME 2.5° ← rpp.TOL_HOME(stage1_to_home / HOME 復帰)
[RTD ] APPROACH_PICK 2.0° ← rpp.TOL_APPROACH(approach 系)
[RTD ] PICK 3.0° ← rpp.TOL_PICK_PLACE(stage4_pick)
[RTD ] APPROACH_PICK (lift) 3.0° ← rpp.TOL_LIFT_BACK(lift の残差 2.19° を吸収)
[RTD ] APPROACH_PLACE 3.0° ← rpp.TOL_APPROACH_PLACE(stage7)
[RTD ] PLACE 3.0° ← rpp.TOL_PICK_PLACE(stage8_place)端末1-15 誤って端末の出力を貼り付けた(zsh: parse error。何も動いていない)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % >....
い)
[RTD ] 区間の所要(送信→到達確認まで)(8 区間): 平均 2.67s / 最大 5.30s
[RECORD] 電流の記録終了 93 行 (2.42 行/秒. 本体が眠っている間だけ読む. 爪の間 14.062 秒は読まない. 見込み超え 0 回. read_servo) → /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_094839/recording/currents.csv
==============================================================================
[RTD ] 再生 完了
==============================================================================
[RTD ] つかめたか (y/n) > y
[RTD ] 箱に入ったか (y/n) > y
[RTD ] 試行 JSON: /Volumes/KIOXIA/r2r2r-data/runs/run_pick_place/run_0001_20261109_094839/run_0001_20261109_094839.json
[LEDGER] append OK: /Volumes/KIOXIA/r2r2r-data/runs/pick_place_ledger_v3.csv (pick=yes place=yes recording_status=ok)
[RTD ] 次に進むには: python3 /Users/shimazueiichi/r2r2r-scripts/pi05/build_demo_episodes.py --run run_0001_20261109_094839 --dataset mecharm_redblock_box_teach_v1
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts %
cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
zsh: parse error near `shimazueiichi@shimad...'
端末1-16 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095308(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.8 dx= +1.9 response=0.686 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-17 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095452(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.4 dx= +2.8 response=0.615 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-18 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095630(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.6 dx= +1.9 response=0.654 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-19 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095810(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.4 dx= +2.1 response=0.612 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-20 位置合わせ(183454)→ measure → 再生 run_0001_20261109_095948(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.4 dx= +2.0 response=0.647 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-21 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100126(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.8 dx= +2.0 response=0.694 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-22 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100307(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.5 dx= +2.1 response=0.630 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-23 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100444(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.7 dx= +1.9 response=0.686 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-24 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100716(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.6 dx= +1.9 response=0.703 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-25 位置合わせ(183454)→ measure → 再生 run_0001_20261109_100852(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.7 dx= +1.7 response=0.675 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-26 位置合わせ(183454)→ measure → 再生 run_0001_20261109_101023(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.5 dx= +2.0 response=0.636 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-27 位置合わせ(183454)→ measure → 再生 run_0001_20261109_101157(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.8 dx= +1.8 response=0.657 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-28 位置合わせ(183454)→ measure → 再生 run_0001_20261109_101434(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +0.8 dx= +1.9 response=0.697 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-29 位置合わせ(183454)→ measure → 再生 run_0001_20261109_101615(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +1.0 dx= +1.8 response=0.660 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-30 位置合わせ(183454)→ measure → 再生 run_0001_20261109_102715(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= -2.5 dx= +5.3 response=0.652 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -1.0 dx= +1.1 response=0.522 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= -2.6 dx= +7.2 response=0.540 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)端末1-31 位置合わせ(183454)→ measure → 再生 run_0001_20261109_102903(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= -2.8 dx= -2.6 response=0.565 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末1-32 位置合わせ(183454)→ measure → 再生 run_0001_20261109_103049(drag_v2_20261109_094222.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 183454 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20261109_094222.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_183454/frames/000000.jpg
[REF ] お手本 run_0001_20261019_183454 (つかんだ瞬間の j0 = -36.4°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= -2.8 dx= -2.8 response=0.598 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末2(位置2)
Last login: Mon Nov 9 09:24:56 on ttys002
端末2-01 位置合わせ(191541)→ measure → 再生 run_0001_20261109_102109(drag_v2_20221013_230205.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro ~ % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_230205.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +8.1 dx= -3.0 response=0.671 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +9.9 dx= -7.1 response=0.738 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +11.3 dx= -7.3 response=0.739 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)端末2-02 位置合わせ(191541)→ measure → 再生 run_0001_20261109_102248(drag_v2_20221013_230205.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_230205.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +4.8 dx= -0.3 response=0.863 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末2-03 位置合わせ(191541)→ measure → 再生 run_0001_20261109_102431(drag_v2_20221013_230205.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_230205.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +4.9 dx= -0.5 response=0.867 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末2-04 位置合わせ(191541)→ measure → 再生 run_0001_20261109_103504(drag_v2_20221013_230205.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_230205.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +4.2 dx= -7.9 response=0.859 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +3.0 dx= -3.2 response=0.860 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[ALIGN ] dy= +1.9 dx= +0.0 response=0.907 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)端末2-05 位置合わせ(191541)→ measure → 再生 run_0001_20261109_103804(drag_v2_20221013_230205.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_230205.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +2.8 dx= -1.2 response=0.830 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末2-06 位置合わせ(191541)→ measure → 再生 run_0001_20261109_103943(drag_v2_20221013_230205.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_230205.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +2.9 dx= -1.1 response=0.814 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末2-07 位置合わせ(191541)→ measure → 再生 run_0001_20261109_104110(drag_v2_20221013_230205.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_230205.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +3.0 dx= -1.2 response=0.816 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):端末2-08 位置合わせ(191541)→ measure → 再生 run_0001_20261109_104517(drag_v2_20221013_230205.json)
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts && python3 pi05/camera_align.py --raw-dir /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes --episode 191541 --scale 5 --alpha 0.7 && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py measure && python3 dynamic_tracking_limits/drag_teaching/record_teach_demo.py run --teach drag_v2_20221013_230205.json --execute
[REF ] 基準画像: /Volumes/KIOXIA/r2r2r-data/datasets/mecharm_redblock_box_teach_v1_trim2/raw_episodes/run_0001_20261019_191541/frames/000000.jpg
[REF ] お手本 run_0001_20261019_191541 (つかんだ瞬間の j0 = -35.7°)
[REF ] 重なった画像のブロックに実物のブロックを合わせると, お手本と同じ位置に置ける
[ALIGN ] |dy| <= 20 なら OK. アームは HOME に置いた状態で合わせる. q または Esc で終了 (ファイルには何も書かない)
[ALIGN ] dy= +2.7 dx= -1.1 response=0.835 → OK (|dy|<=20 / |dx|<=20 / response>=0.20)
[DONE ] 終了 (何も書いていません)
[RTD ] 到達許容差は本線 run_pick_place.py の stage 値を使います(区間ごと。一律 8.0° は 2026-10-19 にやめた):サムネイルの描き方(p2m-site の tools/lab_thumbs/)
この回のサムネイルは、27本の肩 j1 の動きを、下ろし始めを0秒にした時間で描いています。爪がブロックに乗った4本だけを青にし、閉じた時刻に赤の点を置きました。普段の本は1秒ほどで閉じ、乗った本だけが8秒前後まで横に伸びます。描くための値は、extract.py に足した log463_runs() で KIOXIA の記録から書き出しています。
# LOG463: 2026-11-09 のお手本 27 本。「ブロックの上」から閉じたあと 1.5 秒までの肩 j1 を、時間(PICK の段階に入った時刻を0)で
# [t, j1, つかんでいるか, 爪が乗った本か, 使う本か] の点にする。乗った本 = PICK の区間が 5 秒より長い(lab/Log25/log25_runs_table.py と同じ線)
def log463_runs(root='runs/run_pick_place'):
out = []
for d in sorted(glob.glob(root + '/run_0001_20261109_*')):
s = os.path.basename(d)
tj = json.load(open(f'{d}/{s}.json'))
seg = [g for g in tj['segments'] if g.get('to_name') == 'PICK'][0]
st = list(csv.DictReader(open(d + '/recording/states.csv')))
t0 = [float(r['ts']) for r in st if r['event_type'] == 'stage' and r['stage'] == 'PICK'][0]
tc = [float(r['ts']) for r in st if r['event_type'] == 'gripper_cmd' and r['gripper_state'] == '1'][0]
snag = seg['segment_elapsed_sec'] > 5.0
pts = [[round(float(r['ts']) - t0, 2), R(r['j1']), 1 if float(r['ts']) >= tc else 0]
for r in st if r['event_type'] == 'actual' and t0 - 1.5 <= float(r['ts']) <= tc + 1.5]
out.append({'run': s, 'snag': snag, 'p': pts})
return out
o['LOG463'] = log463_runs()
def time_draw(runs, t_lo, t_hi, v_lo, v_hi, w=4):
"""横を時間(秒)にした線。爪が乗った本(snag)を主役の青に、ほかは人の色を薄く。閉じた時刻に赤の点。"""
def f(box, pal):
x0, y0, x1, y1 = box
X = lambda t: x0 + (t - t_lo) / (t_hi - t_lo) * (x1 - x0)
Y = lambda v: y1 - (v - v_lo) / (v_hi - v_lo) * (y1 - y0)
out = []
for r in sorted(runs, key=lambda r: r['snag']):
pts = [(X(p[0]), Y(p[1])) for p in r['p']]
col, op = (pal['m'][0], '.95') if r['snag'] else (pal['c'][0], '.35')
out.append(poly(pts, col, op, w=w * (1.4 if r['snag'] else 1)))
ex, ey = pts[-1]
out.append(f'<circle cx="{ex:.1f}" cy="{ey:.1f}" r="{11 if r["snag"] else 7}" fill="{RED}"/>')
return '\n'.join(out)
return f
463 dark 461 paper 460 split 450 dark 446 paper 436 dark 422 photo_l 419 photo_r 417 dark
if n == 463:
# 下ろし始め(PICK の段階)を0秒に、肩 j1 の動き。爪がブロックに乗った4本だけ青で長く伸びる。赤の点は閉じた所
return dark('27 DEMONSTRATIONS', 'SNAG → 8 S', time_draw(d['LOG463'], -1.5, 11, 60, 92))
次にやること:位置3・4を撮り、位置1の新しい記録を数える表に足す
- 位置3 は、あと8本。前に撮った4本のうち2本が浅かったので、1本目で深さと下ろす時間を見てから続ける。浅ければ、位置1 と同じようにゲームパッドでつかむ姿勢を作り直す
- 位置4 は、あと5本
- drag_v2_20261109_094222.json を、count_by_position.py の TEACH_FILES に位置1 として足す(Claude Code に依頼する)。足さないと、この回の位置1 の10本が「分からない」に数えられる
- 5か所が10本ずつそろったら、浅い本・指の写った本・爪が乗った本を外して学習データを作り直し、π0.5 を学習し直す
- 爪が乗った瞬間を電流で見たいなら、下ろしている間も読む形に変える必要がある。今は下ろす時間と肩の角度で足りているので、急がない