Работа с основными сообщениями ROS

Сообщения являются первичным контейнером для обмена данными в ROS. Темы (см., обмениваются Данными с Издателями ROS и Подписчиками), и сервисы (см. Call and Provide ROS Services), сообщения использования, чтобы нести данные между узлами.

Чтобы идентифицировать его структуру данных, каждое сообщение имеет тип сообщения. Например, данные о датчике из лазерного сканера обычно отправляются в сообщении типа sensor_msgs/LaserScan. Каждый тип сообщения идентифицирует элементы данных, которые содержатся в сообщении. Каждое имя типа сообщения является комбинацией имени пакета, сопровождаемого наклонной чертой вправо/, и имя типа:

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

Предпосылки: Запуск с ROS, соединитесь с сетью ROS

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

Инициализируйте ведущее устройство ROS и глобальный узел.

rosinit
Initializing ROS master on http://bat6230glnxa64:35493/.
Initializing global node /matlab_global_node_51580 with NodeURI http://bat6230glnxa64:40883/

Используйте exampleHelperROSCreateSampleNetwork, чтобы заполнить сеть ROS с тремя дополнительными узлами и демонстрационными издателями и подписчиками.

exampleHelperROSCreateSampleNetwork

Существуют различные узлы в сети с несколькими темами и аффилированными издателями и подписчиками.

Вы видите полный список доступных тем путем вызова rostopic list. /scan является одной из тем, которая перечислена.

rostopic list
/pose  
/rosout
/scan  

Если вы хотите знать больше о типе данных, которые отправляются через тему /scan, используйте команду rostopic info /scan, чтобы исследовать его. /scan имеет тип сообщения sensor_msgs/LaserScan.

rostopic info /scan
Type: sensor_msgs/LaserScan
 
