(base) shimazueiichi@shimadzueiichinoMacBook-Pro _制作ベース % cd ~/r2r2r-scripts && bash tools/daemon_add_read_servo.sh
今の daemon の写し: /Volumes/KIOXIA/r2r2r-data/archive/mecharm_daemon_premerge_readservo_20261107_175619/mecharm_daemon.py
--- 差分
66a67,187
> # ---- 2026-11-07 依頼 109: 電流などを読むだけの命令 read_servo (純追記) ----------------------
> # アームと爪には何も送らない. pymycobot の読む関数 (get_angles / get_servo_currents / get_servo_status /
> # get_gripper_value / get_servo_data) だけを, 頼まれた順に 1 回ずつ呼ぶ. 読み直さない・待たない.
> # 読めなかった項目は値 None と error を返す (ok=True のまま. get_angles_once と同じ. 呼び出し側が例外にしないため).
> #   2.9.6 は返事がないとき 例外にせず, リストを返す関数は [] を, 1 つの値を返す関数は -1 を返す.
> #   これも読めなかったとして value None・error "no reply"・returned (返ってきた値そのまま) にする (codex R1 必須 2).
> #   前提 (この機体で確かめていない. codex R2): 番地の値は 1 バイトで返る (ff は 255 になり -1 にならない).
> #   2 バイトの ffff が返る形だと符号つきで -1 になり, 返事なしと見分けられない. raw=True のバイト列で確かめる.
> #   2.9.6 の read は返事がないと 1 回 0.1 秒ほど待つ (途中まで返ると 0.2 秒近く). 頼む数を増やすと, その分
> #   daemon がほかの命令 (ゲームパッドの stop も) を受けるのが遅れる. 呼び出し側で数を絞る (codex R1 必須 1).
> # 頼み方がおかしいとき (regs の形・番号の範囲) だけ ok=False で, そのときは何も読まない.
> #   {"cmd": "read_servo", "angles": true, "currents": true, "status": false, "gripper": false,
> #    "regs": [[servo_id, addr], ...], "raw": false}
> #   angles / currents は既定で読む. status / gripper / regs は頼んだときだけ.
> #   regs: get_servo_data(servo_id, addr) を 1 つずつ (servo_id 1〜7. 7 = 爪. addr 0〜100. 32 個まで).
> #         この版の get_servo_data は番地を 1 つ渡すだけなので, 2 バイトの値は下位と上位の番地を別々に頼む.
> #   raw: 返ってきたバイト列 (16 進) も返す (形の分からない返事を確かめる用).
> # 返事: {"ok": true, "t": Pi の時刻, "total_ms": ..., "items": {名前: {"value": ..., "ms": ..., ("error"), ("raw")}},
> #        "regs": [[servo_id, addr, value, ms], ...]}
> SERVO_READ_MAX_REGS = 32
> 
> 
> def _servo_read_one(fn, args, want_raw, no_reply=None):
>     """読む関数を 1 回だけ呼ぶ. 返事のバイト列は _read を一時的に包んで写す (daemon は 1 件ずつなので混ざらない).
>     no_reply: 2.9.6 が返事のないときに返す値 ([] か -1). これが返ったら value None・error にする."""
>     item = {}
>     cap = []
>     if want_raw:
>         orig = _mc._read
> 
>         def _cap_read(*a, **k):
>             d = orig(*a, **k)
>             cap.append(d)
>             return d
>         _mc._read = _cap_read
>     t0 = time.perf_counter()
>     try:
>         v = fn(*args)
>         if isinstance(v, tuple):
>             v = list(v)
>         if v is None or (no_reply is not None and v == no_reply):
>             item["value"] = None
>             item["error"] = "no reply"
>             item["returned"] = v
>         else:
>             item["value"] = v
>     except Exception as e:
>         item["value"] = None
>         item["error"] = f"{type(e).__name__}: {e}"
>     finally:
>         item["ms"] = round((time.perf_counter() - t0) * 1000.0, 2)
>         if want_raw:
>             del _mc._read           # インスタンスに置いた包みを外す (クラスの _read に戻る)
>             item["raw"] = [d.hex() if isinstance(d, (bytes, bytearray)) else repr(d) for d in cap]
>     try:
>         json.dumps(item["value"])
>     except (TypeError, ValueError):
>         item["value"] = repr(item["value"])[:200]
>     return item
> 
> 
> def handle_servo_read(cmd_obj):
>     regs = cmd_obj.get("regs")
>     if regs is None:                # 頼まないのは「ない」か None だけ ({}・""・0 は形がおかしいとして断る. codex R2)
>         regs = []
>     if not isinstance(regs, (list, tuple)) or len(regs) > SERVO_READ_MAX_REGS:
>         return {"ok": False, "error": f"regs must be a list of at most {SERVO_READ_MAX_REGS} [servo_id, addr]"}
>     pairs = []
>     for r in regs:
>         try:
>             if not isinstance(r, (list, tuple)) or len(r) != 2:
>                 raise ValueError("length")
>             # 整数だけ (1.9 を 1 に丸めて読まない. True も数にしない. codex R1 推奨)
>             if not all(isinstance(x, int) and not isinstance(x, bool) for x in r):
>                 raise TypeError("not int")
>             sid, addr = r
>         except (TypeError, ValueError):
>             return {"ok": False, "error": f"bad reg: {r!r}"}
>         if not (1 <= sid <= 7) or not (0 <= addr <= 100):
>             return {"ok": False, "error": f"reg out of range (servo_id 1..7, addr 0..100): {r!r}"}
>         pairs.append((sid, addr))
>     want_raw = bool(cmd_obj.get("raw", False))
>     plan = []
>     if cmd_obj.get("angles", True):
>         plan.append(("angles", "get_angles", []))
>     if cmd_obj.get("currents", True):
>         plan.append(("currents", "get_servo_currents", []))
>     if cmd_obj.get("status", False):
>         plan.append(("status", "get_servo_status", []))
>     if cmd_obj.get("gripper", False):
>         plan.append(("gripper_value", "get_gripper_value", -1))
>     t_start = time.perf_counter()
>     t_wall = time.time()
>     items = {}
>     for key, name, no_reply in plan:
>         fn = getattr(_mc, name, None)
>         if fn is None:
>             items[key] = {"value": None, "ms": 0.0, "error": f"{name} is not available in this pymycobot environment"}
>             continue
>         items[key] = _servo_read_one(fn, (), want_raw, no_reply)
>     out_regs = []
>     raw_regs = []
>     if pairs:
>         fn = getattr(_mc, "get_servo_data", None)
>         for sid, addr in pairs:
>             if fn is None:
>                 out_regs.append([sid, addr, None, 0.0])
>                 raw_regs.append({"servo_id": sid, "addr": addr, "raw": None,
>                                  "error": "get_servo_data is not available in this pymycobot environment"})
>                 continue
>             it = _servo_read_one(fn, (sid, addr), want_raw, -1)
>             out_regs.append([sid, addr, it["value"], it["ms"]])
>             if want_raw or "error" in it:
>                 raw_regs.append({"servo_id": sid, "addr": addr, "raw": it.get("raw"), "error": it.get("error")})
>     resp = {"ok": True, "t": t_wall, "total_ms": round((time.perf_counter() - t_start) * 1000.0, 2),
>             "items": items, "regs": out_regs}
>     if raw_regs:
>         resp["regs_detail"] = raw_regs
>     return resp
> 
> 
260a382,385
> 
>     # 2026-11-07 依頼 109: 関節と爪の電流を読む (読むだけ. 純追記). handle_servo_read の説明を参照.
>     elif cmd == "read_servo":
>         return handle_servo_read(cmd_obj)
ping → {'ok': True, 'daemon': 'mecharm_daemon', 'fresh_mode': 0}
get_angles → {'ok': True, 'angles': [-0.08, 92.37, -5.09, 7.47, -89.56, -29.44]}
read_servo → {'ok': True, 't': 1665645171.1441107, 'total_ms': 165.4, 'items': {'angles': {'value': [-0.08, 92.37, -5.09, 7.47, -89.56, -29.44], 'ms': 16.42, 'raw': ['fefe0e20fff82415fe0302ebdd04f480fa']}, 'currents': {'value': None, 'error': 'no reply', 'returned': [], 'ms': 114.57, 'raw': ['None']}, 'status': {'value': [0, 0, 0], 'ms': 15.16, 'raw': ['fefe08e4000000000000fa']}, 'gripper_value': {'value': 95, 'ms': 18.93, 'raw': ['fefe03655ffa']}}, 'regs': []}
   currents = None (no reply)
   status = [0, 0, 0] 
   gripper_value = 95 
