notes
Control

Homing の状態機械 (速度が主信号、電流は確認)

「動き始めの電流」と「壁に当たった電流」は電流だけでは区別できない。速度と時間で切り分ける

要点: 動き始めの慣性 breakaway と「初期位置が壁」は電流だけでは区別できない。速度が立ち上がるかどうかを主信号にして、電流は「本当に押し当ててる」の 2 度目の確認として使う。soft-start で加速電流ピークを潰す。

なぜ電流だけでは足りないか#

状態電流速度
起動 (加速中)高い (慣性 + 静止摩擦の breakaway)0 → 上がる
初期位置が limit高い (壁を押している)0 のまま

電流の時系列形状は同じ。区別できるのは「その後 速度が立ち上がるかどうか」だけ。

6 相の状態機械#

VELOCITY 指令ベース (RoboMaster MD の DUTY = 電流指令だと壁到達で電流スパイクが出ないため、初期の DUTY 版から 2026-09 に切替 [[current-based-endstop-detection]])。

S0 BASELINE     - OFF 50〜150 ms で offset, σ_off, v_min を測定
S1 SOFT_START   - velocity 0 → velocity_home に 200 ms で ramp。current 無視
S2 MOVE_GATE    - ramp 完了 + start_gate_ms 監視
                  |v| > v_min が v_min_hold_ms 連続 → S3
                  timeout → LIMIT_AT_START (初期位置が壁)
S3 CRUISE       - move_baseline_ms 間、I_move / σ_move を実測
S4 WATCH        - 20 ms 毎に (|v| < v_min かつ I > I_move + k·σ_move) 検査
                  成立 → LIMIT_HIT / timeout → FAULT
S5 BACKOFF      - -velocity_home × 0.5 で逆方向、position 差分 ≥ backoff で停止
DONE            - この位置を原点として登録

3 つの仕掛け#

① Soft-start: velocity = 0 → velocity_home を 200 ms で ramp。inrush current を潰す。これだけで加速中の電流ピークが下がり、stall 電流との差 (SNR) が上がる。

② 速度で「動いた」を判定: |v| > v_min が 50〜100 ms 連続で「動いてる」。v_min は encoder 分解能 + ノイズより十分上に設定 (自動導出は 3·σ_v_off 床値 0.05 rad/s)。

③ 初期位置 limit と加速中を、時間で切り分け: soft-start 完了 + 追加 100 ms 待って、まだ |v| ≈ 0 なら「初期位置が limit」と判定。加速中なら 200 ms もあれば必ず動き始める。動かないのは物理的に動けないから。

「初期位置 limit」からの確認#

S_LIMIT_AT_START に落ちたら、逆方向に低 duty で 300 ms 戻す:

  • 戻る間に |v| > v_min を観測できたら「本当に limit にいた」→ その位置を limit として採用
  • 戻っても動かなければ「機構ジャム or 配線切れ」→ fault (押しっぱなしは焼く)

パラメータの床値・目安#

Param目安決め方
v_min0.05〜0.2 rad/smax(3·σ_v_off, 0.05) を毎回自動計算
v_min_hold_ms50 ms短くすると誤検出、長すぎると遅延
ramp_time_ms200 ms慣性大 (アーム先端) は 400、軽量 (ピッカ) は 100
start_gate_ms100 mssoft-start 後の加速完了待ち
k_current_margin3.0I_move + k·σ_move の閾値係数、3σ で誤検出 0.3%
timeout_msstroke / min_speed × 3正常所要時間の 3 倍が上限

電流は主信号にしない#

  • 主信号は速度: 「今動いているか、詰まったか」の 2 値判定
  • 電流は 2 段目: 「止まった」に加えて「本当に押し当ててる」の確認
  • 電流だけを主にすると、加速電流スパイクを stall と誤検知する

関連#

最終更新:

On this page