ThundeRatz / travesim

Gazebo simulation environment for IEEE Very Small Size Soccer robots
MIT License
29 stars 0 forks source link

🚑 Tune diff drive pid controller #32

Closed FelipeGdM closed 3 years ago

FelipeGdM commented 3 years ago

Salve salve amantes do mundo da bola

O @LucasHaug fechou a #19 antes que eu pudesse terminar os testes do impacto das mudanças, então aqui temos outra PR pra corrigir alguns probleminhas

Muito bem, contando a história do começo. Com a configuração das constantes de PID, o diff_drive_controller passa a usar os dados da odometria pra estimar o estado do robô ~e aí começa o caos~. Acontece que os dados da odometria estão mal configurados, de modo que o robô exibe um erro estacionário não trivial na velocidade linear/angular

Captura de tela de 2021-04-16 08-19-17

Captura de tela de 2021-04-16 08-20-01

Mexi um pouco nas constantes de PID e o erro estacionário não sumiu de jeito nenhum, o que me leva a crer que o problema é de fato no sistema de medição do estado do robô (a odometria no caso). De qualquer forma, deixei um Ki diferente de zero de forma que o erro estacionário tenda a zero

Dito isso, fiz uso de dois parâmetros de configuração do diff_drive_controller

wheel_separation_multiplier (double, default: 1.0) Multiplier applied to the wheel separation parameter. This is used to account for a difference between the robot model and a real robot.

wheel_radius_multiplier (double, default: 1.0) Multiplier applied to the wheel radius parameter. This is used to account for a difference between the robot model and a real robot.

Isso me lembra às "constantes de proporcionalidade" das aulas de química do colégio hue

Com essa alteração, foi possível zerar o erro estacionário do controle de velocidade

Captura de tela de 2021-04-16 09-09-34

Captura de tela de 2021-04-16 09-10-08

Não é a solução mais elegante de todas :stuck_out_tongue_closed_eyes:, imagino que uma solução mais robusta necessite da alteração da matriz de covarianca da posição e velocidade angular, mas ainda não tenho conhecimento suficiente para poder ajustar

No mais, é isso que temos para hoje. Fiquem bem e mantenham-se hidratados

lucastrschneider commented 3 years ago

Boa noite galera.

Primeiramente, não gosto muito de configurar essas coisas usando os multipliers do diff_drive_controller. A própria definição deles que aparece no seu quote já é motivo suficiente pra não mexer neles numa simulação kkkkkkk

Mas enfim, tava achando estranho e fui dar uma olhada, mas não descobri que software é esse que você tava usando para testar @FelipeGdM, mó bonitinho. Mas acabei usando o rqt mesmo.

Primeiro, abri um plot para mostrar esses 3 tópicos:

Em seguida, configurei o tópico do comando de velocidade para receber uma senóide na velocidade angular da seguinte forma: sin(i/3) * 7 (nesse caso, i é o tempo em segundos) Dá para fazer vários testes com diferentes valores para frequencia angular e amplitude, mó divertido isso haushuahusa.

Por fim, abri o Dynamic Reconfigure do ros_control para tunar as constantes do PID. Acredito que você não tinha conseguido zerar o erro estacionário pois o valor máximo e minimo do termo integral estava por padrão como 0, então ele não fazia muita coisa.

Basicamente, utilizei as seguintes constantes para ambas as joints:

p: 0.015 i: 1.0 d: 0.0 i_clamp_min: -0.1 i_clamp_max: 0.1 antiwindup: active (nem sei se faz sentido ativar aqui se o derivativo ta nulo, mas sla)

E obtive esses resultados: image

Da pra brincar usando o rqt_steering_topic tbm, e passar valores arbitrarios de velocidade angular, mas parecia estar se comportando bem.

image

Eu não fiquei muito tempo tunando esses parâmetros, então recomendo dar uma ajustada para conseguir um resultado melhor, mas acho que já é um bom ponto de partida.

Outra coisa que acho que seria bom fazer é o mesmo procedimento para a velocidade linear, só checando se essas constantes obtidas são satisfatórias nesse caso também.


Eu não acho que a odometria está mal configurada, nem sei se da para configurar ela de fato, mas pelo que eu plotei aqui, ficava sempre bem parecido com o que a gente obtia da visão (para constantes razoavelmente calibradas) ~para constantes arbitrarias era realmente só bagunça aushasau~

Mas enfim, só pra deixar de referência, foi aqui que aprendi a mexer nessas coisas do rqt, mt bom o video.