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

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

Предпосылки: работа с основными сообщениями ROS

Загрузите демонстрационные сообщения

Во-первых, загрузите некоторые демонстрационные сообщения, которые будут использоваться в этом примере. Эти сообщения заполняются с данными, собранными от различных датчиков робототехники.

Вызовите exampleHelperROSLoadMessages, чтобы загрузить сообщения.

exampleHelperROSLoadMessages

Лазерные сообщения сканирования

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

Используйте rosmessage, чтобы создать сообщение.

emptyscan = rosmessage('sensor_msgs/LaserScan')
emptyscan = 
  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

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

Осмотрите переменную scan. Первичные данные в сообщении находятся в поле Ranges. Данные в Ranges [640x1] массив расстояний препятствия, которые были зарегистрированы в маленьком угловом шаге.

scan
scan = 
  ROS LaserScan message with properties:

       MessageType: 'sensor_msgs/LaserScan'
            Header: [1x1 Header]
          AngleMin: -0.5467
          AngleMax: 0.5467
    AngleIncrement: 0.0017
     TimeIncrement: 0
          ScanTime: 0.0330
          RangeMin: 0.4500
          RangeMax: 10
            Ranges: [640x1 single]
       Intensities: [0x1 single]

  Use showdetails to show the contents of the message

Можно понять измеренные мысли в Декартовых координатах с помощью функции readCartesian.

xy = readCartesian(scan);

Это возвращает список координат [x,y], которые были вычислены на основе всех допустимых показаний области значений. Можно визуализировать сообщение сканирования с помощью функции plot:

figure
plot(scan,'MaximumRange',5)

Отобразите сообщения

MATLAB также оказывает поддержку для сообщений изображений, которые всегда имеют тип сообщения sensor_msgs/Image.

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

emptyimg = rosmessage('sensor_msgs/Image')
emptyimg = 
  ROS Image message with properties:

    MessageType: 'sensor_msgs/Image'
         Header: [1x1 Header]
         Height: 0
          Width: 0
       Encoding: ''
    IsBigendian: 0
           Step: 0
           Data: [0x1 uint8]

  Use showdetails to show the contents of the message

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

Осмотрите переменную img сообщения изображений в своей рабочей области. Размер изображения хранится в свойствах Width и Height. ROS отправляет данные о действительном образе с помощью одномерного массива в поле Data.

img
img = 
  ROS Image message with properties:

    MessageType: 'sensor_msgs/Image'
         Header: [1x1 Header]
         Height: 480
          Width: 640
       Encoding: 'rgb8'
    IsBigendian: 0
           Step: 1920
           Data: [921600x1 uint8]

  Use showdetails to show the contents of the message

Поле Data хранит необработанные данные изображения, которые не могут использоваться непосредственно для обработки и визуализации в MATLAB. Можно использовать функцию readImage, чтобы получить изображение в формате, который совместим с MATLAB.

imageFormatted = readImage(img);

Оригинальное изображение имеет кодирование 'rgb8'. По умолчанию readImage возвращает изображение в стандарте 480x640x3 uint8 формат. Можно просмотреть это изображение с помощью функции imshow.

figure
imshow(imageFormatted)

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

Сжатые сообщения

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

Создайте пустое сжатое сообщение изображений с помощью rosmessage. Сжатые изображения в ROS имеют тип сообщения sensor_msgs/CompressedImage и имеют стандартную структуру.

emptyimgcomp = rosmessage('sensor_msgs/CompressedImage')
emptyimgcomp = 
  ROS CompressedImage message with properties:

    MessageType: 'sensor_msgs/CompressedImage'
         Header: [1x1 Header]
         Format: ''
           Data: [0x1 uint8]

  Use showdetails to show the contents of the message

Для удобства функция exampleHelperROSLoadMessages загрузила сжатое сообщение изображений, которое уже заполняется.

Осмотрите переменную imgcomp, которая была получена камерой. Свойство Format получает всю информацию, что MATLAB должен распаковать данные изображения, сохраненные в Data.

imgcomp
imgcomp = 
  ROS CompressedImage message with properties:

    MessageType: 'sensor_msgs/CompressedImage'
         Header: [1x1 Header]
         Format: 'bgr8; jpeg compressed bgr8'
           Data: [30376x1 uint8]

  Use showdetails to show the contents of the message

