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