Control
システム同定 (System Identification)
実験データから対象システムの数学モデル (パラメータ or 構造) を推定する。制御設計の前段
要点: 実験データから対象の数学モデルを推定する分野。制御 (PID/FF) を設計する前段として使う。モータ校正 (friction 係数、慣性、重力モデル) はすべて system ID の一種 (gray box)。
3 段階
- 入力信号設計 — 何を印加して応答を見るか (ステップ / 掃引 / PRBS)
- データ収集 — 入出力を bag する
- パラメータ fit — LS / 極配置 / MLE 等で係数決定
分類軸
情報の使い方 (何を仮定しているか)
| Type | 説明 | 例 |
|---|---|---|
| Black box | 構造知らない、データだけで fit | ARX, ARMAX, N4SID |
| White box | 全物理式既知、パラメータも設計値 | 有限要素モデル |
| Gray box | 構造既知 + 係数未知 | モータ校正 (duty = c·sign(v) + b·v + g) |
現実の実装ではほぼ gray box。物理的な構造 (慣性・摩擦・重力) は既知だが係数を測って埋める。
入力信号
| Signal | 用途 | 何が分かる |
|---|---|---|
| Step | 単純、加速度で J 同定 | 立ち上がり時定数、オーバーシュート |
| Impulse | 短時間ピーク応答 | インパルス応答 h(t) |
| Sine sweep | 周波数ごとに正弦波印加 | 周波数応答 G(jω) = ゲイン + 位相 → ボード線図 |
| Chirp | 掃引を連続化 (t で ω が変わる) | 短時間で広帯域を励起 |
| PRBS (Pseudo-Random Binary) | ±duty を疑似ランダム切替 | 全周波数を並列に励起、LS で fit |
| Multi-sine | 複数周波数の合成 | 帯域制限しつつ広帯域 |
信号設計のトレードオフ:
- 帯域広い → 全モードが観測可能だが high freq でモータ発熱
- 振幅大 → SNR 良いが機構破損リスク
- 時間短い → transient 支配、定常が見えない
領域
- 時間領域: ステップ / ランプ / PRBS + LS fit
- 周波数領域: 掃引 → FFT → G(jω) → 極配置
代表アルゴリズム
| Method | 特徴 |
|---|---|
| LS (最小二乗) | 線形 + 静的関係 (motor friction fit がこれ) |
| RLS (再帰 LS) | オンライン更新、適応制御 |
ARX y[k] = a·y[k-1] + b·u[k-1] | 動的 SISO 線形モデル |
| ARMAX | ARX + moving average of noise |
| OE (Output Error) | ノイズを output 側にのみ仮定 |
| N4SID (subspace) | MIMO 対応、状態空間モデル |
| Kalman filter | 状態 + パラメータ同時同定 |
| Levenberg-Marquardt | 非線形 LS (物理式 fit) |
制御設計との関係
同定 → モデル → 極配置 or 周波数応答整形 → gain 決定 → 実装
モデルなしで PID チューニング:
- 試行錯誤、Ziegler-Nichols 等の rules of thumb
- 極めて時間がかかる、機構破損リスク
モデルありで gain 計算:
- 1 回で gain が出る:
kp_v = J·ω_v/Kt,kp_p = ω_v/5 - 帯域 ω_v の 1 つのノブで cascade PID が決まる
- FF もモデルから直接:
duty_ff = J·a/Kt + g(θ) + c·sign(v) + b·v
落とし穴 (実測すると必ずぶつかる)
- 入力信号の帯域不足: 全モードが励起されず、一部のパラメータが observability 低い
- 例: 常に低速だけだと viscous slope が見えない
- 対策: 対称速度セット
[-2, -1, -0.5, 0.5, 1, 2]で fit
- 測定ノイズ: LS の分散悪化
- 対策: サンプル数増、window LPF、baseline 減算
- モデル構造の誤り: データが良くても fit が悪い (R² 低)
- 例: 対称モデル
c·sign(v) + b·vを非対称機構に fit すると R² が上がらない - 対策: 構造を先に検証 (残差プロット、方向別 fit)
- 例: 対称モデル
- 可観測性 (identifiability): 同時に測ろうとして片方が固定に見える
- 例: friction stage の中で重力バイアスと constant duty が縮退
- 対策: 実験の切り分け (重力 stage を先に、独立に測る)
- 入力側の飽和: 線形域外で fit が壊れる
- 例: PID output=1.0 (100%) に貼り付いてる時は本当の応答ではない
- 対策: サチュ観測時はその点を除外 or 速度域を下げる
- 温度ドリフト: 電気特性 (kt, R) が変わる
- 対策: 校正直前に暖機、または温度補正モデル
実運用の切り分け (Gray box の作り方)
分離できる物理は分離:
- 摩擦 = 速度依存 → 定速で測る
- 慣性 = 加速度依存 → ステップ応答の加速中を切り出す
- 重力 = 位置依存 → 静止保持で測る (速度・加速度=0)
- backlash = 位置差分 → forward/backward で位置差を測る
分離できないもの (混同する):
- 摩擦 (viscous) と EMF 補償: どちらも v 比例。折り込んで 1 係数で扱う
- 摩擦 (coulomb) と gravity_bias: 定数っぽく見えるが、gravity は姿勢依存
- inertia J と gearbox 摩擦: 加速中に混じる
分離できないものは順序で管理:
- 一方を先に測って減算 → もう一方を測る
- 例: gravity stage を先 → friction stage で減算 (RC27 mech_ff_tuner)
応用例 (身近なところ)
| 対象 | 使う入力信号 | 出力 |
|---|---|---|
| モータ (J/Kt) | ステップ | inertia, torque const |
| ダンパ (減衰係数) | インパルス | 減衰時定数 |
| RC 回路 (RC 時定数) | ステップ | τ = RC |
| 建物構造 (固有振動) | 起振機掃引 | モード解析 |
| 反応炉 (伝達関数) | 温度ステップ | プロセス gain と遅れ |
参考
- Ljung "System Identification: Theory for the User" — 定番教科書
- MATLAB System Identification Toolbox
- Python:
sysidentpy,sippy,controlpackage - ROS 2 では
ros2 bag+ pandas + scipy で LS fit を書くのが多い
関連
- FF スタック — 同定した係数の使い先
- PID と FF 項の自動チューニング — 具体的な同定手順
- Tuning primitives の分離設計 — LS fit の implementation
最終更新: