DCブラシモータのPID制御

古典制御

モータへの入力(PWM制御のオンの時間幅より得られた正弦波の交流電圧)とモータからの出力(エンコーダより得られたモータ軸の回転後位置の値)に注目して、しかしピッタリ、しかも早く回転後の目標値に達するには、入力値と出力値は単純に線形関係では済まず、以下のイラストに示される、PID(P:エンコーダ出力値と目標値の差の線形比率成分、I:エンコーダ出力値と目標値の差の積分成分、D:エンコーダ出力値と目標値の差の微分成分)が考案された古典制御である。

Wikipedia PID制御のブロック図
Wikipedia PID制御のブロック図

PID制御の実現について、以下のようにArduinoボードに実装する。

// p->output:モータへの入力、p->Encoder:モータからの出力
input = p->Encoder - p->PrevEnc;
Perror = p->TargetTicksPerFrame - input;
// PIDのP成分、I成分、D成分を線形合成する
output = (Kp * Perror - Kd * (input - p->PrevInput) + p->ITerm) / Ko;
p->PrevEnc = p->Encoder;
// 簡略化を図るゆえにoutputの最大値の判定およびその際の処理を省略する
output += p->output;
p->ITerm += Ki * Perror;
p->output = output;
p->PrevInput = input;

PID制御のP I Dに伴う係数のKp Ki Kdが、以上ソースコードを実装したArduinoボード、モータコントローラ、モータを接続して、ロボットの実重さ、実走行環境にて実験を行い、Kp Ki Kdを決める方法がある。これを別途記述とする。

以上ソースコードの出典は以下のとおり、但し簡略化を図るゆえにソースの一部を削除したことがあり、ご注意願います。

https://github.com/hbrobotics/ros_arduino_bridge/blob/indigo-devel/ros_arduino_firmware/src/libraries/ROSArduinoBridge/diff_controller.h

現代・ポスト現代制御

現代制御では状態空間モデルが用いられて、ポスト現代制御では代表的なものにロバスト制御や適応制御がある。ニューラルネットワークを用いる深層学習、強化学習の活用が期待される。

関連記事

9軸IMU 6軸/9軸フュージョン 低遅延 USB出力 補正済み ROS対応

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア