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