フィジカルAI研究室を作る Log#21 | ゲームパッドで mechArm 270 を直す形が固まった

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

小型ロボットアーム mechArm 270 をゲームパッドで手直しするときは、長押しなら押した向きへ15°先の目標を1回だけ送って離したら止める、1回押しなら動かす関節だけを送る、という形がいちばん素直に動いた。実物のアームで、送り方を変えた試しを4回、ゲームパッドでの操作を7回記録して確かめた(2026-11-05)。押しても動かない、ほかの関節がつられて動く、受付なしが続く、という3つの困りごとは、どれもサーボの性能ではなく、送り方と、アームの中の受け口のプログラム(daemon)の待ち方が原因だった。

この回でやったことで、次のことが変わる。

  • 良くなること:受付なし(押したのに無視されて何も起きない)は、1本の記録で40回あったのが、最後の記録で0回になった。1回押しで次を受け付けるまでの待ちは、中央の値で2.79秒から0.17秒になった。長押しを止めるたびに、動かしていない関節が1〜1.5°ずつずれて積み上がる現象(最初の記録で j1 が4.8°から37°まで上がった)も止まった
  • もたらされること:AI(Physical Intelligence の π0.5)の実機推論で、アームが失敗しかけたところを人がゲームパッドで直し、その直しを学習のデータに回す準備がそろった。daemon の待ち方も直したので、π0.5 の推論で送る指令の返りも速くなる見込み(推論ではまだ測っていない)
  • 時間・費用:実機での試しと直しは15:34〜17:13の約1時間40分。GPU は使っていないので費用は0円

前の回(LOG436)で、ゲームパッドで実物のアームを動かせるようにした。ただ、長押しの動きがカクカクしていた。そこで、どこまでなめらかに動かせるのかを先に測った。その結果、ゆっくり動かすとどの命令でも0.2秒ごとに進んでは止まる、つまりなめらかさの限界はサーボの側にあると分かった。それに合わせて操作の形を作り直し、実機で7回使いながら、出てきた困りごとを順に直した。

段階やったこと結果
送り方ごとの動きを測る
根元 j0 を、1回送る・送り直し・jog など9通りで動かした(jog_probe 3回)
速さ20以上で1回送るとなめらか。ゆっくりだと、どの命令も0.2秒ごとに止まる。jog は止まらないことがあった
長押しを作り直す
15°先へ1回送り、離したら daemon の stop で止める。daemon に stop を足した
長押しは動いたが、止めるたびにほかの関節がずれ、1回押しが動かないことが多かった
ずれと動かない原因を探す
止めたあとに指令へ戻す形を試したら、もっと動かなくなった
重さで届かない関節の指令を送ると、次の指令が無視されやすくなっていた
小さな動きを測る
1°・2°を3通りの送り方で12回ずつ(jog_probe small)
動かす関節だけを送る形は12回中12回動いた
動かす関節だけ送る
十字キーは send_angle(1関節だけの指令)にした
ほかの関節がつられて動かなくなった
受付なしを減らす
1回押しの待ちを短くし、daemon の読み直しを0.2秒→0.02秒に
受付なし 40回→13回→0回
押した瞬間に送らない
離したら1刻み、押し続けたら長押しの、どちらかだけを送る
向きを変えたときの余分な1°の動きがなくなった

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

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

作業ログ ― jog の試しから、動かす関節だけを送るゲームパッドと daemon の読み直しまで

この回の数字は、すべて実機の記録(KIOXIA の runs/experiments/gamepad_teleop/ の7本と、diag/jog_probe_20261105_*/ の4本)から数えたものです。見込みの数字は、見込みと書いています。

この回で使う言葉

言葉意味
daemon(デーモン)
アームの中の Raspberry Pi で動き続けている受け口のプログラム(mecharm_daemon.py)。Mac から送った指令を受け取り、アームへ流す。ゲームパッドも π0.5 の推論も、ここを通ってアームを動かす
send_angles
6つの関節の角度をまとめて送る命令(pymycobot の命令。pymycobot は mechArm を作っている Elephant Robotics の Python のライブラリ)
send_angle
1つの関節の角度だけを送る命令。ほかの関節には何も送らない
speed
送る命令に付ける速さの設定(1〜100)。この回は20(実測で毎秒約40°)
jog
関節・向き・速さを渡すと、止める命令が来るまで一定の速さで動き続ける命令
stop・jog_stop
動いている途中で止める命令。jog_stop は jog を止める。stop は動き全体を止める
fresh_mode
1にすると、前の動きが終わるのを待たずに、新しい指令で上書きできるアームの設定
受付なし
ゲームパッドで押したが、前の操作がまだ終わっていないので、その押しを捨てたこと

15:34 送り方を4通り変えて根元 j0 を動かした(jog_probe 1回目)

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

ファイルの一覧(31本)

01_diag_jog_probe_20261105_153401_result.json ― diag/jog_probe_20261105_153401/result.json・7,014字

02_sec03.txt ― jog_probe 2回目の端末の出力(15:39)・3,818字

03_diag_jog_probe_20261105_153952_stop_result.json ― diag/jog_probe_20261105_153952_stop/result.json・13,725字

04_sec04.txt ― jog_probe 3回目の端末の出力(15:43)・3,286字

05_diag_jog_probe_20261105_154332_hold_result.json ― diag/jog_probe_20261105_154332_hold/result.json・13,923字

06_sec05.md ― 別の Claude のレビュー(長押しの作り直しと daemon に stop を足すスクリプト)・3,618字

07_sec06.txt ― teleop_20261105_160038 を1回押しと止める処理ごとに並べた出力・4,200字

08_sec06.txt ― ゲームパッドの端末の出力(16:00 teleop_20261105_160038)・6,617字

09_sec07.txt ― ゲームパッドの端末の出力(16:13 teleop_20261105_161347)・3,357字

10_sec07.txt ― ゲームパッドの端末の出力(16:22 teleop_20261105_162224)・3,075字

11_diag_jog_probe_20261105_162617_small_result.json ― diag/jog_probe_20261105_162617_small/result.json・5,468字

12_sec09.txt ― ゲームパッドの端末の出力(16:31 teleop_20261105_163144)・7,042字

13_sec10.txt ― teleop_20261105_163620 を1回押しと止める処理ごとに並べた出力・4,926字

14_sec10.txt ― ゲームパッドの端末の出力(16:36 teleop_20261105_163620)・9,816字

15_sec11.txt ― daemon の読み直しを速くしたときと、ゲームパッドの端末の出力(17:03 teleop_20261105_170313)・11,242字

16_sec11.txt ― teleop_20261105_170313 を1回押しと止める処理ごとに並べた出力・5,656字

17_teleop.py_commit_452a3b6_tools_gamepad_teleop.py.txt ― gamepad_teleop.py(commit 452a3b6) / tools/gamepad_teleop.py・75,916字

18_eop.py_89_commit_452a3b6_tools_test_gamepad_teleop.py.txt ― test_gamepad_teleop.py(テスト89件・commit 452a3b6) / tools/test_gamepad_teleop.py・69,225字

19_jog_probe.sh_tools_jog_probe.sh.txt ― jog_probe.sh / tools/jog_probe.sh・5,902字

20_jog_probe_pi.py_tools_pi_jog_probe_pi.py.txt ― jog_probe_pi.py / tools/pi/jog_probe_pi.py・18,187字

21_daemon_add_stop.sh_tools_daemon_add_stop.sh.txt ― daemon_add_stop.sh / tools/daemon_add_stop.sh・4,295字

22_daemon_fast_read.sh_tools_daemon_fast_read.sh.txt ― daemon_fast_read.sh / tools/daemon_fast_read.sh・4,463字

23_i_mecharm_daemon.py_stop_tools_pi_mecharm_daemon.py.txt ― Pi の mecharm_daemon.py(stop を足し、読み直しを速くしたあと) / tools/pi/mecharm_daemon.py・12,781字

24_sec18.json ― 16:00 の記録 runs/experiments/gamepad_teleop/teleop_20261105_160038/log.jsonl(376行)・225,021字

25_sec18.json ― 16:13 の記録 runs/experiments/gamepad_teleop/teleop_20261105_161347/log.jsonl(118行)・66,967字

26_sec18.json ― 16:22 の記録 runs/experiments/gamepad_teleop/teleop_20261105_162224/log.jsonl(86行)・43,194字

27_sec18.json ― 16:31 の記録 runs/experiments/gamepad_teleop/teleop_20261105_163144/log.jsonl(326行)・182,198字

28_sec18.json ― 16:36 の記録 runs/experiments/gamepad_teleop/teleop_20261105_163620/log.jsonl(386行)・225,335字

29_sec18.json ― 17:03 の記録 runs/experiments/gamepad_teleop/teleop_20261105_170313/log.jsonl(549行)・330,830字

30_sec18.json ― 17:11 の記録 runs/experiments/gamepad_teleop/teleop_20261105_171125/log.jsonl(235行)・138,766字

31_diag_jog_probe_20261105_153952_stop_console.txt ― diag/jog_probe_20261105_153952_stop/console.txt・3,499字

前の回の終わりに用意した試し(tools/jog_probe.sh)を流しました。daemon を一時止め、Pi から直接アームにつないで、根元の関節 j0 だけを、始めの角度から25°以内で動かします。0.1秒ごとの速さを並べると、なめらかかどうかが読めます(数字がそろっていればなめらか、0 や負の数が混ざっていれば、止まったり戻ったりしている)。

試し送り方結果
A
10°先を1回だけ送る(speed 20)
10°を約0.27秒で動いた。加速も減速もなめらか
B
0.1秒おきに、読んだ角度の3°先を送り直す(前のゲームパッドの長押し)
0.1秒ごとの速さが 29、−13、73、−8、34°/秒。3°ずつ進んで止まるのを繰り返した
C
B に fresh_mode を足す
1回送るたびに行きすぎて約1°戻る、のこぎり型の動き
D
jog(speed 10・30)を1秒
速さは一定でいちばんなめらか(speed 30 で毎秒約65°)。ただし speed 10 では jog_stop のあとも同じ速さで動き続け、25°の守りに当たって止まった。向きは説明書きと逆(1を送ると j0 が減った)

jog は動きがいちばんなめらかなのに、離しても止まらない回があります。ゲームパッドの長押しに使うには、止まり方を先に確かめる必要がありました。

jog_probe 1回目の端末の出力(15:34)

(base) shimazueiichi@shimadzueiichinoMacBook-Pro ~ % cd ~/r2r2r-scripts
git tag gamepad-stream-v1 413f7e1
git add tools/jog_probe.sh tools/pi/jog_probe_pi.py
git commit -m "jog_probe: j0 を4通りで動かし、なめらかさと限界を測る"
tools/jog_probe.sh
[main 2c28f88] jog_probe: j0 を4通りで動かし、なめらかさと限界を測る
 2 files changed, 457 insertions(+)
 create mode 100755 tools/jog_probe.sh
 create mode 100644 tools/pi/jog_probe_pi.py
jog_probe 20261105_153401 (結果: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_153401)
--- デーモンの状態 (止める前)
mode=systemd
pid=502
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=502
checker=no
--- デーモンの状態 (止めたあと)
mode=none
pid=なし
listen=no
serial_users=(なし)
checker=no
pymycobot 2.9.6 (/usr/local/lib/python2.7/dist-packages/pymycobot/__init__.py)
始めの角度: [-0.17, 92.63, 1.49, 0.61, -96.06, -29.35]
HOME から離れています。HOME [0,0,0,0,0,-30] へ送ります  (Enter で進む / q と Enter で終わる)

根元 j0 だけを、始めの角度から 25° 以内で動かします。毎回始めの角度へ戻します。

0. 読み取りの速さ (動かさない)
  読み取り 1 回: 中央 16.0 ms / 最大 19.3 ms / 空で返った割合 0.0

A_step_10deg を始めます  (Enter で進む / q と Enter で終わる)

  [A_step_10deg] travel_deg=9.32  mean_speed=4.96  median_speed=0.0  max_speed=30.97  speed_cv=None  stall_ratio=None  arrive_sec=0.4
        0.1 秒ごとの速さ (°/秒): 31.0 -3.4 -0.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  始めの角度へ戻した: 着いた j0=1.23

B_stream を始めます  (Enter で進む / q と Enter で終わる)

  [B_stream] travel_deg=12.39  mean_speed=12.38  median_speed=28.91  max_speed=73.27  speed_cv=1.09  stall_ratio=0.4  overshoot_deg=0.09  stop_latency_sec=0.1  n_sends=7
        0.1 秒ごとの速さ (°/秒): 28.9 -13.2 73.3 -8.3 33.8
  始めの角度へ戻した: 着いた j0=-0.08

C_stream_fresh を始めます  (Enter で進む / q と Enter で終わる)

  [C_stream_fresh] travel_deg=7.91  mean_speed=8.67  median_speed=-11.71  max_speed=-2.32  speed_cv=None  stall_ratio=None  overshoot_deg=2.9  stop_latency_sec=0.26  n_sends=8
        0.1 秒ごとの速さ (°/秒): -6.1 -2.3 -31.0 -11.7 -16.5
  始めの角度へ戻した: 着いた j0=-1.58

D_jog_speed10 を始めます  (Enter で進む / q と Enter で終わる)

  守り: j0 が始めから -25.8° 離れたので止めます
  [D_jog_speed10] travel_deg=-2.37  mean_speed=-8.78  overshoot_deg=-23.38  stop_latency_sec=0.28  jog_moved=True
  始めの角度へ戻した: 着いた j0=-1.4

D_jog_speed30 を始めます  (Enter で進む / q と Enter で終わる)

  守り: j0 が始めから 26.7° 離れたので止めます
  守り: j0 が始めから 31.5° 離れたので止めます
  [D_jog_speed30] travel_deg=-27.06  mean_speed=-45.1  median_speed=-59.41  max_speed=-54.33  speed_cv=None  stall_ratio=None  overshoot_deg=-4.74  stop_latency_sec=0.0  jog_moved=True
        0.1 秒ごとの速さ (°/秒): -54.3 -64.5
  始めの角度へ戻した: 着いた j0=0.08
結果: /tmp/jog_probe_20261105_153401.json
Connection to 192.168.2.1 closed.
--- jog_probe_pi.py の終了コード: 0
結果の JSON: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_153401/result.json
--- デーモンを戻す (systemctl start)
mode=systemd
pid=19339
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=19339
checker=no
デーモンは戻った (5555 LISTEN)

diag/jog_probe_20261105_153401/result.json

