|
from tkinter import Frame
|
from .components import *
|
from .constants import *
|
from ctypes import sizeof, string_at
|
|
perDetectionBytes = 8
|
perTrackerBytes = 32
|
|
class MicroWaveParser:
|
@classmethod
|
def ParserFrame(cls, buffer: bytes) -> list:
|
"""
|
解析完整的帧数据,数据包括数据头,数据体,数据尾,返回点云数组
|
"""
|
buffer_size = len(buffer)
|
frame_start = 0
|
frame_end = 0
|
frame_id = 0
|
|
ply_data_list = []
|
|
while frame_start < buffer_size:
|
# process the current frame
|
header = HeaderBlock(buffer[frame_start:frame_start+sizeof(HeaderBlock)])
|
if HEADER_MAGIC == string_at(header.Magic, 8):
|
numsDetection = header.NumberOfDetection
|
numsTracker = header.NumberOfTrack
|
|
# get the end point of the current frame
|
frame_end = frame_start + \
|
sizeof(HeaderBlock) + \
|
numsDetection * perDetectionBytes + \
|
numsTracker * perTrackerBytes + \
|
sizeof(FooterBlock)
|
|
if frame_end <= buffer_size:
|
# get the frame data and footer data
|
frame = buffer[frame_start:frame_end]
|
footer = FooterBlock(frame[-sizeof(FooterBlock):])
|
# get the cloud point data
|
point_cloud = []
|
|
for i in range(numsDetection):
|
|
point_data = frame[i * 8 + sizeof(HeaderBlock): (i + 1) * 8 + sizeof(HeaderBlock)]
|
detection = DetectionBlock(header, footer, point_data)
|
point = [detection.X, detection.Y, detection.Z]
|
point_cloud.append(point)
|
|
# append the point cloud data to the list
|
ply_data_list.append([frame_id, header.FrameNumber, point_cloud])
|
|
# update the parameters for next frame in the while loop
|
frame_id += 1
|
frame_start = frame_end
|
else:
|
raise ValueError("wrong header magic code for microwave data")
|
|
return ply_data_list
|