できました。記録: /Volumes/KIOXIA/r2r2r-data/archive/mecharm_daemon_premerge_readservo_20261107_175619
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 tools/servo_current_probe.py --seconds 10
[記録] /Volumes/KIOXIA/r2r2r-data/diag/servo_current_20261107/175645_solo
---- 始めの 1 回 (読めるものを全部)
  angles         [-0.08, 92.37, -5.09, 7.47, -89.56, -29.44]  (18.09 ms)  raw=['fefe0e20fff82415fe0302ebdd04f480fa']
  currents       None  (109.93 ms)  error=no reply  raw=['None']
  status         [0, 0, 0]  (18.67 ms)  raw=['fefe08e4000000000000fa']
  gripper_value  95  (15.85 ms)  raw=['fefe03655ffa']
  servo 1 (j0)  60:0  61:0  69:0  70:0
  servo 2 (j1)  60:0  61:0  69:1  70:128
  servo 3 (j2)  60:0  61:0  69:0  70:0
  servo 4 (j3)  60:0  61:0  69:0  70:0
  servo 5 (j4)  60:0  61:0  69:0  70:0
  servo 6 (j5)  60:0  61:0  69:0  70:0
  servo 7 (爪)  60:0  61:0  69:0  70:0
  番地 1 つの読み取り: 中央値 19.9 ms
  Pi の中の合計 709.67 ms
  往復 720.2 ms