{"started_at": "2022-10-13 15:26:29", "pymycobot": "2.9.6", "params": {"speed": 20, "stream_interval": 0.1, "stream_ahead": 3.0, "jog_speeds": [10, 30], "guard_deg": 25.0}, "tests": {"read": {"median_ms": 16.0, "max_ms": 19.3, "empty_ratio": 0.0}, "A_step_10deg": {"n_samples": 114, "travel_deg": 9.32, "active_sec": 1.88, "mean_speed": 4.96, "bin_speeds": [31.0, -3.4, -0.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "median_speed": 0.0, "max_speed": 30.97, "speed_cv": null, "stall_ratio": null, "arrive_sec": 0.4, "samples": [[0.1445, 0.17], [0.1626, 0.35], [0.1808, 0.87], [0.2006, 1.23], [0.2207, 1.93], [0.2407, 2.72], [0.2607, 3.51], [0.2808, 4.39], [0.3007, 4.92], [0.3207, 5.8], [0.3407, 6.76], [0.3607, 7.64], [0.3807, 8.52], [0.4006, 8.96], [0.4186, 9.58], [0.4346, 9.93], [0.4506, 9.93], [0.4669, 10.01], [0.4826, 10.01], [0.4986, 9.93], [0.5146, 9.75], [0.5306, 9.66], [0.547, 9.58], [0.5626, 9.49], [0.5785, 9.49], [0.5947, 9.49], [0.6106, 9.49], [0.627, 9.49], [0.6426, 9.49], [0.6586, 9.49], [0.6746, 9.49], [0.6906, 9.49], [0.7069, 9.49], [0.7225, 9.49], [0.7386, 9.49], [0.7546, 9.49], [0.7706, 9.49], [0.787, 9.49], [0.8026, 9.49], [0.8186, 9.49], [0.8346, 9.49], [0.8506, 9.49], [0.867, 9.49], [0.8825, 9.49], [0.8986, 9.49], [0.915, 9.49], [0.9312, 9.49], [0.9494, 9.49], [0.9592, 9.49], [0.9709, 9.49], [0.9866, 9.49], [1.0026, 9.49], [1.0186, 9.49], [1.0345, 9.49], [1.0506, 9.49], [1.0665, 9.49], [1.0826, 9.49], [1.0985, 9.49], [1.1145, 9.49], [1.1306, 9.49], [1.1466, 9.49], [1.1626, 9.49], [1.1786, 9.49], [1.1946, 9.49], [1.2107, 9.49], [1.2265, 9.49], [1.2426, 9.49], [1.2586, 9.49], [1.2745, 9.49], [1.2907, 9.49], [1.3066, 9.49], [1.3225, 9.49], [1.3385, 9.49], [1.3546, 9.49], [1.3707, 9.49], [1.3865, 9.49], [1.4026, 9.49], [1.4186, 9.49], [1.4346, 9.49], [1.4507, 9.49], [1.4666, 9.49], [1.4826, 9.49], [1.4986, 9.49], [1.5146, 9.49], [1.5306, 9.49], [1.5465, 9.49], [1.5626, 9.49], [1.5786, 9.49], [1.5946, 9.49], [1.6107, 9.49], [1.6266, 9.49], [1.6425, 9.49], [1.6586, 9.49], [1.6746, 9.49], [1.6907, 9.49], [1.7065, 9.49], [1.7226, 9.49], [1.7448, 9.49], [1.765, 9.49], [1.7869, 9.49], [1.8089, 9.49], [1.8309, 9.49], [1.8467, 9.49], [1.8626, 9.49], [1.8786, 9.49], [1.8945, 9.49], [1.9106, 9.49], [1.9268, 9.49], [1.9425, 9.49], [1.9586, 9.49], [1.9746, 9.49], [1.9906, 9.49], [2.0067, 9.49], [2.0225, 9.49]], "t_stop": null}, "B_stream": {"n_samples": 87, "travel_deg": 12.39, "active_sec": 1.0, "mean_speed": 12.38, "bin_speeds": [28.9, -13.2, 73.3, -8.3, 33.8], "median_speed": 28.91, "max_speed": 73.27, "speed_cv": 1.09, "stall_ratio": 0.4, "overshoot_deg": 0.09, "stop_latency_sec": 0.1, "n_sends": 7, "samples": [[0.0143, 0.0], [0.0435, 0.0], [0.1019, 0.0], [0.1619, 0.0], [0.1937, 0.35], [0.2137, 0.96], [0.2315, 1.31], [0.2475, 2.28], [0.2635, 2.81], [0.2937, 3.6], [0.3138, 3.69], [0.3337, 3.69], [0.3537, 3.6], [0.3737, 3.16], [0.4419, 3.16], [0.4596, 5.09], [0.4755, 5.62], [0.7636, 9.22], [0.8058, 8.87], [0.8305, 8.61], [0.9501, 10.19], [0.9816, 10.98], [0.9996, 11.86], [1.0155, 12.39], [1.0316, 12.56], [1.0477, 12.65], [1.0635, 12.74], [1.0795, 12.74], [1.0955, 12.65], [1.1115, 12.48], [1.1277, 12.3], [1.1435, 12.3], [1.1595, 12.21], [1.1755, 12.21], [1.1915, 12.21], [1.2078, 12.3], [1.2235, 12.39], [1.2395, 12.48], [1.2555, 12.48], [1.2715, 12.56], [1.2878, 12.56], [1.3035, 12.65], [1.3195, 12.65], [1.3355, 12.65], [1.3515, 12.65], [1.3677, 12.56], [1.3835, 12.56], [1.3995, 12.56], [1.4155, 12.56], [1.4315, 12.56], [1.4477, 12.56], [1.4635, 12.56], [1.4795, 12.56], [1.4955, 12.56], [1.5115, 12.56], [1.5277, 12.56], [1.5435, 12.56], [1.5595, 12.56], [1.5755, 12.56], [1.5915, 12.56], [1.6078, 12.56], [1.6235, 12.56], [1.6395, 12.56], [1.6555, 12.56], [1.6717, 12.56], [1.6877, 12.56], [1.7035, 12.56], [1.7195, 12.56], [1.7355, 12.56], [1.7515, 12.56], [1.7677, 12.56], [1.7835, 12.56], [1.7995, 12.56], [1.8155, 12.56], [1.8315, 12.56], [1.8477, 12.48], [1.8635, 12.48], [1.8795, 12.48], [1.8955, 12.48], [1.9115, 12.48], [1.9276, 12.48], [1.9435, 12.48], [1.9595, 12.48], [1.9755, 12.48], [1.9915, 12.48], [2.0077, 12.48], [2.0235, 12.48]], "t_stop": 1.0155}, "C_stream_fresh": {"n_samples": 87, "travel_deg": 7.91, "active_sec": 0.91, "mean_speed": 8.67, "bin_speeds": [-6.1, -2.3, -31.0, -11.7, -16.5], "median_speed": -11.71, "max_speed": -2.32, "speed_cv": null, "stall_ratio": null, "overshoot_deg": 2.9, "stop_latency_sec": 0.26, "n_sends": 8, "samples": [[0.0191, -0.08], [0.0472, -0.08], [0.0714, -0.08], [0.087, -0.08], [0.103, -0.08], [0.119, -0.08], [0.1353, -0.08], [0.283, -3.86], [0.311, -3.69], [0.3364, -3.42], [0.3555, -2.9], [0.3661, -2.81], [0.3835, -2.81], [0.4096, -3.25], [0.5796, -7.29], [0.6051, -6.5], [0.6237, -6.06], [0.6435, -5.44], [0.6603, -5.36], [0.6835, -5.36], [0.8243, -9.49], [0.8553, -9.31], [0.8811, -8.96], [0.8994, -8.26], [0.9151, -7.99], [0.931, -7.99], [1.0791, -12.12], [1.095, -11.95], [1.111, -11.6], [1.127, -11.25], [1.1434, -10.72], [1.159, -10.63], [1.1791, -10.63], [1.1949, -10.54], [1.2169, -10.89], [1.2401, -11.25], [1.2638, -11.42], [1.283, -11.42], [1.2998, -11.33], [1.319, -11.25], [1.3352, -10.98], [1.351, -10.89], [1.3679, -10.81], [1.387, -10.81], [1.4032, -10.81], [1.419, -10.81], [1.4357, -10.81], [1.4511, -10.81], [1.467, -10.81], [1.483, -10.89], [1.499, -10.89], [1.5153, -10.89], [1.531, -10.89], [1.547, -10.89], [1.563, -10.89], [1.579, -10.89], [1.5954, -10.89], [1.611, -10.89], [1.627, -10.89], [1.6429, -10.89], [1.659, -10.89], [1.6753, -10.89], [1.691, -10.89], [1.707, -10.89], [1.723, -10.89], [1.739, -10.89], [1.7553, -10.89], [1.771, -10.89], [1.787, -10.89], [1.803, -10.89], [1.819, -10.89], [1.8353, -10.89], [1.851, -10.89], [1.867, -10.89], [1.883, -10.89], [1.8991, -10.89], [1.9153, -10.89], [1.931, -10.89], [1.947, -10.89], [1.963, -10.89], [1.979, -10.89], [1.9953, -10.89], [2.011, -10.89], [2.027, -10.89], [2.0431, -10.89], [2.059, -10.89], [2.0754, -10.89]], "t_stop": 1.0605}, "D_jog_speed10": {"n_samples": 17, "travel_deg": -2.37, "active_sec": 0.27, "mean_speed": -8.78, "overshoot_deg": -23.38, "stop_latency_sec": 0.28, "jog_moved": true, "samples": [[0.0292, -0.26], [0.0476, -0.26], [0.0673, -0.26], [0.0873, -0.26], [0.1073, -0.26], [0.1273, -0.26], [0.1482, -0.26], [0.1681, -0.26], [0.1794, -0.26], [0.2993, -2.63], [1.0512, -18.89], [1.0712, -20.03], [1.1308, -21.0], [1.1908, -21.62], [1.2508, -22.06], [1.3108, -24.69], [1.3708, -26.01]], "t_stop": 1.0302}, "D_jog_speed30": {"n_samples": 12, "travel_deg": -27.06, "active_sec": 0.6, "mean_speed": -45.1, "bin_speeds": [-54.3, -64.5], "median_speed": -59.41, "max_speed": -54.33, "speed_cv": null, "stall_ratio": null, "overshoot_deg": -4.74, "stop_latency_sec": 0.0, "jog_moved": true, "samples": [[0.064, -0.52], [0.1243, -0.52], [0.1841, -0.08], [0.244, 1.4], [0.304, 3.77], [0.364, 7.03], [0.424, 10.72], [0.484, 14.67], [0.544, 18.54], [0.604, 22.5], [0.664, 26.54], [0.6922, 31.28]], "t_stop": 0.6731}}, "start": [-0.17, 1.23, 1.84, 0.52, 1.31, -29.35]}
別のタブで開く保存

15:39 jog と1回送る形の止め方を比べた(jog_probe 2回目)

jog_probe に、止め方を比べる組(stop)を足しました。jog(speed 5・10)と、20°先へ1回だけ送る形(speed 10・20)を1秒動かし、jog_stop・stop・今の角度へ送り直す(hold)の3つのどれで止まるかを見ます。守りに当たったときは、3つを全部送って止めるようにしました。

止め方結果
jog_stop(jog speed 5)
0.16秒で止まった。行きすぎ1.8°
stop(jog speed 10)
約0.1秒で止まった。行きすぎ3.7°
stop(jog speed 5)
止まらず、25°の守りまで動き続けた
今の角度へ送り直す(jog speed 5・10)
止まらなかった。jog は send_angles では上書きできず、次の試しの始めまで jog が続いていた

もう1つ、jog の speed 5 は0.12秒動いて0.08秒止まる階段状の動きでした。20°先へ1回送る形は、1秒のうちに目標へ着いてしまい、途中で止める試しになっていませんでした。

jog_probe 2回目の端末の出力(15:39)

02_sec03.txt3,818字・88行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % git add tools/jog_probe.sh tools/pi/jog_probe_pi.py
git commit -m "jog_probe: 止め方を比べる stop の組を足す (jog の向きは実機に合わせる)"
tools/jog_probe.sh stop
[main dcdf3f1] jog_probe: 止め方を比べる stop の組を足す (jog の向きは実機に合わせる)
 2 files changed, 96 insertions(+), 5 deletions(-)
jog_probe 20261105_153952 (結果: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_153952_stop)
--- デーモンの状態 (止める前)
mode=systemd
別のタブで開く保存

diag/jog_probe_20261105_153952_stop/result.json

{"started_at": "2022-10-13 15:32:20", "pymycobot": "2.9.6", "params": {"speed": 20, "stream_interval": 0.1, "stream_ahead": 3.0, "jog_speeds": [10, 30], "guard_deg": 25.0, "set": "stop", "jog_dir": {"+1": 0, "-1": 1}}, "tests": {"read": {"median_ms": 16.0, "max_ms": 18.1, "empty_ratio": 0.0}, "E_jog5_jogstop": {"n_samples": 137, "travel_deg": 11.15, "active_sec": 0.88, "mean_speed": 12.68, "bin_speeds": [7.6, 24.3, 4.4, 24.3, 6.6, 24.1], "median_speed": 15.89, "max_speed": 24.27, "speed_cv": 0.57, "stall_ratio": 0.0, "overshoot_deg": 1.76, "stop_latency_sec": 0.16, "read_fails": 1, "end_from_start_deg": 12.91, "how": "jog_stop", "speed": 5, "guard": false, "samples": [[0.1358, -0.43], [0.1556, -0.35], [0.1666, -0.26], [0.1772, -0.08], [0.1955, 0.0], [0.2157, 0.43], [0.2355, 0.87], [0.2558, 1.14], [0.2763, 1.49], [0.296, 1.93], [0.3156, 2.19], [0.3355, 2.37], [0.3551, 2.46], [0.375, 2.54], [0.395, 2.63], [0.4149, 2.72], [0.4349, 3.07], [0.455, 3.33], [0.4749, 3.86], [0.495, 4.57], [0.5149, 5.0], [0.5349, 5.27], [0.5549, 5.36], [0.5749, 5.44], [0.5949, 5.36], [0.6149, 5.36], [0.6349, 5.71], [0.6549, 5.97], [0.6749, 6.59], [0.6949, 7.2], [0.7149, 7.64], [0.7349, 7.91], [0.7549, 7.99], [0.7749, 8.08], [0.7949, 8.08], [0.8149, 8.08], [0.8349, 8.52], [0.8549, 8.7], [0.8749, 9.31], [0.8949, 9.93], [0.9149, 10.45], [0.9349, 10.63], [0.9549, 10.72], [0.9749, 10.72], [0.9949, 10.72], [1.0149, 10.72], [1.0469, 11.33], [1.0649, 11.95], [1.0808, 12.39], [1.0975, 12.91], [1.1129, 13.0], [1.1288, 13.09], [1.1453, 13.09], [1.162, 13.0], [1.179, 12.74], [1.2009, 12.56], [1.2168, 12.48], [1.234, 12.39], [1.2528, 12.39], [1.2691, 12.39], [1.2848, 12.48], [1.302, 12.48], [1.3208, 12.48], [1.3371, 12.48], [1.3528, 12.48], [1.37, 12.48], [1.3888, 12.48], [1.4051, 12.48], [1.4208, 12.48], [1.438, 12.48], [1.4568, 12.48], [1.4731, 12.48], [1.4888, 12.48], [1.506, 12.48], [1.5248, 12.48], [1.5411, 12.48], [1.5568, 12.48], [1.574, 12.48], [1.5928, 12.48], [1.6091, 12.48], [1.6248, 12.48], [1.6417, 12.48], [1.6609, 12.48], [1.6769, 12.48], [1.6929, 12.48], [1.7094, 12.48], [1.7248, 12.48], [1.7409, 12.48], [1.7569, 12.48], [1.7728, 12.48], [1.7895, 12.48], [1.8049, 12.48], [1.8209, 12.48], [1.8369, 12.48], [1.8529, 12.48], [1.8696, 12.48], [1.8815, 12.48], [1.8969, 12.48], [1.9129, 12.48], [1.9288, 12.48], [1.9448, 12.48], [1.9615, 12.48], [1.9768, 12.48], [1.9928, 12.48], [2.0088, 12.48], [2.0249, 12.48], [2.0415, 12.48], [2.0568, 12.48], [2.0728, 12.48], [2.0889, 12.48], [2.1048, 12.48], [2.1215, 12.48], [2.1409, 12.48], [2.1569, 12.48], [2.1729, 12.48], [2.1896, 12.48], [2.2015, 12.48], [2.2168, 12.48], [2.2329, 12.48], [2.2488, 12.48], [2.2649, 12.48], [2.2815, 12.48], [2.2969, 12.48], [2.3129, 12.48], [2.3289, 12.48], [2.3451, 12.48], [2.3621, 12.48], [2.3808, 12.48], [2.3971, 12.48], [2.4128, 12.48], [2.4301, 12.48], [2.4489, 12.48], [2.465, 12.48], [2.4808, 12.48], [2.498, 12.48], [2.5168, 12.48], [2.5331, 12.48]], "t_stop": 1.0149}, "E_jog5_stop": {"n_samples": 42, "travel_deg": 0.61, "active_sec": 0.14, "mean_speed": 4.38, "overshoot_deg": 24.26, "stop_latency_sec": 1.06, "read_fails": 9, "end_from_start_deg": -25.23, "how": "stop", "speed": 5, "guard": false, "samples": [[0.1532, -0.79], [0.2925, -1.4], [1.0443, -11.6], [1.0644, -11.6], [1.1234, -11.95], [1.1834, -13.71], [1.2434, -14.32], [1.3034, -14.15], [1.4353, -16.78], [1.4565, -16.78], [1.4765, -17.22], [1.4965, -17.57], [1.5165, -18.45], [1.5365, -19.33], [1.5564, -19.68], [1.5765, -19.77], [1.5964, -19.77], [1.6165, -19.77], [1.6365, -19.51], [1.6564, -19.68], [1.6764, -20.12], [1.6964, -20.47], [1.7165, -21.35], [1.7364, -22.06], [1.7565, -22.32], [1.7765, -22.41], [1.7965, -22.41], [1.8165, -22.41], [1.8365, -22.14], [1.8565, -22.32], [1.8764, -22.76], [1.8965, -23.11], [1.9164, -23.99], [1.9364, -24.78], [1.9565, -25.13], [1.9765, -25.22], [1.9964, -25.22], [2.0164, -25.22], [2.0364, -24.96], [2.0564, -24.96], [2.0765, -25.31], [2.0965, -25.66]], "t_stop": 1.0141}, "E_jog5_hold": {"n_samples": 78, "travel_deg": 10.71, "active_sec": 0.82, "mean_speed": 13.09, "bin_speeds": [0.0, 28.8, 0.0, 37.9], "median_speed": 14.38, "max_speed": 37.86, "speed_cv": 1.18, "stall_ratio": 0.5, "overshoot_deg": 14.59, "stop_latency_sec": 0.95, "read_fails": 4, "end_from_start_deg": 25.03, "how": "hold", "speed": 5, "guard": false, "samples": [[0.1178, -0.7], [0.139, -0.7], [0.161, -0.7], [0.183, -0.52], [0.2052, -0.26], [0.2207, 0.17], [0.24, 0.52], [0.2599, 1.05], [0.28, 1.58], [0.2999, 1.75], [0.3199, 2.02], [0.3399, 2.1], [0.3609, 2.1], [0.3806, 2.02], [0.401, 2.02], [0.4204, 2.28], [0.44, 2.81], [0.4601, 3.6], [0.4803, 4.3], [0.5, 4.57], [0.52, 4.74], [0.54, 4.83], [0.56, 4.83], [0.5803, 4.65], [0.6, 4.74], [0.622, 5.09], [0.638, 5.62], [0.6569, 6.41], [0.7965, 7.47], [0.9182, 9.93], [0.9363, 10.01], [1.1042, 12.48], [1.1245, 12.56], [1.144, 12.48], [1.164, 12.39], [1.184, 12.65], [1.2041, 13.18], [1.2241, 13.53], [1.2441, 14.23], [1.2641, 14.76], [1.2841, 15.02], [1.304, 15.11], [1.3239, 15.11], [1.344, 15.11], [1.3639, 15.11], [1.3839, 15.46], [1.4039, 15.99], [1.4242, 16.34], [1.4439, 16.96], [1.4639, 17.49], [1.4839, 17.66], [1.5039, 17.75], [1.5239, 17.84], [1.5439, 17.84], [1.5639, 17.84], [1.5839, 18.19], [1.6039, 18.63], [1.6239, 18.98], [1.6439, 19.68], [1.6639, 20.21], [1.6839, 20.39], [1.7039, 20.47], [1.7239, 20.47], [1.7439, 20.47], [1.7639, 20.47], [1.7839, 20.91], [1.804, 21.35], [1.8239, 21.79], [1.8439, 22.41], [1.8639, 22.85], [1.8839, 23.02], [1.9039, 23.11], [1.9239, 23.11], [1.9439, 23.11], [1.9639, 23.29], [1.9839, 23.73], [2.0039, 24.16], [2.0239, 24.6]], "t_stop": 1.0579}, "E_jog10_stop": {"n_samples": 114, "travel_deg": 17.13, "active_sec": 0.98, "mean_speed": 17.51, "bin_speeds": [43.3, 25.0, 22.2, 35.0, 17.5], "median_speed": 25.01, "max_speed": 43.28, "speed_cv": 0.37, "stall_ratio": 0.0, "overshoot_deg": 3.52, "stop_latency_sec": 0.12, "read_fails": 3, "end_from_start_deg": -20.22, "how": "stop", "speed": 10, "guard": false, "samples": [[0.0377, 0.0], [0.0624, 0.0], [0.4055, -4.48], [0.4258, -5.36], [0.4457, -5.88], [0.4657, -6.76], [0.4859, -7.38], [0.5076, -7.82], [0.5269, -7.91], [0.547, -7.91], [0.5669, -8.08], [0.5876, -8.52], [0.6024, -9.14], [0.656, -9.58], [0.7161, -11.68], [0.7761, -12.04], [0.8361, -13.09], [0.8961, -15.64], [0.9561, -16.52], [1.0159, -17.13], [1.0437, -19.95], [1.0595, -20.3], [1.0761, -20.74], [1.0915, -20.83], [1.1075, -20.83], [1.1236, -20.83], [1.1395, -20.83], [1.1561, -20.65], [1.1716, -20.65], [1.1875, -20.65], [1.2036, -20.65], [1.2195, -20.65], [1.2361, -20.65], [1.2515, -20.65], [1.2675, -20.65], [1.2836, -20.65], [1.2995, -20.65], [1.3161, -20.65], [1.3315, -20.65], [1.3475, -20.65], [1.3637, -20.65], [1.3795, -20.65], [1.3961, -20.65], [1.4115, -20.65], [1.4276, -20.65], [1.4436, -20.65], [1.4595, -20.65], [1.4761, -20.65], [1.4915, -20.65], [1.5075, -20.65], [1.5237, -20.65], [1.5395, -20.65], [1.5561, -20.65], [1.5715, -20.65], [1.5875, -20.65], [1.6037, -20.65], [1.6195, -20.65], [1.6361, -20.65], [1.6515, -20.65], [1.6675, -20.65], [1.6836, -20.65], [1.6995, -20.65], [1.7161, -20.65], [1.7315, -20.65], [1.7475, -20.65], [1.7637, -20.65], [1.7795, -20.65], [1.7961, -20.65], [1.8115, -20.65], [1.8275, -20.65], [1.8436, -20.65], [1.8595, -20.65], [1.8761, -20.65], [1.8915, -20.65], [1.9075, -20.65], [1.9237, -20.65], [1.9395, -20.65], [1.9561, -20.65], [1.9715, -20.65], [1.9875, -20.65], [2.0036, -20.65], [2.0195, -20.65], [2.0361, -20.65], [2.0515, -20.65], [2.0675, -20.65], [2.0836, -20.65], [2.0995, -20.65], [2.1161, -20.65], [2.1315, -20.65], [2.1475, -20.65], [2.1637, -20.65], [2.1795, -20.65], [2.1962, -20.65], [2.2115, -20.65], [2.2275, -20.65], [2.2437, -20.65], [2.2595, -20.65], [2.2757, -20.65], [2.2915, -20.65], [2.3075, -20.65], [2.3235, -20.65], [2.3395, -20.65], [2.3557, -20.65], [2.3715, -20.65], [2.3875, -20.65], [2.4035, -20.65], [2.4195, -20.65], [2.4356, -20.65], [2.4515, -20.65], [2.4675, -20.65], [2.4835, -20.65], [2.4995, -20.65], [2.5156, -20.65], [2.5315, -20.65]], "t_stop": 1.0159}, "E_jog10_hold": {"n_samples": 18, "travel_deg": 18.98, "active_sec": 0.92, "mean_speed": 20.61, "bin_speeds": [8.8, 33.6, 36.8, 16.2, 11.7], "median_speed": 16.17, "max_speed": 36.81, "speed_cv": 0.71, "stall_ratio": 0.0, "overshoot_deg": 7.21, "stop_latency_sec": 0.0, "read_fails": 3, "end_from_start_deg": 25.83, "how": "hold", "speed": 10, "guard": false, "samples": [[0.1266, -0.79], [0.1485, -0.7], [0.2077, -0.52], [0.2677, 0.79], [0.3278, 1.93], [0.3877, 2.46], [0.4477, 4.13], [0.5078, 6.15], [0.5677, 6.67], [0.6278, 8.08], [0.6875, 10.28], [0.7475, 11.07], [0.8075, 12.04], [0.8676, 14.32], [0.9275, 15.38], [0.9875, 16.08], [1.0475, 18.19], [1.3583, 25.4]], "t_stop": 1.0475}, "F_far10_stop": {"n_samples": 2, "read_fails": 0, "end_from_start_deg": 25.65, "how": "stop", "speed": 10, "guard": true, "samples": [[0.029, 25.22], [0.0745, 25.22]], "t_stop": 0.0533}, "F_far10_hold": {"n_samples": 110, "travel_deg": 18.8, "active_sec": 1.03, "mean_speed": 18.31, "bin_speeds": [22.0, 23.5, 14.7, 33.6, 35.2], "median_speed": 23.5, "max_speed": 35.21, "speed_cv": 0.33, "stall_ratio": 0.0, "overshoot_deg": 0.53, "stop_latency_sec": 0.33, "read_fails": 0, "end_from_start_deg": 19.15, "how": "hold", "speed": 10, "guard": false, "samples": [[0.022, -0.61], [0.034, -0.61], [0.089, -0.61], [0.1489, -0.61], [0.2089, -0.52], [0.2689, 0.26], [0.3289, 1.75], [0.3889, 3.07], [0.4489, 4.21], [0.5089, 5.62], [0.5689, 7.38], [0.6289, 8.61], [0.6889, 9.49], [0.7489, 10.98], [0.8089, 13.0], [0.8689, 13.88], [0.9289, 14.85], [0.9889, 16.96], [1.0489, 18.19], [1.1421, 19.51], [1.16, 19.77], [1.176, 19.86], [1.1922, 19.86], [1.208, 19.86], [1.2253, 19.51], [1.244, 19.33], [1.2602, 18.89], [1.276, 18.63], [1.2932, 18.28], [1.312, 18.19], [1.3283, 18.19], [1.344, 18.19], [1.3613, 18.36], [1.38, 18.45], [1.3962, 18.72], [1.4125, 18.8], [1.4311, 18.8], [1.4419, 18.8], [1.4605, 18.8], [1.4765, 18.8], [1.4925, 18.8], [1.5094, 18.8], [1.522, 18.8], [1.5336, 18.72], [1.5526, 18.72], [1.5681, 18.72], [1.5792, 18.72], [1.5964, 18.72], [1.6132, 18.72], [1.6254, 18.72], [1.6373, 18.72], [1.6492, 18.72], [1.6685, 18.72], [1.6844, 18.72], [1.7009, 18.72], [1.7222, 18.72], [1.7405, 18.72], [1.7514, 18.72], [1.763, 18.72], [1.7805, 18.72], [1.7974, 18.72], [1.8092, 18.72], [1.8285, 18.72], [1.8439, 18.72], [1.8662, 18.72], [1.8846, 18.72], [1.8991, 18.72], [1.9166, 18.72], [1.9363, 18.72], [1.9521, 18.72], [1.968, 18.72], [1.984, 18.72], [2.0007, 18.72], [2.02, 18.72], [2.0361, 18.72], [2.052, 18.72], [2.0692, 18.72], [2.0884, 18.72], [2.1037, 18.72], [2.1201, 18.72], [2.1373, 18.72], [2.156, 18.72], [2.1723, 18.72], [2.188, 18.72], [2.2053, 18.72], [2.224, 18.72], [2.2403, 18.72], [2.256, 18.72], [2.273, 18.72], [2.292, 18.72], [2.308, 18.72], [2.324, 18.72], [2.3407, 18.72], [2.36, 18.72], [2.376, 18.72], [2.392, 18.72], [2.4087, 18.72], [2.428, 18.72], [2.444, 18.72], [2.46, 18.72], [2.4767, 18.72], [2.496, 18.72], [2.512, 18.72], [2.528, 18.72], [2.5446, 18.72], [2.56, 18.72], [2.576, 18.72], [2.592, 18.72], [2.608, 18.72], [2.6247, 18.72]], "t_stop": 1.0489}, "F_far20_hold": {"n_samples": 120, "travel_deg": 19.95, "active_sec": 0.94, "mean_speed": 21.18, "bin_speeds": [54.2, 57.3, 32.3, -10.9, 6.1], "median_speed": 32.27, "max_speed": 57.26, "speed_cv": 0.83, "stall_ratio": 0.4, "overshoot_deg": -0.0, "stop_latency_sec": 0.0, "read_fails": 1, "end_from_start_deg": -20.31, "how": "hold", "speed": 20, "guard": false, "samples": [[0.0708, -0.79], [0.1307, -0.79], [0.1907, -0.79], [0.2507, -0.79], [0.3107, -2.72], [0.3707, -5.97], [0.4307, -8.26], [0.491, -10.28], [0.5509, -13.71], [0.611, -16.78], [0.671, -18.19], [0.6875, -19.68], [0.7052, -20.03], [0.7219, -20.83], [0.7411, -21.0], [0.7581, -21.0], [0.7772, -21.0], [0.7897, -20.83], [0.809, -20.65], [0.8252, -20.21], [0.8412, -20.12], [0.8578, -20.12], [0.8773, -20.12], [0.8931, -20.12], [0.9036, -20.3], [0.9156, -20.39], [0.9277, -20.39], [0.9452, -20.56], [0.9648, -20.65], [0.9807, -20.65], [0.9968, -20.74], [1.0127, -20.74], [1.1687, -20.74], [1.1848, -20.74], [1.2007, -20.74], [1.2172, -20.74], [1.2327, -20.74], [1.2487, -20.74], [1.2648, -20.74], [1.2807, -20.74], [1.2989, -20.74], [1.3111, -20.74], [1.3215, -20.74], [1.3333, -20.74], [1.345, -20.74], [1.3608, -20.74], [1.3767, -20.74], [1.3927, -20.74], [1.4087, -20.74], [1.4248, -20.74], [1.4407, -20.74], [1.4567, -20.74], [1.4727, -20.74], [1.4887, -20.74], [1.5047, -20.74], [1.5207, -20.74], [1.5367, -20.74], [1.5527, -20.74], [1.5687, -20.74], [1.5847, -20.74], [1.6007, -20.74], [1.6167, -20.74], [1.6327, -20.74], [1.6487, -20.74], [1.6647, -20.74], [1.6807, -20.74], [1.6967, -20.74], [1.7128, -20.74], [1.7287, -20.74], [1.7447, -20.74], [1.7607, -20.74], [1.7767, -20.74], [1.7927, -20.74], [1.8087, -20.74], [1.8247, -20.74], [1.8407, -20.74], [1.8567, -20.74], [1.8768, -20.74], [1.8932, -20.74], [1.9087, -20.74], [1.9247, -20.74], [1.9408, -20.74], [1.9567, -20.74], [1.9732, -20.74], [1.9887, -20.74], [2.0047, -20.74], [2.0208, -20.74], [2.0367, -20.74], [2.0533, -20.74], [2.0687, -20.74], [2.0847, -20.74], [2.1008, -20.74], [2.1167, -20.74], [2.1332, -20.74], [2.1487, -20.74], [2.1647, -20.74], [2.1808, -20.74], [2.1967, -20.74], [2.2132, -20.74], [2.2287, -20.74], [2.2447, -20.74], [2.2608, -20.74], [2.2767, -20.74], [2.2932, -20.74], [2.3087, -20.74], [2.3247, -20.74], [2.3408, -20.74], [2.3567, -20.74], [2.3732, -20.74], [2.3887, -20.74], [2.4047, -20.74], [2.4208, -20.74], [2.4367, -20.74], [2.4533, -20.74], [2.4687, -20.74], [2.4847, -20.74], [2.5008, -20.74], [2.5167, -20.74], [2.5332, -20.74], [2.5487, -20.74]], "t_stop": 1.0127}}, "start": [-0.43, 2.98, 3.51, 0.26, 0.7, -29.61]}
別のタブで開く保存

15:43 遠い目標へ1回送る動きを、途中で止めた(jog_probe 3回目)

20°先へ送り、0.4〜0.5秒の動いている途中で止める組(hold)と、jog speed 10 を jog_stop で3回止める組を足しました。冒頭の動画がこの試しです。

試し結果
speed 10 で送り、0.5秒で stop
0.24秒で止まった。行きすぎ3.3°
speed 10 で送り、0.5秒で今の角度へ送り直す
約4°行きすぎてから戻った
speed 5 で送り、0.5秒で今の角度へ送り直す
止まらずに目標の20°まで行った
jog speed 10 を jog_stop で3回
3回とも約0.1秒で止まった。行きすぎ3〜4°

3回の試しの生の記録(時刻と j0 の角度)を、送り方ごとに並べると次のようになります。

mechArm 270 の根元 j0 を、1回送る・送り直し・fresh_mode・jog・階段状の jog・20°先へ送って途中で stop の6通りで動かしたときの、時刻と角度の線。1回送る形と jog speed 30 は線がまっすぐで、送り直しと fresh_mode と jog speed 5 は段になっている

ゆっくり動かすと、jog でも1回送る形でも、0.2秒ごとに進んでは止まる動きになりました。一定の速さでなめらかに動いたのは speed 20〜30 だけです。なめらかさの限界は送り方ではなくサーボの側にあり、ゆっくり、かつなめらかに、は mechArm 270 では両立しません。 jog は止まらない回が1回目にあったので、止めそこなったときに動き続ける jog は長押しの土台にせず、止めそこなっても目標で必ず止まる、遠い目標へ1回送る形を使うことにしました。速さは speed 20(毎秒約40°)に決めました。

jog_probe 3回目の端末の出力(15:43)

04_sec04.txt3,286字・79行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % git add tools/jog_probe.sh tools/pi/jog_probe_pi.py
git commit -m "jog_probe: 遠い目標を途中で止める hold の組を足す"
tools/jog_probe.sh hold
[main b577a13] jog_probe: 遠い目標を途中で止める hold の組を足す
 2 files changed, 22 insertions(+), 5 deletions(-)
jog_probe 20261105_154332 (結果: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_154332_hold)
--- デーモンの状態 (止める前)
mode=systemd
別のタブで開く保存

diag/jog_probe_20261105_154332_hold/result.json

{"started_at": "2022-10-13 15:36:00", "pymycobot": "2.9.6", "params": {"speed": 20, "stream_interval": 0.1, "stream_ahead": 3.0, "jog_speeds": [10, 30], "guard_deg": 25.0, "set": "hold", "jog_dir": {"+1": 0, "-1": 1}}, "tests": {"read": {"median_ms": 12.6, "max_ms": 21.4, "empty_ratio": 0.0}, "G_far5_hold_0.5s": {"n_samples": 70, "travel_deg": 3.94, "active_sec": 0.37, "mean_speed": 10.54, "overshoot_deg": 15.56, "stop_latency_sec": 1.48, "read_fails": 3, "end_from_start_deg": 19.5, "how": "hold", "speed": 5, "guard": false, "samples": [[0.149, -0.17], [0.2629, 1.14], [0.2732, 1.31], [0.2862, 1.58], [0.2999, 1.84], [0.3197, 1.93], [0.3321, 2.1], [0.4439, 2.72], [0.4558, 2.98], [0.4682, 3.33], [0.523, 3.77], [0.6147, 4.13], [0.6349, 4.3], [0.6548, 4.57], [0.6747, 5.18], [0.6947, 6.06], [0.7147, 6.67], [0.735, 6.85], [0.7548, 6.94], [0.7747, 6.94], [0.7947, 6.76], [0.8147, 6.67], [0.8348, 6.85], [0.8547, 7.03], [0.8747, 7.64], [0.8947, 8.34], [0.9147, 8.87], [0.9348, 9.05], [0.9547, 9.14], [0.9747, 9.14], [0.9947, 8.96], [1.0147, 8.87], [1.0348, 9.22], [1.0547, 9.49], [1.0747, 10.01], [1.0947, 10.72], [1.1148, 11.16], [1.1349, 11.33], [1.1547, 11.33], [1.1747, 11.33], [1.1947, 11.16], [1.2147, 11.16], [1.2348, 11.51], [1.2548, 11.77], [1.2746, 12.39], [1.2946, 13.09], [1.3146, 13.44], [1.3345, 13.53], [1.3546, 13.53], [1.3746, 13.53], [1.3946, 13.35], [1.4146, 13.53], [1.4346, 13.88], [1.4552, 14.15], [1.4659, 14.85], [1.4783, 15.2], [1.4996, 15.38], [1.5226, 15.55], [1.5428, 15.64], [1.5626, 15.64], [1.5826, 15.64], [1.6429, 15.73], [1.7029, 17.05], [1.7629, 17.66], [1.8229, 17.49], [1.8829, 18.72], [1.9429, 19.86], [2.0029, 19.77], [2.0629, 19.42], [2.1229, 19.33]], "t_stop": 0.523}, "G_far10_hold_0.5s": {"n_samples": 41, "travel_deg": 6.76, "active_sec": 0.3, "mean_speed": 22.87, "overshoot_deg": 1.59, "stop_latency_sec": 0.21, "read_fails": 9, "end_from_start_deg": -9.41, "how": "hold", "speed": 10, "guard": false, "samples": [[0.2707, -1.23], [0.3262, -1.66], [0.3862, -4.21], [0.4463, -4.92], [0.5062, -5.44], [0.5662, -7.99], [0.6522, -9.84], [0.7736, -13.79], [1.5955, -9.14], [1.6115, -9.14], [1.6275, -9.14], [1.6435, -9.22], [1.6595, -9.31], [1.6758, -9.4], [1.6915, -9.4], [1.7074, -9.4], [1.7235, -9.49], [1.7395, -9.49], [1.7558, -9.49], [1.7715, -9.49], [1.7875, -9.49], [1.8089, -9.49], [1.83, -9.49], [1.852, -9.49], [1.8739, -9.49], [1.8972, -9.49], [1.9132, -9.49], [1.9322, -9.49], [1.9464, -9.49], [1.9635, -9.49], [1.9803, -9.49], [1.9995, -9.49], [2.0156, -9.49], [2.0315, -9.49], [2.0482, -9.49], [2.0601, -9.49], [2.0755, -9.49], [2.0915, -9.49], [2.1075, -9.49], [2.1235, -9.49], [2.1398, -9.58]], "t_stop": 0.5662}, "G_far20_hold_0.4s": {"n_samples": 99, "read_fails": 4, "end_from_start_deg": 19.5, "how": "hold", "speed": 20, "guard": false, "samples": [[0.6873, 20.12], [0.7054, 20.3], [0.7234, 20.3], [0.7393, 20.21], [0.7553, 20.21], [0.7714, 19.77], [0.7874, 19.51], [0.8037, 19.16], [0.8193, 19.07], [0.8353, 18.98], [0.8513, 18.89], [0.8673, 18.89], [0.8836, 18.98], [0.8994, 19.07], [0.9153, 19.16], [0.9313, 19.24], [0.9474, 19.33], [0.9637, 19.33], [0.9793, 19.33], [0.9953, 19.33], [1.0114, 19.33], [1.0274, 19.33], [1.0438, 19.33], [1.0593, 19.33], [1.0753, 19.33], [1.0914, 19.33], [1.1073, 19.33], [1.1237, 19.33], [1.1394, 19.33], [1.1553, 19.33], [1.1713, 19.33], [1.1873, 19.33], [1.2037, 19.33], [1.2193, 19.33], [1.2353, 19.33], [1.2514, 19.33], [1.2675, 19.33], [1.2838, 19.33], [1.2993, 19.33], [1.3153, 19.33], [1.3313, 19.33], [1.3474, 19.33], [1.3637, 19.33], [1.3793, 19.33], [1.3954, 19.33], [1.4114, 19.33], [1.4273, 19.33], [1.4436, 19.33], [1.4593, 19.33], [1.4754, 19.33], [1.4914, 19.33], [1.5074, 19.33], [1.5236, 19.33], [1.5394, 19.33], [1.5553, 19.33], [1.5714, 19.33], [1.5873, 19.33], [1.6037, 19.33], [1.6202, 19.33], [1.6383, 19.33], [1.6557, 19.33], [1.6726, 19.33], [1.6915, 19.33], [1.7074, 19.33], [1.7234, 19.33], [1.7397, 19.33], [1.7567, 19.33], [1.7748, 19.33], [1.7864, 19.33], [1.7988, 19.33], [1.8111, 19.33], [1.8228, 19.33], [1.8348, 19.33], [1.849, 19.33], [1.8589, 19.33], [1.8722, 19.33], [1.8845, 19.33], [1.8952, 19.33], [1.9117, 19.33], [1.9286, 19.33], [1.9418, 19.33], [1.9522, 19.33], [1.9643, 19.33], [1.9761, 19.33], [1.9883, 19.33], [2.0003, 19.33], [2.0122, 19.33], [2.0242, 19.33], [2.036, 19.33], [2.0559, 19.33], [2.0718, 19.33], [2.0824, 19.33], [2.0943, 19.33], [2.1075, 19.33], [2.1191, 19.33], [2.1307, 19.33], [2.1479, 19.33], [2.165, 19.33], [2.1767, 19.33]], "t_stop": 0.4997}, "G_far10_stop_0.5s": {"n_samples": 98, "travel_deg": 7.55, "active_sec": 0.48, "mean_speed": 15.73, "bin_speeds": [23.5], "median_speed": 23.5, "max_speed": 23.5, "speed_cv": 0.0, "stall_ratio": 0.0, "overshoot_deg": 3.25, "stop_latency_sec": 0.24, "read_fails": 0, "end_from_start_deg": -10.37, "how": "stop", "speed": 10, "guard": false, "samples": [[0.0722, 0.26], [0.1321, 0.26], [0.1921, 0.26], [0.2521, -0.35], [0.3121, -1.84], [0.3721, -3.25], [0.4321, -4.21], [0.4921, -5.27], [0.5521, -7.29], [0.5813, -8.96], [0.5973, -9.05], [0.6133, -9.05], [0.6293, -9.05], [0.6459, -9.4], [0.6613, -9.66], [0.6773, -9.84], [0.6933, -10.45], [0.7093, -10.81], [0.7259, -10.89], [0.7413, -10.89], [0.7573, -10.89], [0.7733, -10.72], [0.7893, -10.54], [0.8059, -10.28], [0.8213, -10.28], [0.8373, -10.19], [0.8533, -10.19], [0.8693, -10.19], [0.886, -10.28], [0.9013, -10.37], [0.9173, -10.37], [0.9333, -10.45], [0.9493, -10.45], [0.9659, -10.54], [0.9813, -10.54], [0.9973, -10.54], [1.0133, -10.54], [1.0293, -10.54], [1.046, -10.54], [1.0613, -10.54], [1.0773, -10.54], [1.0933, -10.54], [1.1093, -10.54], [1.126, -10.54], [1.1413, -10.54], [1.1573, -10.54], [1.1733, -10.54], [1.1893, -10.54], [1.206, -10.54], [1.2213, -10.54], [1.2373, -10.54], [1.2533, -10.54], [1.2693, -10.54], [1.286, -10.54], [1.3013, -10.54], [1.3175, -10.54], [1.3336, -10.54], [1.3493, -10.54], [1.3665, -10.54], [1.3853, -10.54], [1.4015, -10.54], [1.4173, -10.54], [1.4345, -10.54], [1.4533, -10.54], [1.4695, -10.54], [1.4853, -10.54], [1.5024, -10.54], [1.5213, -10.54], [1.5376, -10.54], [1.5533, -10.54], [1.5704, -10.54], [1.5946, -10.54], [1.611, -10.54], [1.633, -10.54], [1.6542, -10.54], [1.6761, -10.54], [1.6971, -10.54], [1.7187, -10.54], [1.742, -10.54], [1.766, -10.54], [1.7873, -10.54], [1.8034, -10.54], [1.8148, -10.54], [1.8337, -10.54], [1.8496, -10.54], [1.8653, -10.54], [1.8824, -10.54], [1.9013, -10.54], [1.9176, -10.54], [1.9334, -10.54], [1.9504, -10.54], [1.9693, -10.54], [1.9855, -10.54], [2.0013, -10.54], [2.0184, -10.54], [2.0373, -10.54], [2.0535, -10.54], [2.0693, -10.54]], "t_stop": 0.5522}, "H_jog10_jogstop_1": {"n_samples": 115, "travel_deg": 17.05, "active_sec": 0.91, "mean_speed": 18.72, "bin_speeds": [19.7, 11.7, 16.2, 36.8], "median_speed": 17.92, "max_speed": 36.8, "speed_cv": 0.53, "stall_ratio": 0.0, "overshoot_deg": 3.34, "stop_latency_sec": 0.08, "read_fails": 1, "end_from_start_deg": 20.73, "how": "jog_stop", "speed": 10, "guard": false, "samples": [[0.1166, 0.17], [0.1372, 0.17], [0.1592, 0.17], [0.1858, 0.17], [0.2022, 0.17], [0.2231, 0.35], [0.2485, 0.61], [0.308, 1.49], [0.3683, 3.6], [0.4299, 3.86], [0.4879, 5.0], [0.5479, 7.47], [0.6079, 8.17], [0.6679, 9.14], [0.7279, 11.42], [0.7879, 12.39], [0.8479, 13.18], [0.9077, 15.38], [0.9676, 16.61], [1.0276, 17.22], [1.0575, 19.68], [1.0735, 20.12], [1.0896, 20.65], [1.1055, 20.74], [1.122, 20.91], [1.1376, 21.0], [1.1535, 21.0], [1.1696, 20.91], [1.1855, 20.83], [1.202, 20.74], [1.2175, 20.65], [1.2336, 20.65], [1.2502, 20.56], [1.26, 20.56], [1.2775, 20.56], [1.294, 20.56], [1.3095, 20.56], [1.3256, 20.56], [1.3415, 20.56], [1.3575, 20.56], [1.374, 20.56], [1.3896, 20.56], [1.4055, 20.56], [1.4216, 20.56], [1.4375, 20.56], [1.454, 20.56], [1.4695, 20.56], [1.4855, 20.56], [1.5016, 20.56], [1.5175, 20.56], [1.534, 20.56], [1.5495, 20.56], [1.5655, 20.56], [1.5816, 20.56], [1.5975, 20.56], [1.614, 20.56], [1.6295, 20.56], [1.6455, 20.56], [1.6616, 20.56], [1.6775, 20.56], [1.694, 20.56], [1.7095, 20.56], [1.7255, 20.56], [1.7416, 20.56], [1.7575, 20.56], [1.774, 20.56], [1.7895, 20.56], [1.8055, 20.56], [1.8216, 20.56], [1.8375, 20.56], [1.854, 20.56], [1.8695, 20.56], [1.8855, 20.56], [1.9016, 20.56], [1.9175, 20.56], [1.934, 20.56], [1.9495, 20.56], [1.9655, 20.56], [1.9816, 20.56], [1.9975, 20.56], [2.0141, 20.56], [2.0295, 20.56], [2.0455, 20.56], [2.0616, 20.56], [2.0775, 20.56], [2.094, 20.56], [2.1095, 20.56], [2.1255, 20.56], [2.1416, 20.56], [2.1576, 20.56], [2.1741, 20.56], [2.1895, 20.56], [2.2055, 20.56], [2.2216, 20.56], [2.2375, 20.56], [2.2541, 20.56], [2.2695, 20.56], [2.2855, 20.56], [2.3016, 20.56], [2.3175, 20.56], [2.334, 20.56], [2.3496, 20.56], [2.3655, 20.56], [2.3837, 20.56], [2.3928, 20.56], [2.406, 20.56], [2.4173, 20.56], [2.4281, 20.56], [2.4495, 20.56], [2.4655, 20.56], [2.4815, 20.56], [2.4976, 20.56], [2.5135, 20.56], [2.53, 20.56], [2.5455, 20.56]], "t_stop": 1.0276}, "H_jog10_jogstop_2": {"n_samples": 115, "travel_deg": 17.49, "active_sec": 1.02, "mean_speed": 17.14, "bin_speeds": [38.2, 17.7, 10.2, 20.6, 26.3], "median_speed": 20.57, "max_speed": 38.16, "speed_cv": 0.46, "stall_ratio": 0.0, "overshoot_deg": 3.78, "stop_latency_sec": 0.14, "read_fails": 0, "end_from_start_deg": -21.71, "how": "jog_stop", "speed": 10, "guard": false, "samples": [[0.0329, -0.61], [0.0522, -0.61], [0.0722, -0.61], [0.0922, -0.61], [0.1534, -0.61], [0.2134, -0.61], [0.2734, -0.61], [0.3334, -2.19], [0.3934, -4.48], [0.4534, -5.0], [0.5134, -6.06], [0.5734, -8.52], [0.6334, -9.4], [0.6934, -10.01], [0.7537, -12.48], [0.8135, -13.71], [0.8735, -14.06], [0.9334, -16.34], [0.9934, -17.92], [1.0534, -18.1], [1.082, -20.47], [1.0981, -21.0], [1.1145, -21.79], [1.1301, -22.14], [1.1477, -22.32], [1.166, -22.41], [1.1824, -22.41], [1.198, -22.32], [1.2157, -22.06], [1.2341, -22.06], [1.2504, -21.97], [1.2661, -21.88], [1.2836, -21.88], [1.3021, -21.88], [1.3181, -21.88], [1.3341, -21.88], [1.3518, -21.88], [1.3651, -21.88], [1.3758, -21.88], [1.3882, -21.88], [1.4065, -21.88], [1.4218, -21.88], [1.4345, -21.88], [1.454, -21.88], [1.4682, -21.88], [1.4865, -21.88], [1.503, -21.88], [1.5148, -21.88], [1.5292, -21.88], [1.5385, -21.88], [1.5544, -21.88], [1.5723, -21.88], [1.5843, -21.88], [1.6025, -21.88], [1.6182, -21.88], [1.6302, -21.88], [1.6429, -21.88], [1.6546, -21.88], [1.6705, -21.88], [1.6881, -21.88], [1.7066, -21.88], [1.7247, -21.88], [1.7353, -21.88], [1.7478, -21.88], [1.7591, -21.88], [1.7702, -21.88], [1.7829, -21.88], [1.7943, -21.88], [1.8069, -21.88], [1.8187, -21.88], [1.8306, -21.88], [1.8464, -21.88], [1.8661, -21.88], [1.8821, -21.88], [1.8984, -21.88], [1.914, -21.88], [1.9317, -21.88], [1.95, -21.88], [1.9664, -21.88], [1.982, -21.88], [1.9998, -21.88], [2.0181, -21.88], [2.0344, -21.88], [2.05, -21.88], [2.0677, -21.88], [2.086, -21.88], [2.1024, -21.88], [2.1181, -21.88], [2.1358, -21.88], [2.154, -21.88], [2.1704, -21.88], [2.186, -21.88], [2.2038, -21.88], [2.222, -21.88], [2.2384, -21.88], [2.254, -21.88], [2.2717, -21.88], [2.29, -21.88], [2.3064, -21.88], [2.322, -21.88], [2.3397, -21.88], [2.358, -21.88], [2.3744, -21.88], [2.39, -21.88], [2.4077, -21.88], [2.4261, -21.88], [2.4425, -21.88], [2.4581, -21.88], [2.4753, -21.88], [2.4941, -21.88], [2.5101, -21.88], [2.5261, -21.88], [2.5433, -21.88], [2.5621, -21.88], [2.5781, -21.88]], "t_stop": 1.0534}, "H_jog10_jogstop_3": {"n_samples": 128, "travel_deg": 18.19, "active_sec": 1.03, "mean_speed": 17.71, "bin_speeds": [34.0, 9.9, 42.5, 11.0, 22.5], "median_speed": 22.5, "max_speed": 42.54, "speed_cv": 0.57, "stall_ratio": 0.0, "overshoot_deg": 3.08, "stop_latency_sec": 0.07, "read_fails": 3, "end_from_start_deg": 21.7, "how": "jog_stop", "speed": 10, "guard": false, "samples": [[0.0331, 0.26], [0.053, 0.26], [0.0729, 0.26], [0.093, 0.26], [0.113, 0.26], [0.133, 0.26], [0.1529, 0.26], [0.173, 0.26], [0.193, 0.26], [0.213, 0.35], [0.233, 0.52], [0.253, 1.05], [0.273, 1.75], [0.293, 2.63], [0.313, 3.42], [0.333, 3.77], [0.353, 4.04], [0.373, 4.3], [0.3929, 4.39], [0.413, 4.57], [0.433, 4.83], [0.453, 5.44], [0.473, 6.41], [0.493, 7.38], [0.5129, 7.99], [0.5333, 8.17], [0.5532, 8.52], [0.5738, 8.7], [0.5888, 8.78], [0.709, 12.21], [0.9772, 17.22], [1.0007, 17.75], [1.06, 18.45], [1.0894, 20.91], [1.1105, 21.0], [1.1305, 21.26], [1.1505, 21.44], [1.1705, 21.35], [1.1907, 21.35], [1.2113, 21.44], [1.2307, 21.44], [1.2454, 21.44], [1.2638, 21.44], [1.2829, 21.53], [1.2991, 21.53], [1.3149, 21.53], [1.3318, 21.53], [1.3509, 21.53], [1.3671, 21.53], [1.383, 21.53], [1.3997, 21.53], [1.4189, 21.53], [1.4352, 21.53], [1.4509, 21.53], [1.4676, 21.53], [1.4829, 21.53], [1.4989, 21.53], [1.515, 21.53], [1.5309, 21.53], [1.5476, 21.53], [1.563, 21.53], [1.5789, 21.53], [1.595, 21.53], [1.6109, 21.53], [1.6276, 21.53], [1.6429, 21.53], [1.6589, 21.53], [1.675, 21.53], [1.6909, 21.53], [1.7077, 21.53], [1.7271, 21.53], [1.7422, 21.53], [1.7544, 21.53], [1.7662, 21.53], [1.7786, 21.53], [1.7954, 21.53], [1.8121, 21.53], [1.8283, 21.53], [1.8474, 21.53], [1.8581, 21.53], [1.8699, 21.53], [1.8819, 21.53], [1.8938, 21.53], [1.906, 21.53], [1.9217, 21.53], [1.94, 21.53], [1.952, 21.53], [1.964, 21.53], [1.9768, 21.53], [1.9881, 21.53], [2.0038, 21.53], [2.0219, 21.53], [2.0382, 21.53], [2.0557, 21.53], [2.0754, 21.53], [2.0915, 21.53], [2.1021, 21.53], [2.1141, 21.53], [2.1258, 21.53], [2.1378, 21.53], [2.1506, 21.53], [2.1625, 21.53], [2.1751, 21.53], [2.1864, 21.53], [2.2007, 21.53], [2.2114, 21.53], [2.2226, 21.53], [2.2392, 21.53], [2.2562, 21.53], [2.275, 21.53], [2.2913, 21.53], [2.307, 21.53], [2.324, 21.53], [2.3429, 21.53], [2.3592, 21.53], [2.3749, 21.53], [2.3921, 21.53], [2.411, 21.53], [2.427, 21.53], [2.443, 21.53], [2.4594, 21.53], [2.4749, 21.53], [2.4909, 21.53], [2.5069, 21.53], [2.523, 21.53], [2.5395, 21.53], [2.5549, 21.53], [2.5709, 21.53]], "t_stop": 1.06}}, "start": [-0.17, 1.14, 1.14, 0.0, 0.87, -29.53]}
別のタブで開く保存

15:50 長押しを15°先へ1回送る形にし、daemon に stop を足した

長押しを次の形に作り直しました(commit 4e99c9d)。

  • 押して0.4秒たったら、読んだ角度から15°先の目標を speed 20 で1回だけ送る
  • 0.1秒おきに角度を読み、目標まで残り5°以下になったら、次の15°先を送る
  • 離したら、daemon の stop(jog_stop と stop の両方)を送ってその場で止める。stop が届かなくても、アームは送ってある目標(最大15°先)で止まる
  • L2+R2 の停止でも stop を送り、HOME の途中の動きも止める

daemon には動いている途中で止める命令がなかったので、Pi で動いている daemon を取ってきて、stop の命令を1つだけ書き足すスクリプト(tools/daemon_add_stop.sh)を作りました。書き足す前の daemon は、KIOXIA の archive/mecharm_daemon_premerge_20261105_155954/ に写してあります。

  • ねらい:送り直すたびに加速からやり直すカクつきをなくし、アーム自身の加速・減速で動かす
  • 変わったこと:長押しで送る回数が、0.1秒に1回から、15°動くごとに1回になった(最初の記録で、長押しの目標を送ったのは103回、角度を読んで送らなかった回はその数倍)
  • 見込める効果:長押しの動きは、jog_probe の A(1回送る形)に近いなめらかさになる。実機の長押しは、このあとの記録で、毎秒40〜60°で動き続けた

実機を動かすコードなので、別の Claude にコードを読んでもらいました。必須の指摘は1件で、HOME の途中で L2+R2 を押しても、着くまで stop が出ない作りになっていました。届いたかを確かめるループの頭で停止を見て、すぐ抜けるように直しました。推奨のうち4つ(通信が詰まって止まったときも stop を送る・長押しの途中で終わったら stop を1回送る・長押しの1回目が無視されたら送り直す・daemon を書き換えるスクリプトに失敗したときの戻し方を足す)も入れました。

別の Claude のレビュー(長押しの作り直しと daemon に stop を足すスクリプト)

06_sec05.md3,618字・60行・markdown
## 結論

必須は 1 件です。L2+R2 では、HOME の途中の動きを止められません。それ以外の流れは筋が通っています。長押しを離したとき・ほかのボタン・進まない・端・停止のどの終わり方でも、halt は送った動きの後に送られます。長押しの目標を送っている最中に離した場合も、`released_while_sending` で後から止めています。gate・busy・halt_pending まわりに競合は見つかりませんでした。

(行番号は review_gamepad_teleop.py のものです)

## 必須
別のタブで開く保存

daemon に stop を足したときの端末の出力(15:59)

(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts
git add tools/gamepad_teleop.py tools/test_gamepad_teleop.py tools/daemon_add_stop.sh
git commit -m "gamepad_teleop: 長押しを15°先へ1回送る形にし、離したら daemon の stop で止める"
tools/daemon_add_stop.sh
[main 4e99c9d] gamepad_teleop: 長押しを15°先へ1回送る形にし、離したら daemon の stop で止める
 3 files changed, 483 insertions(+), 44 deletions(-)
 create mode 100755 tools/daemon_add_stop.sh
今の daemon の写し: /Volumes/KIOXIA/r2r2r-data/archive/mecharm_daemon_premerge_20261105_155954/mecharm_daemon.py
stop を書き足しました
--- 差分
236a237,250
> 
>     # 2026-11-05: 動いている途中で止める (ゲームパッドの長押しを離したとき・L2+R2).
>     # jog_probe (diag/jog_probe_20261105_*) で jog_stop と stop はどちらも効かない回があったので両方呼ぶ.
>     elif cmd == "stop":
>         res = {}
>         for name in ("jog_stop", "stop"):
>             try:
>                 res[name] = getattr(_mc, name)()
>             except Exception as e:
>                 res[name] = f"{type(e).__name__}: {e}"
>         log(f"stop: {res}")
>         if all(isinstance(v, str) for v in res.values()):
>             return {"ok": False, "error": f"stop failed: {res}"}
>         return {"ok": True, "result": res}
ping → {'ok': True, 'daemon': 'mecharm_daemon', 'fresh_mode': 0}
stop → {'ok': True, 'result': {'jog_stop': None, 'stop': None}}
できました。記録: /Volumes/KIOXIA/r2r2r-data/archive/mecharm_daemon_premerge_20261105_155954

16:00 ゲームパッドで使うと、止めるたびにほかの関節が1〜1.5°ずつずれて積み上がった

作り直したゲームパッドを実機で使いました。長押しは動きましたが、困りごとが2つ出ました。

1つ目は、R1 で切り替える1°と2°の違いが出ないことです。記録を数えると、1回押しを30回送って、動かした関節が0.3°以上動いたのは4回だけでした。それでも画面には「届いた」と出ていました。届いたかの判定を3°以内にしていたので、1°・2°の押しは、まったく動かなくても「届いた」になっていました。

2つ目は、動かしていない関節が動いてしまうことです。長押しを止めるたびに、動かしていない j1・j2・j4 が1〜1.5°ずつずれ、その止まった角度を次の出発点にしていたので、ずれが積み上がっていました。この記録の間に、j1 は4.83°から37.00°まで上がっています。

teleop_20261105_160038 を1回押しと止める処理ごとに並べた出力

07_sec06.txt4,200字・63行・text
== teleop_20261105_160038  行 376
-- 1 回押し: 送った量と, 動かした関節が動いた量
   0.00s j0 -1° → 動いた -1.32° ほかの関節の最大の変化 0.8° 届いた 待ち 0.02秒 送り直し 0回
   5.11s j0 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.01秒 送り直し 0回
   6.72s j0 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
  20.20s j1 -1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
  22.69s j0 -1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.06秒 送り直し 0回
  27.21s j0 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.03秒 送り直し 0回
別のタブで開く保存

ゲームパッドの端末の出力(16:00 teleop_20261105_160038)

08_sec06.txt6,617字・94行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % git add tools/pi/mecharm_daemon.py
git commit -m "daemon に stop を足した版を tools/pi に置く"
python3 tools/gamepad_teleop.py --execute
[main e0bf052] daemon に stop を足した版を tools/pi に置く
 1 file changed, 339 insertions(+)
 create mode 100644 tools/pi/mecharm_daemon.py
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261105_160038
[実機] daemon に送ります。起動したときの姿勢: -0.61 +4.83 +5.00 -0.08 +0.96 -29.61
別のタブで開く保存

16:08 止めたあとにほかの関節を指令へ戻す形にしたら、もっと動かなくなった

ずれを打ち消すつもりで、止めたあと、動かしていた関節は止まった角度、ほかの関節は指令の角度で送り直す形にしました(commit f0d7e73)。あわせて、1回押しの「届いた」を、動かした関節が0.5°以内に来たときだけにしました。

ところが実機では、全体がぎこちなくなり、1回押しも長押しも、動かないことが増えました。このとき私は、送り直しても動かないなら mechArm のサーボは1〜2°の小さな動きにそもそも反応しないのかもしれない、と書きました。これには次の指摘がありました。

前に細かい動作で動いていたじゃん?

記録を見直すと、その通りでした。前の回でも1°押しで関節は動いていて、この記録でも、止めた直後の1°押しと2°押しは動いていました。動かなかった場面に共通していたのは、腕を伸ばした姿勢で j1 が自分の重さで指令より3〜6°下がっていたことです(指令40.07°に対して、読むと43〜46°)。戻す命令でその j1 を40.07°へ送っても届かず、届かない指令を抱えたままだと、次に送った指令が無視されやすくなっていました。もう1つ、長押しで次の15°を送ったときに、それが無視されて前の目標で止まる場面もありました(j0 が −27.4°、−64.2°、−36.1° で止まった)。

teleop_20261105_161347 を1回押しと止める処理ごとに並べた出力

== teleop_20261105_161347  行 118
-- 1 回押し: 送った量と, 動かした関節が動いた量
   0.00s j0 -1° → 動いた -1.32° ほかの関節の最大の変化 1.15° 届いた 待ち 0.4秒 送り直し 0回
   4.81s j0 -1° → 動いた -1.32° ほかの関節の最大の変化 0.18° 届いた 待ち 0.02秒 送り直し 0回
   5.90s j0 -2° → 動いた -1.67° ほかの関節の最大の変化 0.18° 届いた 待ち 0.03秒 送り直し 0回
  10.02s j0 +2° → 動いた 1.23° ほかの関節の最大の変化 0.09° 届いた 待ち 0.35秒 送り直し 0回
  14.59s j0 +2° → 動いた 0.0° ほかの関節の最大の変化 1.14° 動かなかった 待ち 2.8秒 送り直し 3回
  18.75s j0 +1° → 動いた 2.72° ほかの関節の最大の変化 0.35° 届いた 待ち 0.33秒 送り直し 0回
  21.59s j0 +1° → 動いた 1.41° ほかの関節の最大の変化 1.4° 届いた 待ち 0.7秒 送り直し 0回
  27.74s j2 -1° → 動いた -1.23° ほかの関節の最大の変化 0.7° 届かなかった 待ち 8.11秒 送り直し 0回
  37.80s j2 -2° → 動いた 0.0° ほかの関節の最大の変化 0.0° 動かなかった 待ち 2.79秒 送り直し 3回
  42.25s j2 -2° → 動いた 0.0° ほかの関節の最大の変化 0.08° 動かなかった 待ち 2.75秒 送り直し 3回
  45.38s j2 -2° → 動いた 0.0° ほかの関節の最大の変化 0.26° 動かなかった 待ち 2.78秒 送り直し 3回
  49.25s j2 -1° → 動いた 0.0° ほかの関節の最大の変化 0.27° 動かなかった 待ち 2.84秒 送り直し 3回
-- 止める処理: 止める前に読んだ角度から, 止めたあとに読んだ角度までの差 (6 関節)
   2.73s hold_stall j0 差 [0.0, 1.84, 1.14, -0.18, 1.85, 0.0] 送り直し [-27.42, 40.07, -19.95, 3.95, -27.86, -30.76]
   8.33s release j0 差 [-1.06, 1.5, 0.96, -0.88, 1.67, 0.0] 送り直し [-80.77, 40.07, -19.95, 3.95, -27.86, -30.76]
  12.29s release j0 差 [0.08, 1.85, 1.05, 0.0, 1.58, 0.0] 送り直し [-64.16, 40.07, -19.95, 3.95, -27.86, -30.76]
  21.21s hold_stall j0 差 [-0.09, 1.84, 1.05, 0.26, 2.02, 0.0] 送り直し [-36.21, 40.07, -19.95, 3.95, -27.86, -30.76]
  22.89s release j0 差 [12.83, 1.5, 1.05, 0.18, 1.76, 0.08] 送り直し [-21.97, 44.03, -19.95, 3.95, -27.86, -30.76]
  41.24s release j2 差 [0.0, 0.0, -13.71, 0.0, 0.0, 0.0] 送り直し [-21.97, 44.03, -33.13, 3.95, -27.86, -30.76]
-- 受付なし 10 回. そのとき動いていた仕事: {'move(長押し)': 2, 'halt': 5, 'move': 3}

ゲームパッドの端末の出力(16:13 teleop_20261105_161347)

09_sec07.txt3,357字・47行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts
git add tools/gamepad_teleop.py tools/test_gamepad_teleop.py
git commit -m "gamepad_teleop: 止めたあと他の関節を指令へ戻す・出発点を関節ごと に・1刻みの届いた判定を0.5°に"
python3 tools/gamepad_teleop.py --execute
[main f0d7e73] gamepad_teleop: 止めたあと他の関節を指令へ戻す・出発点を関節ごとに・1刻みの届いた判定を0.5°に
 2 files changed, 137 insertions(+), 30 deletions(-)
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261105_161347
[実機] daemon に送ります。起動したときの姿勢: +1.93 +40.07 -19.95 +3.95 -27.86 -30.76
別のタブで開く保存

そこで、止めたあとは何も送らず、動かしていない関節の指令は変えない(重さで下がった分を拾わない)形にしました。1回押しの「届いた」は動かした関節だけで判定し、長押しが目標の手前で止まったら0.3秒で同じ目標を送り直すようにしました(commit 31a336c)。それでも、1回押しはあまり動きませんでした。

ゲームパッドの端末の出力(16:22 teleop_20261105_162224)

10_sec07.txt3,075字・51行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts
git add tools/gamepad_teleop.py tools/test_gamepad_teleop.py
git commit -m "gamepad_teleop: 止めたあと送り直さない・1刻みは動かした関節だけで判定・長押しが止まったら送り直す"
python3 tools/gamepad_teleop.py --execute
[main 31a336c] gamepad_teleop: 止めたあと送り直さない・1刻みは動かした関節だけで判定・長押しが止まったら送り直す
 2 files changed, 70 insertions(+), 23 deletions(-)
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261105_162224
[実機] daemon に送ります。起動したときの姿勢: -0.17 +1.58 +0.96 +0.26 -0.17 -30.23
別のタブで開く保存

16:26 1°・2°の小さな動きは、動かす関節だけを送ると12回中12回動いた(jog_probe small)

当て推量で直すのをやめ、小さな動きがどの送り方なら通るかを、実機で一度だけ確かめました。腕を少し前に倒した姿勢(j1 40°。直前にゲームパッドでいた姿勢)にして、根元 j0 を±1°と±2°ずつ、3通りの送り方で6回ずつ送りました。

送り方1°2°
S1 6関節まとめて送る。ほかの関節は今読んだ角度
6回中5回動いた6回中6回
S2 6関節まとめて送る。ほかの関節は指令の角度(重さで下がった分とずれている。このときのゲームパッドの送り方)
6回中5回6回中6回
S3 j0 だけを send_angle で送る
6回中6回(毎回0.79°)6回中6回(毎回2.19°)

止まった姿勢から送れば、1°・2°の動きはどの送り方でもほぼ通りました。サーボは小さな動きにちゃんと反応します。動かす関節だけを送る S3 は、動いた量も毎回そろっていました。

jog_probe small の端末の出力(16:26)

(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts
git add tools/gamepad_teleop.py tools/test_gamepad_teleop.py tools/jog_probe.sh tools/pi/jog_probe_pi.py
git commit -m "gamepad_teleop の直しと、jog_probe に小さな動きを比べる small の 組を足す"
tools/jog_probe.sh small
[main 2726d9d] gamepad_teleop の直しと、jog_probe に小さな動きを比べる small の組を足す
 2 files changed, 80 insertions(+), 3 deletions(-)
jog_probe 20261105_162617 (結果: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_162617_small)
--- デーモンの状態 (止める前)
mode=systemd
pid=26153
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=26153
checker=no
--- デーモンの状態 (止めたあと)
mode=none
pid=なし
listen=no
serial_users=(なし)
checker=no
pymycobot 2.9.6 (/usr/local/lib/python2.7/dist-packages/pymycobot/__init__.py)
始めの角度: [-0.43, 1.66, 0.7, 0.26, -0.26, -30.14]
根元 j0 だけを、始めの角度から 25° 以内で動かします。毎回始めの角度へ戻します。

0. 読み取りの速さ (動かさない)
  読み取り 1 回: 中央 16.0 ms / 最大 18.5 ms / 空で返った割合 0.0

腕を少し前に倒した姿勢 [0.0, 40.0, -20.0, 0.0, -30.0, -30.0] へ動かします  (Enter で進む / q と Enter で終わる)

  着いた角度: [-0.43, 41.13, -18.19, 0.26, -28.91, -30.14]  (指令との差 j1 +1.13°)

S1 1.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S1 1.0°] 動いた 5/6  動いた量: 0.86 0.86 0.86 0.86 0.86 -0.0

S1 2.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S1 2.0°] 動いた 6/6  動いた量: 2.2 2.37 1.93 2.27 2.18 2.36

S2 1.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S2 1.0°] 動いた 5/6  動いた量: 1.05 0.96 0.0 1.06 0.8 0.88

