Integrador Linear Quadrático
Com um determinado sistema de acionamento linear
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
Onde $x(t) = \frac{\alpha(t)}{2\pi}$, $u(t)$ é uma entrada entre 1-10 para controlar um servo drive e $f(t)$ é uma perturbação da força.
Estou tentando projetar um controlador de força integrador quadrático linear ,
Da mesma forma que acima.
Eu primeiro projetei um controlador lqr no sistema ... uma força de perturbação será medida, e com uma determinada entrada de motor u (t), o sistema deve tentar desacelerar o acionamento linear (ou recuar totalmente), para reduzir as forças , que parece funcionar bem.
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}*)
Agora tenho um perfil de velocidade específico, ou melhor, um perfil de força que quero dar como sinal de referência $r$ Onde o inversor deve tentar manter uma referência de força quadrática crescente rastreada, novamente diminuindo ou aumentando a velocidade do inversor para mantê-la sob controle.
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}}]
Minha tentativa, entretanto, parece produzir um absurdo.
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}*)
O Integrador, a meu ver, deve dar e manter um sinal rastreado para a entrada do SSM $u(t)$Para manter constantes as forças de perturbação. No entanto, parece não fazer isso de forma alguma.
É evidente que algo está errado. Minha suspeita é que projetei o Statespacemodel errado em geral para controle de força, ou minhas entradas / saídas estão incorretas, ou que meu SystemsConnectionModel foi construído incorretamente. No entanto, não consigo obter nada que faça sentido. Existem olhos melhores lá fora do que os meus?
Qual é a maneira correta de construir um LQI no mma?
(Estou completamente aberto a sugestões sobre como fazer de forma diferente ou melhor, no entanto, idealmente, uma implementação LQI seria preferida)
Respostas
Para este modelo, não é possível projetar um controlador que rastreie $\alpha '$.
{aa, bb, cc, dd} = Normal[model];
StateSpaceModel[{ArrayFlatten[{{0, {{0, -2 π/60}}}, {0, aa}}], ArrayFlatten[{{0}, {bb}}]}]
ControllableModelQ[%]
No entanto, um controlador pode ser projetado para rastrear $\alpha$.
StateSpaceModel[{ArrayFlatten[{{0, {{1, 0}}}, {0, aa}}], ArrayFlatten[{{0}, {bb}}]}]
ControllableModelQ[%]
Como o controlador está usando feedback de estado, você também precisará de um observador. Um exemplo de como fazer tudo isso pode ser visto na seção 'Projeto do controlador de entrada diferencial' da documentação para um caminho seguindo o robô . Aí está a referência$0$ para o robô ficar no curso e a perturbação é o caminho.