Некоторые обычно используемые сообщения ROS хранят данные в формате, требующем некоторого преобразования, прежде чем их можно будет использовать для дальнейшей обработки. MATLAB ® поможет вам форматировать эти специализированные сообщения ROS для удобства использования. В этом примере показано, как обрабатываются типы сообщений для лазерного сканирования, несжатые и сжатые изображения и облака точек.
Предпосылки: Работа с основными сообщениями ROS
Загрузите несколько примеров сообщений. Эти сообщения заполняются данными, собранными с различных датчиков робототехники.
load('specialROSMessageData.mat')Лазерные сканеры обычно используются в робототехнике. Стандартный формат АФК для сообщения лазерного сканирования можно просмотреть, создав пустое сообщение соответствующего типа.
Использовать 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)
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-by-640-by-3 uint8 формат. Просмотр этого изображения с помощью imshow функция.
figure imshow(imageFormatted)

MATLAB ® поддерживает все форматы кодирования изображений ROS, иrosReadImage обрабатывает сложность преобразования данных изображения. Помимо цветных изображений, MATLAB также поддерживает монохроматические и глубинные изображения.
Многие системы АФК отправляют свои данные изображения в сжатом формате. 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)

Большинство форматов изображения поддерживается для типа сжатых сообщений изображения. 16UC1 и 32FC1 кодировки не поддерживаются для сжатых изображений глубины. Поддерживаются монохроматическое и цветное кодирование изображения.
Точечные облака могут захватываться различными датчиками, используемыми в робототехнике, включая LIDAR, Kinect ® и стереокамеры. Наиболее распространенным типом сообщений в АФК для передачи облаков точек является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. rosPlot функция игнорирует все NaN x,y,Координаты z, даже если для этой точки существуют значения RGB.
figure rosPlot(ptcloud)
