Топик, Издатель (Publisher)
Что вы узнаете в этом разделе:
- Что такое топики, издатели и подписчики в ROS
- Как работать с топиками через консоль (CLI)
- Как просмотреть список всех топиков робота
- Как публиковать сообщения в топики через командную строку
- Как получать и просматривать данные из топиков
- Основные команды утилиты
ros2 topic
Базовые сущности ROS
В ROS программы (Ноды), отправляющие сообщения, принято называть Издатель (Publisher), а программы, которые получают данные, принято называть Подписчик (Subscriber). При этом в архитектуре ROS - Подписчик и Издатель могут быть как разные программы, запущенные на одном компьютере, так и разные программы, запущенные на разных устройствах.
Связь подписчика и издателя происходит через единый для них Топик (Topic) (тема), в который издатель отправляет сообщения, а подписчик получает. Один топик от другого отличается именем, и типами сообщений, которые топики могут передавать.
Аналогия из жизни: Представьте топик как почтовый ящик или канал на YouTube. Издатель (Publisher) — это тот, кто кладет письма в ящик или публикует видео на канале. Подписчик (Subscriber) — это тот, кто забирает письма из ящика или подписывается на канал и смотрит видео. Несколько подписчиков могут читать одни и те же письма или смотреть одно и то же видео. Топик — это сам ящик или канал, который имеет название (например, "/температура" или "/скорость") и определенный тип контента (только письма о температуре, только видео о скорости).
Иллюстрация работы Издателя, Подписчика и Топика.

Работа с топиками через консоль (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