Программа Издатель
Начнем с классического примера "Hello robot". Это программа, которая передает в топик сообщение с приветствием. Или если перефразировать более точно, то публикует сообщение "Hello robot" в топик /welcome_topic
Полный код программы (pub.py) дан ниже, скопируйте его себе, и дальше мы разберем, что происходит в каждой строчке программы.
import rospy
from std_msgs.msg import String
rospy.init_node("welcome_node")
pub = rospy.Publisher("/welcome_topic", String, queue_size=10)
s = String()
s.data = "Hello robot"
while not rospy.is_shutdown():
pub.publish(s)
rospy.sleep(1)
Самое начало программы - это блок подключения внешних файлов. Мы подключаем библиотеку rospy и класс для работы со стандартным сообщением типа String. Нам для передачи данных необходим объект ROS "строка", если мы хотим передать "Hello robot"
import rospy
from std_msgs.msg import String
Инициализируем ноду рос. В этот момент происходит "магия" подключения ноды к мастер-ноде, поэтому стоит проверить, что вы уже запустили roscore
rospy.init_node("welcome_node")
Инициализация Издателя. В библиотеке rospy есть созданный класс, который реализует возможность работы с топиками для публикации данных. Это rospy.Publisher. Для его инициализации необходимо указать обязательные атрибуты:
- Имя топика, в который мы должны публиковать данные
- Тип сообщения, который должен быть в топике
- И не очень явный, но обязательный параметр queue_size (это размер очереди на отправку сообщений)
В программном виде инициализация объекта Издатель будет выглядеть вот так:
pub = rospy.Publisher("/welcome_topic", String, queue_size=10)
Далее мы инициализируем само сообщение. Напомним, что "строчка" - это некоторый объект с точки зрения ROS. Поэтому мы сначала инициализируем пустой объект, а потом заполняем его атрибуты.
s = String()
s.data = "Hello robot"
На самом деле тут можно было сократить код до одной строчки, но важно понять, что такое объект String
s = String("Hello robot")
Сейчас у нас есть объект pub, который умеет отправлять сообщения и объект s собственно с сообщением. Запустим "вечный" цикл, который будет публиковать данные
while not rospy.is_shutdown():
pub.publish(s)
rospy.sleep(1)
rospy.is_shutdown() - это метод который проверяет, что есть подключение к мастер ноде. Нам его удобно использовать для того, чтобы программа или сама завершалась при отключении мастер ноды, и работал выход из программы по нажатию комбинации прерывания работы программы Ctrl-C.
Но в целом мы могли написать просто while True
pub.publish(s) - вызов публикации данных. Объект pub отправляет объект s, который содержит нашу строчку "Hello Robot"
rospy.sleep(1) - это функция "паузы" отправки данных в топик, отправлять данные с максимальной скоростью нам абсолютно незачем. Мы отправляем данные раз в секунду.
Запуск программы
python3 pub.py
В нашей программе нет ни одного сообщения для отладки, поэтому при запуске программы мы увидим пустой экран и нам будет казаться, что ничего не происходит. Но это не так, программа запустилась без ошибок и работает!
Проверим, что на самом деле все работает.
Найдем нашу ноду
rosnode list
➜
/rosout
/welcome_node
Нода /welcome_node появилась
Проверим, что у нас появился "наш" топик welcome_topic
rostopic list
/rosout
/rosout_agg
/welcome_topic
И финальное - посмотри данные в топике
rostopic echo /welcome_topic
data: "Hello robot"
---
data: "Hello robot"
---
data: "Hello robot"
Мы видим данные из нашей первой программы.
Наша первая программа ROS работает!