Ros motors

No âmbito da robótica é bastante comum ter a necessidade de controlar motores DC.

Por exemplo, para locomover um robot de 2WD (propulsão diferencial) são necessários dois motores, sejam eles motores DC, steppers ou servos 360.

Os motores DC têm o seu sentido de rotação definido pelo sentido da corrente eléctrica, e a velocidade de rotação dependente da diferença de potencial aplicada.

Nos motores DC a diferença de potencial aplicada não deve exceder o limite indicado para o funcionamento do motor, pois ou queima o motor ou diminui o seu período de vida.

Para efectuar a gestão da direcção dos motores e respectiva velocidade é necessário recorrer a uma ponte-h, que serve de interface entre os motores e o micro-controlador, ou computador através de sinais digitais para definir a direcção e sinais PWM para definir a velocidade do motor.

Importa reter que para controlar os motores recorre-se a sinais digitais e PWM para indicar a direcção e velocidade de  rotação.

O controlo eficaz dos motores em sistema com o ROS pode ser conseguido com várias abordagens, das quais destaco os dois eixos em torno dos quais as várias soluções são construídas:

  • Processo de definição do PWM aplicado aos motores
    • Controlo PID do PWM (implica o uso de encoders)
    • Controlo PWM simples
  • Arquitectura fisica do sistema
    • Directo do computador (sbc com portas io, ex: Raspberry Pi)
    • Com um micro-controlador intermediário (ex: Arduino mega)

Antes de abordar as implementações das diversas soluções importa definir ou esclarecer que as unidades no ROS seguem o sistema métrico, pelo que a:

  • velocidade linear = m/s (metros por segundo)
  • velocidade angular = rad/s (radianos por segundo)

Por outro lado é importante conhecer que o ROS especifica tipos de  variáveis a ser usadas nas mensagens.

No âmbito do controlo dos motores os tipos de mensagens usadas são os seguintes:

  • Int8
  • Int16
  • Int32
  • Int64
  • geometry_msgs/Twist

Posta esta breve introdução segue-se a descrição de algumas soluções enquadradas nos eixos acima.

GPIO do Raspberry Pi

Existem vários modelos do Raspberry Pi, e por conseguinte mais que uma versão dos pinos GPIO, das quais destaco a de 26 pinos e a de 40 pinos, cujos primeiros 26 pinos são iguais. Para o nosso propósito é necessária uma versao de 40 pinos, de modo a ter os dois pinos capazes de emitir sinais PWM.

Conforme o diagrama acima, o raspberry pi tem dois canais PWM, o PWM0 e o PWM1.

Como os pinos de PWM no Raspberry pi são partilhados com o sistema de audio, ou usamos o audio ou usamos a saida de sinal PWM. Mas não as duas coisas ao mesmo tempo.

Para além dos pinos para a ponte H, também são usados dois pinos digitais por cada encoder.

Ponte H

Podem ser usados como pontes H diversos circuitos integrados, ou as correspondentes placas de teste. Os IC de ponte Hmais vulgares são os L298N e o L293D.

Ambos tem 4 entradas digitais, um par por motor, que permitem gerir a direcção de rotação dos motores, e um outra por cada motor que recebe o sinal PWM e o converte na diferença de potencial aplicada a motor.

Arduino

Pode ser usado qualquer dos arduinos, mas preferencialmente o Arduino mega por ter várias portas serie, e facilitar a ligações entre o arduino e o raspberry pi.

Quer o Arduino uno quer o mega tem os pinos necessários para a ponte h e os encoders

Encoders

Para poder determinar a velocidade e efectuar um controlo PID é necessário o uso de encoders com boa resolução em cada uma das rodas. Conforme os encoders usados, são necessários um ou dois pinos por encoder.

Os encoders opticos (menor resolução) normalmente só necessitam de um pino, e os de quadrante (maior resolução) usam dois pinos.

 

