Ação de Andar
Neste handout vamos criar nossa primeira ação: A ação de andar uma distância d.
Como estudamos em Explorando Tópicos e Mensagens, a velocidade linear do robo pode ser controlada publicando uma mensagem do tipo Twist em cmd_vel. Porém, muitas vezes queremos percorrer uma distância conhecida, mas como fazer isso apenas com a velocidade?
Em robotica uma estratégia comum é o método de Dead Reckoning que consiste em deslocar-se com velocidade constante por um tempo fixo, sem receber feedback de quanto, realmente, se deslocou.
Dentro do pacote robcomp_util/robcomp_util, baseando-se no codigo Nó Base de Ação, crie um arquivo denominado andar.py e uma classe chamada Andar e siga os seguintes passos:
- Mude o nome da classe para
Andare o nome do nó paraandar_node. - Mude também a chamada da classe na função
main()paraAndar(). - Mude o nome do estado de
acaoparaandar. - import
Timederclpy.time:from rclpy.time import Time - No construtor
__init__(), adicione e a variávelself.velocidadecom o valor de0.2 m/s. - Na função
reset(),- Modifique a definição da função
reset()para receber um parâmetrodistanciaque define a distância a ser percorrida. - Calcule o tempo necessário,
self.thresholdpara percorrer a distância com uma velocidade constante. - mude o estado do robô para
andar. - Inicie a variável
self.tempo_inicialcomo o seguinte:self.tempo_inicial = self.get_clock().now() # rclpy.time.Time - OBS:
rclpy.time.Time.now()retorna o tempo atual do relógio do nó -- diferente de.to_msg()que é usado para converter para "mensagem de tempo". Na APS 2, você poderia ter convertido o tempo do formato "menssagem",builtin_interfaces.msg.Time, para o tiporclpy.time.Time, que possui operações de subtração, usandofrom_msg(), mas aqui, como estamos usando o tempo apenas para calcular o tempo decorrido dentro do mesmo nó, podemos usar diretamente o tiporclpy.time.Timeque é mais simples de manipular.
- Modifique a definição da função
- Na função
andar(antiga funçãoacao),- Adicione a velocidade linear do robô no pacote da mensagem
twistda seguinte formaself.twist.linear.x = self.velocidade. - Calcule o tempo decorrido
self.dtentre o tempo atual e o tempo inicial, e imprima esse valor. - Se o tempo decorrido for maior ou igual a
self.thresholdsegundos, pare o robô, zere a velocidade na mensagemself.twist.linear.x = 0.0, e mude o estado do robô parastop.
- Adicione a velocidade linear do robô no pacote da mensagem
A ideia do método Dead Reckoning é que você se desloca em velocidade constante por um tempo fixo, dessa forma, voce se deslocou uma distancia d = v * t, onde v é a velocidade e t é o tempo. Com isso em mente,
- Adicione o nó no arquivo
setup.pye então compile o pacote. - Teste esta ação, executando o nó no simuldor e verificando se o robô se move a distância correta.
Cliente de Ação
Agora que temos a ação de andar, baseando-se no código do Nó Base de Controle, crie um arquivo denominado controle_andar.py e uma classe chamada ControleAndar que utilize a ação de andar, leia atentamente o código e o comentários para entender como o nó de controle interage com o nó de ação.