Linearer quadratischer Integrator

Sep 06 2020

Mit einem gegebenen Linearantriebssystem

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

Wo $x(t) = \frac{\alpha(t)}{2\pi}$, $u(t)$ ist ein Eingang zwischen 1-10 zur Steuerung eines Servoantriebs und $f(t)$ ist eine Kraftstörung.

Ich versuche, einen linearen quadratischen Integrator- Kraftregler zu entwerfen.

In der gleichen Form wie oben.

Ich habe zuerst einen lqr-Regler für das System entworfen ... eine Störkraft wird gemessen, und mit einem bestimmten Motoreingang u (t) sollte das System versuchen, den Linearantrieb zu verlangsamen (oder ganz zurückzuschalten), um die Kräfte zu reduzieren , was gut zu funktionieren scheint.

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}*)

Ich habe jetzt ein bestimmtes Geschwindigkeitsprofil oder vielmehr ein Kraftprofil, das ich als Referenzsignal geben möchte $r$ Wenn der Antrieb versuchen sollte, eine quadratisch wachsende Kraftreferenz zu verfolgen, verringern oder erhöhen Sie erneut die Antriebsgeschwindigkeit, um dies in Schach zu halten.

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}}]

Mein Versuch, dies zu tun, scheint jedoch Unsinn zu erzeugen.

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}*)

Der Integrator sollte, so wie ich es verstehe, ein verfolgtes Signal an den Eingang des SSM senden und behalten $u(t)$Störkräfte konstant halten. Es scheint dies jedoch überhaupt nicht zu tun.

Offensichtlich stimmt etwas nicht. Mein Verdacht ist, dass ich entweder das falsche Statespacemodel im Allgemeinen für die Kraftsteuerung entworfen habe oder meine Ein- / Ausgänge falsch sind oder dass mein SystemsConnectionModel falsch aufgebaut ist. Ich kann jedoch nichts Sinnvolles finden. Gibt es da draußen bessere Augen als meine?

Was ist der richtige Weg, um einen LQI in mma zu erstellen?

(Ich bin völlig offen für Vorschläge, wie man es anders oder besser macht, aber im Idealfall wäre eine LQI-Implementierung vorzuziehen.)

Antworten

1 SubaThomas Sep 09 2020 at 21:23

Für dieses Modell ist es nicht möglich, einen Controller zu entwerfen, der verfolgt $\alpha '$.

{aa, bb, cc, dd} = Normal[model];
StateSpaceModel[{ArrayFlatten[{{0, {{0, -2 π/60}}}, {0, aa}}], ArrayFlatten[{{0}, {bb}}]}]
ControllableModelQ[%]

Es kann jedoch ein Controller entworfen werden, der verfolgt $\alpha$.

StateSpaceModel[{ArrayFlatten[{{0, {{1, 0}}}, {0, aa}}], ArrayFlatten[{{0}, {bb}}]}]
ControllableModelQ[%]

Da die Steuerung eine Zustandsrückmeldung verwendet, benötigen Sie auch einen Beobachter. Ein Beispiel dafür finden Sie im Abschnitt 'Design der Differentialeingangssteuerung' in der Dokumentation für einen Pfadverfolgungsroboter . Da ist die Referenz$0$ Damit der Roboter auf Kurs bleibt und die Störung der Weg ist.