fix recorder

This commit is contained in:
remilia 2025-04-19 23:29:19 +08:00
parent b4239c3c74
commit 1900c0c528
5 changed files with 19 additions and 7 deletions

View File

@ -20,6 +20,7 @@ from flandre.nodes.ImageFFMPEG import ImageFFMPEG
from flandre.nodes.ImageQt import ImageQt from flandre.nodes.ImageQt import ImageQt
from flandre.nodes.Midi import Midi from flandre.nodes.Midi import Midi
from flandre.nodes.Mi import Mi from flandre.nodes.Mi import Mi
from flandre.nodes.Recorder import Recorder
from flandre.utils.Msg import KillMsg, NodeOnlineMsg, Msg1, Msg2 from flandre.utils.Msg import KillMsg, NodeOnlineMsg, Msg1, Msg2
from flandre.config import CONFIG_FOLDER from flandre.config import CONFIG_FOLDER
@ -31,6 +32,7 @@ class LaunchComponent(Enum):
Robot = Robot Robot = Robot
Loader = Loader Loader = Loader
Device = Device Device = Device
Recorder = Recorder
Beamformer = Beamformer Beamformer = Beamformer
ImageFFMPEG = ImageFFMPEG ImageFFMPEG = ImageFFMPEG
ImageQt = ImageQt ImageQt = ImageQt

View File

@ -84,6 +84,8 @@ class Beamformer(Node):
arg_msg: ImageArgMsg = Msg.decode_msg(r[:id2]) arg_msg: ImageArgMsg = Msg.decode_msg(r[:id2])
rf_frame_msg: RfFrameMsg = Msg.decode_msg(r[id2:]) rf_frame_msg: RfFrameMsg = Msg.decode_msg(r[id2:])
mat = RfMat.from_rf_frame(rf_frame_msg.rf_frame, 'gpu') mat = RfMat.from_rf_frame(rf_frame_msg.rf_frame, 'gpu')
if mat is None:
continue
if arg_msg.v2 != last_v2 or arg_msg.f_rows != last_f_rows: if arg_msg.v2 != last_v2 or arg_msg.f_rows != last_f_rows:
last_v2 = arg_msg.v2 last_v2 = arg_msg.v2
last_f_rows = arg_msg.f_rows last_f_rows = arg_msg.f_rows

View File

@ -29,6 +29,7 @@ class Muxer(Node):
self.play_mode: str | None = None self.play_mode: str | None = None
self.rep_socket: zmq.Socket = None self.rep_socket: zmq.Socket = None
self.req_driver_socket: zmq.Socket = None self.req_driver_socket: zmq.Socket = None
self.driver_pull_socket: zmq.Socket = None
self.playback_rf_msg: RfFrameMsg | None = None self.playback_rf_msg: RfFrameMsg | None = None
self.device_enabled = False self.device_enabled = False
self.driver_data_raw = b'' self.driver_data_raw = b''
@ -38,6 +39,8 @@ class Muxer(Node):
self.rep_socket: zmq.Socket = self.c.ctx.socket(zmq.REP) self.rep_socket: zmq.Socket = self.c.ctx.socket(zmq.REP)
self.rep_socket.bind(f'tcp://localhost:{C.muxer_rep_port}') self.rep_socket.bind(f'tcp://localhost:{C.muxer_rep_port}')
self.req_driver_socket: zmq.Socket = self.c.ctx.socket(zmq.REQ) self.req_driver_socket: zmq.Socket = self.c.ctx.socket(zmq.REQ)
# self.driver_pull_socket = self.c.ctx.socket(zmq.PULL)
# self.driver_pull_socket.connect(C.live_push_socket)
# self.req_driver_socket.connect(C.driver_rep_socket) # self.req_driver_socket.connect(C.driver_rep_socket)
self.req_driver_socket.connect(C.live_rep_socket) self.req_driver_socket.connect(C.live_rep_socket)
self.c.poller.register(self.rep_socket, zmq.POLLIN) self.c.poller.register(self.rep_socket, zmq.POLLIN)
@ -45,6 +48,9 @@ class Muxer(Node):
def p_thread(self): def p_thread(self):
while self.run_p_thread: while self.run_p_thread:
if self.play_mode == 'live': if self.play_mode == 'live':
# ii = self.driver_pull_socket.poll(timeout=1000)
# if ii > 0:
# self.driver_data_raw = self.driver_pull_socket.recv()
self.req_driver_socket.send(struct.pack('i', Device.magic) + struct.pack('i', DeviceCmd.GetData.value)) self.req_driver_socket.send(struct.pack('i', Device.magic) + struct.pack('i', DeviceCmd.GetData.value))
self.driver_data_raw = self.req_driver_socket.recv() self.driver_data_raw = self.req_driver_socket.recv()
else: else:

