Пример совместной работы
Ранее мы создавали отдельно программы Подписчики и программы Издатели. На этом уроке мы попрактикуемся создавать комплексные примеры, в которых мы будем использовать сразу оба метода коммуникации.
Давайте создадим программу, которая будет принимать данные из одного топика, и передавать в другой. Например, мы будем получать в топик /name данные типа String с именем человека, и возвращать приветствие в виде "Hello, Имя" в топик /greeting
Файл lesson5/string_pubsub.py
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import String
class GreetingWorker(object):
def __init__(self):
self.pub = rospy.Publisher('/greeting', String, queue_size=10)
def sayHello(self, income_msg):
self.pub.publish('Hello, {}'.format(income_msg.data))
if __name__ == '__main__':
rospy.init_node('greeting_node')
rospy.loginfo("Start Greeting Node")
greeter = GreetingWorker()
rospy.Subscriber("/name", String, greeter.sayHello)
rospy.spin()
В этом примере мы создали класс GreetingWorker который выполняет обработку получения данных в топик /name . Обратите внимание, что мы сначала инициализировали класс, а потом указали один из его методов как callback функцию (greeter.sayHello) при инициализации подписчика.
В методе конструктора класса __init__ мы создали объект pub в котором инициализировали объект Издатель. В методе sayHello мы публикуем данные передаваемые из топика /name, вызывая self.pub.publish () и передавая ему эти данные в качестве аргумента.
Запустим наш скрипт.
python3 lesson5/string_pubsub.py
Откроем вывод топика /greeting
rostopic echo /greeting
Отправим тестовые данные в топик /name
rostopic pub /name std_msgs/String "Robot" -r10
В терминале вывода топика /greeting мы увидим что данные начали публиковаться
Hello, Robot
Hello, Robot
Hello, Robot
Мы написали и разобрали пример python программы которая подписывается на данные, обрабатывает и публикует их в другой топик. Большинство программ в ROS, функционируют по аналогичному принципу. Весь вопрос в сложности обработки этих данных.
Пример взаимодействия Подписчика и Издателя в рамках одной ноды: https://youtu.be/WcIFIiG5-Ww