mechArm 270 Pi 動的追従の限界を探る Log#48 | 動的追従 再構想設計書 — 非同期 dual-system
本ドキュメントは、mechArm270Pi 動的追従(ブロック・白箱が移動しても実行中にアームが追従する能力)の再構想設計。シリーズ「動的追従の限界を探る」の主題を、補正記憶・視覚サーボ・VLM-as-Reward という現在の足場の上で再定義する。
位置づけ: 現在の補正記憶+視覚サーボは「特定ステージに到達した瞬間だけ目を開ける」離散的な閉ループ。本設計はこれを「移動中も状況を把握し続け、ズレたら安全に追う」構造へ拡張する。世の中の VLA 研究が到達した主流解「非同期 dual-system」を、mechArm の軽量実装(OpenCV 検出+lookup+send_angles)に翻訳する。
1. 核となる設計原則(3つ)
原則1: 遅い知覚と速い制御を、別周波数・非同期で回す(dual-system)
VLA 研究の主流解。大きな知覚(VLM・重い検出)を低頻度の「遅い系」に、反射的な制御を高頻度の「速い系」に分け、両者を非同期にする。速い系は遅い系の更新を「待たない」。遅い系の最新出力はバッファ経由で読むだけ。
原則2: 追従は連続サーボでなく離散リプラン(LOG200 発振の回避)
LOG200 で j1+j2+j4 連動の連続 Z 追従が発振・不成立となった経緯を踏まえる。移動中も対象位置はモニタするが、実際にターゲットを引き直すのは「ズレが閾値を越えた時だけ」。毎フレーム反応しない。追わない勇気を設計に含める。
原則3: 測ってから作る(P008)
制御周期の律速は Mac の計算力ではなく、カメラ遅延と送角往復。まず 1 周期の時間分解(撮る/検出/送角/到達待ち)を実測し、律速区間を数字で特定してから対策する。推測でカメラ有線化や非同期化に走らない。
2.用語対応表(VLA 研究 → mechArm 実装)
VLA 研究の用語 | mechArm での実体 | 状態 |
|---|---|---|
System 2(遅い・賢い) | OpenCV 検出(ブロック・白箱)+ VLM-as-Reward(成否・異常判定) | 既存(離散実行) |
System 1(速い・反射) | 視覚サーボ(j0)+ send_angles + lookup | 既存(離散実行) |
latent buffer(非同期の橋) | 対象位置の共有バッファ(最新検出位置+時刻+確信度) | 新設対象 |
action chunking(動きを止めない) | 送りっぱなし+並行して次を計画(案R との整合要検討) | 新設対象(後段) |
制御周波数 50–100Hz | 目標としない。実測周期内で追える速さの対象のみ追う | 設計方針 |
補足: 世の中の VLA は 7B モデルを GPU で回すために dual-system を必要とする。mechArm の「速い系」はニューラルネットではなく軽量 OpenCV+幾何 lookup なので、計算力は既に足りている。足りないのは「非同期の橋」という設計パターンのみ。
3.アーキテクチャ(3層)
┌─ 遅い系(Perception・別スレッド/プロセス・止まってよい)────────┐
│ 上カメラ連続撮影 → HSV/テンプレ検出 → homography │
│ → 対象位置バッファへ書き込み(block / box 各々) │
│ VLM 判定(異常検知・成否)は更に低頻度で並走 │
└──────────────┬───────────────────────────────┘
│ バッファ(最新位置+timestamp+confidence)
│ ※速い系は読むだけ・書き込みを待たない
┌──────────────┴───────────────────────────────┐
│ 監視層(Monitoring / Decision) │
│ 現在の狙い(進行中ターゲット) vs バッファ最新位置 を常時比較 │
│ |ズレ| > REPLAN_THRESHOLD_MM → リプランフラグ │
│ |ズレ| ≦ 閾値 → 無視して続行(追わない) │
└──────────────┬───────────────────────────────┘
│ リプランフラグ(離散イベント)
┌──────────────┴───────────────────────────────┐
│ 速い系(Execution / Replanning) │
│ 通常: 既定シーケンスの送角を継続 │
│ フラグ時: 安全停止 → 新ターゲットで lookup → 新軌道へ │
│ send_angles のみ・j0 系の実績パターンを優先 │
└──────────────────────────────────────────────┘
3.1 遅い系(Perception)
上カメラのフレームを一定周期で取得し、赤ブロック・白箱を検出してバッファを更新する
検出は現行の軽量手法(HSV+テンプレート+動的 homography)を維持。重い手法(SAM 等)を実時間ループに入れない
見えない瞬間(アーム自身の遮蔽)は前回値を保持し、
stale(古さ)を timestamp で表現。速い系は stale が大きい値を信用しないカメラ取得は
CAP_PROP_BUFFERSIZE=1+ grab 空回しで最新フレームを掴む(古いフレーム滞留の定石対策)。効果は実測で確認
3.2 バッファ(非同期の橋・新設の核)
構造(案):
{ "block": {x, z, t, conf}, "box": {x, z, t, conf} }を排他制御付きの共有変数で持つ書くのは遅い系だけ、読むのは監視層/速い系だけ(単方向・競合最小)
これが VLA 研究の latent buffer の mechArm 翻訳。賢い表現は不要で「最新の対象位置」だけでよい
3.3 監視層(Monitoring)
進行中ターゲット(例: approach_pick の狙いブロック位置)とバッファ最新位置の差を比較
REPLAN_THRESHOLD_MM(初期値案: 15mm)を越えたらリプランフラグ。越えなければ何もしない閾値は将来、補正記憶が「このセルはよくズレる」を学んで動的化できる(拡張・当面は固定値)
異常検知(対象消失・想定外の大移動)は VLM 判定に回す低頻度パスを持つ(毎フレーム VLM は呼ばない)
3.4 速い系(Execution / Replanning)
通常時は既定シーケンス(HOME→approach→…)をそのまま実行
リプランフラグ時のみ:
進行中の送角を安全に区切る(現在角で一旦静止。急停止・追い送角しない)
バッファの最新位置で該当 phase を再 lookup
新ターゲットへ 1 回送角(send_angles・単発)
リプランは 1 イベント 1 回。連打しない(同一ステージ内のリプラン回数上限を設ける。初期値案: 2 回)
4.安全設計(発振・暴走の防止)
リスク | 対策 |
|---|---|
毎フレーム反応による発振(LOG200 と同型) | 閾値超のみリプラン・回数上限・連続サーボ禁止 |
移動中リプランでの衝突 | リプランは「一旦静止 → 再 lookup → 単発送角」。移動中の軌道変更をしない |
stale データによる誤追従 | バッファに timestamp。古い値(例: >1.5s)はリプラン判断に使わない |
j4 抜けとの相互作用 | j4 切り分け決着が本実装の前提条件。未決着のまま送角回数を増やさない |
案 R(未到達検知 ABORT)との衝突 | リプランで送る新ターゲットも案 R の到達確認を通す。案 R を迂回する送角経路を作らない |
送角頻度の過多で daemon 詰まり | リプランは離散イベントのみ。連続微小送角を送らない |
Z 方向の関節連動 | 引き続き禁止。リプランは lookup 経由の姿勢差し替えであり、係数ベースの関節連動ではない |
5.律速の実測
対策の前に、1 周期の時間分解を実測する。計測スクリプト(runs/experiments/ 行き・台帳追記なし・既存送角を計測でラップするのみ)で以下を刻む:
計測区間 | 内容 | 出力 |
|---|---|---|
T_grab | カメラフレーム取得(要求→取得完了) | ms・fps 実効値 |
T_detect | 検出(HSV/テンプレ+homography) | ms |
T_send | send_angles 送信→daemon ACK | ms |
T_arrive | 送信→到達確認(現行ポーリング) | ms(移動量別) |
T_vlm | VLM API 往復 | ms(参考・実時間ループ外) |
判断基準:
実効ループ周期 = max(T_grab+T_detect, 監視周期) が確定 → その周期で追える対象速度の上限を算出
T_grab が支配的 → バッファサイズ削減・解像度削減・(最後の手段として)有線カメラ検討
T_send/T_arrive が支配的 → 非同期化(送りっぱなし)の検討価値が上がる。ただし案 R との整合を先に設計
6.段階導入ロードマップ
一気に全区間へ入れない(MASTER: 単腕で土台が固まってから複雑さを足す、の思想を適用)。
フェーズ 0: レイテンシ実測(前提・物理リスクなし) 計測スクリプトで 5 節の時間分解を取得。律速を数字で確定。
フェーズ 1: 白箱監視(静的リプランの最小実装) 区間: approach_place 到達後〜stage8.5 リリース前。アームがほぼ静止しており軌道差し替え不要、既に撮影が入っている、白箱ズレは実機で頻発。ここで「リリース前に白箱位置を再確認 → 動いていたら箱中心ターゲットを引き直す」を 1 つ入れる。層 1〜3 のミニ実装=全区間展開の雛形。
フェーズ 2: 移動中モニタ(読むだけ・動かさない) HOME→approach、lift→approach_place の移動中に遅い系を回し、バッファ更新とズレ検知のログだけを取る。リプランはまだ実行しない。「移動中にどれだけズレが起きているか」を実測で把握する観測フェーズ。
フェーズ 3: 移動中リプラン(本丸) フェーズ 2 の実測でズレの頻度・大きさが分かった上で、安全停止→再 lookup→単発送角のリプランを有効化。ステージごとに順次(approach_pick から)。
前提条件(フェーズ 1 以降の着手条件):
j4 切り分け(neg 実験)の決着
PLACE 再照準(stage8.5)の符号確認と効果測定の完了
7. 既存資産との関係
既存資産 | 本設計での役割 |
|---|---|
補正記憶(試行間学習) | 静的な系統誤差の吸収。動的追従は「試行内」の外乱対応で役割が別。共存する |
視覚サーボ(PICK j0 / PLACE stage8.5) | 速い系の実績部品。リプラン後の最終締めとしてそのまま機能 |
VLM-as-Reward | 低頻度の異常検知・成否判定として遅い系に統合 |
案 R(未到達 ABORT) | リプラン送角にも適用。迂回しない |
camera_resolver | 遅い系のカメラ解決に流用 |
FK テーブル / j0_sweep lookup | リプランのターゲット引き直しに流用(新しい姿勢生成手法を作らない) |
8. 作らないもの(スコープ外の明示)
連続 Z 追従(係数ベースの関節連動)— LOG200 で焼いた道。再挑戦しない
実時間ループへの重い知覚(SAM・ニューラル検出)投入 — 追従には過剰。重い処理はクラウド(RunPod/Colab)の役割
50–100Hz の制御周波数目標 — mechArm+現行カメラ経路では非現実的かつ不要。実測周期内で追える対象だけ追う
予測制御(対象の移動方向を先読み)— 等速追従が成立してからの将来課題
更新履歴
2026-07-05 : 初版ドラフト。VLA 研究の非同期 dual-system(System1/2 分離・latent buffer・action chunking)を mechArm の軽量実装に翻訳。3 層アーキテクチャ・安全設計・段階導入 4 フェーズを定義。
