Integrador cuadrático lineal

Sep 06 2020

Con un sistema de accionamiento lineal dado

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

Dónde $x(t) = \frac{\alpha(t)}{2\pi}$, $u(t)$ es una entrada entre 1 y 10 para controlar un servodrive y $f(t)$ es una perturbación de fuerza.

Estoy intentando diseñar un controlador de fuerza integrador cuadrático lineal ,

De la misma forma que arriba.

Primero diseñé un controlador lqr en el sistema ... se medirá una fuerza de perturbación, y con una entrada de motor determinada u (t), el sistema debe intentar ralentizar el accionamiento lineal (o retroceder por completo), para reducir las fuerzas , que parece funcionar bien.

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

Ahora tengo un perfil de velocidad específico, o mejor dicho, un perfil de fuerza que quiero dar como señal de referencia. $r$ Donde el variador debe intentar mantener un seguimiento de una referencia de fuerza de crecimiento cuadrático, nuevamente bajando o aumentando la velocidad del variador para mantener esto bajo control.

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

Sin embargo, mi intento de hacer esto parece producir una tontería.

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

El integrador, según yo lo entiendo, debe dar y mantener una señal de seguimiento a la entrada del SSM $u(t)$Para mantener constantes las fuerzas perturbadoras. Sin embargo, parece no hacer esto en absoluto.

Claramente, algo anda mal. Mi sospecha es que he diseñado el modelo Statespace incorrecto en general para el control de fuerza, o mis entradas / salidas son incorrectas, o que mi SystemsConnectionModel está construido incorrectamente. Sin embargo, parece que no puedo obtener nada que tenga sentido. ¿Hay mejores ojos que los míos?

¿Cuál es la forma correcta de construir un LQI en mma?

(Estoy completamente abierto a sugerencias sobre cómo hacerlo de manera diferente o mejor, sin embargo, idealmente se preferiría una implementación de LQI)

Respuestas

1 SubaThomas Sep 09 2020 at 21:23

Para este modelo no es posible diseñar un controlador que rastree $\alpha '$.

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

Sin embargo, se puede diseñar un controlador que rastree $\alpha$.

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

Debido a que el controlador está usando retroalimentación de estado, también necesitará un observador. Un ejemplo de cómo hacer todo esto se puede ver en la sección 'Diseño del controlador de entrada diferencial' de la documentación para un robot que sigue la trayectoria . Ahí está la referencia$0$ para que el robot mantenga el rumbo y la perturbación es el camino.