Программа Подписчик
Уроком ранее мы написали первую программу, которая публикует данные. Сейчас мы рассмотрим программу на python, которая будет принимать эти данные и выводить их на экран.
Полный код программы (sub.py) дан ниже, скопируйте его себе и сохраните в файл. Далее мы рассмотрим его более подробно.
import rospy
from std_msgs.msg import String
rospy.init_node("welcome_sub_node")
def callback(msg):
print(msg)
rospy.Subscriber("welcome_topic", String, callback)
rospy.spin()
Как обычно программа начинается с подключения других модулей. Мы подключили основную библиотеку rospy и тип сообщений String из прошлой программы; мы помним, что используем именно этот тип сообщения.
import rospy
from std_msgs.msg import String
Инициализируем ноду рос, укажем новое имя.
rospy.init_node("welcome_sub_node")
Создадим функцию обработки полученных данных.
def callback(msg):
print(msg)
Тут стоит немного поговорить про эту функцию. В программировании такая функция называется CallBack (функция обратного вызова). Это некоторый подход к разработке, который позволяет запускать обработку данных только в момент, когда данные есть, в остальное время программа "занимается" другими своими делами. Поэтому мы говорим, что это callback функция, которая запускается по вызову.
Сама по себе функция ничего особого не делает, только печатает переданные ей данные. Также мы можем ее назвать как нам удобно, это не так важно. Важно, что мы понимаем, что это та функция, которая должна запуститься, когда получены данные.
Далее мы создаем наш основной объект "подписчик". Который, собственно, и делает то что нужно.
rospy.Subscriber("/welcome_topic", String, callback)
При инициализации объекта мы передаем параметры
- Имя топика для подписки
- Тип сообщения
- Имя функции CallBack (в нашей программе это
callback)
По сути, мы написали, что если в топике /welcome_topic появится сообщение типа String, то надо запустить функцию callback При этом как параметр функции будет передано само сообщение для дальнейшей ее обработки.
По логике нашей программы, она должна работать "вечно", а не сразу выходить. Для этого мы в конец программы добавим функцию, которая ничего не делает, но и не дает программе закрыться. Это rospy.spin()
rospy.spin()
Если мы запустим одновременно и Издателя (pub.py), и нашего подписчика (sub.py), то в выводе Подписчика мы увидим
python sub.py
data: "Hello robot"
data: "Hello robot"
Ради интереса мы можем поменять программу pub.py, изменив текст сообщения, и мы увидим, что текст вывода в sub.py поменяется.