PID制御---Pythonシミュレーションに基づく

    PID は制御における非常に古典的なモデルで、P (比例)、I (微分)、D (積分) を相互に連携させて信号の閉ループ制御を実現すると同時に、信号波形は急激ではなく滑らかに変化します。以下は主にPythonで実装された速度制御プログラムを組み合わせてPIDの処理をシミュレーションするものです。

参考ブログ:Motor Control Advanced - PID Speed Control_pid Speed Control Algorithm_Programmer Blog-CSDN Blog 

目次

簡単な説明 

P(プロポーション)

I(微分)

D(ポイント)

Pythonベースの速度調整

Kp=0.01、Ki=0、Kd=0

Kp=0.01、Ki=0.01、Kd=0

Kp=0.01、Ki=0.01、Kd=0.01


簡単な説明 

    PID制御はインクリメンタル制御方式と位置制御方式に分けられますが、位置型の方がよく使われるため、ここでは位置型に焦点を当てます(インクリメンタル型については参考にしたブログにあります。興味があればご自身で勉強してください) )。

    位置PID制御は主にP(比例)、I(微分)、D(積分)の3つの部分から構成されており、簡単な構成ブロック図は以下のとおりです。

     現在の設定が速度であるとすると、目標速度-実速度から誤差が求められることがわかり、この誤差に応じて、電流必要補正量を実際の値に対して補正するための計算と加算が行われます。 P、I、D の 3 つの量を設定し、最終的な実際の値を目標値に近づけ続けます。

PID については、次のとおり個別に説明します。

P(プロポーション)

    P に反映される大まかな変化量は、現在値と目標値とのギャップに関係し、ギャップが大きいほど変化量も大きくなります。      倉庫番を例にとると、目的地から遠ければ遠いほど力を使うので早く目的地に着くことができますが、逆に目的地に近ければ力は少なくて済みます。そうしないと体重が減り、目標からさらに外れてしまいます。

I(微分)

    抵抗の大きさを大まかに反映すると、連続の場合は導関数として反映されますが、一般的な工学の離散の場合は、2つの測定誤差の差、つまり電流誤差と測定誤差の差になります。前のエラー。 

    これは実は抵抗の役割に相当するもので、どう調整しても逆方向に変化させてしまうのですが、これは最終天秤が振動しているときに非常に効果があり、振動の振幅を大幅に抑えることができます。

D(ポイント)

    D は、大まかに各段階の調整方法であり、調整の誤差合計に関連します。

    この量は主に静的バランスの問題を解決するためのものです. 予想される水位のプールがあれば, 放水と漏水が発生します. 状態が完全に一致している場合, P と I も前の状態と完全に一致しています,調整後もこの状態が続くと無限ループに陥ります この時必要となる量 D は誤差の合計に直結するため、調整するたびに誤差は増加していきます, そうすれば次回の調整額は今回とは異なることになり、この無限ループを断ち切ることができます。

Pythonベースの速度調整

以下は主に PID モデルの速度調整モデルを確立することです. 60 から 100 への速度調整を例にとります. 最終的な精度要件は 0.001 です. 各量の効果を感じることができます.

エフェクトを安定させるため、いくつかの係数は比較的小さい値に設定していますが、大きすぎると最終的には直接 NaN になる可能性が高いため、パラメーターの設定は自分で調整できます。

コードは以下のように表示されます。

from matplotlib import pyplot as plt

def PID(now_v,expc_v):
    Kp = 0.01
    Ki = 0
    Kd = 0
    sum_err = 0
    v_list = []
    err = expc_v - now_v
    err_last = err  # 上一次的输出,先初始化为一致
    cnt = 0
    while abs(err) > 0.001:  # 误差还在范围外
        err = expc_v - now_v
        sum_err += err
        uk = Kp*err + Ki * sum_err + Kd * (err-err_last) # 确定本次输出
        # now_v = now_v + uk + random.uniform(0,0)  # 更新当前速度,加入一个扰动
        now_v = now_v + uk
        err_last = err
        v_list.append(now_v)
        cnt += 1
    print(cnt)
    plt.plot(v_list)
    plt.show()

if __name__ == '__main__':
    PID(60,100)

Kp=0.01、Ki=0、Kd=0

このとき、Pのみで制御することになり、実行後に以下のような調整過程が求まります。

この状態自体が理想的なので非常に理想的ですが、乱数アイテムを追加すると、ランダム乱数アイテムに速度を加えてこうなります。

now_v = now_v + uk + random.uniform(-0.1,0.1)  # 更新当前速度,加入一个扰动

 テスト後、比較的小さな外乱はすぐに収束しますが、(-2,2) などの比較的大きな外乱の場合は次のようになります。

 5000回転くらいまでは収束しないが、この時点では誤差が大きくなるため、Pのみに頼って制御するのは理想的な場合にのみ適している。

Kp=0.01、Ki=0.01、Kd=0

このとき、I の量を追加します。この量は主に衝撃を除去するためのものであり、外部からの影響を除去することができます。また、ランダムな外乱 (-2,2) を次のように設定します。

 約 2500 ラウンドで精度要件が達成されることがわかりますが、実験の観点からは、パラメーターが適切に調整されていないため、その効果はあまり明らかではありません。

Kp=0.01、Ki=0.01、Kd=0.01

この場合、累積誤差項の調整が追加され、これが完全な PID プロセスとなります。

ランダムな誤差が (-2,2) の場合でも、この組み合わせの相対的な調整数は確かに若干少なくなります。

 上記は PID に関する個人的な理解です。これは単純なデバッグであり、実際のパラメータ調整がなければ、単なる記録にすぎません。

おすすめ

転載: blog.csdn.net/weixin_60360239/article/details/130415274