Integratore quadratico lineare

Sep 06 2020

Con un dato sistema di azionamento lineare

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

Dove $x(t) = \frac{\alpha(t)}{2\pi}$, $u(t)$ è un ingresso compreso tra 1 e 10 per controllare un servoazionamento e $f(t)$ è un disturbo della forza.

Sto tentando di progettare un controller di forza con integratore quadratico lineare ,

Nella stessa forma di cui sopra.

Per prima cosa ho progettato un controller lqr sul sistema ... verrà misurata una forza di disturbo e con un dato input del motore u (t) il sistema dovrebbe tentare di rallentare l'azionamento lineare (o arretrare completamente), per ridurre le forze , che sembra funzionare bene.

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

Ora ho un profilo di velocità specifico, o meglio, un profilo di forza che voglio dare come segnale di riferimento $r$ Dove l'azionamento deve tentare di tenere traccia di un riferimento di forza in crescita quadratica, abbassando o aumentando nuovamente la velocità di azionamento per tenerlo sotto controllo.

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

Il mio tentativo in tal senso tuttavia sembra produrre sciocchezze.

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

L'integratore, per come la vedo io, dovrebbe dare e mantenere un segnale tracciato all'ingresso dell'SSM $u(t)$Per mantenere costanti le forze di disturbo. Tuttavia, sembra che non lo faccia affatto.

Chiaramente qualcosa non va. Il mio sospetto è che ho progettato il modello Statespacemodel sbagliato in generale per il controllo della forza, o che i miei input / output non siano corretti o che il mio SystemsConnectionModel sia costruito in modo errato, tuttavia, non riesco a ottenere nulla che abbia senso. Ci sono occhi migliori là fuori dei miei?

Qual è il modo corretto per costruire un LQI in mma?

(Sono completamente aperto a suggerimenti su come farlo in modo diverso o migliore, tuttavia idealmente sarebbe preferibile un'implementazione LQI)

Risposte

1 SubaThomas Sep 09 2020 at 21:23

Per questo modello non è possibile progettare un controller che traccia $\alpha '$.

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

Tuttavia è possibile progettare un controller che traccia $\alpha$.

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

Poiché il controller utilizza il feedback sullo stato, sarà necessario anche un osservatore. Un esempio di come fare tutto questo può essere visto nella sezione "Differential input controller design" della documentazione per un robot che segue il percorso . Ecco il riferimento$0$ perché il robot rimanga sulla rotta e il disturbo è il percorso.