Como posso usar a biblioteca PID do Arduino para dirigir um robô em uma linha reta?

19

Gostaria de criar um robô baseado no Arduino com 2 rodas, codificadores de quadratura em cada roda, um chip de driver H-bridge (ou controlador de motor) e um rodízio. Quero usar a biblioteca PID para garantir que a velocidade seja proporcional à distância a percorrer.

No nível conceitual, (assumindo que os motores não respondem de forma idêntica aos níveis de PWM), como posso implementar o controle PID para que ele viaje em linha reta e a uma velocidade proporcional à distância restante para viajar?

Robert
fonte
Essa pergunta também tem seu lugar aqui, pois é baseada especificamente na biblioteca PID do Arduino .
Anindo Ghosh 11/04

Respostas:

18

Específicos

Observando o exemplo básico do PID, acho que você só precisa instanciar duas cópias do controlador PID, uma para cada roda, codificador e pwm:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);

Então, no seu loop()equivalente, você acabou de ler os dois codificadores, passar cada valor do codificador para o relevante PIDe, finalmente, gravar os dois valores PWM.

Por enquanto SetpointLefte SetpointRightpode realmente apontar para o mesmo valor, mas defini-los separadamente dessa maneira permite adicionar o recurso de virar mais tarde.

Conceitos

Embora isso possa funcionar para o caso básico, se é suficiente depende realmente da precisão que você precisa que sua linha reta seja.

Cálculo morto

Dado que você tem codificadores em cada roda, se você executar dois circuitos PID e comparar o erro seguinte de cada roda , poderá potencialmente calcular seu erro máximo de abbe ao longo da distância, supondo que suas rodas não escorregem. Se esse erro for menor do que os seus requisitos, basta calcular o número de mortos .

No entanto, se suas rodas estão propensas a escorregar, você pode ter ocultado o seguinte erro que seu sistema de controle não consegue detectar e você precisará de uma maneira de detectar um escorregamento ou calcular a posição independentemente dos seus codificadores de roda e, em seguida, usar um software de nível superior para corrigir exigiu posições / velocidades das rodas para manter uma linha reta.

Determinação da posição relativa

Como John sugere , você pode usar um acelerômetro para determinar a posição, mas, dada a precisão e o efeito dos erros acumulados ao longo do tempo, pode ser melhor usar os dados do acelerômetro para detectar e corrigir a derrapagem das rodas.

Na robótica móvel, as técnicas de filtragem Kalman são comumente usadas para fundir os dados de várias fontes, como um acelerômetro e os codificadores de roda para determinar melhor a posição atual.

Faça o que fizer com determinação posição relativa no entanto, ao longo do tempo a posição que você acredita ser em vão afastar-se da sua posição física real.

Determinação de posição absoluta

A única maneira de contornar isso é ter um ponto de referência fora do quadro de referência do seu veículo.

Um roomba, por exemplo, geralmente usa o acerto de contas morto para se movimentar pela sala, mas sempre que precisa atracar, ele procura um feixe de luz infravermelha enviado pela estação de carregamento. Quando o roomba se move aleatoriamente através desse feixe, ele o detecta, trava no feixe e o segue de volta à sua fonte. Em combinação com seus sensores de resposta, ele pode se posicionar com precisão nos contatos de carregamento.

Para o seu robô, ele pode ter uma posição inicial, onde pode voltar e detectar que está naquele local conhecido. Nesse ponto, ele sabe exatamente onde está e pode relatar a distância entre a posição calculada e a posição real.

Outra opção, se você precisar que seu robô viaje em linha reta por centenas de metros, seria mudar para uma técnica diferente, como adicionar um escudo GPS do Arduino .

Uma combinação de técnicas

Por fim, dependendo dos requisitos de precisão, pode ser necessário usar uma combinação dessas técnicas.

Se um feixe guia for possível, você poderá fazer o que deseja com muita simplicidade com uma linha invisível seguindo a técnica . Se você precisar se mover em qualquer linha reta arbitrária em uma área restrita, como o roomba, poderá usar um par de vigas guia (perpendiculares entre si) para permitir que você corrija sua posição sintetizada em um eixo cartesiano toda vez que o robô passa por um dos feixes.

Existem muitas opções aqui, e o que você escolheu depende do que você precisa.

Mark Booth
fonte
1

Se você não estiver usando um único eixo para acionar as duas rodas, as únicas soluções que posso ver são adicionar um acelerômetro de 3 eixos ou outro sensor para detectar a orientação do robô e ajustar os sinais para cada motor de acordo.


fonte
0

Como dito acima, você começa dizendo a cada roda para se mover na mesma velocidade e, em seguida, o PID garante que eles estejam funcionando nessa velocidade. Mas isso não será perfeito. Você precisa continuar verificando e corrigindo os erros (1), leia e compare periodicamente as contagens do codificador de duas rodas e faça com que uma roda vá ligeiramente mais rápida, se necessário, para obter as contagens iguais. e (2) os codificadores NUNCA são perfeitos, você precisa de um acelerômetro e uma bússola.

Você está olhando para um filtro Kalman. se você deseja combinar dados do codificador, da bússola e do acelerômetro para obter o título.

user3150208
fonte
0

Este link fornece um bom exemplo sem o cálculo de dois PID. Além disso, você pode implementar imu / compass para medir o caminho reto

acs
fonte