[[制御]] #contents *疑問 [#h3bba893] -独立制御可能性を示すためにはどうすればいいか?(直進と回転など) -制御不要の時にフィードバックゲインの一部を0にすることは最適レギュレータに対してどう影響するか。 *基本式 [#c0925454] -&mimetex(\dot{x}=Ax(t)+Bu(t)); -&mimetex(u(t)=-F(x(t)-r(t)));(ただしrは平衡点。平衡点であれば、以下の記述はr=0として一般性を失わない) *状態フィードバック [#ff46b8b1] -&mimetex(\dot{x}=Ax(t)+Bu(t)=(A-BF)x(t));に対して、A-BFの固有値実部が全て負で漸近安定である。 --固有値は、時定数の逆数を表す。(証明は実際にxを解くによる。よく固有値を-3[/t]とか-4[/t]とかになるように制御する) *フィードバックゲインの修正 [#l4ecd7c1] **制御しなくても何とかなる変数 [#ybe5354f] -Aのi列が0ベクトルかつBのi行が0ベクトルならば、変数&mimetex(x_i);は制御不要である。 -制御不要な変数を制御しない方法 --真面目にやるには、不要な変数を削除して最適レギュレータを再度組む ---パラメータが増えるデメリットがある。 --簡単には、制御の必要ないフィードバックゲインを0にすればよい。 ---例えば、倒立振子ロボットでの速度制御をしたい場合は、フィードバックゲインのうちxのフィードバックを支配する要素を0にする。 ---パラメータを増やす必要がないので、実装も楽。 *フィードバックゲインの決定法 [#z6326cb9] -直接法、可制御正順系を介した直接法、アッカーマン法、最適レギュレータ、折り返し法がある。 -''アッカーマン法と、最適レギュレータが現実的。''これらは実装もある。 **直接法 [#daa94f85] +可制御性のチェック +フィードバック係数ベクトルfを要素で表現して、A-Bfを計算 +特性方程式|sI-A+bf|を計算 (1) +目的とする固有値&mimetex(e_i);を恣意的に選び、&mimetex(\Pi (s-e_i));を計算 (2) +(1)と(2)の係数比較により、fを算出 **可制御正準型を介した直接法 [#v5ea1450] +可制御性のチェック +可制御正準型に変換行列Tで変換 +可制御正準型なので、Aの最下行に特性方程式が現れる (1) +目的とする固有値&mimetex(e_i);を恣意的に選び、&mimetex(\Pi (s-e_i));を計算 (2) +(2)-(1)により、可制御正準系でのフィードバック係数ベクトル&mimetex(\tilde{f'});を算出 +&mimetex(f=\tilde{f}T^{-1});により、fを算出 **アッカーマン法 [#z249585b] +可制御性のチェック +目的とする固有値&mimetex(e_i);を恣意的に選び、P(s)=&mimetex(\Pi (s-e_i));を計算 (1) +可制御性行列&mimetex(U_c);を用いて、&mimetex(f=(0 ... 0 1)U_c^{-1}P(A)); -実装 --[[最適レギュレータで倒立振子を制御するプログラム>https://github.com/hamko/sample/tree/master/opt_reg]]のparam.mをAchermannで検索(モデルは[[ここ>http://www.r.mach.mie-u.ac.jp/~nkato/class/sc/Invpend_exp5.pdf]]を参照、ただしxの次元の順序が2,3で逆になってるので注意) --octave run.mでシミュレータが走る。 **最適レギュレータ [#ub0a3072] +可制御性のチェック +状態フィードバックのうち、恣意的に与えたQ, Rに対して&mimetex(J=\frac{1}{2} \int_0^\infty x^t Q x + u^t R u dt);を最小化するフィードバックゲインは、&mimetex(A^tP+PA+Q-PBR^{-1}B^tP=0);を満たす正定行列Pを用いて、&mimetex(F=R^{-1}B^tP);である。 -実装 --[[最適レギュレータで倒立振子を制御するプログラム>https://github.com/hamko/sample/tree/master/opt_reg]]のparam.mをLinear Quadratic Controllerで検索。(モデルは[[ここ>http://www.r.mach.mie-u.ac.jp/~nkato/class/sc/Invpend_exp5.pdf]]を参照、ただしxの次元の順序が2,3で逆になってるので注意) --octave run.mでシミュレータが走る。 --モータのモデル化については[[モータ]]へ **折り返し法 [#ifbd69d9] +可制御性のチェック +固有値を折り返すための直線を\mimetex(Re \lambda = - \alpha);で指定する(Aの固有値にかぶらないように)。 +フィードバックゲインは、恣意的に与えたRに対して&mimetex((A+\alpha I)^tP+P(A+\alpha I)-PBR^{-1}B^tP=0);を満たす半正定な最大解&mimetex(P_+);(他の解との差が半正定となる解)を用いて、&mimetex(F=R^{-1}B^tP_+);である。 -備考 --&mimetex(Q=2 \alpha P_+);とした最適レギュレータに一致。 *教科書と実機とのギャップ [#p2bdf132] **操作量uがトルク・力の時のモータでの扱い [#e33cf1fc] -モータの実出力トルクは ++電流に比例する→電流センサをつける ++電圧に比例する無回転トルク-回転数に比例する粘性抵抗→これらを分解し、電圧に比例する無回転トルクを操作量、粘性抵抗を損失としてモデル化する **理論と実機の単位の違い [#hed82731] -状態・操作量の単位補正行列&mimetex(U_x, U_u);を計算し、フィードバックゲイン&mimetex(K);をロボット用のフィードバックゲイン&mimetex(K_{r} = U_u^{-1} K U_x);に変換する --&mimetex(x=(x, \theta));で表されるとする。&mimetex(x_1);のロボットの内部単位である1mmは、SI単位系では0.001である。&mimetex(x_2);のロボット内部単位である1radは、SI単位系では1である。このような数値を集めた単位補正行列&mimetex(U_x=diag([0.001\,1]));を用いて、&mimetex(x = U_x x_{r}); --同様に、トルクのロボットの内部単位である1 dutyは、SI単位系でk[Nm]だとする。単位補正行列&mimetex(U_u=diag([k]));を用いて、&mimetex(u = U_u u_{r}); --フィードバックゲインの式&mimetex(u=-Kx);は、&mimetex(U_u u_{r} = -K U_x x_{r});なので、&mimetex(u_{r} = - U_u^{-1} K U_x x_{r}); --したがって、ロボットのプログラミング時のフィードバックゲインは、&mimetex(K_{r} = U_u^{-1} K U_x);と表され、&mimetex(u_{r} = -K_{r} x_{r});である。 **実機のduty-トルク特性が非線形だったら [#w5a5f150] -上の単位の違いの吸収の式で、&mimetex(U_u);が非線形になるだけ。 **x=0以外の目標値 [#x2ccb304] -&mimetex(u(t)=-F(x(t)-r(t)));とすればよいだけ。(ただしrは平衡点) *Tips [#o08fbaa9] -[[倒立振子の数式とoctaveスクリプト>http://www.katzlab.jp/edu/index.php?Simulator%2F%C5%DD%CE%A9%BF%B6%BB%D2]] |