Publishers:
* /node_3 (http://bat6230glnxa64:41037/)
 
Subscribers:
* /node_2 (http://bat6230glnxa64:42225/)
* /node_1 (http://bat6230glnxa64:44645/)

Вывод команды также говорит вам, которых узлы публикуют и подписывают на тему. Чтобы узнать об издателях и подписчиках, смотрите, обмениваются Данными с Издателями ROS и Подписчиками.

  • Чтобы узнать больше о типе сообщения темы, создайте пустое сообщение того же типа. Используйте функцию rosmessage. rosmessage поддерживает заполнение клавишей Tab для типа сообщения. Чтобы завершить имена типа сообщения, введите первые несколько символов имени, вы хотите завершить, и затем нажать клавишу TAB.

scandata = rosmessage('sensor_msgs/LaserScan')
scandata = 
  ROS LaserScan message with properties:

       MessageType: 'sensor_msgs/LaserScan'
            Header: [1x1 Header]
          AngleMin: 0
          AngleMax: 0
    AngleIncrement: 0
     TimeIncrement: 0
          ScanTime: 0
          RangeMin: 0
          RangeMax: 0
            Ranges: [0x1 single]
       Intensities: [0x1 single]

  Use showdetails to show the contents of the message

Созданное сообщение scandata имеет много свойств, сопоставленных с данными, обычно полученными от лазерного сканера. Например, минимальное расстояние обнаружения хранится в свойстве RangeMin и максимальном расстоянии обнаружения в RangeMax.

Чтобы видеть полный список всех типов сообщений, доступных для тем и сервисов, используйте rosmsg list.

Исследуйте структуру сообщения и получите данные о сообщении

Сообщения ROS являются объектами, и данные о сообщении хранятся в свойствах. MATLAB® показывает удобные способы найти и исследовать содержимое сообщений.

  • Если вы подписываетесь на тему /pose, можно получить и исследовать сообщения, которые отправляются.

posesub = rossubscriber('/pose')
posesub = 
  Subscriber with properties:

        TopicName: '/pose'
      MessageType: 'geometry_msgs/Twist'
    LatestMessage: [0x1 Twist]
       BufferSize: 1
    NewMessageFcn: []

  • Используйте receive, чтобы получить данные от подписчика. Если новое сообщение получено, функция возвратит его и сохранит его в переменной posedata (второй аргумент является тайм-аутом в секундах).

posedata = receive(posesub, 10)
posedata = 
  ROS Twist message with properties:

    MessageType: 'geometry_msgs/Twist'
         Linear: [1x1 Vector3]
        Angular: [1x1 Vector3]

  Use showdetails to show the contents of the message

Сообщение имеет тип geometry_msgs/Twist. В сообщении существует два других поля: Linear и Angular. Вы видите значения этих полей сообщения путем доступа к ним непосредственно:

posedata.Linear
ans = 
  ROS Vector3 message with properties:

    MessageType: 'geometry_msgs/Vector3'
              X: 0.0315
              Y: 0.0406
              Z: -0.0373

  Use showdetails to show the contents of the message

posedata.Angular
ans = 
  ROS Vector3 message with properties:

    MessageType: 'geometry_msgs/Vector3'
              X: 0.0413
              Y: 0.0132
              Z: -0.0402

  Use showdetails to show the contents of the message

Вы видите, что каждое из значений этих полей сообщения является на самом деле сообщением сам по себе. Типом сообщения для них является geometry_msgs/Vector3. geometry_msgs/Twist является составным сообщением, составленным из двух сообщений geometry_msgs/Vector3.

Доступ к данным для этих вложенных сообщений работает точно то же самое доступом к данным в других сообщениях. Доступ к компоненту X сообщения Linear с помощью этой команды:

xpos = posedata.Linear.X
xpos = 0.0315

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

showdetails(posedata)
  Linear     
    X :  0.03147236863931789
    Y :  0.04057919370756193
    Z :  -0.03730131837064939
  Angular    
    X :  0.04133758561390194
    Y :  0.01323592462254095
    Z :  -0.04024595950005905

showdetails помогает вам во время отладки и когда это необходимо быстро исследовать содержимое сообщения.

Установите данные о сообщении

Можно также установить значения свойств сообщения. Создайте сообщение с типом geometry_msgs/Twist.

twist = rosmessage('geometry_msgs/Twist')
twist = 
  ROS Twist message with properties:

    MessageType: 'geometry_msgs/Twist'
         Linear: [1x1 Vector3]
        Angular: [1x1 Vector3]

  Use showdetails to show the contents of the message

Числовые свойства этого сообщения инициализируются к "0" по умолчанию. Можно изменить любое из свойств этого сообщения. Сделайте запись Linear.Y равной 5.

twist.Linear.Y = 5;

Можно просмотреть данные о сообщении, чтобы убедиться, что изменение вступило в силу.

twist.Linear
ans = 
  ROS Vector3 message with properties:

    MessageType: 'geometry_msgs/Vector3'
              X: 0
              Y: 5
              Z: 0

  Use showdetails to show the contents of the message

Если сообщение заполняется с вашими данными, можно использовать его с издателями, подписчиками и сервисами. Смотрите Данные о Exchange с примерами ROS Publishers and Subscribers and Call and Provide ROS Services.

Скопируйте сообщения

Существует два способа скопировать содержимое сообщения:

  • Можно создать ссылочную копию, в которой копия и исходные сообщения совместно используют те же данные

  • Можно создать глубокую копию, в которой копия и исходные сообщения у каждого есть их собственные данные.

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

Сделайте ссылочную копию сообщения при помощи '=' знак. Это создает переменную, которая ссылается на то же содержимое сообщения как исходная переменная.

twistCopyRef = twist
twistCopyRef = 
  ROS Twist message with properties:

    MessageType: 'geometry_msgs/Twist'
         Linear: [1x1 Vector3]
        Angular: [1x1 Vector3]

  Use showdetails to show the contents of the message

Измените поле Linear.Z twistCopyRef и смотрите, что это изменяет содержимое twist также:

twistCopyRef.Linear.Z = 7;
twist.Linear
ans = 
  ROS Vector3 message with properties:

    MessageType: 'geometry_msgs/Vector3'
              X: 0
              Y: 5
              Z: 7

  Use showdetails to show the contents of the message

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

twistCopyDeep = copy(twist)
twistCopyDeep = 
  ROS Twist message with properties:

    MessageType: 'geometry_msgs/Twist'
         Linear: [1x1 Vector3]
        Angular: [1x1 Vector3]

  Use showdetails to show the contents of the message

Измените свойство Linear.X twistCopyDeep и заметьте, что содержимое twist остается неизменным.

twistCopyDeep.Linear.X = 100;
twistCopyDeep.Linear
ans = 
  ROS Vector3 message with properties:

    MessageType: 'geometry_msgs/Vector3'
              X: 100
              Y: 5
              Z: 7

  Use showdetails to show the contents of the message

twist.Linear
ans = 
  ROS Vector3 message with properties:

    MessageType: 'geometry_msgs/Vector3'
              X: 0
              Y: 5
              Z: 7

  Use showdetails to show the contents of the message

Сохраните и загрузите сообщения

Можно сохранить сообщения и сохранить содержимое для дальнейшего использования.

Получите новое сообщение от подписчика.

posedata = receive(posesub,10)
posedata = 
  ROS Twist message with properties:

    MessageType: 'geometry_msgs/Twist'
         Linear: [1x1 Vector3]
        Angular: [1x1 Vector3]

  Use showdetails to show the contents of the message

Сохраните данные о положении к .mat функции save MATLAB использования файла.

save('posedata.mat','posedata')

Прежде, чем загрузить файл назад в рабочую область, очистите переменную posedata.

clear posedata

Теперь можно загрузить данные о сообщении путем вызывания load функции. Это загружает posedata сверху в messageData структуру. posedata является полем данных struct.

messageData = load('posedata.mat')
messageData = struct with fields:
    posedata: [1x1 Twist]

Исследуйте messageData.posedata, чтобы видеть содержимое сообщения.

messageData.posedata
ans = 
  ROS Twist message with properties:

    MessageType: 'geometry_msgs/Twist'
         Linear: [1x1 Vector3]
        Angular: [1x1 Vector3]

  Use showdetails to show the contents of the message

Можно теперь удалить файл MAT.

delete('posedata.mat')

Массивы объектов в сообщениях

Некоторые сообщения от ROS хранятся в Массивах объектов (MATLAB). Они должны быть обработаны по-другому по сравнению с типичными массивами данных.

В вашей рабочей области переменная tf содержит демонстрационное сообщение (скрипт exampleHelperROSCreateSampleNetwork создал переменную). В этом случае это - сообщение типа tf/tfMessage, используемый для координатных преобразований.

tf
tf = 
  ROS tfMessage message with properties:

    MessageType: 'tf/tfMessage'
     Transforms: [53x1 TransformStamped]

  Use showdetails to show the contents of the message

tf имеет два поля: MessageType содержит стандартный массив данных, и Transforms содержит объектный массив. Существует 53 объекта, хранившие в Transforms, и у всех них есть та же структура.

Расширьте tf в Transforms, чтобы видеть структуру:

tf.Transforms
ans = 
  53x1 ROS TransformStamped message array with properties:

    MessageType
    Header
    ChildFrameId
    Transform

Каждый объект в Transforms имеет четыре свойства. Можно расшириться, чтобы видеть поле Transform Transforms.

tformFields = tf.Transforms.Transform

Примечание: команда, вывод дает 53 отдельных ответа, начиная с каждого объекта, оценена и возвращает значение своего поля Transform. Этот формат не всегда полезен, таким образом, можно преобразовать его в массив ячеек со следующей командой:

cellTransforms = {tf.Transforms.Transform}
cellTransforms = 1x53 cell array
  Columns 1 through 4

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 5 through 8

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 9 through 12

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 13 through 16

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 17 through 20

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 21 through 24

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 25 through 28

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 29 through 32

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 33 through 36

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 37 through 40

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 41 through 44

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 45 through 48

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Columns 49 through 52

    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}    {1x1 Transform}

  Column 53

    {1x1 Transform}

Это помещает все 53 объектных записи в массив ячеек, который позволяет вам получать доступ к ним с индексацией.

Кроме того, можно получить доступ к элементам объектного массива тем же путем, вы получаете доступ к стандартным векторам MATLAB:

tf.Transforms(5)
ans = 
  ROS TransformStamped message with properties:

     MessageType: 'geometry_msgs/TransformStamped'
          Header: [1x1 Header]
    ChildFrameId: '/imu_link'
       Transform: [1x1 Transform]

  Use showdetails to show the contents of the message

Доступ к свойствам отдельных элементов массива:

tf.Transforms(5).Transform.Translation
ans = 
  ROS Vector3 message with properties:

    MessageType: 'geometry_msgs/Vector3'
              X: 0.0599
              Y: 0
              Z: -0.0141

  Use showdetails to show the contents of the message

Это представляет компонент перевода пятого преобразования в списке 53.

Закройте сеть ROS

Удалите демонстрационные узлы, издателей и подписчиков от сети ROS.

exampleHelperROSShutDownSampleNetwork

Закройте ведущее устройство ROS и удалите глобальный узел.

rosshutdown
Shutting down global node /matlab_global_node_51580 with NodeURI http://bat6230glnxa64:40883/
Shutting down ROS master on http://bat6230glnxa64:35493/.

Следующие шаги