exponenta event banner

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

Сообщения являются основным контейнером для обмена данными в ROS. Разделы и службы используют сообщения для переноса данных между узлами. (Для получения дополнительной информации по темам и услугам см. раздел Обмен данными с издателями и подписчиками ROS и Услуги по вызову и предоставлению ROS)

Для идентификации структуры данных каждое сообщение имеет тип сообщения. Например, данные датчика от лазерного сканера обычно посылаются в сообщении типа 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 раздел, используйте 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.

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

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

Копировать сообщения

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

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

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

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

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

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 - поле данных структуры.

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_57880 with NodeURI http://bat6315glnxa64:43565/
Shutting down ROS master on http://192.168.0.10:52182.

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