Некоторые обычно используемые сообщения 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)
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)
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)
Большинство форматов изображения поддерживается для сжатого типа сообщения изображений. 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)