Работа со специализированными сообщениями 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 object. The axes object 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]

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

imageFormatted = rosReadImage(img);

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

figure
imshow(imageFormatted)

Figure contains an axes object. The axes object 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 переменная, которая была получена камерой. 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 object. The axes object contains an object of type image.

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

Облака точек

Облака точек могут быть получены множеством датчиков, используемых в робототехнике, включая ЛИДАРЫ, 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-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 точечном графике. rosPlot функция игнорирует весь NaN x,y,z координаты, даже если значения RGB существуют для той точки.

figure
rosPlot(ptcloud)

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