倒立振子を制御するための線形二次コントローラーを噛む

前文



倒立振子を制御する例を使用して、線形2次コントローラーの使用の詳細な説明を続けます。 ところで、「LCR」という用語は、私がすでにコメントで促されたように、ロシアの制御理論の学校ではこのアプローチが「最適なコントローラーの分析的構築」と呼ばれる、起こっていることの本質を非常に不正確に反映しています。



いつものように、興味のある学生が資料を利用できるように、数学を最大限に噛み砕こうとします。 私は数学を良い方法で使うことは支払われるべきであると深く確信している。どんな公式も理解を促進することを意図している場合にのみ使用すべきであり、誇示するためではない。



したがって、これは4番目の記事です。何が起きているのかをよりよく理解するには、前の3つを読むとよいでしょう。





これがシステムの写真です(クリック可能):







中古センサー



システムで何が起こっているかについての情報は2つしかありません。これらは2つのインクリメンタルエンコーダーであり、1つ(1回転あたり1000パルス)はキャリッジの位置を示し、2つ目(1回転あたり2000パルス)は振り子自体の位置を示します。 前の記事で、私はアルデュイン自体を使用してパルスをカウントしましたが、これはエンコーダーのノイズの多い測定値に対してかなり不正確であり、弱く耐性があります。 さらに、すでに弱いatmegaコンピューティングリソースを無駄にします。 ここで、 HCTL-2032マイクロ回路を1つ(aliexpressあたり約5ユーロ)配置し、2つのエンコーダーのパルスをカウントして、32ビットカウンターを提供できます。 アルドゥインの足を保存するために、カウンターとアルドゥイーノ自体の間に74hc165があり、1バイトを並列に読み取り、このバイトを順番に返します。



エンジンパラメータの再測定



前の記事と比較して、私のシステムパラメーターは少し変更されているので(別のモータードライバーとエンコーダーをキャリッジに配置)、システムパラメーターを再度測定します。 そのため、小さなステップ(約1ボルト、-24V〜24V)でモーターに定電圧を印加し、キャリッジの速度の変化を測定します。 キャリッジ速度は、隣接するキャリッジ位置の差を経過時間で除算したものと見なされます(このアプローチの正確性については後で)。 使用されているコードはここにあります



水平時間(秒)、およびキャリッジの垂直速度(メートル/秒)。 ノイズの多い曲線は実際の測定結果であり、滑らかな曲線はシステムの数学モデルです。 今のところ、タスクは現実に近い滑らかな曲線のモデルを正確に計算することです。







24Vでは、キャリッジは毎秒約60メートルで加速され、システムの剛性は何かを合理的に測定するには不十分であることが判明しました。 そのため、15ボルトで測定値をカットしました。カーブの最初の部分では、キャリッジの速度の変動を確認できます。



そのため、各測定では、定常状態の速度(プラトーの高さ)を考慮し、印加電圧が水平で、定常状態の速度が垂直になるグラフを描きます。







システムに摩擦がない場合、このグラフは線形になり、モデルはv_ {k + 1} = a * v_k + b * u_kとして構築されます。 そして、結局のところ、それはその正と負の部分で同時にほぼ線形ですが、これらの2本の線はゼロを通過しません。 摩擦による(これを含む)。 正の電圧を加えて、文字通りわずかな電圧を加えると、グラフはゼロを通過して線形になることがわかります。



システムの摩擦を考慮したい場合、モデルは次のように構築されます(この式がどこから来たのか明確でない場合は、前の記事を読むことを忘れないでください):







そのため、データを取得したら、a、b、cの値を見つける必要があります。 フィットはデスクトップ上で一度だけ実行されるため、好きなように実行できます。3つのネストされたループを作成できます。 以下は 、測定値間のサンプリングが20ミリ秒の場合、a = .4、b = .06、c =-。01 であることを示すフィッティングコードです。 つまり、私のシステムの摩擦を補償するために必要な電圧は、1/10ボルトに相当します。 この近似によって得られた曲線は、上の図の実際の測定値に重ねられます。



