Система сообщений 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 переменных.