More stable version ig

This commit is contained in:
BOTAlex 2025-03-07 22:01:25 +01:00
parent b6044d2276
commit 28e2204ce1
2 changed files with 36 additions and 30 deletions

View File

@ -19,7 +19,7 @@ from .DataPacket import PacketHeader # Python imports stupid. missed a single ".
WAIT_TIME = 0.1 WAIT_TIME = 0.1
IMAGE_BUFFER_SIZE = 1024 IMAGE_BUFFER_SIZE = 1024
NUM_FRAGMENTS = 12 NUM_MAX_FRAGMENTS = 12
HEADER_FORMAT = "iiii" HEADER_FORMAT = "iiii"
RED = "\033[91m" RED = "\033[91m"
@ -50,10 +50,10 @@ class UDP_Camera(ICameraSource):
self.host = "0.0.0.0" self.host = "0.0.0.0"
self.port = 3333 self.port = 3333
self.num_loaded = 0 self.num_loaded = 0
self.packets = [None] * NUM_FRAGMENTS self.packets = [None] * NUM_MAX_FRAGMENTS
self.headerSize = struct.calcsize(HEADER_FORMAT) self.headerSize = struct.calcsize(HEADER_FORMAT)
self.rawDataBuffer = np.zeros(IMAGE_BUFFER_SIZE + self.headerSize, dtype=np.uint8) self.rawDataBuffer = np.zeros(IMAGE_BUFFER_SIZE + self.headerSize, dtype=np.uint8)
self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_FRAGMENTS, dtype=np.uint8) self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_MAX_FRAGMENTS, dtype=np.uint8)
self.imageBuffView = memoryview(self.rawFullDataBuffer) self.imageBuffView = memoryview(self.rawFullDataBuffer)
self.currentFrameNum = 0 self.currentFrameNum = 0
self.totalDataSize = 0 self.totalDataSize = 0
@ -86,12 +86,12 @@ class UDP_Camera(ICameraSource):
# print(f"Packet {packet.id}: {offset}->{offset + packet.image_buf_size}") # print(f"Packet {packet.id}: {offset}->{offset + packet.image_buf_size}")
def resetImageBuffer(self): def resetImageBuffer(self):
self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_FRAGMENTS, dtype=np.uint8) self.rawFullDataBuffer = np.zeros(IMAGE_BUFFER_SIZE*NUM_MAX_FRAGMENTS, dtype=np.uint8)
def handle_packet(self, dataSize, senderAddr): def handle_packet(self, dataSize, senderAddr):
bufferView = memoryview(self.rawDataBuffer) bufferView = memoryview(self.rawDataBuffer)
packet = PacketHeader(HEADER_FORMAT, bufferView, dataSize) packet = PacketHeader(HEADER_FORMAT, bufferView, dataSize)
if packet.id < 0 or packet.id >= NUM_FRAGMENTS: if packet.id < 0 or packet.id >= NUM_MAX_FRAGMENTS:
return return
# Send acknowledgment # Send acknowledgment
@ -102,35 +102,34 @@ class UDP_Camera(ICameraSource):
# self.sock.sendto(f"ERR".encode(), senderAddr) # self.sock.sendto(f"ERR".encode(), senderAddr)
if (packet.id == 0 or packet.frame_num != self.currentFrameNum): if (packet.id == 0 or packet.frame_num != self.currentFrameNum):
self.packets: list[PacketHeader|None] = [None] * packet.totalPackets # Reset packets self.packets: list[PacketHeader|None] = [None] * NUM_MAX_FRAGMENTS # Reset packets
self.num_loaded = 0 self.num_loaded = 0
self.currentFrameNum = packet.frame_num self.currentFrameNum = packet.frame_num
self.rawFullDataBuffer[:] = 0 self.rawFullDataBuffer[:] = 0
# print(f"Reset frame capture. total packets: {packet.totalPackets}") # print(f"Reset frame capture. total packets: {packet.totalPackets}")
if (packet.id < len(self.packets) # if self.packets[0] is not None:
and self.packets[packet.id] is None # print(f"Got packet id: {packet.id} (total: {self.packets[0].totalPackets} loaded: {self.num_loaded})")
and self.packets[0] is not None
if (self.packets is not None
and self.currentFrameNum == packet.frame_num and self.currentFrameNum == packet.frame_num
and self.packets[0] is not None
and not packet in self.packets
or packet.id == 0): or packet.id == 0):
self.num_loaded += 1 self.num_loaded += 1
self.packets[packet.id] = packet self.packets[packet.id] = packet
self.saveDataToBuff(bufferView, packet) self.saveDataToBuff(bufferView, packet)
# if self.packets[0] is not None: if (packet.id < len(self.packets) and self.packets[0] is not None and self.num_loaded >= self.packets[0].totalPackets
# print(f"Got packet id: {packet.id} (total: {self.packets[0].totalPackets} loaded: {self.num_loaded})") or self.num_loaded >= NUM_MAX_FRAGMENTS):
# if self.packets[0] is not None: # if self.packets[0] is not None:
# formatted_list = "[" + ", ".join(f"{RED}x{RESET}" if item is None else f"{GREEN}x{RESET}" for item in self.packets[:self.packets[0].totalPackets]) + "]" # formatted_list = "[" + ", ".join(f"{RED}x{RESET}" if item is None else f"{GREEN}x{RESET}" for item in self.packets[:self.packets[0].totalPackets]) + "]"
# print(formatted_list) # print(formatted_list)
if (self.packets[0] is not None and self.num_loaded >= self.packets[0].totalPackets
or self.num_loaded >= NUM_FRAGMENTS):
self.process_and_push_image() self.process_and_push_image()
self.num_loaded = 0 self.num_loaded = 0
self.packets: list[PacketHeader|None] = [None] * NUM_FRAGMENTS # Reset packets self.packets: list[PacketHeader|None] = [None] * NUM_MAX_FRAGMENTS # Reset packets
self.rawFullDataBuffer[:] = 0 self.rawFullDataBuffer[:] = 0

View File

@ -240,19 +240,26 @@ class Camera(ICameraSource):
current_frame_time = time.time() current_frame_time = time.time()
delta_time = current_frame_time - self.last_frame_time delta_time = current_frame_time - self.last_frame_time
self.last_frame_time = current_frame_time self.last_frame_time = current_frame_time
self.fps = (self.fps + self.pf_fps) / 2
self.newft = time.time() # Avoid division by zero
self.fps = 1 / (self.newft - self.prevft) if delta_time > 0:
self.prevft = self.newft fps = 1.0 / delta_time
self.fps = int(self.fps)
if len(self.fl) < 60:
self.fl.append(self.fps)
else: else:
self.fl.pop(0) fps = 0
self.fl.append(self.fps)
# Smooth the FPS using a moving average
self.fl.append(fps)
if len(self.fl) > 60:
self.fl.pop(0) # Keep the list length constant
# Compute average FPS
self.fps = sum(self.fl) / len(self.fl) self.fps = sum(self.fl) / len(self.fl)
# Compute bandwidth per second (bps)
self.bps = image.nbytes * self.fps self.bps = image.nbytes * self.fps
self.frame_number = self.frame_number + 1
# Increment frame count
self.frame_number += 1
if should_push: if should_push:
self.push_image_to_queue(image, self.frame_number, self.fps) self.push_image_to_queue(image, self.frame_number, self.fps)
except Exception: except Exception: