Пример работы Издателя и Подписчика

На уроках ранее мы рассмотрели примеры простых программ, которые могли или отправлять данные, или только получать данные.

Но в реальных условиях таких программ очень мало. Обычно программы одновременно и принимают множество различных данных, анализируют их и отправляют их далее.

В текущий момент у вас нет доступа к реальному роботу, поэтому задачи будем рассматривать исключительно теоретические.

Давайте создадим программу, которая будет принимать данные из одного топика и передавать в другой. Например, мы будем получать в топик /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

results matching ""

    No results matching ""