Estou trabalhando na construção de um robô seguidor de linha e quero otimizar seu desempenho. Foi sugerido que eu use um algoritmo PID. Eu li muito sobre PID, mas estou um pouco confuso sobre o seguinte:
Eu calculei o valor do erro usando Mas com relação à mudança na velocidade do motor, estou confuso quanto ao que usar durante a comparação, a diferença (isto é, posição atual - ponto de ajuste) ou o valor do erro. Ou seja, devo usar
if (difference > 0)
{ //code for changing appropriate motor's speed using error_value }
ou
if (error_value > 0)
{ //code for changing appropriate motor's speed using error_value }
Também não há qualquer intervalo especificado para os valores das constantes , e ? Estou usando um robô com rodas diferenciais para o meu seguidor de linha.
Também ficaria feliz se alguém me sugerisse algum outro algoritmo de otimização avançado para melhorar o robô seguidor de linha.
arduino
pid
line-following
meteoros
fonte
fonte
Respostas:
Ao usar um loop PID para direcionar usando a linha a seguir, seu ponto de ajuste será sempre o mesmo. Você sempre desejará que a linha esteja na mesma posição em relação ao robô, por exemplo, no centro do seu sensor.
Portanto, se o seu sensor de linha gerar um valor de -1 a 1, com 0 sendo o centro do sensor, você desejará que o seu ponto de ajuste seja zero (e o sensor volte a ler e a diferença será a mesma). Se o seu sensor de linha exibir um valor de 0 a 10, você desejará que o seu ponto de ajuste seja 5 (e o sensor lida novamente e a diferença será diferente).
Como você está dirigindo, configurando as rodas para girar em velocidades diferentes, e para seguir suavemente uma linha a uma velocidade constante, você provavelmente desejará ajustar as velocidades para as duas rodas com base no erro. Por exemplo, se você precisar virar à esquerda para permanecer na linha, diminuirá a roda esquerda e acelerará a roda direita. Quanto mais você precisar girar, mais precisará desacelerar a roda interna e mais precisará acelerar a roda externa.
Considere a situação em que você precisa girar radianos para a esquerda para corrigir o erro e sua velocidade atual é :θ e S0 0
Portanto, sua roda esquerda precisa viajar em e sua roda direita precisa viajar em .Seu= r θ SR= ( r + b ) θ
Para manter a mesma velocidade geral , você precisa de , para que a roda esquerda precise percorrer enquanto a roda direita precisará percorrer em .S0 0 S0 0= ( r + b / 2 ) θ Seu=S0 0- ( b / 2 ) θ SR=S0 0+ ( b / 2 ) θ
Como seu erro tende a zero, as velocidades de cada motor também tendem a se aproximar. À medida que o erro aumenta, os diferenciais de velocidade também aumentam.
Você pode até precisar que sua roda interna gire para trás se o sensor estiver lhe dizendo que a linha está se curvando com mais força do que a distância entre as rodas. Essas são complicações que você pode executar passo a passo, pois seu controle fica mais sofisticado.
Além disso, como seu erro terá valores positivos e negativos (para representar o continuum da balança à esquerda ... muito à esquerda ... na linha ... muito à direita ... fora da balança, então você deve Para não precisar perguntar se
if
o erro é positivo ou negativo, você deve apenas calcular novos valores com base no valor do erro, pois um valor positivo e um valor negativo devem ter efeitos opostos e simétricos nos motores.Observe que, para a linha seguinte, você pode se safar apenas do termo de ganho proporcional (ou seja, deixando os outros termos em zero). A implementação de um termo Derivativo pode muito bem permitir que você amplie o termo de ganho proporcional mais alto para obter um sistema mais responsivo, mas é improvável que um termo integral ajude. O fato de que, se o seu robô for na direção errada, o erro aumentará, significa que os movimentos físicos do seu robô funcionarão como um termo integral de qualquer maneira.
Os valores específicos de P, D e I serão determinados pela capacidade de resposta do seu sistema. Para obter conselhos gerais sobre como ajustar os parâmetros do PID, consulte minha resposta e outras sobre Quais são as boas estratégias para ajustar os loops do PID?
fonte
Você pode querer verificar esta pergunta sobre como ajustar PIDs .
Parece que você está confundindo o papel
error
desse cálculo. A equação PID realiza a medição do erro (posição atual - posição desejada) e determina quanto "resposta" deve ser comandada no controlador (por exemplo, quanta força).Então, em vez de dizer
if (error_value > 0) { }
, você deveria dizer algo comoresponse = get_PID_calculation(error_value)
. Dependendo da construção do seu veículo específico, essa resposta seria enviada ao motor de acionamento como a quantidade do acelerador, a direção como o ângulo desejado ou alguma outra entrada de controle.fonte