S2 2.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S2 2.0°] 動いた 6/6  動いた量: 2.18 2.36 2.01 2.27 2.1 2.28

S3 1.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S3 1.0°] 動いた 6/6  動いた量: 0.79 0.79 0.79 0.79 0.79 0.79

S3 2.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S3 2.0°] 動いた 6/6  動いた量: 2.19 2.19 2.19 2.19 2.19 2.19

HOME へ戻します  (Enter で進む / q と Enter で終わる)

結果: /tmp/jog_probe_20261105_162617.json
Connection to 192.168.2.1 closed.
--- jog_probe_pi.py の終了コード: 0
結果の JSON: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_162617_small/result.json
--- デーモンを戻す (systemctl start)
mode=systemd
pid=6649
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=6649
checker=no
デーモンは戻った (5555 LISTEN)

diag/jog_probe_20261105_162617_small/result.json

{"started_at": "2022-10-13 16:18:45", "pymycobot": "2.9.6", "params": {"speed": 20, "stream_interval": 0.1, "stream_ahead": 3.0, "jog_speeds": [10, 30], "guard_deg": 25.0, "set": "small", "jog_dir": {"+1": 0, "-1": 1}}, "tests": {"read": {"median_ms": 16.0, "max_ms": 18.5, "empty_ratio": 0.0}, "small": {"S1_1": {"how": "S1", "step": 1.0, "n_moved": 5, "n": 6, "trials": [{"i": 0, "sign": 1, "q0": -0.43, "want": 0.57, "moved_deg": 0.86, "moved": true, "moved_at_sec": 0.12, "others_gap_deg": 1.81}, {"i": 1, "sign": -1, "q0": 0.43, "want": -0.57, "moved_deg": 0.86, "moved": true, "moved_at_sec": 0.2, "others_gap_deg": 2.78}, {"i": 2, "sign": 1, "q0": -0.43, "want": 0.57, "moved_deg": 0.86, "moved": true, "moved_at_sec": 0.17, "others_gap_deg": 3.66}, {"i": 3, "sign": -1, "q0": 0.43, "want": -0.57, "moved_deg": 0.86, "moved": true, "moved_at_sec": 0.2, "others_gap_deg": 4.82}, {"i": 4, "sign": 1, "q0": -0.43, "want": 0.57, "moved_deg": 0.86, "moved": true, "moved_at_sec": 0.17, "others_gap_deg": 6.05}, {"i": 5, "sign": -1, "q0": 0.43, "want": -0.57, "moved_deg": -0.0, "moved": false, "moved_at_sec": null, "others_gap_deg": 7.28}]}, "S1_2": {"how": "S1", "step": 2.0, "n_moved": 6, "n": 6, "trials": [{"i": 0, "sign": 1, "q0": 0.43, "want": 2.43, "moved_deg": 2.2, "moved": true, "moved_at_sec": 0.25, "others_gap_deg": 7.28}, {"i": 1, "sign": -1, "q0": 2.63, "want": 0.63, "moved_deg": 2.37, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 8.51}, {"i": 2, "sign": 1, "q0": 0.26, "want": 2.26, "moved_deg": 1.93, "moved": true, "moved_at_sec": 0.12, "others_gap_deg": 9.65}, {"i": 3, "sign": -1, "q0": 2.19, "want": 0.19, "moved_deg": 2.27, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 10.88}, {"i": 4, "sign": 1, "q0": -0.08, "want": 1.92, "moved_deg": 2.18, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 12.03}, {"i": 5, "sign": -1, "q0": 2.1, "want": 0.1, "moved_deg": 2.36, "moved": true, "moved_at_sec": 0.14, "others_gap_deg": 13.26}]}, "S2_1": {"how": "S2", "step": 1.0, "n_moved": 5, "n": 6, "trials": [{"i": 0, "sign": 1, "q0": -0.26, "want": 0.74, "moved_deg": 1.05, "moved": true, "moved_at_sec": 0.35, "others_gap_deg": 14.4}, {"i": 1, "sign": -1, "q0": 0.79, "want": -0.21, "moved_deg": 0.96, "moved": true, "moved_at_sec": 0.17, "others_gap_deg": 2.09}, {"i": 2, "sign": 1, "q0": -0.17, "want": 0.83, "moved_deg": 0.0, "moved": false, "moved_at_sec": null, "others_gap_deg": 2.09}, {"i": 3, "sign": -1, "q0": -0.17, "want": -1.17, "moved_deg": 1.06, "moved": true, "moved_at_sec": 0.19, "others_gap_deg": 2.09}, {"i": 4, "sign": 1, "q0": -1.23, "want": -0.23, "moved_deg": 0.8, "moved": true, "moved_at_sec": 0.17, "others_gap_deg": 2.09}, {"i": 5, "sign": -1, "q0": -0.43, "want": -1.43, "moved_deg": 0.88, "moved": true, "moved_at_sec": 0.19, "others_gap_deg": 2.09}]}, "S2_2": {"how": "S2", "step": 2.0, "n_moved": 6, "n": 6, "trials": [{"i": 0, "sign": 1, "q0": -1.31, "want": 0.69, "moved_deg": 2.18, "moved": true, "moved_at_sec": 0.2, "others_gap_deg": 2.09}, {"i": 1, "sign": -1, "q0": 0.87, "want": -1.13, "moved_deg": 2.36, "moved": true, "moved_at_sec": 0.14, "others_gap_deg": 2.09}, {"i": 2, "sign": 1, "q0": -1.49, "want": 0.51, "moved_deg": 2.01, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 2.09}, {"i": 3, "sign": -1, "q0": 0.52, "want": -1.48, "moved_deg": 2.27, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 2.09}, {"i": 4, "sign": 1, "q0": -1.75, "want": 0.25, "moved_deg": 2.1, "moved": true, "moved_at_sec": 0.13, "others_gap_deg": 2.09}, {"i": 5, "sign": -1, "q0": 0.35, "want": -1.65, "moved_deg": 2.28, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 2.09}]}, "S3_1": {"how": "S3", "step": 1.0, "n_moved": 6, "n": 6, "trials": [{"i": 0, "sign": 1, "q0": -1.93, "want": -0.93, "moved_deg": 0.79, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 2.09}, {"i": 1, "sign": -1, "q0": -1.14, "want": -2.14, "moved_deg": 0.79, "moved": true, "moved_at_sec": 0.2, "others_gap_deg": 2.09}, {"i": 2, "sign": 1, "q0": -1.93, "want": -0.93, "moved_deg": 0.79, "moved": true, "moved_at_sec": 0.17, "others_gap_deg": 2.09}, {"i": 3, "sign": -1, "q0": -1.14, "want": -2.14, "moved_deg": 0.79, "moved": true, "moved_at_sec": 0.2, "others_gap_deg": 2.09}, {"i": 4, "sign": 1, "q0": -1.93, "want": -0.93, "moved_deg": 0.79, "moved": true, "moved_at_sec": 0.19, "others_gap_deg": 2.09}, {"i": 5, "sign": -1, "q0": -1.14, "want": -2.14, "moved_deg": 0.79, "moved": true, "moved_at_sec": 0.22, "others_gap_deg": 2.09}]}, "S3_2": {"how": "S3", "step": 2.0, "n_moved": 6, "n": 6, "trials": [{"i": 0, "sign": 1, "q0": -1.93, "want": 0.07, "moved_deg": 2.19, "moved": true, "moved_at_sec": 0.2, "others_gap_deg": 2.09}, {"i": 1, "sign": -1, "q0": 0.26, "want": -1.74, "moved_deg": 2.19, "moved": true, "moved_at_sec": 0.16, "others_gap_deg": 2.09}, {"i": 2, "sign": 1, "q0": -1.93, "want": 0.07, "moved_deg": 2.19, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 2.09}, {"i": 3, "sign": -1, "q0": 0.26, "want": -1.74, "moved_deg": 2.19, "moved": true, "moved_at_sec": 0.15, "others_gap_deg": 2.09}, {"i": 4, "sign": 1, "q0": -1.93, "want": 0.07, "moved_deg": 2.19, "moved": true, "moved_at_sec": 0.14, "others_gap_deg": 2.09}, {"i": 5, "sign": -1, "q0": 0.26, "want": -1.74, "moved_deg": 2.19, "moved": true, "moved_at_sec": 0.14, "others_gap_deg": 2.09}]}}}, "start": [-0.43, 1.66, 0.7, 0.26, -0.26, -30.14], "small_pose_measured": [-0.43, 41.13, -18.19, 0.26, -28.91, -30.14]}
別のタブで開く保存