ROS, Raspberry PI e motores DC com PWM simples

Nesta solução são usados 6 pinos do interface GPIO do Raspberry pi para controlo directo da ponte H, e subsequentemente dos motores.

O node ROS deve proceder de acordo com os seguintes princípios:

  • subscrever o tópico velocity, onde são publicadas mensagens do tipo geometry_msgs/Twist.
  • aplicar nos pinos in1, in2, in3 e in4, os sinais adequados à definição do sentido de rotação correcto dos motores, face à ultima mensagem recebida.
  • aplicar nos pinos ena, enb, o valor do PWM para a velocidade dos motores adequado à ultima mensagem cmd_vel recebida.

Por não ter nenhum micro-controlador intermédio esta solução as vantagens desta solução são as seguintes:

  • Mais simples, menos programas, menos cabos, menor consumo;
  • Mais económica;
  • Evita a perda de mensagens (no rosserial_arduino tenho verificado que existe perda de mensagens)

As desvantagens são as seguintes:

  • A tradução da velocidade linear ou angular nas velocidades de cada uma das rodas, é arbitrária (não existe uma correspondência única entre PWM e velocidade, nem um controlo eficaz da velocidade real de cada uma das rodas)
  • O Raspberry PI não é um micro-controlador e portanto as questões de temporização assumem relevo pois o controlo dos motores está sujeito a flutuações no tempo de acção que podem fazer com que a rotação das rodas nao seja suave, sincronizada e tão constante quanto desejável.

 

ROS, Raspberry PI e Motores DC com controlo PID do PWM

Para esta solução é mecessário usar encoders em cada uma das rodas, e são usados 6 pinos do interface GPIO do Raspberry pi para controlo directo da ponte H, e subsequentemente dos motores.

Os encoders devem ser de alta resolução. Recomenda-se encoders de quadrante com pelo menos 1920 pontos por rotação. Os encoders ópticos de 20 pulsos não têm a resolução necessária para um bom desempenho.

A principal diferença face à solução anterior é, para além da necessidade de ter encoders, existe o recurso ao controlo PID para uma melhor gestão do PWM enviado para os motores e para determinação eficaz do PWM adequado para a velocidade desejada (a velocidade definida pelas mensagens do tópico cmd_vel).

O node ROS deve proceder de acordo com os seguintes princípios:

  • subscrever o tópico cmd_vel, onde são publicadas mensagens do tipo geometry_msgs/Twist.
  • aplicar nos pinos in1, in2, in3 e in4, os sinais adequados à definição do sentido de rotação correcto dos motores, face à ultima mensagem cmd_vel recebida.
  • aplicar nos pinos ena, enb, o valor do PWM para a velocidade dos motores adequado à ultima mensagem cmd_vel recebida, e aos valores reais da velocidade das rodas obtidos pelas leituras dos respectivos encoders.

Por não ter nenhum micro-controlador intermédio esta solução as vantagens desta solução são as seguintes:

  • Mais simples, menos programas, menos cabos, menor consumo;
  • Mais económica;
  • Evita a perda de mensagens (no rosserial_arduino tenho verificado que existe perda de mensagens)

As desvantagens são as seguintes:

  • O Raspberry PI não é um micro-controlador e portanto as questões de temporização, e controlo do motor está sujeita a flutuações no tempo de acção que podem fazer com que a rotação das rodas nao seja suave, sincronizada e tão constante quanto desejável.

 

ROS, Arduino e motores DC com PWM simples

O que tipifica este caso é que nenhum dos nodes envolvidos efectua o controlo PID do PWM a enviar para os motores por intermédio do Arduino que simplesmente recebe o valor do PWM e efectua a sua aplicação nos motores.

ROS, Arduino e motores DC com controlo PID do PWM

 

https://github.com/makerfire/rpi-demo/wiki/RPI-L298N-Motor-Driver-Module

 

Raspberry Pi: PWM in GPIO (Python)