Abordagem do uso do PID para obter um robô diferencial dirigindo em linha reta


13

Considere um robô de acionamento diferencial que tenha duas rodas motorizadas com um codificador conectado a cada uma para feedback. Supõe-se que exista uma função para cada motor CC que flutue de -1 a 1 e defina os sinais PWM para fornecer uma quantidade proporcional de energia para esse motor. Infelizmente, nem todos os motores são criados iguais; portanto, enviar a cada motor o mesmo sinal PWM faz com que o robô vire para a esquerda ou para a direita. Estou tentando pensar em como dirigir o robô usando os codificadores conectados a cada motor como entrada para um loop PID.

Aqui está como eu faria isso: pegaria a diferença entre os codificadores esquerdo e direito, vincularia o erro a algum intervalo, normalizaria para que fosse de [-1, 1] e, em seguida, mapeie para as potências de 0 a 1 do motor. Portanto, se eu e D fossem zero e obtivemos um erro de 1 (então o motor esquerdo girou muito mais que o motor direito), o motor esquerdo seria definido como 0 e o motor direito como 1 (causando um esquerda).

Há algum problema com isso? Qual é uma abordagem melhor?

Respostas:


5

Há algum problema com isso?

O principal problema é que, embora sua solução proposta corrija instantaneamente uma incompatibilidade entre o desempenho dos motores, ela não corrigirá erros acumulados, muito menos erros mais complexos em posições como o erro Abbe (veja mais adiante).

Qual é uma abordagem melhor?

Você pode fazer várias coisas, dependendo da sua tolerância a erros e de quanto esforço você deseja colocar para corrigi-los.

O primeiro passo seria configurar um par de loops PID, um para cada roda, dando a ambos a mesma posição de demanda. Como sugeri na minha resposta a uma pergunta semelhante , se você mantiver as duas rodas dentro de um erro muito apertado, limite de onde você as pede, levará algum tempo para acumular um erro suficiente para causar um desvio perceptível.

Também será muito mais fácil ajustar dois loops PID no nível do motor, nominalmente independentes, do que ajustar um único sistema combinado complexo e interdependente. Para suportar qualquer alteração no funcionamento do controle de nível superior, você realmente precisa que cada motor se comporte da mesma forma possível com o outro motor o maior tempo possível, e isso realmente requer laços servo separados.

Entretanto, existem várias complicações adicionais, e isso depende da precisão necessária e de quanto esforço você está preparado para corrigir para eles e para qual solução você procura. Pode ser que o Dead Reckoning seja suficiente ou talvez você precise adicionar a determinação de posição Relativa ou Absoluta ao seu robô.

Um problema é que, mesmo que as rodas esquerda e direita movam 1000 contagens de codificador, você ainda pode acabar em uma posição diferente em duas execuções diferentes.

Por exemplo, suponha que você tenha um erro máximo seguinte de 10 contagens de codificador e seus motores estejam funcionando a uma velocidade de, por exemplo, 10 contagens de codificador por iteração de loop PID. Seu motor esquerdo pode se mover 5,10,10,10 ... 10,5 enquanto o motor direito pode ter um perfil de 4,11,10,10 ... 10,5 e até mesmo essa ligeira diferença na aceleração no início A movimentação pode fazer com que o robô parta levemente na direção errada. Não apenas isso, mas quanto mais você avança nessa direção, maior o erro se tornará em termos absolutos. É disso que estamos falando quando falamos de erro do Abbe , e sem um modelo cinemático complexo ou algum tipo de referência externa, você nunca será capaz de corrigi-lo.

Para obter mais informações, consulte minha resposta a uma pergunta semelhante, mas não totalmente duplicada: Como posso usar a biblioteca PID do Arduino para dirigir um robô em uma linha reta? e minha resposta para a otimização de seguidor de linha também relacionada


2

Eu tenho um bot com 2 rodas independentes.

Eu escolhi usar um giroscópio para mantê-lo na direção desejada, solavancos de deslizamento e até mesmo pegá-lo e girá-lo são de pouca importância, pois ele apenas corrige o rumo.

Eu uso um único PID, que adiciona / subtrai uma correção à velocidade atual desejada para cada um dos 2 motores, de acordo com o erro no rumo atual (direção), conforme determinado pelo giroscópio.

Por exemplo, defino a velocidade em 50% e o título em 20 graus. isso normalmente acionaria ambos os motores com 50% de potência. mas, à medida que o rumo se esvai, o PID fará ajustes adicionando um pouco de energia a um motor e removendo um pouco do outro, então você pode acabar com uma divisão de energia de 45% / 55% entre os motores à medida que o pid corrige o rumo.

Porém, os giroscópios têm seus problemas, mesmo com algum tempo gasto na calibração, ainda estou descobrindo que meu gryo tem cerca de 1 grau por minuto de desvio. Pode ser porque a Terra gira 15 graus por hora, isso também deve ser considerado a longo prazo.

Como mencionado anteriormente, os codificadores nas rodas são uma ótima idéia para realmente saber até onde você viajou.


Eu adoraria ver seu código para isso. Estou iniciando o mesmo caminho com um giroscópio / acelerômetro / magnetômetro, mas ainda estou no estágio inicial de apenas tentar entender as leituras desses sensores.
Ron Smith

Aqui está um link para o meu código, receio que não seja fácil de entender. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Robert Sutton
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.