16:28 十字キーは、動かす関節だけを send_angle で送る形にした

十字キーの1回押しも長押しも、動かす関節だけを send_angle で送る形にしました(commit b71ffb5)。HOME だけは今までどおり6関節まとめて送ります。

  • ねらい:重さで下がった関節の指令とぶつからないようにし、ほかの関節を動かさない
  • 変わったこと:十字キーで送る指令から、動かさない5つの関節の角度が消えた
  • 見込める効果:ほかの関節がつられて動くこと、ずれの積み上がりが、仕組みとして起きなくなる。実際、このあとの記録では、j1 は起動時と終わりで 1.49°→1.14°、1.31°→2.54° と、ほとんど変わらなかった

ほかの関節は止まったままになりましたが、今度は受付なしが目立ちました。1本の記録で40回です。

teleop_20261105_163144 を1回押しと止める処理ごとに並べた出力

== teleop_20261105_163144  行 326
-- 1 回押し: 送った量と, 動かした関節が動いた量
   2.94s j0 -1° → 動いた -0.88° ほかの関節の最大の変化 0.0° 届いた 待ち 0.34秒 送り直し 0回
   8.50s j0 +2° → 動いた 2.02° ほかの関節の最大の変化 0.8° 届いた 待ち 0.03秒 送り直し 0回
  16.76s j2 -1° → 動いた -2.37° ほかの関節の最大の変化 3.17° 届かなかった 待ち 8.16秒 送り直し 0回
  25.35s j2 -1° → 動いた 0.0° ほかの関節の最大の変化 2.1° 動かなかった 待ち 3.16秒 送り直し 3回
  30.41s j2 -1° → 動いた 0.0° ほかの関節の最大の変化 4.13° 動かなかった 待ち 2.77秒 送り直し 3回
  36.51s j2 +1° → 動いた 0.7° ほかの関節の最大の変化 7.11° 届いた 待ち 0.37秒 送り直し 0回
  41.90s j2 -1° → 動いた 0.61° ほかの関節の最大の変化 2.55° 届かなかった 待ち 8.14秒 送り直し 0回
  54.53s j3 -1° → 動いた -0.53° ほかの関節の最大の変化 0.0° 届いた 待ち 3.31秒 送り直し 1回
  60.27s j3 -1° → 動いた -0.97° ほかの関節の最大の変化 0.0° 届いた 待ち 0.33秒 送り直し 0回
  68.20s j3 +1° → 動いた 0.53° ほかの関節の最大の変化 1.05° 届いた 待ち 3.44秒 送り直し 2回
  72.90s j3 +1° → 動いた 1.05° ほかの関節の最大の変化 0.44° 届いた 待ち 0.35秒 送り直し 0回
  77.89s j3 +1° → 動いた 1.23° ほかの関節の最大の変化 0.0° 届いた 待ち 0.35秒 送り直し 0回
  78.90s j3 +1° → 動いた 0.53° ほかの関節の最大の変化 1.41° 届いた 待ち 2.36秒 送り直し 0回
  82.36s j4 -1° → 動いた -2.28° ほかの関節の最大の変化 0.09° 届いた 待ち 0.35秒 送り直し 0回
  86.78s j4 +1° → 動いた 1.85° ほかの関節の最大の変化 1.06° 届かなかった 待ち 8.1秒 送り直し 0回
  97.10s j5 -1° → 動いた -0.53° ほかの関節の最大の変化 0.09° 届いた 待ち 3.34秒 送り直し 1回
 105.77s j5 -2° → 動いた 0.0° ほかの関節の最大の変化 0.0° 動かなかった 待ち 2.74秒 送り直し 3回
 111.65s j5 +1° → 動いた 0.52° ほかの関節の最大の変化 0.7° 届いた 待ち 1.98秒 送り直し 0回
 116.60s j0 -1° → 動いた -4.04° ほかの関節の最大の変化 0.97° 届いた 待ち 0.35秒 送り直し 0回
 121.42s j2 -1° → 動いた -1.85° ほかの関節の最大の変化 3.61° 届かなかった 待ち 8.14秒 送り直し 0回
 130.01s j2 -1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 動かなかった 待ち 2.81秒 送り直し 3回
 133.46s j2 +1° → 動いた 0.53° ほかの関節の最大の変化 0.53° 届かなかった 待ち 8.15秒 送り直し 0回
 186.47s j4 -1° → 動いた -1.57° ほかの関節の最大の変化 0.0° 届いた 待ち 5.34秒 送り直し 2回
 193.15s j4 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 動かなかった 待ち 2.78秒 送り直し 3回
 196.91s j4 -1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
 202.04s j4 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 動かなかった 待ち 2.79秒 送り直し 3回
 208.44s j4 +1° → 動いた 1.59° ほかの関節の最大の変化 0.09° 届いた 待ち 4.91秒 送り直し 0回
 230.75s j0 -1° → 動いた 0.0° ほかの関節の最大の変化 0.09° 動かなかった 待ち 2.83秒 送り直し 3回
 237.26s j0 -1° → 動いた 0.0° ほかの関節の最大の変化 0.53° 届かなかった 待ち 13.0秒 送り直し 1回
