Некоторые обычно используемые сообщения 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)