電圧ではなく、加えられる力の制御



現時点では、システムは次のように記述できます。







残念ながら、これはx_ {k + 1} = A x_k + B u_kの形式の線形微分方程式ではありません。これは線形2次コントローラーに必要です。 さらに、このためではない場合でも、振り子をキャリッジに追加する必要があり、振り子の位置と角速度の電圧依存性を導出する方法がわかりません。 私のコントロールはストレスではなく、直接キャリッジの加速であることを望みます:







厳密に言えば、x_ {k + 1} = x_k + dt v_k +(dt)^ 2/2 a_kですが、dt = .02秒(dt)^ 2/2は.0002に等しいため、すでに無視できるため、レコード。



さて、私のレギュレーターがコントロールとして加速を使用すると仮定します。 しかし、実際には、モーターに電圧を印加する必要があります。 入手方法 非常にシンプル:







つまり、現在の速度(システムの状態)があれば、必要な加速度を得るために印加する必要がある電圧を簡単に計算できます。 したがって、1石で2羽の鳥を殺しました。レギュレーターの非線形性を取り除きましたが、同時に摩擦補償を残し、直感的な制御を得ました。 電圧よりも加速を想像するほうがはるかに簡単です。電圧は速度に非常に非線形の影響を及ぼします。



シンプルだが長い数学または振り子を追加



振子の運動方程式



そのため、タスクはシステムに振り子を追加し、コントローラーに対応する線形方程式を書くことです。 これに必要な物理量の完全なリストを示しましょう。









合計で、私のシステムの変数は、キャリッジの位置、その速度、振り子の偏角およびその角速度で構成される4次元ベクトルになります。 ここでのタスクは、この種の線形微分方程式系を書き留めることです。







連続した形式で記述できる場合は、サンプルを取得するだけで戦いに勝ちました。 ここでは、加速度ではなく制御として適用された力を使用しますが、ニュートンの第2法則がこれを行う方法を示していることに注意してください。 したがって、未知の行列AおよびBを見つける必要があります。



