モデル予測制御(Model Predictive Control: MPC)は、次の一手だけでなく、今の操作が数秒・数十ステップ後の状態へどう効くかをモデルで予測し、制約を守る操作列を最適化する制御法である。操作量に上限があり、速度・温度・関節角・障害物距離などにも制約があり、複数の入力が相互に干渉する系で特に価値が出る。計算した列のうち最初の一手だけを実行し、新しい測定値で再び最適化する。この「予測し、少し実行し、測り直す」反復がMPCの本質である。

MPCはPIDを置き換える万能の上位版ではない。モデル誤差、測定遅延、最適化失敗、実行時間超過を設計しなければ、制約を数式へ書いても安全にならない。低位の電流・速度ループにはPIDを残し、MPCを経路追従、熱プロセス、エネルギー管理、複数軸の配分に使う階層構成が多い。本稿は結論、直感、信号フロー、数式、調整、制約・安全、現行実装例、チェックリストの順に説明する。ROS 2の実行構成はROS 2入門、推定誤差が予測を崩す例はVisual SLAM入門を参照してほしい。

結論:制約を「後で切る」のではなく最適化に入れる

直感:曲がる前にブレーキを決める

自動車が曲線へ入る場面を考える。PIDだけでも横方向誤差を見て操舵できるが、曲線の先、速度、操舵角の上限、タイヤの横力、障害物との距離を一つの判断へ入れるには工夫が要る。MPCは候補となる操舵・加減速列を未来へ展開し、「車線から外れず、急操舵を避け、速度制限を守る」列を選ぶ。実際に使うのは最初の操舵・加速だけで、次の制御周期には観測し直して計画を更新する。未来を当て切る予言器ではなく、未来の仮説を毎周期捨てて更新するフィードバック制御である。

信号フローとreceding horizon

MPCの予測と再最適化の信号フロー測定状態、参照軌道、モデル、制約、最適化器が操作列を作り、最初の入力だけをプラントへ送り次周期に測定し直す概念図測定・推定 xₖ時刻・共分散も確認参照 rₖ…rₖ₊N経路・目標・速度予測モデルx₊=f(x,u,w)制約入力・状態・安全域最適化器操作列 uₖ…uₖ₊N−1対象最初のuだけ実行次周期:新しい測定で最適化をやり直す(receding horizon)

図: Duskcoil作成の概念図。予測軌跡は実測ではなくモデルによる候補であり、実行後に必ず観測で更新する。

最小の数式:二次計画問題としての線形MPC

離散時間線形モデルを

x_{k+1}=Ax_k+Bu_k+Ew_k,\qquad y_k=Cx_k

とする。x は状態、u は操作、w は外乱、y は出力である。予測地平 N に対して、参照 r への追従、入力、入力変化 \Delta u_k=u_k-u_{k-1} を評価する代表的な目的関数は

J=\sum_{i=0}^{N-1}\left(\lVert x_{k+i}-x_{ref,k+i}\rVert_Q^2+\lVert u_{k+i}\rVert_R^2+\lVert\Delta u_{k+i}\rVert_S^2\right)+\lVert x_{k+N}-x_{ref,k+N}\rVert_P^2

である。Q,R,S,P は「どの誤差をどれだけ嫌うか」を表す半正定値・正定値の重みで、単なる魔法の数字ではない。例えば横方向誤差だけを大きく罰すると、操舵を急に変え、乗り心地・タイヤ・アクチュエータを犠牲にし得る。S を入れるのは入力の滑らかさを明示的に評価するためである。

MPCの強みは、

u_{min}\le u_{k+i}\le u_{max},\quad \Delta u_{min}\le\Delta u_{k+i}\le\Delta u_{max},\quad x_{min}\le x_{k+i}\le x_{max}

のように、現実の制限を最適化問題へ直接入れられることにある。障害物距離、電池SOC、圧力、温度、関節角も状態または出力制約として表せる。ただし制約が同時に満たせないと実行不能になる。安全距離のように絶対に破れないハード制約と、快適性・目標追従のようにスラック変数 \epsilon\ge0 を許せるソフト制約を分ける必要がある。ソフト制約なら \rho\lVert\epsilon\rVert^2 を目的関数へ加え、どの逸脱を許したかログに残す。

状態推定、遅れ、モデル誤差

MPCは x_k を知っている前提で予測するが、現実には速度、温度、姿勢、位置はセンサと推定器の出力である。カメラSLAMで位置を得る移動ロボットでは、推定の遅れ、地図再局在化、座標系の不整合が、予測の初期条件を誤らせる。Visual SLAM入門で扱う時刻同期は、MPCでは目的関数より前の要件となる。古い状態に対して新しい参照を解けば、最適化器は数学的には正しくても物理的には遅れた操作を選ぶ。

モデル誤差には、摩擦、風、荷重変化、タイヤスリップ、熱容量の変化、未モデル化の柔軟性が含まれる。対策は、モデルを際限なく複雑にすることだけではない。外乱推定器・積分状態を拡張する、オンラインでパラメータを更新する、複数モデルを切り替える、制約に余裕を持たせるtube MPCやロバストMPCを用いる、低位ループを高速に安定化する、といった選択がある。どの方法も、想定外のモデル誤差に対し停止・減速する安全系を置き換えない。

調整:地平と重みは目的を文章から移す作業

