Пример работы Издателя и Подписчика
На уроках ранее мы рассмотрели примеры простых программ, которые могли или отправлять данные, или только получать данные.
Но в реальных условиях таких программ очень мало. Обычно программы одновременно и принимают множество различных данных, анализируют их и отправляют их далее.
В текущий момент у вас нет доступа к реальному роботу, поэтому задачи будем рассматривать исключительно теоретические.
Давайте создадим программу, которая будет принимать данные из одного топика и передавать в другой. Например, мы будем получать в топик /name данные типа String с именем человека и возвращать приветствие в виде Hello, Имя в топик /greeting
Также из нового для нас -- мы будем использовать подходы ООП для решения задачи. Мы напишем класс GreetingWorker, который будет содержать в себе всю логику работы.
Рассмотрим реализацию такой программыpubsub.py
import rospy
from std_msgs.msg import String
class GreetingWorker(object):
def __init__(self):
rospy.loginfo("Start Greeting Node")
self.pub = rospy.Publisher('/greeting', String, queue_size=10)
rospy.Subscriber("/name", String, self.sayHello)
def sayHello(self, income_msg):
self.pub.publish('Hello, {}'.format(income_msg.data))
rospy.init_node('greeting_node')
greeter = GreetingWorker()
rospy.spin()
Рассмотрим класс GreetingWorker. В конструкторе класса мы для отладки выводим информационное сообщение:
rospy.loginfo("Start Greeting Node")
Инициализируем издатель на топик /greeеting и присваиваем его атрибуту класса self.pub
self.pub = rospy.Publisher('/greeting', String, queue_size=10)
Инициализируем подписчик на топик /name, указав функцией обратного вызова метод текущего класса sayHello
rospy.Subscriber("/name", String, self.sayHello)
Функция CallBack публикует форматированные данные
def sayHello(self, income_msg):
self.pub.publish('Hello, {}'.format(income_msg.data))
Класс мы завершили, нам осталось только запустить его.
rospy.init_node('greeting_node')
greeter = GreetingWorker()
rospy.spin()
Мы инициализируем ноду рос, создаем объект GreetingWorker и запускаем rospy.spin() для того, чтобы программа не завершала свою работу.
Запустим и проверим
python pubsub.py
Откроем вывод топика /greeting
rostopic echo /greeting
Отправим тестовые данные в топик /name (параметр -r10 означает, что данные публикуются с частотой 10 герц)
rostopic pub /name std_msgs/String "Robot" -r10
В консоли вывода топика /greeting мы увидим, что данные начали выводиться на экран.
Hello, Robot
Hello, Robot
Hello, Robot