Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Топик, Издатель (Publisher)

Что вы узнаете в этом разделе:

  • Что такое топики, издатели и подписчики в ROS
  • Как работать с топиками через консоль (CLI)
  • Как просмотреть список всех топиков робота
  • Как публиковать сообщения в топики через командную строку
  • Как получать и просматривать данные из топиков
  • Основные команды утилиты ros2 topic

Базовые сущности ROS

В ROS программы (Ноды), отправляющие сообщения, принято называть Издатель (Publisher), а программы, которые получают данные, принято называть Подписчик (Subscriber). При этом в архитектуре ROS - Подписчик и Издатель могут быть как разные программы, запущенные на одном компьютере, так и разные программы, запущенные на разных устройствах.

Связь подписчика и издателя происходит через единый для них Топик (Topic) (тема), в который издатель отправляет сообщения, а подписчик получает. Один топик от другого отличается именем, и типами сообщений, которые топики могут передавать.

Аналогия из жизни: Представьте топик как почтовый ящик или канал на YouTube. Издатель (Publisher) — это тот, кто кладет письма в ящик или публикует видео на канале. Подписчик (Subscriber) — это тот, кто забирает письма из ящика или подписывается на канал и смотрит видео. Несколько подписчиков могут читать одни и те же письма или смотреть одно и то же видео. Топик — это сам ящик или канал, который имеет название (например, "/температура" или "/скорость") и определенный тип контента (только письма о температуре, только видео о скорости).

Иллюстрация работы Издателя, Подписчика и Топика.

MultiplePublisher

Работа с топиками через консоль (cli)

Познакомиться с работой топиков проще всего через консоль, используя специальные утилиты. Такой способ взаимодействия обычно называют cli (command line interface).

CLI (Command Line Interface) — интерфейс командной строки, текстовый пользовательский интерфейс, который используется для взаимодействия с операционной системой или программным обеспечением компьютера путём ввода команд в консоли или терминале

Для работы с топиками, в ROS есть утилита ros2 topic. Основные команды

ros2 topic list – показать все существующие топики;
ros2 topic pub – ручная публикация сообщений;
ros2 topic echo – «эхо», то есть прослушивание топика в реальном времени;

Если выполнить команду ros2 topic list, то мы получим список топиков робота (не забудьте подключиться по ssh к роботу)

ros2 topic list
====
/backlight/all
/backlight/array
/bat
/client_count
/cmd_vel
...
/pose2d
/robot_description
/rosout
/scan
/tf
/tf_static

Публикация сообщений в топики

Для публикации данных в топик, воспользуемся утилитой ros2 topic pub <имя_топика> <тип_сообщения> <данные_сообщения>

Запустим команду на роботе

ros2 topic pub /temp std_msgs/msg/Float32 "{data: '21.10'}"

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

publisher: beginning loop
publishing #1: std_msgs.msg.Float32(data=21.1)
publishing #2: std_msgs.msg.Float32(data=21.1)
publishing #3: std_msgs.msg.Float32(data=21.1)
publishing #4: std_msgs.msg.Float32(data=21.1)

Получение сообщений

Для получения данных из топика, воспользуемся командой ros2 topic echo <имя_топика>

Запустим в новом окне терминала команду подписки на топик /temp. Новое окно терминала нам необходимо для того, чтобы мы могли запустить две команды Издателя и Подписчика одновременно.

ros2 topic echo /temp

Получим вывод работы программы

data: 21.100000381469727
---
data: 21.100000381469727
---
data: 21.100000381469727
---
data: 21.100000381469727

Этим примером мы показали как просто используя консоль создавать Издателей и Подписчиков, и проверять данные которые публикуются в топик.

tip

Для завершения работы программы, нажмите Ctrl+C.

Утилита ros2 topic

Для получения справки и параметров утилиты ros2 topic необходимо запустить утилиту без параметров. Например получить список всех команд и их краткое описание.

ros2 topic
====
usage: ros2 topic [-h] [--include-hidden-topics] Call `ros2 topic <command> -h` for more detailed usage. ...

Various topic related sub-commands

options:
  -h, --help            show this help message and exit
  --include-hidden-topics
                        Consider hidden topics as well

Commands:
  bw     Display bandwidth used by topic
  delay  Display delay of topic from timestamp in header
  echo   Output messages from a topic
  find   Output a list of available topics of a given type
  hz     Print the average receiving rate to screen
  info   Print information about a topic
  list   Output a list of available topics
  pub    Publish a message to a topic
  type   Print a topic's type

  Call `ros2 topic <command> -h` for more detailed usage.

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

ros2 topic pub
====
usage: ros2 topic pub [-h] [--stdin] [-r N] [-p N] [-1 | -t TIMES] [-w WAIT_MATCHING_SUBSCRIPTIONS] [--max-wait-time-secs MAX_WAIT_TIME_SECS] [--keep-alive N]
                      [-n NODE_NAME]
                      [--qos-profile {unknown,default,system_default,sensor_data,services_default,parameters,parameter_events,action_status_default,best_available}]
                      [--qos-depth N] [--qos-history {system_default,keep_last,keep_all,unknown}]
                      [--qos-reliability {system_default,reliable,best_effort,unknown,best_available}]
                      [--qos-durability {system_default,transient_local,volatile,unknown,best_available}]
                      [--qos-liveliness {system_default,automatic,manual_by_topic,unknown,best_available}]
                      [--qos-liveliness-lease-duration-seconds QOS_LIVELINESS_LEASE_DURATION_SECONDS] [--spin-time SPIN_TIME] [-s]
                      topic_name message_type [values]
ros2 topic pub: error: the following arguments are required: topic_name, message_type

Более подробно о топиках, можно посмотреть в официальной документации Understanding-ROS2-Topics