読み始めます。印: 1 静止 2 空で閉じた 3 つかんだ 4 引っ張った 5 離した 6 押した 0 そのほか / p 止める・再開 / q 終わる
[読み] 16 回  7.4 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 16 回  やりとりの失敗 0 回
[読み] 33 回  7.7 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 33 回  やりとりの失敗 0 回
[読み] 50 回  7.9 Hz  往復の中央値 123.7 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 50 回  やりとりの失敗 0 回
[読み] 67 回  7.9 Hz  往復の中央値 124.2 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 67 回  やりとりの失敗 0 回
[読み] 81 回  7.9 Hz  往復の中央値 127.1 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 81 回  やりとりの失敗 0 回
[終了] アームには何も送っていません (ゲームパッドで送った分を除く)。記録: /Volumes/KIOXIA/r2r2r-data/diag/servo_current_20261107/175645_solo
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % 
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 tools/servo_current_probe.py --with-pad
[記録] /Volumes/KIOXIA/r2r2r-data/diag/servo_current_20261107/175706_pad
/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[91550]: Class SDLApplication is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1025612c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0890). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDLAppDelegate is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561318) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b08e0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDLTranslatorResponder is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561390) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0958). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDLMessageBoxPresenter is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1025613b8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0980). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDL_cocoametalview is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561408) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b09d0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDLOpenGLContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561458) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0a20). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDL_ShapeData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1025614d0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0a98). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDL_CocoaClosure is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561520) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0ae8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDL_VideoData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561570) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0b38). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDL_WindowData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1025615c0) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0b88). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDLWindow is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1025615e8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0bb0). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class Cocoa_WindowListener is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561610) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0bd8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDLView is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561688) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0c50). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class METAL_RenderData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561700) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0cc8). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class METAL_TextureData is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561750) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0d18). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDL_RumbleMotor is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x102561778) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0d40). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
objc[91550]: Class SDL_RumbleContext is implemented in both /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/pygame/.dylibs/libSDL2-2.0.0.dylib (0x1025617c8) and /opt/homebrew/Caskroom/miniforge/base/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib (0x1279b0d90). This may cause spurious casting failures and mysterious crashes. One of the duplicates must be removed or renamed.
---- 始めの 1 回 (読めるものを全部)
  angles         [-0.08, 92.37, -5.09, 7.47, -89.56, -29.44]  (20.63 ms)  raw=['fefe0e20fff82415fe0302ebdd04f480fa']
  currents       None  (100.74 ms)  error=no reply  raw=['None']
  status         [0, 0, 0]  (20.16 ms)  raw=['fefe08e4000000000000fa']
  gripper_value  95  (21.44 ms)  raw=['fefe03655ffa']
  servo 1 (j0)  60:0  61:0  69:0  70:0
  servo 2 (j1)  60:0  61:0  69:0  70:0
  servo 3 (j2)  60:0  61:0  69:0  70:0
  servo 4 (j3)  60:0  61:0  69:0  70:0
  servo 5 (j4)  60:0  61:0  69:0  70:0
  servo 6 (j5)  60:0  61:0  69:0  70:0
  servo 7 (爪)  60:0  61:0  69:0  70:0
  番地 1 つの読み取り: 中央値 19.8 ms
  Pi の中の合計 712.86 ms
  往復 724.7 ms
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261107_175708
[実機] daemon に送ります。起動したときの姿勢: -0.08 +92.37 -5.09 +7.47 -89.56 -29.44
[注意] 起動したときの姿勢が守りの外: j1=+92.37。この関節を含む操作は送りません（HOME の長押しは送れます）
コントローラーを待っています（つないでいなければ、今つないでください）
読み始めます。印はターミナルかゲームパッドの窓で: 1 静止 2 空で閉じた 3 つかんだ 4 引っ張った 5 離した 6 押した 0 そのほか / p 止める・再開 / 終わるときはウィンドウを閉じる
[読み] 15 回  6.7 Hz  往復の中央値 127.5 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 15 回  やりとりの失敗 0 回
[読み] 30 回  6.9 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 30 回  やりとりの失敗 0 回
[読み] 45 回  7.0 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 45 回  やりとりの失敗 0 回
[読み] 60 回  7.1 Hz  往復の中央値 127.7 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 60 回  やりとりの失敗 0 回
[読み] 75 回  7.1 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 75 回  やりとりの失敗 0 回
[読み] 90 回  7.2 Hz  往復の中央値 127.5 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 90 回  やりとりの失敗 0 回
[読み] 105 回  7.2 Hz  往復の中央値 127.5 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 105 回  やりとりの失敗 0 回
[接続] PS4 Controller  GUID=03008fe54c050000cc09000000016800  軸=6  ボタン=16
[読み] 108 回  6.0 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 108 回  やりとりの失敗 0 回
[読み] 123 回  6.1 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 123 回  やりとりの失敗 0 回
[読み] 138 回  6.2 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 138 回  やりとりの失敗 0 回
[読み] 153 回  6.3 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 153 回  やりとりの失敗 0 回
[読み] 168 回  6.4 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 168 回  やりとりの失敗 0 回
[読み] 183 回  6.4 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 183 回  やりとりの失敗 0 回
[読み] 198 回  6.5 Hz  往復の中央値 127.5 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 198 回  やりとりの失敗 0 回
[読み] 213 回  6.5 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 213 回  やりとりの失敗 0 回
[読み] 228 回  6.6 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 228 回  やりとりの失敗 0 回
[読み] 243 回  6.6 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 243 回  やりとりの失敗 0 回
[読み] 258 回  6.7 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 258 回  やりとりの失敗 0 回
[読み] 273 回  6.7 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 273 回  やりとりの失敗 0 回
[読み] 287 回  6.7 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 287 回  やりとりの失敗 0 回
[読み] 302 回  6.7 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 302 回  やりとりの失敗 0 回
[読み] 317 回  6.8 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 317 回  やりとりの失敗 0 回
[読み] 332 回  6.8 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 332 回  やりとりの失敗 0 回
[読み] 346 回  6.8 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 346 回  やりとりの失敗 0 回
[読み] 361 回  6.8 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 361 回  やりとりの失敗 0 回
[読み] 376 回  6.8 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 376 回  やりとりの失敗 0 回
[読み] 391 回  6.8 Hz  往復の中央値 127.6 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 391 回  やりとりの失敗 0 回
[読み] 406 回  6.8 Hz  往復の中央値 127.7 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 406 回  やりとりの失敗 0 回
[読み] 421 回  6.8 Hz  往復の中央値 127.7 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 421 回  やりとりの失敗 0 回
[読み] 432 回  6.8 Hz  往復の中央値 127.7 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 432 回  やりとりの失敗 0 回
[送信] HOME → +0.00 +0.00 +0.00 +0.00 +0.00 -30.00  届いた（ずれ 1.31°）  届いた角度 -0.26 +1.23 +0.70 +0.70 +1.31 -29.61
[読み] 447 回  6.8 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 447 回  やりとりの失敗 0 回
[読み] 462 回  6.8 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 462 回  やりとりの失敗 0 回
[読み] 477 回  6.8 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 477 回  やりとりの失敗 0 回
[読み] 492 回  6.8 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 492 回  やりとりの失敗 0 回
[読み] 507 回  6.8 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 507 回  やりとりの失敗 0 回
[読み] 521 回  6.9 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 521 回  やりとりの失敗 0 回
[読み] 536 回  6.9 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 536 回  やりとりの失敗 0 回
[読み] 551 回  6.9 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 551 回  やりとりの失敗 0 回
[読み] 566 回  6.9 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 566 回  やりとりの失敗 0 回
[読み] 581 回  6.9 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 581 回  やりとりの失敗 0 回
[読み] 596 回  6.9 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 596 回  やりとりの失敗 0 回
[読み] 611 回  6.9 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 611 回  やりとりの失敗 0 回
[読み] 626 回  6.9 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 626 回  やりとりの失敗 0 回
[読み] 641 回  6.9 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 641 回  やりとりの失敗 0 回
[読み] 656 回  6.9 Hz  往復の中央値 127.9 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 656 回  やりとりの失敗 0 回
[読み] 671 回  6.9 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 671 回  やりとりの失敗 0 回
[読み] 686 回  6.9 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 686 回  やりとりの失敗 0 回
[読み] 701 回  6.9 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 701 回  やりとりの失敗 0 回
[読み] 716 回  6.9 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 716 回  やりとりの失敗 0 回