View File

@ -5,18 +5,17 @@ from pathlib import Path
import numpy as np import numpy as np
import zmq import zmq
from flandre.config import LIVE_SOCKET,C from flandre.config import C
from flandre.nodes.Node import Node from flandre.nodes.Node import Node
from flandre.utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg, \ from flandre.utils.Msg import ImageArgMsg, KillMsg, SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg, \
RfFrameWithMetaMsg, RequestRfFrameMsg, RecordFrameMsg, RobotRtsiMsg RequestRfFrameMsg, RecordFrameMsg, RobotRtsiMsg, SeqMetaMsg
from flandre.utils.RfFile import RfSequenceMeta from flandre.utils.RfMeta import RfFrameMeta, RfSequenceMeta
from flandre.utils.RfMeta import RfFrameMeta
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Recorder(Node): class Recorder(Node):
topics = [SetSeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg, RfFrameWithMetaMsg, RequestRfFrameMsg, topics = [SetSeqMetaMsg, SeqMetaMsg, SetPlayMode, SetDeviceConfigMsg, SetRecordMsg, RequestRfFrameMsg,
ImageArgMsg, RobotRtsiMsg] ImageArgMsg, RobotRtsiMsg]
def __init__(self, level=logging.INFO): def __init__(self, level=logging.INFO):
@ -34,12 +33,13 @@ class Recorder(Node):
) )
device_socket = self.context.socket(zmq.PULL) device_socket = self.context.socket(zmq.PULL)
self.c.poller.register(device_socket, zmq.POLLIN) self.c.poller.register(device_socket, zmq.POLLIN)
while True: while True:
socks = dict(self.c.poller.poll()) socks = dict(self.c.poller.poll())
for k in socks: for k in socks:
if k == device_socket: if k == device_socket:
buffer = device_socket.recv() buffer = device_socket.recv()
_, sequence_id, encoder = struct.unpack_from('=iqi', buffer) _, sequence_id, encoder = struct.unpack_from('=IQi', buffer)
s = buffer[4 + 8 + 4:] s = buffer[4 + 8 + 4:]
if self.seq_meta_live is not None and s.__len__() // 2 == np.prod(self.seq_meta_live.shape): if self.seq_meta_live is not None and s.__len__() // 2 == np.prod(self.seq_meta_live.shape):
(self.record_path / RfFrameMeta( (self.record_path / RfFrameMeta(
@ -64,7 +64,7 @@ class Recorder(Node):
if isinstance(msg, KillMsg): if isinstance(msg, KillMsg):
if msg.name == '': if msg.name == '':
return return
elif isinstance(msg, SetSeqMetaMsg): elif isinstance(msg, SeqMetaMsg):
match msg.target: match msg.target:
case 'live': case 'live':
self.seq_meta_live = RfSequenceMeta.from_name(msg.name) self.seq_meta_live = RfSequenceMeta.from_name(msg.name)

View File

@ -131,6 +131,8 @@ class RfMat:
seq_meta = frame.seq_meta seq_meta = frame.seq_meta
else: else:
raise NotImplementedError() raise NotImplementedError()
if seq_meta.prod() != frame.__bytes__().__len__() // 2:
return None
m = np.frombuffer(frame.__bytes__(), dtype=np.int16).reshape(seq_meta.shape).copy() m = np.frombuffer(frame.__bytes__(), dtype=np.int16).reshape(seq_meta.shape).copy()
if device == 'gpu': if device == 'gpu':
m = cp.asarray(m) m = cp.asarray(m)