Integrator Kuadrat Linier
Dengan sistem penggerak linier yang diberikan
Needs["VariationalMethods`"]
params = {jb -> 870 10^-5 + 75 10^-6, p -> 2, mw -> 0.75, mb -> 10,
r1 -> 0.000001, r2 -> 0.000001,
jm -> 7800 0.002 \[Pi] (0.165/2)^4 1/2, r3 -> 0.165/2, k1 -> 1,
k2 -> 1};
displacement = 0;
ke = 1/2 mw (p/(2 \[Pi]) \[Alpha]'[t])^2 + 1/2 jm \[Alpha]'[t]^2 +
1/2 mb (p/(2 \[Pi]) \[Alpha]'[t])^2;
kp = mb g h1 + mb g (h1 + h2);
l = ke - kp;
eqns = EulerEquations[l, {\[Alpha][t]}, t] // FullSimplify;
deqns = {First@eqns[[1]] == -r1 \[Alpha]'[t] - f[t] + 4.3 u[t]};
MatrixForm[deqns]
symmodelqr =
StateSpaceModel[
deqns, {{\[Alpha][t], 0}, {\[Alpha]'[t], 0}}, {u[t],
f[t]}, {\[Alpha]'[t] 2 \[Pi]/60, f[t]}, t] // FullSimplify;
model = symmodelqr /. params
Dimana $x(t) = \frac{\alpha(t)}{2\pi}$, $u(t)$ adalah input antara 1-10 untuk mengontrol drive servo dan $f(t)$ adalah gangguan kekuatan.
Saya mencoba merancang pengontrol gaya integrator kuadrat linier ,
Dalam bentuk yang sama seperti di atas.
Saya pertama kali merancang pengontrol lqr pada sistem ... gaya gangguan akan diukur, dan dengan input motor yang diberikan u (t) sistem harus mencoba memperlambat penggerak linier (atau mundur seluruhnya), untuk mengurangi gaya , yang tampaknya bekerja dengan baik.
init = {0, 0};
times = RandomInteger[{10, 60}, 3];
disturb = (*{0,Table[1 UnitBox[(t-times[[i]])/
25]\[ExponentialE]^(-1(t-times[[i]])^2),{i,1,Length@
times}]};*)
{0, 1 UnitBox[(t - 15)/25] - 1 UnitBox[(t - 40)/25]};
q = DiagonalMatrix[{1, 10}];
r = 1 {{1}};
lineargains =
Join[Last@CoefficientArrays[LQRegulatorGains[{model, 1}, {q, r}]] //
Normal, {ConstantArray[0, 2]}];
First@lineargains
controlmodel = SystemsModelStateFeedbackConnect[model, lineargains];
{alphadot, force} =
StateResponse[{controlmodel, init}, disturb, {t, 60}];
Plot[{alphadot, force, disturb[[2]] }, {t, 0, 60},
PlotLegends -> "Expressions", PlotRange -> All, FrameStyle -> Black,
Frame -> True]
(*{1., 5.47913}*)
Sekarang saya memiliki profil kecepatan tertentu, atau lebih tepatnya, profil gaya yang ingin saya berikan sebagai sinyal referensi $r$ Dimana drive harus mencoba untuk menjaga referensi gaya yang tumbuh secara kuadrat dilacak, sekali lagi menurunkan atau meningkatkan kecepatan drive untuk menjaganya tetap terkendali.
feedback = StateSpaceModel[{{}, {}, {{}}, {{1, -1}}}];
integrator = TransferFunctionModel[1/s, s];
tracker =
SystemsModelMerge@
SystemsConnectionsModel[{feedback, integrator,
model}, {{1, 1} -> {2, 1}, {2, 1} -> {3, 1}, {3, 1} -> {1,
2}}, {{1, 1}, {3, 2}}, {{3, 1}, {3, 2}}]
Namun upaya saya dalam hal ini tampaknya membuahkan hasil.
init2 = {0, 25, 25};
times2 = RandomInteger[{10, 60}, 3];
disturb2 = {1 UnitStep[t],
0 UnitBox[(t - 10)/5] - 0 UnitBox[(t - 40)/5]};
q2 = DiagonalMatrix[{1000, 10, 100}];
r2 = 1 {{1}};
lineargains =
Join[Last@
CoefficientArrays[LQRegulatorGains[{tracker, 1}, {q2, r2}]] //
Normal, {ConstantArray[0, 3]}];
First@lineargains
controlmodel2 = SystemsModelStateFeedbackConnect[tracker, lineargains];
{int, alphadot2, force2} =
StateResponse[{controlmodel2, init2}, disturb2, {t, 100}];
Plot[{int, alphadot2, force2, disturb2 }, {t, 0, 100},
PlotLegends -> "Expressions", PlotRange -> All, FrameStyle -> Black,
Frame -> True, ImageSize -> Large]
(*{31.7673, 3.16228, 45.8435}*)
Integrator, menurut cara saya memahaminya, harus memberi dan menyimpan sinyal terlacak ke input SSM $u(t)$Untuk menjaga gaya gangguan konstan. Namun, tampaknya tidak melakukan ini sama sekali.
Jelas ada sesuatu yang salah. Kecurigaan saya adalah bahwa saya telah merancang Statespacemodel yang salah secara umum untuk kontrol paksa, atau input / output saya tidak benar, atau bahwa SystemsConnectionModel saya dibuat dengan tidak benar, Namun, saya tidak bisa mendapatkan apa pun yang masuk akal. Apakah ada mata yang lebih baik di luar sana daripada mata saya?
Apa cara yang benar untuk membangun LQI di mma?
(Saya sangat terbuka untuk saran tentang bagaimana melakukannya secara berbeda atau lebih baik, namun idealnya penerapan LQI lebih disukai)
Jawaban
Untuk model ini, tidak mungkin merancang pengontrol yang akan melacak $\alpha '$.
{aa, bb, cc, dd} = Normal[model];
StateSpaceModel[{ArrayFlatten[{{0, {{0, -2 π/60}}}, {0, aa}}], ArrayFlatten[{{0}, {bb}}]}]
ControllableModelQ[%]
Namun pengontrol dapat dirancang untuk melacak $\alpha$.
StateSpaceModel[{ArrayFlatten[{{0, {{1, 0}}}, {0, aa}}], ArrayFlatten[{{0}, {bb}}]}]
ControllableModelQ[%]
Karena pengontrol menggunakan umpan balik keadaan, Anda juga akan membutuhkan pengamat. Contoh cara melakukan semua ini dapat dilihat di bagian 'Desain pengontrol input diferensial' pada dokumentasi untuk robot yang mengikuti jalur . Itu rujukannya$0$ agar robot tetap berada di jalur dan gangguannya adalah jalurnya.