Skip to content

Turtlesim & Python: Controle em Malha Fechada

raphaelrcb edited this page Nov 17, 2017 · 1 revision

Fechando a Malha

Após obter os resultados em malha aberta, decidiu-se aproveitar os sensores de posição da tartaruga para implementar um controle em malha fechada. Para receber os valores dos sensores, foram utilizados scripts do ros com essa finalidade

Implementando Orientação à Objetos

Afim de facilitar a obtenção de parâmetros dos sensores da tartaruga, decidimos implementar essa função em uma classe TurtleClosedLoop, cujos métodos implementam o controle em malha fechada.

class TurtleClosedLoop:
       ...

Serão explicados a seguir as principais funcionalidades para o controle em malha fechada, caso queira entender melhor o código e os métodos, basta olhar no repositório

Imports

Primeiramente em código deve-se importar o tipo de mensagem de posição, além das importações já feitas:

import rospy
from geometry_msgs.msg import Twist
from turtlesim.msg import Pose
import math

Neste trecho, realiza-se o import do pacote rospy, para gerenciar a interface ROS e Python, e a declaração do tipo de mensagem que será utilizado para leitura da posição é turtlesim.msg/Pose e para a publicação das velocidades é geometry_msg.msg/Twist. Também é importado a biblioteca matemática para os cálculos que serão feitos.

Leitura dos Sensores

Para fazer a leitura dos sensores, utiliza-se a classe específica do ROS, para ler mensagens publicadas em um tópico. Usualmente, sensores realizam esse papel. Na tartaruga vamos ler a sua posição atual publicada no tópico pelo sensor /(nome_da_tartaruga)/Pose

        # Elemento subscriber ROS
        rospy.Subscriber("turtle1/pose", Pose, self.callback)

Para entender como funciona esse elemento, acesse a sua documentação

Callback para o Subscriber

O callback é uma método recorrente, chamada para atualizar as informações do tópico. Vale lembrar que o nome "callback" é usualmente utilizado para esse tipo de método, no entanto você pode utilizar qualquer nome para ele. Segue o código utilizado para obter os parâmetros que o sensor /(nome_da_tartaruga)/Pose publica no tópico:

def callback(self, msg):
        ''' Funcao chamada toda a vez que atualizar-se o topico: turtle1/pose '''
        self.turtle_x = msg.x
        self.turtle_y = msg.y
        self.turtle_theta = msg.theta
        self.turtle_linear_velocity = msg.linear_velocity
        self.turtle_angular_velocity = msg.angular_velocity