Некоторые обычно используемые сообщения ROS хранят данные в формате, который требует некоторого преобразования, прежде чем это сможет использоваться для последующей обработки. MATLAB® может помочь, вы путем форматирования их специализировали сообщения ROS для легкого использования. В этом примере можно исследовать, как обработаны типы сообщений для лазерных сканирований, несжатых и сжатых изображений и облак точек.
Предпосылки: работа с основными сообщениями ROS
Во-первых, загрузите некоторые демонстрационные сообщения, которые будут использоваться в этом примере. Эти сообщения заполняются с данными, собранными от различных датчиков робототехники.
Вызовите exampleHelperROSLoadMessages
, чтобы загрузить сообщения.
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
[640x1] массив расстояний препятствия, которые были зарегистрированы в маленьком угловом шаге.
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);
Это возвращает список координат [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
возвращает изображение в стандарте 480x640x3 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 (если они будут существовать), и покажите им в 3D графике рассеивания. Функция
scatter3
игнорирует все координаты NaN
[x,y,z]
, даже если значения RGB существуют для той точки.
figure scatter3(ptcloud)