Сообщения

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

Топики (Topic), службы (Services) и Действия (Actions) используют сообщения для взаимодействия между собой. Сообщения могут включать в себя как базовые типы (целое число, число с плавающей точкой, логические и тд), так и массивы сообщений.

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

Сообщения описываются в файлах .msg как пары значений: тип поля и имя поля.

fieldtype fieldname
fieldtype1 fieldname1

Для реального примера, сообщение может выглядеть так:

int32 x
int32 y

Мы описали сообщение, содержащее две переменных типа int32 с именами x и y

Базовые типы ROS

Типы данных ROS не заимствованы на прямую ни из одного из языков. В момент "сборки" происходит преобразование типа ROS к типу используемого языка.

В таблице ниже описаны базовые типы ROS и их представление в языках С++ и Python

в ROS для C++ для Python
bool uint8_t bool
int8 int8_t int
uint8 uint8_t int
int16 int16_t int
uint16 uint16_t int
int32 int32_t int
uint32 uint32_t int
int64 int64_t long
uint64 uint64_t long
float32 float float
float64 double float
string std::string str
time ros::Time rospy.Time
duration ros::Duration rospy.Duration

Отдельно стоит отметить типы данных

в ROS для С++ для Python
fixed-length boost::array, std::vector tuple
variable-length std::vector tuple
uint8[] std::vector bytes
bool[] std::vector<uint8_t> list of bool

Наследование типов сообщений

Сообщения могут содержать не только базовые типы, но и переиспользовать уже созданные типы сообщений. Например сообщение типа geometry_msgs/Pose описывается конфигурацией

Point position
Quaternion orientation

Где Point и Quaternion это существующие типы сообщений.

Если рассмотреть сообщение geometry_msgs/Pose в развернутом виде, то мы увидим структуру:

geometry_msgs/Point position

  float64 x
  float64 y

float64 z

geometry_msgs/Quaternion orientation

  float64 x

  float64 y
  float64 z
  float64 w

Создание новых сообщений

В процессе разработки часто возникает необходимость создавать собственные типы сообщений с уникальной структурой данных. Файлы с описанием сообщений необходимо хранить в директории ./msg При этом имя файла определяет название типа созданного сообщения.

Например, мы хотим использовать данные с датчика давления и температуры BMP180. Мы предполагаем, что нам понадобится передавать два значения: давление и температура (стандартные параметры для барометрических датчиков).

Создадим файл ./msg/Barometer.msg

uint16  pressure
float32 temperature

Для правильного подключения созданных .msg файлов необходимо удостовериться, что установлены все зависимости и внесены изменения в конфигурацию пакета.

Файл package.xml должен содержать следующие строчки

<build_depend>message_generation</build_depend>
<exec_depend>message_generation</exec_depend>

Файл CMakeLists.txt должен содержать следующие изменения для подключения процесса обработки сообщений

find_package(catkin REQUIRED COMPONENTS
    roscpp
    rospy
    std_msgs
    message_generation)

catkin_package(
   CATKIN_DEPENDS
   message_generation
   roscpp
   rospy
   std_msgs
)

## Generate messages in the 'msg' folder
add_message_files(

   FILES

   Barometer.msg
)

 generate_messages(
   DEPENDENCIES
   std_msgs
)

После этого необходимо запустить процесс сборки пакета командой catkin_make

$ cd ~/catkin_ws && catkin_make

Проверить правильность создания нового типа сообщений Barometer.msg в пакет можно выполнить поиском по названию сообщения:

$ rosmsg list | grep Baro

ros_book_samples/Barometer

Подключить .msg файл в python

import rospy
from ros_book_samples.msg import Barometer

После изменения файла .msg всегда необходимо "пересобирать" проект через вызов catkin_make. Файлы .msg не используются напрямую, а служат инструкцией для генерации вспомогательных файлов, которые подключаются после их вызова. Например из файла Barometer.msg создается файл для python devel/lib/python2.7/dist-packages/ros\_book\_samples/msg/\_Barometer.py.

Консольная утилита rosmsg

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

Например, если вы используете сообщение в своем коде, вы можете выполнить rosmsg show в командной строке для получения списка полей используемых в сообщении:

$ rosmsg show sensor_msgs/CameraInfo

Header header
  uint32 seq
  time stamp
  string frame_id
uint32 height
uint32 width
RegionOfInterest roi
  uint32 x_offset
  uint32 y_offset
  uint32 height
  uint32 width
float64[5] D
float64[9] K
float64[9] R
float64[12] P

Команды консольной утилиты rosmsg

Commands:
    rosmsg show    Показать информацию о сообщении
    rosmsg info    Алиас для команды rosmsg show
    rosmsg list    Вывести все существующие типы сообщений
    rosmsg md5    Отобразить md5sum сообщения
    rosmsg package    Список всех сообщений в пакете
    rosmsg packages    Список пакетов, использующих сообщение

results matching ""

    No results matching ""