MATLABの離散時間PIDコントローラーの軽い紹介とC++での実装例です。

はじめに

今年からMathworksがマイクロマウスのスポンサーとなり、マイクロマウス出場者は無償でMATLABが使えるようになりました。

Mathworks: Micromouse Contest

自分も学生時代からMATLABを使いまくっていたので、マイクロマウスでのMATLABの活用を盛り上げていくべくMATLABに関する記事を書いていきたいと思います。

今回はMATLABでのPIDコントローラ設計(仕様を満たすようにPIDパラメータを決める作業の意)に関する情報の場所を紹介し、 そこに出てくるツールで設計された離散時間2自由度PIDコントローラのC++実装を紹介します。

MATLABでPIDコントローラ設計する

MATLAB(のControl System Toolbox)では制御対象のモデルと達成したい制御目標を与えると、PIDコントローラのパラメータを設計してくれます。

PIDコントローラの設計に関するドキュメントのトップページはおそらくここです。

Mathworks: PID コントローラーの調整

例えばpidtuneという関数は、引数に制御対象のモデルと設計オプションを渡すと、いい感じのPIDコントローラを設計してくれます。

また、コマンドラインでpidTunerと打つと起動するPID 調整器アプリを使うと、 以下の画像のようにGUIからパラメータをいじりながら時間応答・周波数応答をみつつコントローラを設計することができます。

MATLABのドキュメントを見ると分かるとおり、PIDコントローラと言っても様々な形のものがあります。

Mathworks: 離散時間比例-積分-微分 (PID) コントローラー

自分は例えば去年のマイクロマウスの速度制御部分には、離散時間2自由度並列PIDコントローラに使ってました。 現実で実装可能という意味では離散時間のものを使うしかなく、目標値追従をするので2自由度制御に対応したものを使っていました。 この場合に限らず多分実物を制御する上では、PIDコントローラの中でも離散時間2自由度PIDコントローラが一番一般的な形をしているんじゃないかと思います。

以降ではこの離散時間2自由度並列PIDコントローラのC++での実装例を紹介します。

MATLABで設計したPIDコントローラをC++で実装する

長々と書いていた離散時間2自由度並列PIDコントローラ(ここの2-DOF 並列)をC++で実装したものが以下のものです。

使用例

MATLABで設計したパラメータは以下のコード中のcontroller_paramに設定します。

const float control_period = 0.010; // 10ms
const PIDController::Param controller_param = {
        .P = 1.1,
        .I = 0.45,
        .D = 0.014,
        .N = 1919.0,
        .b = 0.8,
        .c = 0.10
};

PIDController pid_controller(control_period, controller_param);

// 制御周期ごとに...
// reference: 目標値  sensor_output: センサ出力
// control_input: 制御入力
float control_input = pid_controller.update(reference, sensor_output);