予測地平 N は、遅れや主要な過渡現象を見通せる長さが必要だが、長いほど計算が重く、遠い未来のモデル誤差も効く。制御周期 T_sN の積 NT_s を、対象の支配的な時定数、停止距離、経路の曲率変化から決める。制御地平を短くして、後半の入力を一定と仮定することもある。

重みは次の順に調整すると追跡しやすい。第一に、安全制約と物理単位を固定する。第二に、参照追従に必要な Q を定める。第三に、入力の大きさ R と変化 S を上げて、電力・摩耗・乗り心地・熱を管理する。第四に、最悪計算時間と実行不能率を負荷・外乱・センサノイズを加えた試験で測る。速く追従するよう Q だけを上げるのは、制約へ衝突する入力列を選ばせる近道である。

問題 可能性 先に見るログ 典型的な対処
曲線で遅れる 地平が短い、状態遅れ 予測軌跡と実軌跡、時刻 N・速度計画・遅れ補償を見直す
操作がギザギザ S が小さい、ノイズ \Delta u、測定波形 入力変化重み・フィルタ・推定器を見直す
制約を頻繁に破る モデル誤差、余裕不足 スラック、飽和、外乱 マージン、外乱モデル、参照を緩和
解けない 制約競合、初期値不良 solver status、活性制約 実行不能方針、ソフト制約、縮退確認
周期に間に合わない 問題が大きい、計算変動 最悪実行時間 地平・モデル・solver設定を縮小

PIDとの役割分担と安全

典型的なロボット構成では、MPCが10~100 Hz程度で速度・姿勢・経路の参照を出し、各モータドライバまたはros2_controlのPIDがより高速な電流・速度・位置ループを閉じる。上位MPCが遅れたり失敗しても、低位ループには目標ゼロ・減速・保持などの安全なフォールバックを渡す。逆に低位PIDの飽和・追従不良をMPCが知らなければ、上位は実現不可能な入力を前提に計画する。両者の上限、遅れ、状態、タイムアウトを共有することが必要である。

安全設計では、最適化制約と独立した保護を持つ。非常停止、衝突検知、関節ハードリミット、過温・過電流、速度監視、通信断watchdogは、solverが正常に解を返すという仮定に依存させない。解がない、解が遅い、数値異常、推定値が古い、目標が不正のそれぞれに対し、減速・停止・最後の安全なコマンド保持のどれを選ぶかを明文化する。制約を満たす解が存在すること(feasibility)と、実世界で安全であることは同義ではない。

現行ソフトウェア、製品、研究例

MPCは化学・石油・発電などの連続プロセスから、車両、ロボット、エネルギー管理へ広がっている。実装では、二次計画問題を高速に解くソルバ、コード生成、状態推定、モデル同定、監視が一体となる。オープンソースのOSQPは凸二次計画を対象にし、MPCを含む組込み・制御用途の資料を公開している。MathWorksもMPCの公式解説で、予測、制約、繰返し最適化という構造を示している。これらは製品選定の推奨ではなく、実装で最適化器以外の設計が必要なことを確認する一次資料である。

ROS 2側では、ros2_controlがハードウェアとコントローラのライフサイクル、インターフェース、非同期更新、チェーン化を扱う。ros2_control公式文書 MPCノードをROS 2へ置くだけでは、最適化の締切、参照・状態の時刻整合、リアルタイム優先度、低位ループの独立性は解決しない。研究では、非線形MPC(NMPC)、学習したダイナミクス、分布ロバストMPC、知覚と計画の同時最適化が進む一方、計算負荷・説明可能性・安全保証が実装課題であり続ける。

実装チェックリスト

  1. 状態・入力・外乱・参照の単位、座標、遅れ、更新周期を定義したか。
  2. 物理的に守るハード制約と、緩和できるソフト制約を分けたか。
  3. solverの最悪時間、打切り、実行不能、数値失敗ごとのフォールバックを試験したか。
  4. 予測軌跡、実測、操作列、活性制約、スラック、solver statusを同じ時刻軸で保存するか。
  5. モデル誤差、外乱、スリップ、センサ遅延・欠損、通信断を注入したか。
  6. 低位PIDの飽和と実現可能な入力範囲を上位MPCが理解しているか。
  7. 独立した停止系がMPC・ROS 2・推定器の故障時にも働くか。

事前シミュレーションで確認したい境界

MPCはシミュレーションで見栄えのよい軌跡を作りやすい。そのため、通常条件だけを試すと危険な仮定を発見しにくい。参照軌道を急に切り替える、摩擦係数や荷重を変える、アクチュエータを飽和させる、測定を数周期遅らせる、位置を一時的に欠損させる、solverへ意図的に短い締切を与える、といった境界試験を最初から自動化したい。各試験で「何m外れたか」だけでなく、どの制約が活性化し、何周期で安全なフォールバックへ入り、どの信号がその判断の根拠になったかを確認する。

実機への移行は、低速・低出力・広い余裕を持つ場所から始める。モデル同定時と異なるタイヤ、床面、温度、搭載物を使うと、予測誤差の分布が変わる。最適化器の成功フラグだけを信じず、測定と予測の残差、入力飽和時間、スラック、停止距離を監視する。予測が外れた場合に「より強く操舵する」のではなく、速度を落とし、参照を緩め、必要なら停止する方針を前もって決めることが、制約を扱う制御の成熟度を決める。

参考資料

#制御工学 #MPC #最適化 #ロボティクス #自動運転 #ROS 2 #安全