フィジカルAI研究室を作る Log#21 | ゲームパッドで mechArm 270 を直す形が固まった
この記事の素材(コード・ログ・データ 31ファイル・まとめてダウンロードあり)arrow_downwardAIで読む ChatGPT・Claude などで、この記事に質問できます expand_more
小型ロボットアーム 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、買うか借りるか実際に借りて学習させた費用と、損益分岐の計算機で決められますarrow_forward作業ログ ― 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)
(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=systemddiag/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 の角度)を、送り方ごとに並べると次のようになります。

ゆっくり動かすと、jog でも1回送る形でも、0.2秒ごとに進んでは止まる動きになりました。一定の速さでなめらかに動いたのは speed 20〜30 だけです。なめらかさの限界は送り方ではなくサーボの側にあり、ゆっくり、かつなめらかに、は mechArm 270 では両立しません。 jog は止まらない回が1回目にあったので、止めそこなったときに動き続ける jog は長押しの土台にせず、止めそこなっても目標で必ず止まる、遠い目標へ1回送る形を使うことにしました。速さは speed 20(毎秒約40°)に決めました。
jog_probe 3回目の端末の出力(15:43)
(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=systemddiag/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 を足すスクリプト)
## 結論
必須は 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回押しと止める処理ごとに並べた出力
== 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)
(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.6116: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)
(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)
(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.2316: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)
(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.2316: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回押しと止める処理ごとに並べた出力
== 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)
(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.7916: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)
(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回押しと止める処理ごとに並べた出力
== 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_SAFEjog_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行)
{"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行)
{"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行)
{"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行)
{"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行)
{"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行)
{"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行)
{"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=nodiag/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)