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

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

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

Загрузка выборок сообщений

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

load('specialROSMessageData.mat')

Сообщения лазерного скана

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

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

emptyscan = rosmessage("sensor_msgs/LaserScan","DataFormat","struct")
emptyscan = struct with fields:
       MessageType: 'sensor_msgs/LaserScan'
            Header: [1x1 struct]
          AngleMin: 0
          AngleMax: 0
    AngleIncrement: 0
     TimeIncrement: 0
          ScanTime: 0
          RangeMin: 0
          RangeMax: 0
            Ranges: [0x1 single]
       Intensities: [0x1 single]

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

Осмотрите scan переменная. Основные данные в сообщении указаны в Ranges свойство. Данные в Ranges - вектор расстояний между препятствиями, регистрируемых с небольшими шагами угла.

scan
scan = struct with fields:
       MessageType: 'sensor_msgs/LaserScan'
            Header: [1x1 struct]
          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]

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

xy = rosReadCartesian(scan);

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

figure
rosPlot(scan,'MaximumRange',5)

Figure contains an axes. The axes with title Laser Scan contains an object of type line.

Изображения сообщений

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

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

emptyimg = rosmessage("sensor_msgs/Image","DataFormat","struct")
emptyimg = struct with fields:
    MessageType: 'sensor_msgs/Image'
         Header: [1x1 struct]
         Height: 0
          Width: 0
       Encoding: ''
    IsBigendian: 0
           Step: 0
           Data: [0x1 uint8]

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

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

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

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

imageFormatted = rosReadImage(img);

У оригинальное изображение есть кодировка 'rgb8'. По умолчанию rosReadImage возвращает изображение в стандартном 480 на 640 на 3 uint8 формат. Просмотрите это изображение используя imshow функция.

figure
imshow(imageFormatted)

Figure contains an axes. The axes contains an object of type image.

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

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

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

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

emptyimgcomp = rosmessage("sensor_msgs/CompressedImage","DataFormat","struct")
emptyimgcomp = struct with fields:
    MessageType: 'sensor_msgs/CompressedImage'
         Header: [1x1 struct]
         Format: ''
           Data: [0x1 uint8]

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

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

imgcomp
imgcomp = struct with fields:
    MessageType: 'sensor_msgs/CompressedImage'
         Header: [1x1 struct]
         Format: 'bgr8; jpeg compressed bgr8'
           Data: [30376x1 uint8]

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

compressedFormatted = rosReadImage(imgcomp);

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

figure
imshow(compressedFormatted)

Figure contains an axes. The axes contains an object of type image.

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

Облака точек

Облака точек могут быть захвачены различными датчиками, используемыми в робототехнике, включая LIDAR, Kinect ® и стереофотоаппараты. Самый распространенный тип сообщения в ROS для передачи облаков точек sensor_msgs/PointCloud2 и MATLAB предоставляет некоторые специализированные функции для работы с этими данными.

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

emptyptcloud = rosmessage("sensor_msgs/PointCloud2","DataFormat","struct")
emptyptcloud = struct with fields:
    MessageType: 'sensor_msgs/PointCloud2'
         Header: [1x1 struct]
         Height: 0
          Width: 0
         Fields: [0x1 struct]
    IsBigendian: 0
      PointStep: 0
        RowStep: 0
           Data: [0x1 uint8]
        IsDense: 0

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

ptcloud
ptcloud = struct with fields:
    MessageType: 'sensor_msgs/PointCloud2'
         Header: [1x1 struct]
         Height: 480
          Width: 640
         Fields: [4x1 struct]
    IsBigendian: 0
      PointStep: 32
        RowStep: 20480
           Data: [9830400x1 uint8]
        IsDense: 0

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

xyz = rosReadXYZ(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 каждой точке в облаке точек. Если эти значения цветов существуют, можно извлечь их с помощью вызова rosReadRGB.

rgb = rosReadRGB(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
      ⋮

Вы можете визуализировать облако точек с помощью rosPlot функция. rosPlot автоматически извлекает x ,y ,z координат и значений цвета RGB (если они существуют) и отобразить их на 3-D точечном графике. The rosPlot функция игнорирует все NaN x ,y ,z координат, даже если значения RGB существуют для этой точки.

figure
rosPlot(ptcloud)

Figure contains an axes. The axes with title Point Cloud contains an object of type scatter.