-- 止める処理: 止める前に読んだ角度から, 止めたあとに読んだ角度までの差 (6 関節)
   7.50s release j0 差 [-11.52, 0.97, 0.97, 0.0, 1.5, 0.0] 送り直し None
  14.68s release j0 差 [21.27, 1.05, 0.96, 0.0, 1.59, 0.0] 送り直し None
  35.76s release j2 差 [-0.09, 0.62, -6.06, 0.0, 3.25, 0.0] 送り直し None
  40.81s release j2 差 [0.0, 0.79, 22.68, 0.0, 1.41, 0.0] 送り直し None
  65.34s release j3 差 [0.0, 0.79, 0.62, -13.54, -0.44, 0.0] 送り直し None
  77.12s release j3 差 [0.0, 0.0, 0.0, 14.94, 0.0, 0.0] 送り直し None
  78.46s release j3 差 [0.0, 0.87, 0.61, 0.17, 1.23, 0.0] 送り直し None
  85.54s release j4 差 [0.0, 1.06, 0.7, -0.53, 1.76, 0.0] 送り直し None
 110.88s release j5 差 [0.0, 0.88, 0.7, -0.43, 1.49, -26.1] 送り直し None
 115.84s release j5 差 [0.0, 0.0, 0.0, 0.09, 0.0, 7.56] 送り直し None
 118.79s release j0 差 [-14.49, 0.79, 0.71, 0.08, 1.5, 0.0] 送り直し None
 201.19s release j4 差 [0.0, -0.08, 0.0, 0.0, -6.68, 0.0] 送り直し None
-- 受付なし 40 回. そのとき動いていた仕事: {'halt': 12, 'move': 23, 'move(長押し)': 2, 'home': 3}

ゲームパッドの端末の出力(16:31 teleop_20261105_163144)

12_sec09.txt7,042字・111行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts
git add tools/gamepad_teleop.py tools/test_gamepad_teleop.py
git commit -m "gamepad_teleop: 十字キーは動かす関節だけを send_angle で送る"
python3 tools/gamepad_teleop.py --execute
[main b71ffb5] gamepad_teleop: 十字キーは動かす関節だけを send_angle で送る
 2 files changed, 31 insertions(+), 16 deletions(-)
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261105_163144
[実機] daemon に送ります。起動したときの姿勢: +0.70 +1.49 +1.75 -0.08 +0.26 -30.23
別のタブで開く保存

16:35 1回押しの待ちを短くした(受付なし 40回→28回)

受付なしの多くは、1回押しの「届いた」を待っている間に押したものでした。j2 のように重さで1〜2°手前で止まる関節では、届くのを8秒の上限まで待っていました。角度を読む間隔も0.3秒で、届いたと分かるまでに毎回0.3秒以上かかっていました(commit 72d9d96)。

  • 1回押しは、動き出して0.25秒止まったら「手前で止まった」として戻る。指令はその目標のままにし、次の押しはその先から動く
  • 1回押しで角度を読む間隔を0.3秒から0.05秒に
  • 動き出さないときの送り直しは、0.5秒おきに3回から、0.3秒おきに2回に
  • 長押しを止めたあと角度を読むまでの待ちを0.3秒から0.1秒に

1回押しの待ちは中央の値で2.79秒から0.18秒になりました。それでも、数秒から十数秒まとめて受け付けない時間が残りました。いちばん長いのは約15秒で、長押しを離したあとの止める処理に11秒かかっていました。

teleop_20261105_163620 を1回押しと止める処理ごとに並べた出力

13_sec10.txt4,926字・74行・text
== teleop_20261105_163620  行 386
-- 1 回押し: 送った量と, 動かした関節が動いた量
   0.00s j0 -1° → 動いた -0.79° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
   5.22s j0 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
  17.49s j2 -1° → 動いた 0.0° ほかの関節の最大の変化 1.49° 動かなかった 待ち 1.01秒 送り直し 2回
  21.82s j2 +1° → 動いた 1.49° ほかの関節の最大の変化 0.0° 届いた 待ち 0.03秒 送り直し 0回
  28.88s j0 +1° → 動いた 1.49° ほかの関節の最大の変化 0.08° 届いた 待ち 0.17秒 送り直し 0回
  30.49s j4 -1° → 動いた -0.08° ほかの関節の最大の変化 2.28° 動かなかった 待ち 1.02秒 送り直し 2回
別のタブで開く保存

ゲームパッドの端末の出力(16:36 teleop_20261105_163620)

14_sec10.txt9,816字・136行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts
git add tools/gamepad_teleop.py tools/test_gamepad_teleop.py
git commit -m "gamepad_teleop: 受付なしを減らす(止める待ち0.1秒・1刻みは止まっ たら戻る・読む間隔0.05秒)"
python3 tools/gamepad_teleop.py --execute
[main 72d9d96] gamepad_teleop: 受付なしを減らす(止める待ち0.1秒・1刻みは止まったら戻る・読む間隔0.05秒)
 2 files changed, 47 insertions(+), 9 deletions(-)
[記録] /Volumes/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop/teleop_20261105_163620
[実機] daemon に送ります。起動したときの姿勢: -0.26 +1.14 +1.75 +0.26 -0.26 -29.79
別のタブで開く保存

16:41 daemon が角度を読み直す待ちを0.2秒から0.02秒にした(受付なし 28回→13回)

まとめて受け付けない時間の原因は、daemon が角度を読むところでした。アームが動いている最中は、角度の読み取りが空で返ることがよくあります。daemon はそのたびに0.2秒待って最大12回読み直すので、1回の読み取りに最長約2.6秒かかります。Mac 側も読めないと5回読み直すので、合わせて10秒を超えることがありました。しかも daemon は、送る命令のたびに、記録のためだけに角度を読んでいて、ここで読めないと送る命令の返事そのものが遅れていました。

daemon を次のように書き換えるスクリプト(tools/daemon_fast_read.sh)を作りました。書き換える前の daemon は、KIOXIA の archive/mecharm_daemon_premerge_fastread_20261105_170254/ に写してあります。

  • 読み直しの待ちを0.2秒から0.02秒に(jog_probe で直接読んだときは、0.02秒おきの読み直しですぐ読めていた)

  • 送る命令のあとの記録用の読み取りは1回だけにし、読めなくても送る命令はすぐ返す

  • ゲームパッドの止める処理の読み取りも1回だけにした(Mac 側。commit 617c3bd)

  • ねらい:アームが動いている最中の読み取りの失敗で、指令の返事と次の操作が何秒も止まらないようにする

  • 変わったこと:読めなかったときの待ちが、1回の読み取りで最長約2.6秒から約0.3秒になった。受付なしは28回から13回になり、1回押しの待ちの最大は5.59秒から1.27秒になった

  • 見込める効果:π0.5 の実機推論も同じ daemon を通るので、送る指令の返りが速くなり、前から気になっていた動きの合間の長さも短くなる見込み。推論ではまだ測っていない

Pi の mecharm_daemon.py の差分(書き換える前 → stop を足し、読み直しを速くしたあと)

--- mecharm_daemon.py(11/5 15:59 に Pi から持ち帰った版)
+++ tools/pi/mecharm_daemon.py(stop と読み直しの変更のあと)
@@ -18,7 +18,7 @@
 SERIAL_PORT = "/dev/ttyAMA0"
 BAUDRATE = 1000000
 GET_ANGLES_RETRIES = 12
-GET_ANGLES_INTERVAL_SEC = 0.2
+GET_ANGLES_INTERVAL_SEC = 0.02   # 2026-11-05: 0.2 → 0.02 (動いている間は空で返ることが多く, 1 回の読み取りに最長 2.6 秒かかっていた)
 
 _mc = None
 _server_sock = None
@@ -54,6 +54,16 @@
     return None
 
 
+def read_angles_once_for_log():
+    """送ったあとの記録用に 1 回だけ読む (2026-11-05). 読めなくても待たない.
+    以前は読み直しつきで, 読めないと送る命令の返事が最長 2.6 秒遅れていた."""
+    try:
+        a = _mc.get_angles()
+    except Exception:
+        return None
+    return a if isinstance(a, (list, tuple)) and len(a) == 6 else None
+
+
 def handle_command(cmd_obj):
     """コマンドを処理してレスポンス dict を返す。"""
     global _fresh_mode_state
@@ -78,7 +88,7 @@
 
             if wait > 0:
                 time.sleep(wait)
-            current_angles = read_angles_with_retry("send_angles_after", log_fail=False)
+            current_angles = read_angles_once_for_log()
             log(f"send_angles 後の現在角度: {current_angles}")
 
             return {"ok": True, "result": result, "elapsed_ms": elapsed_ms}
@@ -104,7 +114,7 @@
 
             if wait > 0:
                 time.sleep(wait)
-            current_angles = read_angles_with_retry("send_angle_after", log_fail=False)
+            current_angles = read_angles_once_for_log()
             log(f"send_angle 後の現在角度: {current_angles}")
 
             return {"ok": True, "result": result, "elapsed_ms": elapsed_ms}
@@ -235,6 +245,20 @@
             return {"ok": True, "angles": list(a)}
         return {"ok": True, "angles": None, "raw": repr(a)[:80]}
 
+    # 2026-11-05: 動いている途中で止める (ゲームパッドの長押しを離したとき・L2+R2).
+    # jog_probe (diag/jog_probe_20261105_*) で jog_stop と stop はどちらも効かない回があったので両方呼ぶ.
+    elif cmd == "stop":
+        res = {}
+        for name in ("jog_stop", "stop"):
+            try:
+                res[name] = getattr(_mc, name)()
+            except Exception as e:
+                res[name] = f"{type(e).__name__}: {e}"
+        log(f"stop: {res}")
+        if all(isinstance(v, str) for v in res.values()):
+            return {"ok": False, "error": f"stop failed: {res}"}
+        return {"ok": True, "result": res}
+
     else:
         return {"ok": False, "error": f"unknown cmd: {cmd}"}

daemon の読み直しを速くしたときと、ゲームパッドの端末の出力(17:03 teleop_20261105_170313)

15_sec11.txt11,242字・154行・text
(base) shimazueiichi@shimadzueiichinoMacBook-Pro r2r2r-scripts % cd ~/r2r2r-scripts
git add tools/gamepad_teleop.py tools/daemon_fast_read.sh
git commit -m "daemon の読み直しを速くするスクリプト・止めるときの読み取りは1回 だけ"
tools/daemon_fast_read.sh
git add tools/pi/mecharm_daemon.py
git commit -m "daemon の読み直しを0.02秒にした版を tools/pi に置く"
python3 tools/gamepad_teleop.py --execute
[main 617c3bd] daemon の読み直しを速くするスクリプト・止めるときの読み取りは1回だけ
別のタブで開く保存

teleop_20261105_170313 を1回押しと止める処理ごとに並べた出力

16_sec11.txt5,656字・84行・text
== teleop_20261105_170313  行 549
-- 1 回押し: 送った量と, 動かした関節が動いた量
   0.00s j0 -1° → 動いた -1.05° ほかの関節の最大の変化 0.0° 届いた 待ち 0.1秒 送り直し 0回
   6.46s j2 -1° → 動いた 0.0° ほかの関節の最大の変化 3.34° 動かなかった 待ち 1.04秒 送り直し 2回
  10.85s j2 +1° → 動いた 0.44° ほかの関節の最大の変化 0.79° 届いた 待ち 0.18秒 送り直し 0回
  15.45s j0 +1° → 動いた 3.95° ほかの関節の最大の変化 1.93° 届いた 待ち 0.22秒 送り直し 0回
  15.85s j0 +1° → 動いた -0.35° ほかの関節の最大の変化 0.0° 動かなかった 待ち 1.04秒 送り直し 2回
  17.75s j0 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 動かなかった 待ち 1.06秒 送り直し 2回
別のタブで開く保存

17:08 押した瞬間には送らず、離したら1刻み・押し続けたら長押しのどちらかだけを送る形にした(受付なし 13回→0回)

残っていたのは、十字キーの向きを変えたときの細かい動きです。今までは、押すとまず1°動き、0.4秒押し続けたら長押しの動きに変わっていたので、向きを変えるたびに、1°動いて少し止まってから動き出す形になっていました。さらに、前の長押しを止める処理と重なると、押した瞬間の1回が受付なしになっていました。

  • 押した瞬間には送らない。0.4秒より前に離せば1刻み、押し続ければ長押しの、どちらか片方だけを送る(commit 452a3b6)
  • 動いている最中に押した十字キーは捨てず、前の動きや止める処理が終わってから送る。何回か押したときは最後の1回だけで、1秒以内に送れなければ捨てる(あとから急に動かさないため)。爪と HOME は今までどおり、動いている間は受付なし

そのかわり、短く押したときは離した瞬間に動くので、今までより0.1〜0.2秒遅れて動き出します。最後の記録では受付なしが0回になり、1回押しの待ちは中央の値で0.17秒でした。1回だけ、1回押しが7.75秒かかった場面が残っています(j1 の2°押しで、最初の送信から送り直しまで約7秒あいていた。原因はまだ調べていない)。

teleop_20261105_171125 を1回押しと止める処理ごとに並べた出力

== teleop_20261105_171125  行 235
-- 1 回押し: 送った量と, 動かした関節が動いた量
  30.78s j1 +1° → 動いた 2.02° ほかの関節の最大の変化 1.05° 手前で止まった 待ち 0.59秒 送り直し 0回
  31.46s j1 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
  32.00s j1 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.03秒 送り直し 0回
  34.30s j1 +2° → 動いた 0.0° ほかの関節の最大の変化 1.84° 動かなかった 待ち 7.75秒 送り直し 2回
  42.25s j1 -1° → 動いた 0.88° ほかの関節の最大の変化 0.35° 手前で止まった 待ち 0.3秒 送り直し 0回
  44.90s j2 -1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 動かなかった 待ち 1.02秒 送り直し 2回
  46.01s j2 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
  46.93s j2 +1° → 動いた 1.49° ほかの関節の最大の変化 0.0° 届いた 待ち 0.17秒 送り直し 0回
  48.05s j2 +1° → 動いた 0.35° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
  48.89s j2 +1° → 動いた 0.0° ほかの関節の最大の変化 0.0° 届いた 待ち 0.02秒 送り直し 0回
  50.04s j2 +2° → 動いた 1.58° ほかの関節の最大の変化 0.0° 届いた 待ち 0.16秒 送り直し 0回
  50.95s j2 +2° → 動いた 1.5° ほかの関節の最大の変化 0.0° 届いた 待ち 0.17秒 送り直し 0回
  52.14s j2 +2° → 動いた 1.49° ほかの関節の最大の変化 0.0° 届いた 待ち 0.16秒 送り直し 0回
  53.18s j2 +2° → 動いた 2.02° ほかの関節の最大の変化 0.0° 手前で止まった 待ち 0.6秒 送り直し 0回
-- 止める処理: 止める前に読んだ角度から, 止めたあとに読んだ角度までの差 (6 関節)
   3.06s release j0 差 [-9.84, 0.0, 0.0, 0.0, 0.0, 0.0] 送り直し None
   6.72s release j0 差 [15.11, 0.97, 0.88, -0.09, 1.49, 0.0] 送り直し None
  10.85s release j2 差 [0.0, 0.18, -4.04, 0.0, 0.61, 0.0] 送り直し None
  13.29s release j2 差 [0.0, 0.96, 3.6, 0.0, 1.5, 0.0] 送り直し None
  17.58s release j4 差 [0.0, 0.79, 0.71, 0.0, 8.7, 0.0] 送り直し None
  22.03s release j4 差 [0.0, 0.96, 0.87, 0.0, 1.23, 0.0] 送り直し None
  26.51s release j1 差 [0.0, -4.04, -0.09, 0.0, -0.35, 0.0] 送り直し None
  29.95s release j1 差 [-0.08, 2.11, 0.96, 0.0, 1.76, 0.0] 送り直し None
  56.94s release j0 差 [-3.87, 1.14, 0.35, 0.97, 1.4, 0.17] 送り直し None
  60.59s release j0 差 [6.95, 1.05, 0.44, -0.62, 1.23, -0.08] 送り直し None
 257.83s controller_disconnected jNone 差 [-0.09, 1.05, 0.79, 0.09, 1.48, 0.0] 送り直し None
-- 受付なし 0 回. そのとき動いていた仕事: {}

7本の記録を同じ数え方で並べた表

7本の記録の比べ(src/teleop_stats.py の出力)

| 記録 | 行 | 1回押し 送った | 動かした関節が0.3°以上動いた | 受付なし | 止める | 長押しの目標を送った回数 | 1回押しの待ち 中央/最大(秒) | 起動時と終わりの j1 |
|---|---|---|---|---|---|---|---|---|
| 160038 | 376 | 30 | 4 | 4 | 29 | 103 | 0.02 / 0.34 | +4.83 → +37.00 |
| 161347 | 118 | 12 | 7 | 10 | 6 | 16 | 1.73 / 8.11 | +40.07 → +46.75 |
| 162224 | 86 | 10 | 6 | 22 | 2 | 15 | 2.79 / 8.85 | +1.58 → +2.98 |
| 163144 | 326 | 29 | 20 | 40 | 12 | 84 | 2.79 / 13.00 | +1.49 → +1.14 |
| 163620 | 386 | 48 | 27 | 28 | 22 | 104 | 0.18 / 5.59 | +1.14 → +2.54 |
| 170313 | 549 | 52 | 32 | 13 | 28 | 138 | 0.34 / 1.27 | +1.31 → +2.54 |
| 171125 | 235 | 14 | 8 | 0 | 11 | 58 | 0.17 / 7.75 | +1.49 → +30.67 |

1回押しの「動いた」は、動かした関節が0.3°以上動いた回数です。最後の記録の j1 が30.67°で終わっているのは、j1 を長押しで動かしたためで、ずれではありません。

なめらかさは speed 20 以上でしか出ないが、修正に使うには足りている

送り方をいろいろ変えても、mechArm 270 のサーボはゆっくり動かすと0.2秒ごとに進んで止まります。長押しで大きく運び、1回押しの1°・2°で合わせる形なら、AI の動きを直す道具としては足りていると判断しました。

次に確かめること

順番確かめること見る数字
1
π0.5 の実機推論で失敗しかけたところを、このゲームパッドで直す
1回の直しにかかった時間・直した回数
2
daemon の読み直しを速くしたあと、推論の動きの合間が短くなったか
推論の1回の送信の返り・1つの動作にかかる時間
3
1回押しが7秒以上かかった場面の原因
その送信の前後の daemon のログ
4
十字キーの右で根元がどちらに回るか(今は右がプラス)を決める
―

18:00 LinkedIn の自動投稿のトークンを作り直した

この回の SNS を予約したとき、LinkedIn の自動投稿に使うトークン(投稿してよいという合図の文字列)が12月23日ごろに切れることが分かりました。トークンは60日で切れます(2026-10-24 に作ったもの)。そのままだと、それより後に予約した LinkedIn の投稿(この回の分は2027年1月6日)は出ません。そこで、この場で作り直しました。

順番やったことだれが
1
LinkedIn の開発者ページ(LinkedIn Developers)で、App「Pixels to Motors Autopost」の OAuth Token Tools を開き、scope に openid・profile・w_member_social を選んでトークンを作った
人
2
トークンを KIOXIA の keys/linkedin_token.txt に保存した(チャットには貼らない)
人
3
中身を画面に出さずに、LinkedIn の https://api.linkedin.com/v2/userinfo に問い合わせ、使えることを確かめた
Claude
4
GitHub の r2r2r-content の Actions の Secret LINKEDIN_ACCESS_TOKEN を、ブラウザで上書きした(Update secret)
人
5
次に切れる前の 2026-12-31 10:00 に、作り直しのリマインダーを予約した
Claude

4は、はじめ Claude が代わりにやるつもりでしたが、Claude の作業環境から GitHub へつなぐ経路では、Actions の Secret をさわれない決まりになっていました。そのときの返事です(トークンの中身は出していません)。

Claude の作業環境から Secret を上書きしようとしたときの返事

failed to fetch public key: HTTP 403: Access to this GitHub Actions path is not permitted through this proxy. (https://api.github.com/repos/PixelstoMotors/r2r2r-content/actions/secrets/public-key)

トークンが使えるかを確かめたときの出力

トークンは有効 True

次にトークンが切れるのは2027年1月4日ごろです。作り直しは、上の1・2・4を人がブラウザで行い、3を Claude が確かめる形になります。

この回のコード(全文)

gamepad_teleop.py(commit 452a3b6)

tools/gamepad_teleop.py

#!/usr/bin/env python3
"""gamepad_teleop.py — ゲームパッドで mechArm 270 を手で動かす (依頼 68. 2026-11-02)

PICK で爪の位置がずれたときに, エイイチがゲームパッドで左右・上げ下げ・爪の開閉を直す.
押した分だけそのまま動く. 自動で動く要素は入れない (自動の握り直し・失敗時の自動 HOME などはない).
押した操作と, 送った角度・届いた角度をすべて log.jsonl に残す (あとで「人が直した記録」として使う).

操作 (エイイチが決めた. 変えない):
別のタブで開く保存

test_gamepad_teleop.py(テスト89件・commit 452a3b6)

tools/test_gamepad_teleop.py

#!/usr/bin/env python3
"""test_gamepad_teleop.py — gamepad_teleop.py の確かめ (アームなし・コントローラーなし. 依頼 68).

  python3 tools/test_gamepad_teleop.py -v

中身:
  - ボタン番号と操作の対応 (依頼 68 の表) / 十字キー上下の向き / △ で j1 → j5 → j1
  - 守り: j1 は 90.87 を超えない / 物理可動域まで (基準の姿勢からの枠はない. 2026-11-03) / J4_SAFE
別のタブで開く保存

jog_probe.sh

tools/jog_probe.sh

#!/bin/bash
# jog_probe.sh — Mac から, Pi の mechArm で根元 j0 を 4 つの動かし方で動かし, なめらかさと限界を測る (2026-11-03)
#
#   tools/jog_probe.sh     A 1 回の send_angles / B 送り直し (今の長押し) / C 送り直し + fresh_mode / D jog (speed 10・30)
#                          テストごとに Enter で進む。q と Enter で止める
#
# 流れ (tools/servo_check.sh と同じ):
#   0. KIOXIA のマウントを確かめ, diag/jog_probe_{日時}/ を作る
別のタブで開く保存

jog_probe_pi.py

tools/pi/jog_probe_pi.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""jog_probe_pi.py — 根元 j0 で 4 つの動かし方を測り, mechArm がどこまでなめらかに動くかを見る (2026-11-03)

Mac の tools/jog_probe.sh から呼ぶ (デーモンを止めてから, シリアルに直接つなぐ)。
Pi の python3 は 3.6, pymycobot 2.9.6 (PYTHONPATH=/usr/local/lib/python2.7/dist-packages)。

測るもの (どれも j0 だけを動かす. 始める前に HOME 近くにいること. 各テストのあと始めの角度へ戻す):
別のタブで開く保存

daemon_add_stop.sh

tools/daemon_add_stop.sh

#!/bin/bash
# daemon_add_stop.sh — Pi の mecharm_daemon.py に「stop」の命令を 1 つ書き足して起動し直す (2026-11-05)
#
#   tools/daemon_add_stop.sh
#
# なぜ: ゲームパッドの長押しを「15° 先へ 1 回送り, 離したら止める」形にするため (jog_probe 3 回の結果).
#       今の daemon には動いている途中で止める命令がない.
# 足す命令: {"cmd": "stop"} → mc.jog_stop() と mc.stop() を順に呼ぶ (どちらかが効かなかった試しがあるので両方).
別のタブで開く保存

daemon_fast_read.sh

tools/daemon_fast_read.sh

#!/bin/bash
# daemon_fast_read.sh — Pi の mecharm_daemon.py の角度の読み直しを速くして起動し直す (2026-11-05)
#
#   tools/daemon_fast_read.sh
#
# なぜ: 動いている間は get_angles が空で返ることが多く, daemon は 0.2 秒待って 12 回まで読み直す (1 回最長約 2.6 秒).
#       送る命令のたびに記録用にも読むので, 送る命令の返事も遅れ, ゲームパッドが最長 15 秒受け付けなかった.
# 変えること: 読み直しの待ち 0.2 → 0.02 秒. 送ったあとの記録用の読み取りは 1 回だけ (読めなくても待たない).
別のタブで開く保存

Pi の mecharm_daemon.py(stop を足し、読み直しを速くしたあと)

tools/pi/mecharm_daemon.py

#!/usr/bin/env python3
"""
mecharm_daemon.py
Pi 側で常駐する MyCobot 制御デーモン。
TCP socket で Mac からの JSON コマンドを受け取り、永続化された MyCobot 経由で実機に転送する。
"""

import json
別のタブで開く保存

記録を数えるスクリプト

teleop_stats.py(7本の記録を同じ数え方で並べる)

"""LOG446: 11/5 のゲームパッドの記録 7 本を、同じ数え方で並べる."""
import json, sys, collections, statistics
from pathlib import Path
ROOT = Path("/mnt/user-data/uploads/KIOXIA/r2r2r-data/runs/experiments/gamepad_teleop")
RUNS = ["160038", "161347", "162224", "163144", "163620", "170313", "171125"]
print("| 記録 | 行 | 1回押し 送った | 動かした関節が0.3°以上動いた | 受付なし | 止める | 長押しの目標を送った回数 | 1回押しの待ち 中央/最大(秒) | 起動時と終わりの j1 |")
print("|---|---|---|---|---|---|---|---|---|")
for r in RUNS:
    rows = [json.loads(l) for l in open(ROOT / f"teleop_20261105_{r}" / "log.jsonl")]
    short = [x for x in rows if x["kind"] == "move" and (x.get("hold_n") or 0) == 0 and x.get("sent") is True]
    moved = 0
    els = []
    for x in short:
        j = x["joint"]; mb = x.get("measured_before"); ra = x.get("reached_angles")
        if mb and ra and abs(ra[j] - mb[j]) >= 0.3:
            moved += 1
        if x.get("elapsed_sec") is not None:
            els.append(x["elapsed_sec"])
    busy = sum(1 for x in rows if x.get("reason") == "busy")
    halts = sum(1 for x in rows if x["kind"] == "halt")
    hold_sent = sum(1 for x in rows if x["kind"] == "move" and (x.get("hold_n") or 0) >= 1 and x.get("sent") is True)
    angs = [x.get("measured_before") for x in rows if x.get("measured_before")]
    j1 = f"{angs[0][1]:+.2f} → {angs[-1][1]:+.2f}" if angs else "-"
    med = statistics.median(els) if els else None
    print(f"| {r} | {len(rows)} | {len(short)} | {moved} | {busy} | {halts} | {hold_sent} | "
          f"{'-' if med is None else f'{med:.2f}'} / {'-' if not els else f'{max(els):.2f}'} | {j1} |")

teleop_details.py(1本の記録を1回押しと止める処理ごとに並べる)

"""LOG446: ゲームパッドの記録 1 本を, 1 回押しと止める処理ごとに並べる (11/5 の不具合を調べたときの数え方).

使い方: python3 teleop_details.py <teleop の記録のフォルダ>
"""
import json, sys, collections
from pathlib import Path
d = Path(sys.argv[1])
rows = [json.loads(l) for l in open(d / "log.jsonl")]
t0 = rows[0]["t_unix"]
print(f"== {d.name}  行 {len(rows)}")
print("-- 1 回押し: 送った量と, 動かした関節が動いた量")
for r in rows:
    if r["kind"] == "move" and (r.get("hold_n") or 0) == 0 and r.get("sent") is True:
        j = r["joint"]; mb = r.get("measured_before"); ra = r.get("reached_angles"); c = r["command"]
        mv = None if not (mb and ra) else round(ra[j] - mb[j], 2)
        oth = None if not (mb and ra) else round(max(abs(ra[k] - mb[k]) for k in range(6) if k != j), 2)
        tag = "届いた" if r.get("reached") else ("手前で止まった" if r.get("settled") else ("動かなかった" if r.get("not_moved") else "届かなかった"))
        print(f"{r['t_unix']-t0:7.2f}s j{j} {r['delta']:+.0f}° → 動いた {mv}° ほかの関節の最大の変化 {oth}° "
              f"{tag} 待ち {r.get('elapsed_sec')}秒 送り直し {len(r.get('resends') or [])}回")
print("-- 止める処理: 止める前に読んだ角度から, 止めたあとに読んだ角度までの差 (6 関節)")
for r in rows:
    if r["kind"] == "halt":
        print(f"{r['t_unix']-t0:7.2f}s {r.get('halt_reason')} j{r.get('halt_joint')} 差 {r.get('moved_after_request_deg')} "
              f"送り直し {r.get('pin_command')}")
busy = [r for r in rows if r.get("reason") == "busy"]
last = None; cause = collections.Counter()
for r in rows:
    if r.get("reason") == "busy":
        cause[last] += 1
    elif r.get("accepted") and r["kind"] in ("move", "halt", "home", "grip_close", "grip_open"):
        last = r["kind"] + ("(長押し)" if (r.get("hold_n") or 0) > 0 else "")
print(f"-- 受付なし {len(busy)} 回. そのとき動いていた仕事: {dict(cause)}")

plot_jog_probe.py(jog_probe の生の記録を図にする)

"""LOG446: jog_probe の生の記録 (時刻と j0 の角度) を, 送り方ごとに並べた図にする."""
import json
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib import font_manager
D = "/mnt/user-data/uploads/KIOXIA/r2r2r-data/diag/"
runs = {"base": "jog_probe_20261105_153401", "stop": "jog_probe_20261105_153952_stop", "hold": "jog_probe_20261105_154332_hold"}
R = {k: json.load(open(D + v + "/result.json")) for k, v in runs.items()}
for f in font_manager.findSystemFonts():
    if "NotoSansCJK" in f or "NotoSansJP" in f:
        font_manager.fontManager.addfont(f)
plt.rcParams["font.family"] = ["Noto Sans CJK JP"]
INK, PAPER = "#0d0d0d", "#f5f5f0"
panels = [
    ("A 1回だけ送る (+10°, speed 20)", "base", "A_step_10deg", "-"),
    ("B 0.1秒おきに3°先を送り直す (前のゲームパッド)", "base", "B_stream", "-"),
    ("C B + fresh_mode", "base", "C_stream_fresh", "-"),
    ("D jog speed 30", "base", "D_jog_speed30", "-"),
    ("E jog speed 5 (階段状)", "stop", "E_jog5_jogstop", "-"),
    ("G 20°先へ送り 0.5秒で stop (今のゲームパッド)", "hold", "G_far10_stop_0.5s", "-"),
]
fig, axes = plt.subplots(3, 2, figsize=(12, 9), facecolor=PAPER)
for ax, (title, run, key, ls) in zip(axes.flat, panels):
    t = R[run]["tests"][key]
    s = t["samples"]
    x = [a for a, q in s if a <= 2.0]
    y = [q - s[0][1] for a, q in s if a <= 2.0]
    ax.set_facecolor(PAPER)
    ax.plot(x, y, color=INK, lw=1.8, marker="o", ms=2.5)
    if t.get("t_stop"):
        ax.axvline(t["t_stop"], color=INK, lw=1, ls="--")
        ax.text(t["t_stop"] + 0.03, ax.get_ylim()[0] if False else min(y) , "止める命令", fontsize=9, color=INK)
    ax.set_title(title, fontsize=11, color=INK, loc="left")
    ax.set_xlim(0, 2.0)
    ax.grid(color=INK, alpha=0.15)
    for sp in ax.spines.values():
        sp.set_color(INK); sp.set_linewidth(1.2)
    ax.tick_params(colors=INK, labelsize=9)
for ax in axes[-1]:
    ax.set_xlabel("送ってからの秒", color=INK)
for ax in axes[:, 0]:
    ax.set_ylabel("j0 の動いた角度 (°)", color=INK)
fig.suptitle("mechArm 270 の根元 j0 を、送り方を変えて動かした生の記録 (2026-11-05 jog_probe)", color=INK, fontsize=13, x=0.01, ha="left")
fig.tight_layout(rect=(0, 0, 1, 0.96))
fig.savefig("/mnt/user-data/outputs/LOG446_images/LOG446_04_jog_probe_traces.png", dpi=110, facecolor=PAPER)
print("ok")

この回の commit

r2r2r-scripts の commit(11/5 15:34〜17:08)

452a3b6 2026-11-05 17:11:25 +0900 gamepad_teleop: 押した瞬間には送らず、離したら1刻み・押し続けたら長押しのどちらかだけ送る
c7992ca 2026-11-05 17:03:11 +0900 daemon の読み直しを0.02秒にした版を tools/pi に置く
617c3bd 2026-11-05 17:02:53 +0900 daemon の読み直しを速くするスクリプト・止めるときの読み取りは1回だけ
72d9d96 2026-11-05 16:36:19 +0900 gamepad_teleop: 受付なしを減らす(止める待ち0.1秒・1刻みは止まったら戻る・読む間隔0.05秒)
b71ffb5 2026-11-05 16:31:42 +0900 gamepad_teleop: 十字キーは動かす関節だけを send_angle で送る
2726d9d 2026-11-05 16:26:17 +0900 gamepad_teleop の直しと、jog_probe に小さな動きを比べる small の組を足す
31a336c 2026-11-05 16:22:22 +0900 gamepad_teleop: 止めたあと送り直さない・1刻みは動かした関節だけで判定・長押しが止まったら送り直す
f0d7e73 2026-11-05 16:13:45 +0900 gamepad_teleop: 止めたあと他の関節を指令へ戻す・出発点を関節ごとに・1刻みの届いた判定を0.5°に
e0bf052 2026-11-05 16:00:35 +0900 daemon に stop を足した版を tools/pi に置く
4e99c9d 2026-11-05 15:59:53 +0900 gamepad_teleop: 長押しを15°先へ1回送る形にし、離したら daemon の stop で止める
b577a13 2026-11-05 15:43:32 +0900 jog_probe: 遠い目標を途中で止める hold の組を足す
dcdf3f1 2026-11-05 15:39:52 +0900 jog_probe: 止め方を比べる stop の組を足す (jog の向きは実機に合わせる)
2c28f88 2026-11-05 15:34:01 +0900 jog_probe: j0 を4通りで動かし、なめらかさと限界を測る

この回の実機の記録(全量)

16:00 の記録 runs/experiments/gamepad_teleop/teleop_20261105_160038/meta.json

{
  "run_stem": "teleop_20261105_160038",
  "started_at": "2026-11-05T16:00:43",
  "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-05T16:00:51"
    }
  ],
  "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.61,
    4.83,
    5.0,
    -0.08,
    0.96,
    -29.61
  ],
  "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.0,
    "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": "e0bf05203a2af9acc41eb611f0db51a00c5ba4df",
    "script_status": "clean"
  },
  "script_copy": "gamepad_teleop.py",
  "script_sha256": "be5c7372080646069412ba5a528239fde63807099c8b1a7ec11fd914d7d9846c",
  "ended_at": "2026-11-05T16:13:43",
  "end_reason": "ctrl_c",
  "n_sent": 133
}

