Сообщения 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
