Программа Издатель

Начнем с классического примера "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 работает!

results matching ""

    No results matching ""