No mecanismo Publisher-Subscriber há o nó que envia dados (Publisher) e o nó que recebe dados (Subscriber).
O caminho de envio desses dados é chamado de Topics e pode ser do tipo 1:1, 1:N, N:1 e N:N dependendo do propósito.
Este tutorial foi retirado do curso ROS for Beginners: Basics, Motion, and OpenCV disponível no site da Udemy e é ministrado por Anis Koubaa.
Para reproduzir este artigo é necessário implementar os códigos seguintes disponíveis em seu git.
Para isto basta clonar seu repositório no workspace de sua máquina:
$ cd catkin_ws
$ git clone https://github.com/aniskoubaa/ros_essentials_cpp.git
Exemplo Hello World (Talker Listener)
O Topic aqui é chamado de chatter e possui uma mensagem do tipo String
Código talker.py
##########################################
1 #!/usr/bin/env python
2 # license removed for brevity
3 import rospy
4 from std_msgs.msg import String
5
6 def talker():
7 pub = rospy.Publisher(‘chatter’, String, queue_size=10)
8 rospy.init_node(‘talker’, anonymous=True)
9 rate = rospy.Rate(1) # 1hz
10 i=0
11 while not rospy.is_shutdown():
12 hello_str = “hello world %s” % i
13 rospy.loginfo(hello_str)
14 pub.publish(hello_str)
15 rate.sleep()
16 i=i+1
17
18 if __name__ == ‘__main__’:
19 try:
20 talker()
21 except rospy.ROSInterruptException:
22 pass
##############################################
A linha 7 é responsável pela criação do Publisher e os parâmetros fornecidos é o nome do tópico, o tipo de mensagem e quantas mensagens será armazenada na fila simultaneamente até serem descartadas.
A linha 8 inicia o nó e os parâmetros são o nome do nó enquanto anonymous=TRUE garante que cada nó criado seja único através de um ID
A linha 10 especifica a frequencia com que é publicado, ou seja, quantas mensagens por segundo
O loop da linha 11 funciona enquanto estiver ligado, neste caso cria a mensagem na linha 12 e o publica na linha 14.
Após clonar o repósitório do Anis Koubaa é necessário iniciar o ROS com o comando
$ roscore
Em dois novos terminais abrir o workspace e fazer
$ rosrun ros_essentials_cpp talker.py
e
$ rosrun ros_essentials_cpp listener.py
Código listener.py
##################################################
1 #!/usr/bin/env python
2 import rospy
3 from std_msgs.msg import String
4
5 def callback(message):
6 print(” I heard “, message.data)
7
8 def listener():
9 rospy.init_node(‘listener’, anonymous=True)
10
11 rospy.Subscriber(“chatter”, String, callback)
12
13 rospy.spin()
14
15 if __name__ == ‘__main__’:
16 listener()
######################################################
A linha 9 inicia o nó da mesma forma que o Publisher
A linha 11 cria o Subscriber onde deve ser fornecido o mesmo nome dado ao Publisher, o mesmo tipo de mensagem e o último parâmetro é a função callback que é chamada toda vez que uma nova mensagem é recebida.
Ao executar os dois códigos em sua máquina você é capaz de ver que a comunicação acontece de forma que o que é enviado em Talker é recebido pelo Listener