Atividade #1427
AbertaIdentificar modelo dinâmico do robô (controle 2022)
Adicionado por Antonio de Souza Gomes Pereira quase 3 anos atrás. Atualizado quase 3 anos atrás.
Descrição
Esta tarefa tem por objetivo descobrir o modelo dinâmico do robô usando técnicas de identificação de sistemas. Além de criar um módulo no código para levantar esse modelo de forma automática e simplificada.
Após isso, o modelo encontrado deverá ser usado em um controlador apropriado.
Arquivos
arx-3-3-3steps.png (16,9 KB) arx-3-3-3steps.png | Antonio de Souza Gomes Pereira, 28/01/2022 14:18 h | ||
narx-4-4-3steps.png (16,7 KB) narx-4-4-3steps.png | Antonio de Souza Gomes Pereira, 28/01/2022 14:34 h | ||
sindy-3-4-2steps.png (20,3 KB) sindy-3-4-2steps.png | Antonio de Souza Gomes Pereira, 28/01/2022 14:58 h | ||
arx-60steps.png (19,3 KB) arx-60steps.png | Antonio de Souza Gomes Pereira, 28/01/2022 15:04 h | ||
sindy-60steps.png (25,1 KB) sindy-60steps.png | Antonio de Souza Gomes Pereira, 28/01/2022 15:05 h | ||
fft-signal.png (10,4 KB) fft-signal.png | Antonio de Souza Gomes Pereira, 28/01/2022 17:21 h | ||
non-linearity(x).png (3,66 KB) non-linearity(x).png | Antonio de Souza Gomes Pereira, 28/01/2022 17:21 h | ||
toy_fft.png (6,19 KB) toy_fft.png | Antonio de Souza Gomes Pereira, 28/01/2022 17:21 h | ||
toy_x.png (11,2 KB) toy_x.png | Antonio de Souza Gomes Pereira, 28/01/2022 17:21 h |
Atualizado por Antonio de Souza Gomes Pereira há quase 3 anos
- Arquivo arx-3-3-3steps.png arx-3-3-3steps.png adicionado
Após a excitação do robô com o sinal PRBS nas velocidades x, y e angular, foram medidas as posições e as orientações no campo ao longo do tempo, sendo essa a resposta ao sinal PRBS. Os dados coletados são duas matrizes, uma correspondente ao sinal de controle e outra à resposta na posição, onde cada linha é uma medição.
Inicialmente, usei esses dados para encontrar o modelo arx, exatamente como foi descrito no artigo da fei, usando o system identification toolbox do matlab.
Abaixo estão os resultados de um modelo arx que usa o resultado de 3 iterações anteriores na posição e no controle (parâmetros na=3 e nb=3, mostrado apenas a posição x e prevendo 3 passos no futuro):
![](arx-3-3-3steps.png)
A métrica utilizada para medir se o modelo se adequou bem aos dados é o NRMS (Normalized root mean square error), sendo essa a mesma métrica utilizada em todos os outros modelos, para garantir uma comparação justa.
O gráfico mostra uma comparação do modelo obtido com um dataset de validação, gerado independentemente dos dados de treinamento. Sendo que todos os modelos foram obtidos usando os mesmos dados de treinamento e testados usando o mesmo conjunto de validação.
Assim como descrito no artigo da fei, não foi observado muita diferença no nrms ao mudar os parâmetros do modelo arx, ou ao usar um modelo armax no lugar, dessa forma, optou-se por adotar o modelo mais simples nos testes a seguir.
Os coeficientes do modelo arx encontrado estão mostrados abaixo e foram obtidos usando técnicas de regressão nos coeficientes das matrizes do modelo (system toolbox identification). É importante enfatizar que esses coeficientes serão muito importantes, pois será feita a comparação direta deles com as de outros modelos.
Discrete-time ARX model:
Model for output "y1": A(z)y_1(t) = B(z)u(t) + e_1(t)
A(z) = 1 - 1.137 z^-1 - 0.3131 z^-2 + 0.2508 z^-3 + 0.2 z^-4
B1(z) = -0.495 + 0.3098 z^-1 + 0.2651 z^-2 + 2.072 z^-3
B2(z) = 0.2367 - 0.06718 z^-1 + 0.1604 z^-2 - 1.054 z^-3
B3(z) = -0.01609 + 0.02775 z^-1 - 0.01194 z^-2 + 0.2313 z^-3
Model for output "y2": A(z)y_2(t) = B(z)u(t) + e_2(t)
A(z) = 1 - 1.213 z^-1 - 0.2132 z^-2 + 0.2716 z^-3 + 0.1545 z^-4
B1(z) = -0.6224 + 0.01818 z^-1 - 0.02708 z^-2 + 0.221 z^-3
B2(z) = 0.3603 - 0.1004 z^-1 - 0.003915 z^-2 + 1.185 z^-3
B3(z) = -0.05199 + 0.02514 z^-1 + 0.06738 z^-2 + 0.05205 z^-3
Model for output "y3": A(z)y_3(t) = B(z)u(t) + e_3(t)
A(z) = 1 - 1.192 z^-1 - 0.2161 z^-2 + 0.2621 z^-3 + 0.1463 z^-4
B1(z) = -0.004458 - 0.0002581 z^-1 + 0.0032 z^-2 + 0.006197 z^-3
B2(z) = 0.004166 + 0.001562 z^-1 - 0.006498 z^-2 - 0.004087 z^-3
B3(z) = -0.001014 - 0.0007149 z^-1 + 0.002261 z^-2 + 0.002515 z^-3
Atualizado por Antonio de Souza Gomes Pereira há quase 3 anos
- Arquivo narx-4-4-3steps.png narx-4-4-3steps.png adicionado
Além desse, foi feita a identificação usando um modelo narx, que tem o mesmo formato do modelo arx, mas é usado principalmente na identificação de modelos não lineares. Como descrito na documentação do system identification toolbox, nesse modelo é utilizado uma wavelet network para o treinamento, sendo essa uma rede neural simples, com as funções não lineares sendo wavelets.
Abaixo está o resultado do mesmo teste feito para o modelo arx:
![](narx-4-4-3steps.png)
É importante salientar que os resultados são bem similares, até mesmo para diferentes números de passos preditos. O fato é que as não linearidades desse modelo em específico não são suficientes para representar as não linearidades do robô, mas isso será explorado mais adiante.
Abaixo estão os parâmetros da rede neural encontrada:
Nonlinear ARX model with 3 outputs and 3 inputs
Inputs: u1, u2, u3
Outputs: y1, y2, y3
Regressors:
Linear regressors in variables y1, y2, y3, u1, u2, u3
Output functions:
Output 1: Wavelet network with 6 units
Output 2: Wavelet network with 10 units
Output 3: Wavelet network with 2 units
Atualizado por Antonio de Souza Gomes Pereira há quase 3 anos
- Arquivo sindy-3-4-2steps.png sindy-3-4-2steps.png adicionado
- Arquivo arx-60steps.png arx-60steps.png adicionado
- Arquivo sindy-60steps.png sindy-60steps.png adicionado
Por fim, foi feita a identificação utilizando a técnica SINDy (System identification of nonlinear dynamics). O formato do modelo é similar ao dos outros (posições e controle com shift de 4 no tempo), apenas a técnica de regressão que é diferente, há também a possibilidade de usar funções não lineares para descrever o modelo.
Apesar da possibilidade de usar funções não lineares, não foi obtido nenhum ganho significativo em fazer isso (mais sobre isso depois), dessa forma, o modelo foi obtido apenas usando combinações lineares das variáveis. Abaixo está o resultado do mesmo teste feito anteriormente para os outros modelos (3 passos no futuro):
![](sindy-3-4-2steps.png)
E o modelo encontrado está mostrado abaixo apenas para a posição x, sendo notório a similaridade com os coeficientes do modelo arx.
(x)[k+1] = 1.074 x[k] + 0.368 x-1[k] + -0.201 x-2[k] + -0.241 x-3[k] + -0.047 ux[k] + -0.057 uy[k] + 0.027 uo[k] + 0.483 ux-1[k] + 0.115 uy-1[k] + 0.014 uo-1[k] + 1.240 ux-2[k] + -0.238 uy-2[k] + 0.072 uo-2[k] + 1.655 ux-3[k] + -0.577 uy-3[k] + 0.166 uo-3[k]
Apesar dos resultados serem bem parecidos, o real ganho em adotar esse modelo está no fato de ele conseguir prever com maior precisão muitos passos a frente. Mantendo uma precisão próxima de 90% quando são previstos 15 passos no futuro, sendo que para o modelo arx, esse número é de 81%. Extrapolando esse número, ao considerarmos 60 passos à frente, a diferença se torna bem significativa:
ARX:
![](arx-60steps.png)
SINDy:
![](sindy-60steps.png)
Dessa forma, a conclusão chegada é que apenas a técnica de regressão foi melhor, dado que não foi utilizado que o sistema possui não linearidades.
Atualizado por Antonio de Souza Gomes Pereira há quase 3 anos
- Arquivo fft-signal.png fft-signal.png adicionado
- Arquivo non-linearity(x).png non-linearity(x).png adicionado
- Arquivo toy_fft.png toy_fft.png adicionado
- Arquivo toy_x.png toy_x.png adicionado