mechArm 270 Pi 動的追従の限界を探る Log#48 | 動的追従 再構想設計書 — 非同期 dual-system
LOG272R2R2R2026/7/5

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→…)をそのまま実行

  • リプランフラグ時のみ:

  1. 進行中の送角を安全に区切る(現在角で一旦静止。急停止・追い送角しない)

  2. バッファの最新位置で該当 phase を再 lookup

  3. 新ターゲットへ 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 フェーズを定義。