2.8 KiB
Step 2 - Disaccoppiamento Capture / Inference
Obiettivo
Ridurre la serializzazione del loop principale separando:
- acquisizione video e campionamento metadati;
- inferenza, tracking e logica demo.
Lo scopo non e' introdurre ancora una pipeline completa multi-processo stile ROS, ma togliere dal percorso critico almeno la parte cap.read() e la preparazione del pacchetto frame.
Vincolo architetturale
Il frame consumato dall'inferenza non puo' essere un'immagine grezza isolata.
Ogni frame deve essere rappresentato da un pacchetto logico di acquisizione che congela nello stesso istante:
frame_idtimestampvideo_time_sec- immagine
- posa / stato del drone campionati nel momento di acquisizione
Questo segue il modello gia' fissato nei documenti di architettura:
capturenon inventa la posa;capturela campiona dalla sorgente di stato disponibile;inferenceconsuma unCapturedFramegia' coerente.
Nel contesto della demo video attuale non esiste ancora una posa SLAM reale. Quindi il campo posa verra' popolato con una posa simulata minima, ma congelata all'acquisizione, utile a:
- mantenere il contratto architetturale corretto;
- evitare che in futuro frame e stato si disallineino;
- propagare i metadati fino agli snapshot.
Struttura dati proposta
CapturedFrame
- frame_id
- timestamp
- video_time_sec
- frame
- pose
Dove pose e' un dizionario o struttura equivalente con almeno:
modeframe_idvideo_time_secscan_directionroute_progress_ratio
Il campo pose potra' essere sostituito piu' avanti da un provider reale SLAM / PX4 / odometria senza cambiare il contratto tra capture e inference.
Strategia di esecuzione
Capture worker
Un worker separato:
- legge da
VideoCapture - costruisce
CapturedFrame - pubblica solo l'ultimo frame disponibile
Inference / control loop
Il loop principale:
- legge l'ultimo
CapturedFrame - esegue YOLO, tracking e logica demo
- usa sempre i metadati congelati nel pacchetto
Regola di coda
La coda deve essere piccola:
- niente backlog lungo;
- meglio perdere frame che accumulare ritardo;
- politica
latest frame wins.
Impatto sul codice esistente
Nuove entita'
CapturedFrameCaptureWorker- helper
sample_demo_pose(...)
Oggetti da aggiornare
CandidateSnapshotNavigationSnapshot- metadata snapshot JSON
- observer telemetry, se utile, con riferimento alla posa dell'ultimo frame
Criteri di successo
- il core continua a produrre lo stesso comportamento funzionale della demo;
- inferenza e snapshot lavorano su frame con metadati coerenti;
cap.read()non sta piu' nel loop principale critico;- nessun backlog crescente;
- nessun blocco se il capture worker arriva piu' veloce o piu' lento del consumer.