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

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

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

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

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

Поиск типов сообщений

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

rosinit
Launching ROS Core...
Done in 0.68556 seconds.
Initializing ROS master on http://192.168.0.10:52182.
Initializing global node /matlab_global_node_57880 with NodeURI http://bat6315glnxa64:43565/

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

exampleHelperROSCreateSampleNetwork

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

Полный список доступных тем вы можете увидеть по телефону rostopic list.

rostopic list
/pose  
/rosout
/scan  
/tf    

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

rostopic info /scan
Type: sensor_msgs/LaserScan
 
Publishers:
* /node_3 (http://bat6315glnxa64:35933/)
 
Subscribers:
* /node_1 (http://bat6315glnxa64:37711/)
* /node_2 (http://bat6315glnxa64:42175/)

Командный выход также сообщает, какие узлы публикуются и подписываются на тему. Для получения информации о издателях и подписчиках см. раздел «Вызов и предоставление услуг 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'
    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 Data with ROS Publishers and Subscribers и Call and Supply 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 содержит пример сообщения. (The 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 содержит объектный массив. В Transforms хранятся 53 объектаи все они имеют одинаковую структуру.

Разверните 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_57880 with NodeURI http://bat6315glnxa64:43565/
Shutting down ROS master on http://192.168.0.10:52182.

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