8.干渉オブザーバーに基づく単一のロボットアームスライドモード制御
8.1シングルロボットアームモデル
外乱オブザーバを導入することにより、制御対象物の不確実性や外乱を正確に推定することができ、スライディングモード制御のゲインを低減し、チャタリングを効果的に低減します。
不確実な単一のロボットアームの動的方程式は次のとおりです。
(8.25)
これらの中で、システム出力角度である慣性モーメントであり、重力は、制御入力であり、未知の非線形摩擦は、回転中心からの質量の中心であるコネクティングロッド、コネクティングロッドの動きの粘性摩擦であり、そして対応するパラメータの不確実性であります値は弾性摩擦係数です。
式(8.25)をに変更します
次に、不確実な単一のロボットアームは、2次微分方程式で表すことができます。
(8.26)
、、と知られている値は、不確実性を表す、重力項の和、及び摩擦用語、
8.2シングルマニピュレータモデル用のスライディングモードコントローラの設計と分析
滑り面は次のように設計されています
(8.27)
その中で、場所です。
制御対象式(8.26)を目指して、設計スライディングモード制御則は
(8.28)
その中には、干渉オブザーバーによる項の推定値と、項の推定誤差があります。
スイッチングゲイン係数は次のように設計されています
(8.29)
リャプノフ関数は
のため
制御法則の式(8.28)を上記の式に代入すると、次のようになります。
その後
満たされるためには、満たされる必要があることがわかります。項の推定誤差が十分に小さい場合は、スイッチングゲイン係数を小さい値に設計することで、チャタリングを効果的に低減できます。
8.3干渉オブザーバーの設計
干渉項を観察するために、オブザーバーは次のように設計されています。
(8.30)
これは、推定用の干渉推定値であり、極によって構成されたゲインです。
干渉オブザーバーの式(9.30)は次のように表されます。
(8.31)
(8.32)
8.4シミュレーション例
単一のロボットアームの動的方程式が
(8.33)
それらの中で。
被告人の中で、それを取る。制御則は(8.28)であり、干渉オブザーバーは式(8.31)と式(8.32)を取ります。テイク克服するために、干渉オブザーバを使用せずに、用語を、設計が必要とされ、およびシミュレーション結果を図と図に示しています。テイク、干渉オブザーバーを採用、テイク、シミュレーション結果は写真のように表示されます。
図9.1制御入力信号(M = 2)
図9.2位置追跡と追跡エラー(M = 2)
図9.3干渉とその観測結果(M = 2)
シミュレーションプログラム:
simulinkメインプログラム:chap9_5sim.mdl
コントローラSの機能:chap9_5ctrl.m
function [sys,x0,str,ts]=spacemodel(t,x,u,flag)
switch flag,
case 0,
[sys, x0,str,ts] = mdlInitializeSizes;
case 3,
sys = mdlOutputs(t,x,u);
case{2,4,9}
sys = [];
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumOutputs =1;
sizes.NumInputs =5;
sizes.DirFeedthrough =1;
sizes.NumSampleTimes =1;
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [0 0];
function sys = mdlOutputs(t,x,u)
r = u(1);
dr = cos(t);
ddr = -sin(t);
th = u(2);
dth = u(3);
fp = u(5);
e = r-th;
de = dr - dth;
c = 3;
s = de+c*e;
b = 15;
a = 5;
M = 2;
if M ==1 % Traditional with SMC
Kf = 6;
% Kf = 0.15;
ut = 1/a*(c*de+ddr+b*dth+Kf*sign(s));
elseif M ==2 % SMC with observer
Kf = 0.15;
ut = 1/a*(c*de+ddr+b*dth+1*fp+Kf*sign(s));
end
sys(1) = ut;
外乱オブザーバーS関数:chap9_5obv.m
function [sys,x0,str,ts]=s_function(t,x,u,flag)
switch flag,
case 0,
[sys, x0,str,ts] = mdlInitializeSizes;
case 1,
sys = mdlDerivatives(t,x,u);
case 3,
sys = mdlOutputs(t,x,u);
case{2,4,9}
sys = [];
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates =2;
sizes.NumDiscStates =0;
sizes.NumOutputs =1;
sizes.NumInputs =4;
sizes.DirFeedthrough =0;
sizes.NumSampleTimes =0;
sys = simsizes(sizes);
x0 = [0;0];
str = [];
ts = [];
function sys = mdlDerivatives(t,x,u)
r = sin(t);
dr = cos(t);
ddr = -sin(t);
ut = u(1);
dth = u(3);
x2 = dr - dth;
K1 = 1500;
K2 = 200;
a =5;b = 15;
sys(1) = K1*(x2-x(2));
sys(2) = x(1)-b*x(2)-a*ut+K2*(x2-x(2))+ddr+b*dth+b*x(2);
function sys = mdlOutputs(t,x,u)
sys(1) = x(1);
制御対象オブジェクトS関数:chap9_5plant.m
function [sys,x0,str,ts] = s_function(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts] = mdlInitializesSizes;
case 1,
sys = mdlDerivatives(t,x,u);
case 3,
sys = mdlOutputs(t,x,u);
case{2,4,9}
sys = [];
otnerwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates =2;
sizes.NumDiscStates =0;
sizes.NumOutputs =3;
sizes.NumInputs =1;
sizes.DirFeedthrough =0;
sizes.NumSampleTimes =0;
sys = simsizes(sizes);
x0 = [0;0];
str = [];
ts = [];
function sys = mdlDerivatives(t,x,u)
ut = u(1);
b = 15;
a = 5;
f = 5+0.15*sin(t);
ddth = -b*x(2)+a*ut-f;
sys(1)=x(2);
sys(2)=ddth;
function sys = mdlOutputs(t,x,u)
f = 5+0.15*sin(t);
sys(1) = x(1);
sys(2) = x(2);
sys(3) = f;
描画プログラム:chap9_5plot.m
close all;
figure(1);
subplot(211);
plot(t,y(:,1),'r',y(:,2),'b');
xlabel('time(s)');
ylabel('Position tracking');
subplot(212);
plot(t,y(:,1)-y(:,2),'r');
xlabel('time(s)');
ylabel('Position tracking error');
figure(2);
plot(t,ut(:,1),'r');
xlabel('time(s)');
ylabel('Control input');
figure(3);
plot(t,f(:,3),'r',t,f(:,4),'b');
xlabel('time(s)');
ylabel('f and fp');
Simulinkシミュレーションダイアグラムと対応するS-Function関数のmファイルがパッケージ化され、リソースにアップロードされています。コードが少し変更されています。必要に応じてダウンロードしてください。