Сообщения Velodyne ROS хранят данные в формате, который требует некоторой интерпретации, прежде чем это сможет использоваться для последующей обработки. MATLAB® может помочь вам путем форматирования сообщений Velodyne ROS для легкого использования. В этом примере можно исследовать как VelodyneScan
сообщения от Velodyne LiDAR обработаны.
Необходимые условия: работа с основными сообщениями ROS
Выборка загрузки сообщения Velodyne. Эти сообщения заполняются с данными, собранными от датчика Velodyne LiDAR.
load("lidarData_ConstructionRoad.mat")
VelodyneScan
сообщения являются сообщениями ROS, которые содержат пакеты Скана лидара Velodyne. Вы видите стандартный формат ROS для VelodyneScan
сообщение путем создания пустого сообщения соответствующего типа. Используйте сообщения в формате структуры для лучшей эффективности.
emptyveloScan = rosmessage("velodyne_msgs/VelodyneScan","DataFormat","struct")
emptyveloScan = struct with fields:
MessageType: 'velodyne_msgs/VelodyneScan'
Header: [1x1 struct]
Packets: [0x1 struct]
Поскольку вы создали пустое сообщение, emptyveloScan
не содержит значимых данных. Для удобства, загруженного lidarData_ConstructionRoad.mat
файл содержит набор VelodyneScan
сообщения, которые полностью заполняются и хранятся в msgs
переменная. Каждый элемент в msgs
массивом ячеек является VelodyneScan
Struct сообщения ROS. Первичные данные в каждом VelodyneScan
сообщение находится в Packets
свойство, это содержит несколько VelodynePacket
сообщения. Вы видите стандартный формат ROS для сообщения VelodynePacket путем создания пустого сообщения соответствующего типа.
emptyveloPkt = rosmessage("velodyne_msgs/VelodynePacket","DataFormat","struct")
emptyveloPkt = struct with fields:
MessageType: 'velodyne_msgs/VelodynePacket'
Stamp: [1x1 struct]
Data: [1206x1 uint8]
velodyneROSMessageReader
объект считывает данные об облаке точек из VelodyneScan
ROS обменивается сообщениями на основе их заданного типа модели. Обратите внимание на то, что обеспечение неправильной модели устройства может привести к неправильно калиброванным облакам точек. Этот пример использует сообщения от "HDL32E"
модель.
veloReader = velodyneROSMessageReader(msgs,"HDL32E")
veloReader = velodyneROSMessageReader with properties: VelodyneMessages: {28x1 cell} DeviceModel: 'HDL32E' CalibrationFile: '/mathworks/devel/bat/BR2021bd/build/matlab/toolbox/shared/pointclouds/utilities/velodyneFileReaderConfiguration/HDL32E.xml' NumberOfFrames: 55 Duration: 2.7477 sec StartTime: 1145.2 sec EndTime: 1147.9 sec Timestamps: [1145.2 sec 1145.2 sec 1145.3 sec ... ] CurrentTime: 1145.2 sec
Можно извлечь облака точек из необработанного пакетного сообщения с помощью этого velodyneROSMessageReader
объект. Путем обеспечения определенного номера системы координат или метки времени, одно облако точек может быть извлечено из velodyneROSMessageReader
объект с помощью readFrame
объектная функция. Если вы вызываете readFrame
без номера системы координат или метки времени, это извлекает облако следующего вопроса в последовательности на основе CurrentTime
свойство.
Создайте скаляр длительности, который представляет спустя одну секунду после первого чтения облака точек.
timeDuration = veloReader.StartTime + seconds(1);
Считайте первое облако точек, зарегистрированное в или после данной длительности времени.
ptCloudObj = readFrame(veloReader,timeDuration);
Доступ к Location
данные в облаке точек.
ptCloudLoc = ptCloudObj.Location;
Сбросьте CurrentTime
свойство veloReader
к значению по умолчанию
reset(veloReader)
Можно также циклично выполниться через все облака точек в сообщениях входа Velodyne ROS.
Задайте x-, y-, и пределы осей z для pcplayer
в метрах. Подпишите оси.
xlimits = [-60 60]; ylimits = [-60 60]; zlimits = [-20 20];
Создайте проигрыватель облака точек.
player = pcplayer(xlimits,ylimits,zlimits);
Подпишите оси.
xlabel(player.Axes,"X (m)"); ylabel(player.Axes,"Y (m)"); zlabel(player.Axes,"Z (m)");
Первое облако точек интереса получено в 0,3 секунды во входные сигналы. Установите CurrentTime
свойство к тому времени, чтобы начать читать облака точек оттуда.
veloReader.CurrentTime = veloReader.StartTime + seconds(0.3);
Отобразите поток облака точек в течение 2 секунд. Чтобы проверять, доступна ли новая система координат и продолжает прошлые 2 секунды, удалите последний while
условие. Выполните итерации через файл путем вызова readFrame
читать в облаках точек. Отобразите их использующий проигрыватель облака точек.
while(hasFrame(veloReader) && isOpen(player) && (veloReader.CurrentTime < veloReader.StartTime + seconds(2))) ptCloudObj = readFrame(veloReader); view(player,ptCloudObj.Location,ptCloudObj.Intensity); pause(0.1); end