ニュートンのキャリッジの第2法則を記述します。キャリッジの加速度に質量を乗じた値は、2つの水平方向の力の合計です。最初の力は制御であり、電気モーターによってベルトに加えられる力です。 2つ目の力は、振り子が落下または上昇しようとしてキャリッジを横に押す力です。 それを見つけるために、振り子の重心の座標を2次元ベクトル(x(t)+ l sin(θ(t))、l cos(θ(t)))として書くことができます。 座標を2回微分すると、加速度が得られ、力は質量による加速度になります。 水平成分のみに関心があるため、x(t)+ l sin(θ(t)の2次導関数のみを取得することは理にかなっています。







これは非線形方程式ですが、平衡点を中心に線形に近似できます。 角度がゼロに近い場合、最初の顕著な制限(ウェルまたはテイラー級数)は、角度の正弦が角度にほぼ等しいことです。 コサインについても同じです。角度がゼロに近い場合、コサインはほぼ1に等しくなります。 まあ、同じように、正方形から始まるパワーを無視します(1秒あたりの速度が.1ラジアンの場合、速度の2乗は非常に小さい寄与(.01)になるため、大胆に無視します)。







次に、前の方程式を線形近似できます。







次に、振り子の2番目のニュートンの法則(回転のバージョン)を書きます。 まず第一に、ニュートンの回転の第二法則は何ですか? これは、角加速度に慣性モーメントを掛けたものに等しいモーメントの合計です。 慣性モーメントは、並進運動の質量の類似物です。 振り子に垂直な直線上にすべての力を投影することに興味があります(結局、垂直成分だけが回転しますか?)もちろん、モーメントを得るにはこれらの力に肩を掛ける必要があります。 振り子に作用する力は3つです。重力と、支持体の反力の水平成分と垂直成分です。これは、前回と同様に、振り子の重心の座標の時間微分の2倍を取得できます。







線形方程式で近似してみましょう。







システムに方程式(1)および(2)を記述します。







便宜上、行列式を文字Dと呼びます。







行列を反転します。







さて、微分方程式を書きます。実際、行列AとBが見つかりました。







線形システムを離散化する





そこで、非連続微分方程式を書きました。







一定のステップΔtの場合、以下を取得します。







Eで単位4x4行列を示す場合、次のように記述できます。







端の周りを回転するロッドの慣性モーメントは、 ここで見ることができます。







これは、振り子の動きにとって最も重要な方程式です。



線形二次コントローラー



コントローラ係数を計算するためのコードはここにあります。 以前は最小の正方形を使用してカウントしていましたが、それでも非常に面倒なので、新しいコードではゲインマトリックスが直接カウントされます。 Matlabはこのためのオプションであり、通常のpythonで十分です。



そのため、LCRは、制御力f_k = 24.95 x_k + 18.54 v_k + 70.44θ_k+ 14.96ω_kを採用すると、振り子を垂直から12°逸脱させ、キャリッジを平衡位置から20センチメートル移動させると、次の動作が発生することを示していますシステム:







x_kはキャリッジの位置、v_kはその速度、θ_kは振り子の角度、ω_kはその角速度です。 グラフ上の電圧は、3つのグラフのスケールをほぼ等しくするために、数十ボルトで与えられます。



Arduinoでオッズを決める



これが私が振り子を手に入れた方法です、制御コードはここにあります







原則として、これまでの結果に非常に満足しています。 キャリッジの振幅は、2センチメートルの領域での希望の位置からの偏差であり、かなりまともです。 なぜ彼女はゼロに根ざして立っていないのか、非常に小さな動きで振り子の偏差をキャッチしているのでしょうか? いくつかの理由があります。 最も単純なものは、モーターギアボックスのバックラッシュです。これは、キャリッジの位置で約5ミリメートルです。つまり、方向を変えるにはキャリッジが非常に高価です。 次に重要な理由は、振り子の角速度の推定です(よく、キャリッジの速度)。



インクリメンタルエンコーダのみが利用可能な場合、移動速度を評価する方法は? 最も簡単な方法は、エンコーダの最後の2つの値を取得し、その差を経過時間で除算することで、これは有限差として知られており、実際に広く使用されています。



次のチャートを見てみましょう。







振り子の角度を数秒で記録しました。赤で表示されます。 グラフはエンコーダの解像度のために少しうるさいですが、全体的にかなり滑らかです。 振り子の位置の履歴から総合的に速度を見つけなければなりません。 隣接する2つの位置の差を直接取得し、20ミリ秒で除算すると、青色のグラフが表示されます。 有限差分の利点は、プログラムが非常に簡単であることです。 欠点は、測定ノイズを劇的に増幅することです。



このような速度の推定値を取得すると、コントローラーはおかしくなります。







前のビデオとの唯一の違いは速度の評価であり、それ以上のものはありません。



良い方法では、赤い曲線を何らかの多項式で近似し、その導関数を考慮する必要があります。これがSavitsky-Golayフィルターの主要な考え方です。 頭を悩ませないために、速度の推定値を単純化して、隣接するサンプルではなく、現在のサンプルと8サンプル前の差を(20ms * 8)で除算しました。 このアプローチにより、速度の推定が大幅にスムーズになりますが、システムに遅延が生じるという欠点があります。 緑色の曲線を見てください。実際の状態よりも明らかに遅れています。 このような推定の遅れにより、振り子がわずかに揺れます。



ところで、額にSavitsky-Golayフィルターを使用すると、同様の遅延が発生します。 したがって、目標を達成することと大砲の単純さの間の合理的な妥協を見つけました。 ノイズの多い測定をまったく異なる方法で処理する予定です。これは今後の会話のトピックです。 さらに会話には、振り子の自動スイングが含まれ、振り子自体が下の状態から上の状態に上昇します。



お楽しみに!



All Articles