MATLABでPIDコントローラを設計し、C++で実装する
TweetMATLABの離散時間PIDコントローラーの軽い紹介とC++での実装例です。
はじめに
今年からMathworksがマイクロマウスのスポンサーとなり、マイクロマウス出場者は無償でMATLABが使えるようになりました。
自分も学生時代からMATLABを使いまくっていたので、マイクロマウスでのMATLABの活用を盛り上げていくべくMATLABに関する記事を書いていきたいと思います。
今回はMATLABでのPIDコントローラ設計(仕様を満たすようにPIDパラメータを決める作業の意)に関する情報の場所を紹介し、 そこに出てくるツールで設計された離散時間2自由度PIDコントローラのC++実装を紹介します。
MATLABでPIDコントローラ設計する
MATLAB(のControl System Toolbox)では制御対象のモデルと達成したい制御目標を与えると、PIDコントローラのパラメータを設計してくれます。
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);