So-net無料ブログ作成
検索選択

ドローンのシステム基礎を学ぶ(11) [ロボットを作ってみる!]

前回、PI制御について学びました。PI制御は精度は高いですが収束まで時間がかかります。動きの激しいシステムでは使えません。


PIsystem.png


収束まで時間がかかるのは、小さな値を積算してフィードバックをかけるためです。小さな値を累積させてフィードバックに意味ある値にするまで時間がかかるためです。

時間がかかるのであれば、変化に応じてフィードバック量を増やしてやればよいということで、変化量の微分値を加える方法が考えられました。これが微分制御(D制御)です。


pidformura.png


変化量の傾き(微分量)を加えることによって、変化がはげしいときはフィードバック量が増えターゲット値に早く近づけることができます。


d.png


しかし、ハンドル操作で容易に想像がつくように、変化が激しい状況でフィードバック量をあまりに大きくすると制御不能に陥ってしまいます。


実際にプログラムを作って試してみましょう。質量は1g、測定間隔は0.1秒、手始めに 比例係数Kp、積分項係数Ki、微分項係数Kd の値はすべて1.0にしてみました。

#include <stdio.h>

#define MASS 1
#define TIME_INTERVAL 0.1
#define Kp 1.0
#define Ki 1.0
#define Kd 1.0

void main()
{
    float Vt = 80.0;  // Target Velocity
    float Vm = 60.0;  // Measured Velocity
    float Time = 0.0;
    float err_integ = 0.0;
    float pre_err = 0.0;

    printf("%f, %f\n", Time, Vm);
    for (int i = 0; i < 500; i++) {
	
	float err = Vt - Vm;
	err_integ += err * TIME_INTERVAL;
	float derr = (err - pre_err) / TIME_INTERVAL;
	
	float force = Kp * err + Ki * err_integ + Kd * derr;
        float dAcc = force / MASS;

        Vm += dAcc * TIME_INTERVAL;
        Time += TIME_INTERVAL;

        printf("%f, %f\n", Time, Vm);

	pre_err = err;
    }
}



これをグラフにしてみました。なんと微分項係数Kd が大きすぎたのか発散をしてしまいました。


PID_Kp1Ki1Kd1.png


ということで、Kp、Ki、Kd の値を変えてみて収束の様子を観察をしてみました。


PID_adjustment.gif


どうやら、この制御系の場合は、Kp = 7.0、Ki = 0.2、Kd = 0.02 がもっともよいようです。各係数の求め方はいくつか手法が編み出されていますので、皆さんも試してみてください。

この系をシステムとして表現すると下記のようになります。


pidsystem.png


これが有名なPID制御系になります。いわゆる古典制御と言われているものですが、ドローン制御やロボット制御でも未だに使われている現役の制御理論です。

次はこれをドローンの制御系に適用してみたいと思います!
(^_^)/~





エンジニアのためのフィードバック制御入門

エンジニアのためのフィードバック制御入門

  • 作者: Philipp K. Janert
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2014/07/26
  • メディア: 単行本(ソフトカバー)






ArduinoとMATLABで制御系設計をはじめよう! (Physical Computing Lab)

ArduinoとMATLABで制御系設計をはじめよう! (Physical Computing Lab)

  • 作者: 平田光男
  • 出版社/メーカー: TechShare
  • 発売日: 2012/12/07
  • メディア: 単行本(ソフトカバー)




nice!(32)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 32

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0