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

Система сообщений ROS

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

  • Что такое сообщения в ROS и зачем они нужны
  • Какие типы сообщений доступны в ROS
  • Как просмотреть список всех доступных сообщений
  • Как изучить структуру конкретного сообщения
  • Как создавать и использовать сообщения в Python

Сообщения ROS

Первое фундаментальное понятие, с которым нам надо познакомиться, это Сообщение. Создавая любую программу, мы рано или поздно начинаем сталкиваться с проблемой обмена данных между разными частями программ или разными программами.

В ROS - данные, которые мы хотим передавать или получать, объединяются одной конкретной сущностью - Сообщением (message).

Аналогия из жизни: Сообщение в ROS можно сравнить с письмом или посылкой. Как письмо имеет определенный формат (конверт, адрес, содержимое), так и сообщение ROS имеет строго определенную структуру и тип данных. Например, сообщение о температуре — это как термометр, который показывает только температуру, а не влажность или давление. Каждое сообщение имеет свой "формат" (структуру), который все участники системы понимают одинаково.

Например, если мы говорим "мы получаем данные датчика температуры", то в логике ROS это означает, что мы получаем сообщение, содержащее данные о температуре.

Важно уточнить, что любое сообщение описывает определенный и заранее заданный набор данных - структуру, и их тип. Для сообщений от датчика температуры мы можем представить данные и их тип как одну переменную типа float. В общем случае сообщения могут содержать довольно сложные структуры данных, и также включать в себя "другие" сообщения.

Типовые сообщения ROS, находятся в пакете std_msgs. Мы можем посмотреть все типы сообщений этого пакета.

ros2 interface package std_msgs

====
std_msgs/msg/MultiArrayLayout
std_msgs/msg/Byte
std_msgs/msg/MultiArrayDimension
......
std_msgs/msg/Float64MultiArray
std_msgs/msg/UInt8
std_msgs/msg/Int16
std_msgs/msg/UInt32
std_msgs/msg/Float32

Необходимое нам сообщение имеет имя std_msgs/msg/Float32

Если рассмотреть код на python, то создание сообщения будет выглядеть вот так

from std_msgs.msg import Float32

msg = Float32()
msg.data = 22.10

Все сообщения доступные в системе, мы можем посмотреть командой

ros2 interface list

Посмотреть информацию о структуре сообщения возможно используя параметр show и имя типа сообщения. Для данных датчика IMU (инерциальный датчик) мы получим структуру сообщения как представлено ниже.

ros2 interface show sensor_msgs/msg/Imu

====
std_msgs/Header header
	builtin_interfaces/Time stamp
		int32 sec
		uint32 nanosec
	string frame_id

geometry_msgs/Quaternion orientation
	float64 x 0
	float64 y 0
	float64 z 0
	float64 w 1
float64[9] orientation_covariance # Row major about x, y, z axes

geometry_msgs/Vector3 angular_velocity
	float64 x
	float64 y
	float64 z
float64[9] angular_velocity_covariance # Row major about x, y, z axes

geometry_msgs/Vector3 linear_acceleration
	float64 x
	float64 y
	float64 z
float64[9] linear_acceleration_covariance # Row major x, y z

Мы видим тут отдельный блоки данных header, orientation, angular_velocity, linear_acceleration содержащий более 20 переменных.