• Unidade 3
  • Capítulo 7 - Controle Propocional
  • Atividades
  • 2 - Segue-Linha

Segue Linha

Agora que aprendemos o conceito de controle proporcional, vamos implementar a Ação Segue Linha para que o robô siga a linha amarela do controle de forma suave e precisa.

Conceito

Relembrando o controle proporcional: a saída é ajustada proporcionalmente ao erro.

rot = K_p * erro
  • rot é a velocidade angular do robô (ex.: Twist.angular.z),
  • K_p é a constante proporcional,
  • erro erro da medição.

Como calcular o erro para seguir a linha:

Para andar em direção a um alvo, o alvo deve estar centralizado na horizontal na imagem, ou seja, o x do centróide do alvo deve ser igual ao x do centro da imagem. Com isso em mente o erro é a distância horizontal (x) entre o centro da imagem e o centróide do segmento amarelo.

Como calcular na prática:

No image_callback, após detectar o centróide do segmento amarelo:

  • Guarde self.cx_linha (x do centróide) e self.w = metade da largura da imagem.
  • Se não houver linha, defina self.erro = None.
  • Se houver linha, calcule o erro:

  • self.erro = ??? (em pixels)

  • Normalize o erro ≈ [-1, 1] dividindo por self.w

Então no estado segue, use o controle proporcional para definir a velocidade angular. Defina o ganho self.kp testando valores e considerando o limite da velocidade angular (+- 0.5 rad/s, por exemplo).

Cuidado com o sinal do erro! Pense quando o robô deve girar para a esquerda ou para a direita.

Prática 1

Baseando-se no codigo Nó Base de Ação e Nó Base de Visão, implemente a Ação Segue Linha com o seguindo os passos:

  1. A Ação Segue Linha não deve ter fim (ou seja, o robô deve seguir a linha até o Cliente finalizar).
  2. Mude o nome da classe para SegueLinha e o nome do nó para seguelinha_node.
  3. Mude também a chamada da classe na função main() para SegueLinha().
  4. Mude o nome do estado de acao para seguir.
  5. No construtor __init__(), adicione as variáveis necessárias.
  6. Na função reset(),

    • Mude o estado do robô para seguir.
  7. Na função seguir (antiga função acao),

    • Calcule a velocidade angular com controle proporcional: self.twist.angular.z = self.kp * self.erro.
    • Defina uma velocidade linear constante.
  8. No. image_callback:

  9. Siga os passos definidos no inicio do handout para calcular self.erro.