[終了] Ctrl+C
[終了] アームは動かしていません。記録: /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261107_175708
  [WARN] _daemon_request timeout (timeout=3.0s, cmd=read_servo). socket closed.
[読み] 731 回  6.8 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 730 回  やりとりの失敗 1 回
[読み] 731 回  6.8 Hz  往復の中央値 127.8 ms  電流が 6 個の数で読めた 0 回  項目が読めなかった 730 回  やりとりの失敗 1 回
[パッド] 鍵の待ち (ms): 読んでいる間 {'n': 11, 'median': 41.66, 'p95': 132.41, 'max': 139.99} / 止めている間 None
[終了] アームには何も送っていません (ゲームパッドで送った分を除く)。記録: /Volumes/KIOXIA/r2r2r-data/diag/servo_current_20261107/175706_pad
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % python3 tools/servo_current_probe.py --with-pad --no-currents --regs 2:69,2:70,7:69,7:70
usage: servo_current_probe.py [-h] [--with-pad] [--seconds SECONDS] [--regs REGS] [--status] [--gripper] [--no-currents] [--gap GAP]
servo_current_probe.py: error: --with-pad のときは 1 回に読む数 (角度・電流・状態・爪・番地の合計) を 4 までにしてください (今 5). daemon が読んでいる間はゲームパッドの命令 (stop も) が待たされます
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % 
