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

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

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

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

Необходимые условия: Начало работы с ROS, подключением к сети ROS

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

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

rosinit
Launching ROS Core...
Done in 0.824 seconds.
Initializing ROS master on http://192.168.0.10:50625.
Initializing global node /matlab_global_node_24525 with NodeURI http://bat1071901glnxa64:33953/

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

exampleHelperROSCreateSampleNetwork

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

Вы видите полный список доступных тем путем вызова rostopic list.

rostopic list
/pose  
/rosout
/scan  
/tf    

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

rostopic info /scan
Type: sensor_msgs/LaserScan
 
Publishers:
* /node_3 (http://bat1071901glnxa64:40149/)
 
Subscribers:
* /node_1 (http://bat1071901glnxa64:33181/)
* /node_2 (http://bat1071901glnxa64:43959/)

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

Чтобы узнать больше о типе сообщения темы, создайте пустое сообщение того же типа с помощью 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'
    LatestMessage: [0x1 Twist]
      MessageType: 'geometry_msgs/Twist'
       BufferSize: 1
    NewMessageFcn: []
       DataFormat: 'object'

Использование 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.0093
              Y: 0.0453
              Z: 0.0084

  Use showdetails to show the contents of the message

posedata.Angular
ans = 
  ROS Vector3 message with properties:

    MessageType: 'geometry_msgs/Vector3'
              X: 0.0878
              Y: -0.0210
              Z: 0.0068

  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.0093

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

showdetails(posedata)
  Linear     
    X :  0.00932219052602273
    Y :  0.04526734562806031
    Z :  0.008449365172780367
  Angular    
    X :  0.08782643913382959
    Y :  -0.02100276720970422
    Z :  0.006813318676002524

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 MATLAB save функция.

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 хранятся в Массивах объектов. Они должны быть обработаны по-другому по сравнению с типичными массивами данных.

В вашей рабочей области, переменной 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
    Transform
    ChildFrameId

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

tformFields = tf.Transforms.Transform

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

cellTransforms = {tf.Transforms.Transform}
cellTransforms=1×53 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]
       Transform: [1x1 Transform]
    ChildFrameId: '/imu_link'

  Use showdetails to show the contents of the message

Доступ к компоненту перевода пятого преобразования в списке 53:

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

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

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

exampleHelperROSShutDownSampleNetwork

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

rosshutdown
Shutting down global node /matlab_global_node_24525 with NodeURI http://bat1071901glnxa64:33953/
Shutting down ROS master on http://192.168.0.10:50625.

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