Подобно сообщению изображений можно использовать readImage, чтобы получить изображение в стандартном формате RGB. Даже при том, что исходное кодирование для этого сжатого изображения является bgr8, readImage сделает преобразование.

compressedFormatted = readImage(imgcomp);

Можно визуализировать изображение с помощью функции imshow.

figure
imshow(compressedFormatted)

Большинство форматов изображения поддерживается для сжатого типа сообщения изображений. '16UC1' и '32FC1' кодировка не поддержана для сжатых изображений глубины. Поддерживается кодировка монохроматического и цветного изображения.

Облака точек

Облака точек могут быть получены множеством датчиков, используемых в робототехнике, включая ЛАЗЕРНЫЕ ДАЛЬНОМЕРЫ, Kinect® и стереофотоаппараты. Наиболее распространенным типом сообщения в ROS для передачи облак точек является sensor_msgs/PointCloud2, и MATLAB предоставляет некоторые специализированные функции вам, чтобы работать с этими данными.

Вы видите стандартный формат ROS для сообщения облака точек путем создания пустого сообщения соответствующего типа.

emptyptcloud = rosmessage('sensor_msgs/PointCloud2')
emptyptcloud = 
  ROS PointCloud2 message with properties:

    PreserveStructureOnRead: 0
                MessageType: 'sensor_msgs/PointCloud2'
                     Header: [1x1 Header]
                     Height: 0
                      Width: 0
                IsBigendian: 0
                  PointStep: 0
                    RowStep: 0
                    IsDense: 0
                     Fields: [0x1 PointField]
                       Data: [0x1 uint8]

  Use showdetails to show the contents of the message

Просмотрите заполненное сообщение облака точек, которое хранится в переменной ptcloud в вашей рабочей области:

ptcloud
ptcloud = 
  ROS PointCloud2 message with properties:

    PreserveStructureOnRead: 0
                MessageType: 'sensor_msgs/PointCloud2'
                     Header: [1x1 Header]
                     Height: 480
                      Width: 640
                IsBigendian: 0
                  PointStep: 32
                    RowStep: 20480
                    IsDense: 0
                     Fields: [4x1 PointField]
                       Data: [9830400x1 uint8]

  Use showdetails to show the contents of the message

Информация об облаке точек закодирована в поле Data сообщения. Можно извлечь координаты [x,y,z] как матрицу N-3 путем вызывания readXYZ функции.

xyz = readXYZ(ptcloud)
xyz = 307200x3 single matrix

   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
      ⋮

NaN в данных об облаке точек указывает, что некоторые значения [x,y,z] не допустимы. В этом случае это - артефакт датчика Kinect®, и можно безопасно удалить все значения NaN.

xyzvalid = xyz(~isnan(xyz(:,1)),:)
xyzvalid = 193359x3 single matrix

    0.1378   -0.6705    1.6260
    0.1409   -0.6705    1.6260
    0.1433   -0.6672    1.6180
    0.1464   -0.6672    1.6180
    0.1502   -0.6705    1.6260
    0.1526   -0.6672    1.6180
    0.1556   -0.6672    1.6180
    0.1587   -0.6672    1.6180
    0.1618   -0.6672    1.6180
    0.1649   -0.6672    1.6180
      ⋮

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

rgb = readRGB(ptcloud)
rgb = 307200×3

    0.8392    0.7059    0.5255
    0.8392    0.7059    0.5255
    0.8392    0.7137    0.5333
    0.8392    0.7216    0.5451
    0.8431    0.7137    0.5529
    0.8431    0.7098    0.5569
    0.8471    0.7137    0.5569
    0.8549    0.7098    0.5569
    0.8588    0.7137    0.5529
    0.8627    0.7137    0.5490
      ⋮

Можно визуализировать облако точек с помощью функции scatter3. scatter3 автоматически извлечет координаты [x,y,z] и значения цвета RGB (если они будут существовать), и покажите им в 3D графике рассеивания. Функция scatter3 игнорирует все координаты NaN [x,y,z], даже если значения RGB существуют для той точки.

figure
scatter3(ptcloud)