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

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

Необходимые условия: работа с основными сообщениями ROS

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

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

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 вектор из расстояний препятствия, зарегистрированных в маленьком угловом шаге.

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);

Это заполняет xy со списком [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 возвращает изображение в стандартных 480 640 3 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]
                     Fields: [0x1 PointField]
                     Height: 0
                      Width: 0
                IsBigendian: 0
                  PointStep: 0
                    RowStep: 0
                       Data: [0x1 uint8]
                    IsDense: 0

  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]
                     Fields: [4x1 PointField]
                     Height: 480
                      Width: 640
                IsBigendian: 0
                  PointStep: 32
                    RowStep: 20480
                       Data: [9830400x1 uint8]
                    IsDense: 0

  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 (если они существуют) и показывают им в 3-D точечном графике. scatter3 функция игнорирует весь NaN x,y,z координаты, даже если значения RGB существуют для той точки.

figure
scatter3(ptcloud)