16:00 の記録 runs/experiments/gamepad_teleop/teleop_20261105_160038/log.jsonl(376行)

24_sec18.json225,021字・376行・json
{"seq": 1, "t": "2026-11-05T16:00:52.689", "t_unix": 1793862052.69, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -1.0, "hold_id": 1, "hold_n": 0, "accepted": true, "measured_before": [-0.61, 4.83, 5.0, -0.08, 0.96, -29.61], "start_source": "command", "cmd_gap_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-1.61, 4.83, 5.0, -0.08, 0.96, -29.61], "sent": true, "timeout_sec": 8.0, "t_send": 1793862052.760244, "measured_before_send": [-0.61, 4.83, 5.0, -0.08, 0.96, -29.61], "resends": [], "reached": true, "reached_angles": [-1.93, 5.53, 5.8, -0.08, 0.17, -29.61], "reach_err": 0.8, "elapsed_sec": 0.02, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-05T16:00:53.167", "t_unix": 1793862053.168, "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.479, "accepted": true, "measured_before": [-1.58, 5.53, 5.8, -0.08, 0.17, -29.61], "start_source": "hold", "cmd_gap_deg": 0.8, "hold_lead_deg": 0.03, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-16.58, 4.83, 5.0, -0.08, 0.96, -29.61], "sent": true, "reached": null, "no_check": true, "t_send": 1793862053.194277, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 3, "t": "2026-11-05T16:00:53.285", "t_unix": 1793862053.286, "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.597, "accepted": true, "measured_before": [-1.4, 5.53, 5.8, -0.08, 0.17, -29.61], "start_source": "hold", "cmd_gap_deg": 0.8, "hold_lead_deg": 15.18, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.18, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 4, "t": "2026-11-05T16:00:53.389", "t_unix": 1793862053.39, "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.7, "accepted": true, "measured_before": [-3.33, 5.53, 5.8, -0.08, 0.17, -29.61], "start_source": "hold", "cmd_gap_deg": 0.8, "hold_lead_deg": 13.25, "sent": false, "why": "lead_ok", "hold_remaining_deg": 13.25, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-05T16:00:53.489", "t_unix": 1793862053.49, "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.801, "accepted": true, "measured_before": [-6.85, 5.53, 5.8, -0.08, 0.17, -29.61], "start_source": "hold", "cmd_gap_deg": 0.8, "hold_lead_deg": 9.73, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.73, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-05T16:00:53.605", "t_unix": 1793862053.606, "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.917, "accepted": true, "released_during_job": true, "measured_before": [-12.21, 5.53, 5.8, -0.08, 0.17, -29.61], "start_source": "hold", "cmd_gap_deg": 0.8, "hold_lead_deg": 4.37, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-27.21, 4.83, 5.0, -0.08, 0.96, -29.61], "sent": true, "reached": null, "no_check": true, "t_send": 1793862053.6382499, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 8, "t": "2026-11-05T16:00:54.424", "t_unix": 1793862054.425, "button": 14, "button_name": "dpad_right", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": 1.0, "hold_id": 2, "hold_n": 0, "accepted": false, "reason": "busy", "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-05T16:00:54.033", "t_unix": 1793862054.034, "button": null, "button_name": null, "kind": "halt", "selected_joint": 1, "step_deg": 1.0, "execute": true, "accepted": true, "halt_reason": "release", "hold_id": 1, "measured_at_request": [-6.85, 5.53, 5.8, -0.08, 0.17, -29.61], "t_halt": 1793862054.0342588, "halt": "stop", "halt_result": {"jog_stop": null, "stop": null}, "measured_after_halt": [-27.15, 5.53, 5.8, -0.08, 0.17, -29.61], "moved_after_request_deg": [-20.3, 0.0, 0.0, 0.0, 0.0, 0.0], "grip_state": "unknown", "stopped": false, "stop_reason": null}
別のタブで開く保存

16:13 の記録 runs/experiments/gamepad_teleop/teleop_20261105_161347/meta.json

{
  "run_stem": "teleop_20261105_161347",
  "started_at": "2026-11-05T16:13:48",
  "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-05T16:13:57"
    }
  ],
  "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": [
    1.93,
    40.07,
    -19.95,
    3.95,
    -27.86,
    -30.76
  ],
  "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.0,
    "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": "f0d7e732e335c551b2960bd19b583907420773aa",
    "script_status": "clean"
  },
  "script_copy": "gamepad_teleop.py",
  "script_sha256": "baf7e242f2c7801f3de18a9de5b2b0f3adeb9e92c40bbc921a477d2706f29d03",
  "ended_at": "2026-11-05T16:22:20",
  "end_reason": "ctrl_c",
  "n_sent": 29
}

16:13 の記録 runs/experiments/gamepad_teleop/teleop_20261105_161347/log.jsonl(118行)

25_sec18.json66,967字・118行・json
{"seq": 1, "t": "2026-11-05T16:14:03.034", "t_unix": 1793862843.034, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -1.0, "hold_id": 1, "hold_n": 0, "accepted": true, "measured_before": [1.93, 40.07, -19.95, 3.95, -27.86, -30.76], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [0.93, 40.07, -19.95, 3.95, -27.86, -30.76], "sent": true, "timeout_sec": 8.0, "t_send": 1793862843.127028, "measured_before_send": [1.93, 40.07, -19.95, 3.95, -27.86, -30.76], "resends": [], "reached": true, "reached_angles": [0.61, 41.22, -18.98, 3.77, -27.5, -30.76], "reach_err": 1.15, "elapsed_sec": 0.4, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-05T16:14:03.581", "t_unix": 1793862843.581, "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.549, "accepted": true, "measured_before": [0.7, 41.22, -18.98, 4.13, -27.5, -30.67], "start_source": "hold", "cmd_gap_deg": 1.15, "hold_lead_deg": 0.23, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-14.3, 40.07, -19.95, 3.95, -27.86, -30.76], "sent": true, "reached": null, "no_check": true, "t_send": 1793862843.6045382, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 3, "t": "2026-11-05T16:14:03.681", "t_unix": 1793862843.681, "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.65, "accepted": true, "measured_before": [1.14, 41.22, -18.98, 4.13, -27.5, -30.67], "start_source": "hold", "cmd_gap_deg": 1.15, "hold_lead_deg": 15.44, "sent": false, "why": "lead_ok", "hold_remaining_deg": 15.44, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 4, "t": "2026-11-05T16:14:03.797", "t_unix": 1793862843.798, "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.766, "accepted": true, "measured_before": [-0.17, 41.22, -18.98, 3.51, -27.5, -30.76], "start_source": "hold", "cmd_gap_deg": 1.15, "hold_lead_deg": 14.13, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.13, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-05T16:14:03.898", "t_unix": 1793862843.898, "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.866, "accepted": true, "measured_before": [-3.69, 41.22, -18.98, 3.51, -27.42, -30.76], "start_source": "hold", "cmd_gap_deg": 1.15, "hold_lead_deg": 10.61, "sent": false, "why": "lead_ok", "hold_remaining_deg": 10.61, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-05T16:14:03.999", "t_unix": 1793862843.999, "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.967, "accepted": true, "measured_before": [-8.26, 41.22, -18.98, 3.51, -27.42, -30.76], "start_source": "hold", "cmd_gap_deg": 1.15, "hold_lead_deg": 6.04, "sent": false, "why": "lead_ok", "hold_remaining_deg": 6.04, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-05T16:14:04.101", "t_unix": 1793862844.101, "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.069, "accepted": true, "measured_before": [-12.74, 41.22, -18.98, 3.51, -27.42, -30.76], "start_source": "hold", "cmd_gap_deg": 1.15, "hold_lead_deg": 1.56, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-27.74, 40.07, -19.95, 3.95, -27.86, -30.76], "sent": true, "reached": null, "no_check": true, "t_send": 1793862844.1261408, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 8, "t": "2026-11-05T16:14:04.216", "t_unix": 1793862844.217, "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": 7, "held_sec": 1.185, "accepted": true, "measured_before": [-14.58, 41.22, -18.98, 4.39, -27.42, -30.67], "start_source": "hold", "cmd_gap_deg": 1.15, "hold_lead_deg": 13.16, "sent": false, "why": "lead_ok", "hold_remaining_deg": 13.16, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
別のタブで開く保存

16:22 の記録 runs/experiments/gamepad_teleop/teleop_20261105_162224/meta.json

{
  "run_stem": "teleop_20261105_162224",
  "started_at": "2026-11-05T16:22:25",
  "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-05T16:22:31"
    }
  ],
  "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.17,
    1.58,
    0.96,
    0.26,
    -0.17,
    -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": "31a336c1994f1a214b00abe93f20b8b271e5d178",
    "script_status": "clean"
  },
  "script_copy": "gamepad_teleop.py",
  "script_sha256": "2ccfa5a504163d02786d9854141ee1a21a8d48ca8bfd78318bf945544461c5e6",
  "ended_at": "2026-11-05T16:26:15",
  "end_reason": "ctrl_c",
  "n_sent": 26
}

16:22 の記録 runs/experiments/gamepad_teleop/teleop_20261105_162224/log.jsonl(86行)

26_sec18.json43,194字・86行・json
{"seq": 1, "t": "2026-11-05T16:22:36.397", "t_unix": 1793863356.398, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -1.0, "hold_id": 1, "hold_n": 0, "accepted": true, "measured_before": [-0.17, 1.58, 0.96, 0.26, -0.17, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-1.17, 1.58, 0.96, 0.26, -0.17, -30.23], "sent": true, "timeout_sec": 8.0, "t_send": 1793863356.43919, "measured_before_send": [-0.17, 1.58, 0.96, 0.26, -0.17, -30.23], "resends": [], "reached": true, "reached_angles": [-0.96, 2.46, 1.75, 0.26, -0.08, -30.23], "reach_err": 0.88, "elapsed_sec": 0.34, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-05T16:22:36.840", "t_unix": 1793863356.84, "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.443, "accepted": true, "measured_before": [-0.96, 2.46, 1.75, 0.26, -0.08, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 0.21, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-15.96, 1.58, 0.96, 0.26, -0.17, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1793863356.861637, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 3, "t": "2026-11-05T16:22:36.942", "t_unix": 1793863356.942, "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.545, "accepted": true, "measured_before": [-1.14, 2.46, 1.75, 0.26, -0.08, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 14.82, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.82, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 4, "t": "2026-11-05T16:22:37.043", "t_unix": 1793863357.043, "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.646, "accepted": true, "measured_before": [-15.2, 2.46, 1.75, 0.26, -0.08, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 0.76, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-30.2, 1.58, 0.96, 0.26, -0.17, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1793863357.4127731, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-05T16:22:37.799", "t_unix": 1793863357.8, "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": 1.403, "accepted": true, "measured_before": [-29.61, 2.46, 1.75, 0.08, -0.08, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 0.59, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-44.61, 1.58, 0.96, 0.26, -0.17, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1793863358.227385, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-05T16:22:38.621", "t_unix": 1793863358.621, "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": 2.224, "accepted": true, "measured_before": [-44.29, 2.46, 1.75, 0.0, -0.08, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 0.32, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-59.29, 1.58, 0.96, 0.26, -0.17, -30.23], "sent": true, "reached": null, "no_check": true, "t_send": 1793863359.028451, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-05T16:22:39.125", "t_unix": 1793863359.126, "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": 2.728, "accepted": true, "measured_before": [-44.29, 2.46, 1.75, 0.0, -0.08, -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": 8, "t": "2026-11-05T16:22:39.228", "t_unix": 1793863359.228, "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": 7, "held_sec": 2.831, "accepted": true, "measured_before": [-46.31, 2.46, 1.75, 0.0, -0.08, -30.23], "start_source": "hold", "cmd_gap_deg": 0.88, "hold_lead_deg": 12.98, "sent": false, "why": "lead_ok", "hold_remaining_deg": 12.98, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
別のタブで開く保存

16:31 の記録 runs/experiments/gamepad_teleop/teleop_20261105_163144/meta.json

{
  "run_stem": "teleop_20261105_163144",
  "started_at": "2026-11-05T16:31:45",
  "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-05T16:31:51"
    }
  ],
  "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.7,
    1.49,
    1.75,
    -0.08,
    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": "b71ffb5aca9a7ca9a3b74e41e3a5d011d1083fe4",
    "script_status": "clean"
  },
  "script_copy": "gamepad_teleop.py",
  "script_sha256": "197310e4269e159c4507d16222fd3952d1261e3208503926fec08575af3a7d3c",
  "ended_at": "2026-11-05T16:36:17",
  "end_reason": "ctrl_c",
  "n_sent": 116
}

16:31 の記録 runs/experiments/gamepad_teleop/teleop_20261105_163144/log.jsonl(326行)

27_sec18.json182,198字・326行・json
{"seq": 1, "t": "2026-11-05T16:31:53.338", "t_unix": 1793863913.338, "button": 5, "button_name": "home", "kind": "home", "selected_joint": 1, "step_deg": 1.0, "execute": true, "held_sec": 1.003, "accepted": true, "measured_before": [0.7, 1.49, 1.75, -0.17, 45.17, -30.23], "command": [0.0, 0.0, 0.0, 0.0, 0.0, -30.0], "range_check": "skipped_for_home", "sent": true, "timeout_sec": 8.78, "t_send": 1793863913.3969028, "measured_before_send": [0.7, 1.49, 1.75, -0.17, 45.17, -30.23], "resends": [], "reached": true, "reached_angles": [-0.26, 1.49, 1.75, -0.17, 0.87, -30.23], "reach_err": 1.75, "elapsed_sec": 0.67, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-05T16:31:56.281", "t_unix": 1793863916.281, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -1.0, "hold_id": 1, "hold_n": 0, "accepted": true, "measured_before": [-0.26, 1.49, 1.75, -0.17, 0.87, -30.23], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 1.75, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-1.0, 0.0, 0.0, 0.0, 0.0, -30.0], "sent": true, "timeout_sec": 8.0, "t_send": 1793863916.3476741, "measured_before_send": [-0.26, 1.49, 1.75, -0.17, 0.87, -30.23], "resends": [], "reached": true, "reached_angles": [-1.14, 1.49, 1.75, -0.17, 0.87, -30.23], "reach_err": 1.75, "elapsed_sec": 0.34, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 3, "t": "2026-11-05T16:31:56.769", "t_unix": 1793863916.77, "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.489, "accepted": true, "measured_before": [-1.14, 1.49, 1.75, -0.17, 0.87, -30.23], "start_source": "hold", "cmd_gap_deg": 1.75, "hold_lead_deg": 0.14, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-16.14, 0.0, 0.0, 0.0, 0.0, -30.0], "sent": true, "reached": null, "no_check": true, "t_send": 1793863916.7909088, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 4, "t": "2026-11-05T16:31:57.190", "t_unix": 1793863917.191, "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.91, "accepted": true, "measured_before": [-10.81, 1.49, 1.75, -0.17, 0.87, -30.23], "start_source": "hold", "cmd_gap_deg": 1.75, "hold_lead_deg": 5.33, "sent": false, "why": "lead_ok", "hold_remaining_deg": 5.33, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-05T16:31:57.291", "t_unix": 1793863917.291, "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": 1.01, "accepted": true, "measured_before": [-15.55, 1.49, 1.75, -0.17, 0.87, -30.23], "start_source": "hold", "cmd_gap_deg": 1.75, "hold_lead_deg": 0.59, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-30.55, 0.0, 0.0, 0.0, 0.0, -30.0], "sent": true, "reached": null, "no_check": true, "t_send": 1793863917.3173099, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-05T16:31:57.393", "t_unix": 1793863917.393, "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": 1.112, "accepted": true, "measured_before": [-15.73, 1.49, 1.75, -0.17, 0.87, -30.23], "start_source": "hold", "cmd_gap_deg": 1.75, "hold_lead_deg": 14.82, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.82, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-05T16:31:57.493", "t_unix": 1793863917.494, "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": 1.213, "accepted": true, "measured_before": [-16.96, 1.49, 1.75, -0.17, 0.87, -30.23], "start_source": "hold", "cmd_gap_deg": 1.75, "hold_lead_deg": 13.59, "sent": false, "why": "lead_ok", "hold_remaining_deg": 13.59, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 8, "t": "2026-11-05T16:31:57.595", "t_unix": 1793863917.595, "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.314, "accepted": true, "measured_before": [-20.74, 1.49, 1.75, -0.17, 0.87, -30.23], "start_source": "hold", "cmd_gap_deg": 1.75, "hold_lead_deg": 9.81, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.81, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
別のタブで開く保存

16:36 の記録 runs/experiments/gamepad_teleop/teleop_20261105_163620/meta.json

{
  "run_stem": "teleop_20261105_163620",
  "started_at": "2026-11-05T16:36:22",
  "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-05T16:36:27"
    }
  ],
  "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.26,
    1.14,
    1.75,
    0.26,
    -0.26,
    -29.79
  ],
  "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": "72d9d964c770e3c8f8c95d98600d41f607624dce",
    "script_status": "clean"
  },
  "script_copy": "gamepad_teleop.py",
  "script_sha256": "5e84320facb48ece2464b4875b263342d900d97e4d16418f155e1f73cff94d9b",
  "ended_at": "2026-11-05T16:51:52",
  "end_reason": "ctrl_c",
  "n_sent": 152
}

16:36 の記録 runs/experiments/gamepad_teleop/teleop_20261105_163620/log.jsonl(386行)

28_sec18.json225,335字・386行・json
{"seq": 1, "t": "2026-11-05T16:36:30.051", "t_unix": 1793864190.052, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -1.0, "hold_id": 1, "hold_n": 0, "accepted": true, "measured_before": [-0.26, 1.14, 1.75, 0.26, -0.26, -29.79], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-1.26, 1.14, 1.75, 0.26, -0.26, -29.79], "sent": true, "timeout_sec": 8.0, "t_send": 1793864190.092095, "measured_before_send": [-0.26, 1.14, 1.75, 0.26, -0.26, -29.79], "resends": [], "reached": true, "reached_angles": [-1.05, 1.14, 1.75, 0.26, -0.26, -29.79], "reach_err": 0.21, "elapsed_sec": 0.02, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-05T16:36:30.486", "t_unix": 1793864190.487, "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.436, "accepted": true, "measured_before": [-0.96, 1.14, 1.75, 0.26, -0.26, -29.79], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 0.3, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-15.96, 1.14, 1.75, 0.26, -0.26, -29.79], "sent": true, "reached": null, "no_check": true, "t_send": 1793864190.509464, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 3, "t": "2026-11-05T16:36:30.587", "t_unix": 1793864190.588, "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.537, "accepted": true, "measured_before": [-1.05, 1.14, 1.75, 0.26, -0.26, -29.79], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 14.91, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.91, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 4, "t": "2026-11-05T16:36:30.689", "t_unix": 1793864190.689, "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.638, "accepted": true, "measured_before": [-15.11, 1.14, 1.75, 0.26, -0.26, -29.79], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 0.85, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-30.11, 1.14, 1.75, 0.26, -0.26, -29.79], "sent": true, "reached": null, "no_check": true, "t_send": 1793864191.09264, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-05T16:36:31.499", "t_unix": 1793864191.5, "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": 1.449, "accepted": true, "measured_before": [-26.1, 1.14, 1.75, 0.26, -0.26, -29.79], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 4.01, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-41.1, 1.14, 1.75, 0.26, -0.26, -29.79], "sent": true, "reached": null, "no_check": true, "t_send": 1793864191.519255, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-05T16:36:31.884", "t_unix": 1793864191.884, "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": 1.831, "accepted": true, "measured_before": [-36.03, 1.14, 1.75, 0.26, -0.26, -29.79], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 5.07, "sent": false, "why": "lead_ok", "hold_remaining_deg": 5.07, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-05T16:36:31.998", "t_unix": 1793864191.998, "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.947, "accepted": true, "measured_before": [-40.34, 1.14, 1.75, 0.26, -0.26, -29.79], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 0.76, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-55.34, 1.14, 1.75, 0.26, -0.26, -29.79], "sent": true, "reached": null, "no_check": true, "t_send": 1793864192.040844, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 8, "t": "2026-11-05T16:36:32.100", "t_unix": 1793864192.101, "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": 7, "held_sec": 2.05, "accepted": true, "measured_before": [-41.66, 1.14, 1.75, 0.17, -0.26, -29.79], "start_source": "hold", "cmd_gap_deg": 0.09, "hold_lead_deg": 13.68, "sent": false, "why": "lead_ok", "hold_remaining_deg": 13.68, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
別のタブで開く保存

17:03 の記録 runs/experiments/gamepad_teleop/teleop_20261105_170313/meta.json

{
  "run_stem": "teleop_20261105_170313",
  "started_at": "2026-11-05T17:03:14",
  "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-05T17:03:47"
    }
  ],
  "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": [
    5.09,
    1.31,
    2.81,
    -0.96,
    -13.62,
    -26.98
  ],
  "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": "c7992ca137a102227981b9595fa569359ca285dd",
    "script_status": "clean"
  },
  "script_copy": "gamepad_teleop.py",
  "script_sha256": "e6a1b54e8fa777cbdc6c33e1a98feda91e1366f7d7933b8c58ac5a4530fd82e5",
  "ended_at": "2026-11-05T17:11:23",
  "end_reason": "ctrl_c",
  "n_sent": 192
}

17:03 の記録 runs/experiments/gamepad_teleop/teleop_20261105_170313/log.jsonl(549行)

29_sec18.json330,830字・549行・json
{"seq": 1, "t": "2026-11-05T17:03:51.788", "t_unix": 1793865831.789, "button": 13, "button_name": "dpad_left", "kind": "move", "selected_joint": 1, "step_deg": 1.0, "execute": true, "joint": 0, "delta": -1.0, "hold_id": 1, "hold_n": 0, "accepted": true, "measured_before": [5.09, 1.31, 2.81, -0.96, -13.62, -26.98], "start_source": "command", "others_from_measured": [], "cmd_gap_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [4.09, 1.31, 2.81, -0.96, -13.62, -26.98], "sent": true, "timeout_sec": 8.0, "t_send": 1793865831.837409, "measured_before_send": [5.09, 1.31, 2.81, -0.96, -13.62, -26.98], "resends": [], "reached": true, "reached_angles": [4.04, 1.31, 2.81, -0.96, -13.62, -26.98], "reach_err": 0.05, "elapsed_sec": 0.1, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-05T17:03:52.192", "t_unix": 1793865832.192, "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.404, "accepted": true, "measured_before": [4.3, 1.31, 2.81, -0.96, -13.62, -26.98], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 0.21, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-10.7, 1.31, 2.81, -0.96, -13.62, -26.98], "sent": true, "reached": null, "no_check": true, "t_send": 1793865832.215175, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 3, "t": "2026-11-05T17:03:52.292", "t_unix": 1793865832.292, "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.504, "accepted": true, "measured_before": [4.3, 1.31, 2.81, -0.96, -13.62, -26.98], "start_source": "hold", "cmd_gap_deg": 0.0, "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": 4, "t": "2026-11-05T17:03:52.394", "t_unix": 1793865832.394, "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.607, "accepted": true, "measured_before": [3.77, 1.31, 2.81, -0.96, -13.62, -26.98], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 14.47, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.47, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-05T17:03:52.495", "t_unix": 1793865832.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": 4, "held_sec": 0.707, "accepted": true, "measured_before": [-0.87, 1.31, 2.81, -0.96, -13.62, -26.98], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 9.83, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.83, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-05T17:03:52.612", "t_unix": 1793865832.613, "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.825, "accepted": true, "measured_before": [-10.54, 1.31, 2.81, -0.87, -13.62, -26.98], "start_source": "hold", "cmd_gap_deg": 0.09, "hold_lead_deg": 0.16, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-25.54, 1.31, 2.81, -0.96, -13.62, -26.98], "sent": true, "reached": null, "no_check": true, "t_send": 1793865832.758465, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-05T17:03:52.812", "t_unix": 1793865832.812, "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.024, "accepted": true, "measured_before": [-10.81, 1.31, 2.81, -0.26, -13.62, -26.98], "start_source": "hold", "cmd_gap_deg": 0.7, "hold_lead_deg": 14.73, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.73, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 8, "t": "2026-11-05T17:03:52.913", "t_unix": 1793865832.914, "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": 7, "held_sec": 1.126, "accepted": true, "measured_before": [-15.38, 1.31, 2.81, -0.43, -13.62, -26.98], "start_source": "hold", "cmd_gap_deg": 0.53, "hold_lead_deg": 10.16, "sent": false, "why": "lead_ok", "hold_remaining_deg": 10.16, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
別のタブで開く保存

17:11 の記録 runs/experiments/gamepad_teleop/teleop_20261105_171125/meta.json

{
  "run_stem": "teleop_20261105_171125",
  "started_at": "2026-11-05T17:11:26",
  "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-05T17:11:31"
    }
  ],
  "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.26,
    1.49,
    1.84,
    -0.26,
    -0.26,
    -29.7
  ],
  "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": "452a3b608873debb2dcb9f1d9a3f2e2a16169d83",
    "script_status": "clean"
  },
  "script_copy": "gamepad_teleop.py",
  "script_sha256": "65479edb0f19729c826a5306aef4bd92231cfd8a9e5436ac8b4a7a8ecab65fbe"
}

17:11 の記録 runs/experiments/gamepad_teleop/teleop_20261105_171125/log.jsonl(235行)

30_sec18.json138,766字・235行・json
{"seq": 1, "t": "2026-11-05T17:11:34.044", "t_unix": 1793866294.044, "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.26, 1.49, 1.84, -0.26, -0.26, -29.7], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 0.0, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-15.26, 1.49, 1.84, -0.26, -0.26, -29.7], "sent": true, "reached": null, "no_check": true, "t_send": 1793866294.0647411, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 2, "t": "2026-11-05T17:11:34.146", "t_unix": 1793866294.146, "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.509, "accepted": true, "measured_before": [-0.26, 1.49, 1.84, -0.26, -0.26, -29.7], "start_source": "hold", "cmd_gap_deg": 0.0, "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-05T17:11:34.263", "t_unix": 1793866294.263, "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.626, "accepted": true, "measured_before": [-8.08, 1.49, 1.84, -0.26, -0.26, -29.7], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 7.18, "sent": false, "why": "lead_ok", "hold_remaining_deg": 7.18, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 4, "t": "2026-11-05T17:11:34.446", "t_unix": 1793866294.446, "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.809, "accepted": true, "measured_before": [-9.4, 1.49, 1.84, -0.26, -0.26, -29.7], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 5.86, "sent": false, "why": "lead_ok", "hold_remaining_deg": 5.86, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 5, "t": "2026-11-05T17:11:34.546", "t_unix": 1793866294.547, "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.909, "accepted": true, "measured_before": [-14.67, 1.49, 1.84, -0.26, -0.26, -29.7], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 0.59, "clip": [], "refused": [], "limit_ja": "", "limit_ascii": "", "command": [-29.67, 1.49, 1.84, -0.26, -0.26, -29.7], "sent": true, "reached": null, "no_check": true, "t_send": 1793866294.577536, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 6, "t": "2026-11-05T17:11:34.731", "t_unix": 1793866294.732, "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.094, "accepted": true, "measured_before": [-15.64, 1.49, 1.84, -0.26, -0.26, -29.7], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 14.03, "sent": false, "why": "lead_ok", "hold_remaining_deg": 14.03, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 7, "t": "2026-11-05T17:11:34.833", "t_unix": 1793866294.833, "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": 7, "held_sec": 1.196, "accepted": true, "measured_before": [-19.77, 1.49, 1.84, -0.26, -0.26, -29.7], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 9.9, "sent": false, "why": "lead_ok", "hold_remaining_deg": 9.9, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
{"seq": 8, "t": "2026-11-05T17:11:34.936", "t_unix": 1793866294.937, "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": 8, "held_sec": 1.299, "accepted": true, "measured_before": [-23.29, 1.49, 1.84, -0.26, -0.26, -29.7], "start_source": "hold", "cmd_gap_deg": 0.0, "hold_lead_deg": 6.38, "sent": false, "why": "lead_ok", "hold_remaining_deg": 6.38, "reached": null, "grip_state": "unknown", "stopped": false, "stop_reason": null}
別のタブで開く保存

diag/jog_probe_20261105_153401/console.txt

jog_probe 20261105_153401 (結果: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_153401)
--- デーモンの状態 (止める前)
mode=systemd
pid=502
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=502
checker=no
--- デーモンの状態 (止めたあと)
mode=none
pid=なし
listen=no
serial_users=(なし)
checker=no
pymycobot 2.9.6 (/usr/local/lib/python2.7/dist-packages/pymycobot/__init__.py)
始めの角度: [-0.17, 92.63, 1.49, 0.61, -96.06, -29.35]
HOME から離れています。HOME [0,0,0,0,0,-30] へ送ります  (Enter で進む / q と Enter で終わる)

根元 j0 だけを、始めの角度から 25° 以内で動かします。毎回始めの角度へ戻します。

0. 読み取りの速さ (動かさない)
  読み取り 1 回: 中央 16.0 ms / 最大 19.3 ms / 空で返った割合 0.0

A_step_10deg を始めます  (Enter で進む / q と Enter で終わる)

  [A_step_10deg] travel_deg=9.32  mean_speed=4.96  median_speed=0.0  max_speed=30.97  speed_cv=None  stall_ratio=None  arrive_sec=0.4
        0.1 秒ごとの速さ (°/秒): 31.0 -3.4 -0.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  始めの角度へ戻した: 着いた j0=1.23

B_stream を始めます  (Enter で進む / q と Enter で終わる)

  [B_stream] travel_deg=12.39  mean_speed=12.38  median_speed=28.91  max_speed=73.27  speed_cv=1.09  stall_ratio=0.4  overshoot_deg=0.09  stop_latency_sec=0.1  n_sends=7
        0.1 秒ごとの速さ (°/秒): 28.9 -13.2 73.3 -8.3 33.8
  始めの角度へ戻した: 着いた j0=-0.08

C_stream_fresh を始めます  (Enter で進む / q と Enter で終わる)

  [C_stream_fresh] travel_deg=7.91  mean_speed=8.67  median_speed=-11.71  max_speed=-2.32  speed_cv=None  stall_ratio=None  overshoot_deg=2.9  stop_latency_sec=0.26  n_sends=8
        0.1 秒ごとの速さ (°/秒): -6.1 -2.3 -31.0 -11.7 -16.5
  始めの角度へ戻した: 着いた j0=-1.58

D_jog_speed10 を始めます  (Enter で進む / q と Enter で終わる)

  守り: j0 が始めから -25.8° 離れたので止めます
  [D_jog_speed10] travel_deg=-2.37  mean_speed=-8.78  overshoot_deg=-23.38  stop_latency_sec=0.28  jog_moved=True
  始めの角度へ戻した: 着いた j0=-1.4

D_jog_speed30 を始めます  (Enter で進む / q と Enter で終わる)

  守り: j0 が始めから 26.7° 離れたので止めます
  守り: j0 が始めから 31.5° 離れたので止めます
  [D_jog_speed30] travel_deg=-27.06  mean_speed=-45.1  median_speed=-59.41  max_speed=-54.33  speed_cv=None  stall_ratio=None  overshoot_deg=-4.74  stop_latency_sec=0.0  jog_moved=True
        0.1 秒ごとの速さ (°/秒): -54.3 -64.5
  始めの角度へ戻した: 着いた j0=0.08
結果: /tmp/jog_probe_20261105_153401.json
Connection to 192.168.2.1 closed.
--- jog_probe_pi.py の終了コード: 0
結果の JSON: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_153401/result.json
--- デーモンを戻す (systemctl start)
mode=systemd
pid=19339
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=19339
checker=no
デーモンは戻った (5555 LISTEN)

diag/jog_probe_20261105_153952_stop/console.txt

jog_probe 20261105_153952 (結果: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_153952_stop)
--- デーモンの状態 (止める前)
mode=systemd
pid=19339
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=19339
checker=no
別のタブで開く保存

diag/jog_probe_20261105_154332_hold/console.txt

jog_probe 20261105_154332 (結果: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_154332_hold)
--- デーモンの状態 (止める前)
mode=systemd
pid=4995
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=4995
checker=no
--- デーモンの状態 (止めたあと)
mode=none
pid=なし
listen=no
serial_users=(なし)
checker=no
pymycobot 2.9.6 (/usr/local/lib/python2.7/dist-packages/pymycobot/__init__.py)
始めの角度: [-0.96, 5.53, 6.41, 0.0, -0.08, -29.53]
HOME から離れています。HOME [0,0,0,0,0,-30] へ送ります  (Enter で進む / q と Enter で終わる)

根元 j0 だけを、始めの角度から 25° 以内で動かします。毎回始めの角度へ戻します。

0. 読み取りの速さ (動かさない)
  読み取り 1 回: 中央 12.6 ms / 最大 21.4 ms / 空で返った割合 0.0

G_far5_hold_0.5s を始めます  (Enter で進む / q と Enter で終わる)

  [G_far5_hold_0.5s] travel_deg=3.94  mean_speed=10.54  overshoot_deg=15.56  stop_latency_sec=1.48  read_fails=3  end_from_start_deg=19.5  guard=False
  始めの角度へ戻した: 着いた j0=0.17

G_far10_hold_0.5s を始めます  (Enter で進む / q と Enter で終わる)

  [G_far10_hold_0.5s] travel_deg=6.76  mean_speed=22.87  overshoot_deg=1.59  stop_latency_sec=0.21  read_fails=9  end_from_start_deg=-9.41  guard=False
  始めの角度へ戻した: 着いた j0=0.52

G_far20_hold_0.4s を始めます  (Enter で進む / q と Enter で終わる)

  [G_far20_hold_0.4s] read_fails=4  end_from_start_deg=19.5  guard=False

  始めの角度へ戻した: 着かない j0=0.26

G_far10_stop_0.5s を始めます  (Enter で進む / q と Enter で終わる)

  [G_far10_stop_0.5s] travel_deg=7.55  mean_speed=15.73  median_speed=23.5  max_speed=23.5  speed_cv=0.0  stall_ratio=0.0  overshoot_deg=3.25  stop_latency_sec=0.24  read_fails=0  end_from_start_deg=-10.37  guard=False
        0.1 秒ごとの速さ (°/秒): 23.5
  始めの角度へ戻した: 着かない j0=0.17

H_jog10_jogstop_1 を始めます  (Enter で進む / q と Enter で終わる)

  [H_jog10_jogstop_1] travel_deg=17.05  mean_speed=18.72  median_speed=17.92  max_speed=36.8  speed_cv=0.53  stall_ratio=0.0  overshoot_deg=3.34  stop_latency_sec=0.08  read_fails=1  end_from_start_deg=20.73  guard=False
        0.1 秒ごとの速さ (°/秒): 19.7 11.7 16.2 36.8
  始めの角度へ戻した: 着かない j0=-0.61

H_jog10_jogstop_2 を始めます  (Enter で進む / q と Enter で終わる)

  [H_jog10_jogstop_2] travel_deg=17.49  mean_speed=17.14  median_speed=20.57  max_speed=38.16  speed_cv=0.46  stall_ratio=0.0  overshoot_deg=3.78  stop_latency_sec=0.14  read_fails=0  end_from_start_deg=-21.71  guard=False
        0.1 秒ごとの速さ (°/秒): 38.2 17.7 10.2 20.6 26.3
  始めの角度へ戻した: 着かない j0=0.26

H_jog10_jogstop_3 を始めます  (Enter で進む / q と Enter で終わる)

  [H_jog10_jogstop_3] travel_deg=18.19  mean_speed=17.71  median_speed=22.5  max_speed=42.54  speed_cv=0.57  stall_ratio=0.0  overshoot_deg=3.08  stop_latency_sec=0.07  read_fails=3  end_from_start_deg=21.7  guard=False
        0.1 秒ごとの速さ (°/秒): 34.0 9.9 42.5 11.0 22.5
  始めの角度へ戻した: 着かない j0=-0.43
結果: /tmp/jog_probe_20261105_154332.json
Connection to 192.168.2.1 closed.
--- jog_probe_pi.py の終了コード: 0
結果の JSON: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_154332_hold/result.json
--- デーモンを戻す (systemctl start)
mode=systemd
pid=17242
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=17242
checker=no
デーモンは戻った (5555 LISTEN)

diag/jog_probe_20261105_162617_small/console.txt

jog_probe 20261105_162617 (結果: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_162617_small)
--- デーモンの状態 (止める前)
mode=systemd
pid=26153
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=26153
checker=no
--- デーモンの状態 (止めたあと)
mode=none
pid=なし
listen=no
serial_users=(なし)
checker=no
pymycobot 2.9.6 (/usr/local/lib/python2.7/dist-packages/pymycobot/__init__.py)
始めの角度: [-0.43, 1.66, 0.7, 0.26, -0.26, -30.14]
根元 j0 だけを、始めの角度から 25° 以内で動かします。毎回始めの角度へ戻します。

0. 読み取りの速さ (動かさない)
  読み取り 1 回: 中央 16.0 ms / 最大 18.5 ms / 空で返った割合 0.0

腕を少し前に倒した姿勢 [0.0, 40.0, -20.0, 0.0, -30.0, -30.0] へ動かします  (Enter で進む / q と Enter で終わる)

  着いた角度: [-0.43, 41.13, -18.19, 0.26, -28.91, -30.14]  (指令との差 j1 +1.13°)

S1 1.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S1 1.0°] 動いた 5/6  動いた量: 0.86 0.86 0.86 0.86 0.86 -0.0

S1 2.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S1 2.0°] 動いた 6/6  動いた量: 2.2 2.37 1.93 2.27 2.18 2.36

S2 1.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S2 1.0°] 動いた 5/6  動いた量: 1.05 0.96 0.0 1.06 0.8 0.88

S2 2.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S2 2.0°] 動いた 6/6  動いた量: 2.18 2.36 2.01 2.27 2.1 2.28

S3 1.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S3 1.0°] 動いた 6/6  動いた量: 0.79 0.79 0.79 0.79 0.79 0.79

S3 2.0° を始めます  (Enter で進む / q と Enter で終わる)

  [S3 2.0°] 動いた 6/6  動いた量: 2.19 2.19 2.19 2.19 2.19 2.19

HOME へ戻します  (Enter で進む / q と Enter で終わる)

結果: /tmp/jog_probe_20261105_162617.json
Connection to 192.168.2.1 closed.
--- jog_probe_pi.py の終了コード: 0
結果の JSON: /Volumes/KIOXIA/r2r2r-data/diag/jog_probe_20261105_162617_small/result.json
--- デーモンを戻す (systemctl start)
mode=systemd
pid=6649
listen=yes
daemon_pythonpath=/usr/local/lib/python2.7/dist-packages
serial_users=6649
checker=no
デーモンは戻った (5555 LISTEN)