import datetime
|
import queue
|
from socketserver import BaseRequestHandler, UDPServer
|
import time
|
import os, sys
|
import open3d as o3d
|
from multiprocessing import Pool
|
import numpy as np
|
import threading
|
|
from ..utils.tools import file_fliter, write_ply
|
from .servers import MicroWaveReceiver,MicroWaveUDPThread
|
from .parsers import MicroWaveParser
|
|
|
def udp_get_tool(microwaveHost,packetThreshold,deviceName,saveFolder,subFolder):
|
|
# host = ''
|
# host = '192.168.2.65' # use this host to get the udp data from microwave device
|
port = 9911
|
udp_queue = queue.Queue()
|
udp_get_stop = threading.Event()
|
|
if subFolder is not None:
|
path = os.path.join(saveFolder,subFolder)
|
else:
|
start = datetime.datetime.now()
|
path = os.path.join(saveFolder,f"{deviceName}-{start.strftime('%Y-%m-%d-%H-%M-%S')}")
|
if not os.path.exists(path):
|
os.makedirs(path)
|
|
udp_thread = MicroWaveUDPThread(MicrowaveHost=microwaveHost,
|
MicrowavePort=port,
|
udp_queue=udp_queue,
|
udp_get_stop=udp_get_stop,
|
packet_threshold=packetThreshold,
|
timeusage_threshold=None)
|
|
udp_thread.setDaemon(True)
|
udp_thread.setName("UDPGet_Thread")
|
|
print(time.asctime(),'Server started on port', port)
|
print('....')
|
print('ctrl-c to quit server.')
|
try:
|
udp_thread.start()
|
|
run = True
|
|
while run:
|
packed_count = 0
|
while not udp_queue.empty():
|
value = udp_queue.get()
|
if value is not False:
|
time_tag = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
|
with ('{}/{}_packet{}.udp'.format(path,time_tag,packed_count), 'wb') as f:
|
f.write(udp_queue.get())
|
packed_count += 1
|
else:
|
run = False
|
|
except KeyboardInterrupt:
|
udp_get_stop.set()
|
print(time.asctime(),"Server Stopped")
|
except:
|
udp_get_stop.set()
|
print(time.asctime(),"Server Stopped with unknown reasons")
|
|
# udp2bin
|
def udp2bin_tool(udp_folder_Or_list):
|
Save = True
|
bin_list = []
|
|
if isinstance(udp_folder_Or_list, list):
|
udp_files = udp_folder_Or_list
|
Save = False
|
else:
|
UDPfolder = udp_folder_Or_list
|
# example pod1-2022-02-21-13-25-03_packet125.udp --> 125
|
sort_lambda = lambda x:int(x.split('packet')[-1][:-4])
|
udp_files = file_fliter(UDPfolder,'udp', sort_lambda)
|
Save = True
|
|
receiver = MicroWaveReceiver()
|
|
|
for file in udp_files:
|
data = None
|
if isinstance(file,str):
|
filename = os.path.join(UDPfolder, file)
|
with open(filename, "rb") as f:
|
data = f.read()
|
else:
|
data = file
|
|
receiver.AddBuf(data)
|
if receiver.DataFrameReady:
|
frame_number = receiver.Header.FrameNumber
|
if Save:
|
bin_name = os.path.join(UDPfolder, "{}.bin".format(frame_number))
|
print(time.asctime(),"Frame {} ready".format(frame_number))
|
with open(bin_name, "wb") as bin_file:
|
bin_file.write(receiver.DataFrame)
|
bin_file.close()
|
|
bin_list.append((frame_number,receiver.DataFrame))
|
|
return bin_list
|
|
def bin2ply_f(folder,file):
|
|
with open(os.path.join(folder,file), "rb") as bin_file:
|
print(f"Extracting the data in {file} ...")
|
buf = bin_file.read()
|
buf_data = MicroWaveParser.ParserFrame(buf)
|
for frame in buf_data:
|
|
Frame_id = frame[0]
|
FrameNumber = frame[1]
|
point_cloud = np.array(frame[2])
|
if len(point_cloud) == 0 :
|
print(f"Notice: Frame {FrameNumber} is empty!")
|
else:
|
write_ply(point_cloud,folder,str(FrameNumber))
|
|
# bin2ply
|
def bin2ply_tool(folder,nums_worker = 4):
|
pool = Pool(processes = nums_worker)
|
|
bin_files = file_fliter(folder,'bin')
|
|
for file in bin_files:
|
pool.apply_async(func=bin2ply_f,args=(folder,file,))
|
|
pool.close()
|
pool.join()
|
|
|
def plot_ply(path):
|
if isinstance(path,str):
|
abspath = os.path.abspath(path)
|
else:
|
raise ValueError("Not a path!")
|
|
if os.path.isdir(abspath):
|
# open folder to load all ply files
|
ply_files = file_fliter(abspath,'ply')
|
show = []
|
for ply in ply_files:
|
pcd = o3d.io.read_point_cloud(os.path.join(abspath,ply))
|
show.append(pcd)
|
else:
|
show = [o3d.io.read_point_cloud(abspath)]
|
|
o3d.visualization.draw_geometries(show)
|
return
|