Kamera-Radar-Fusion · Anforderungsbasierte SiL-Validierung

Wahrnehmungssystem zur Hinderniserkennung (Kamera + Radar), validiert als Software-in-the-Loop: auf reproduzierbaren synthetischen Szenarien und auf realen nuScenes-Daten (reales Radar, reale Ground Truth).

GitHub Repository

Motivation

In der realen ADAS-Entwicklung entfällt der größte Teil des Aufwands auf das Testen und Validieren von Wahrnehmungssoftware, nicht allein auf deren Entwicklung. Dieses Projekt bildet genau diesen Workflow vollständig ab: von den Anforderungen über die Systemarchitektur bis zu einer automatisierten, anforderungsbasierten Validierungs-Pipeline mit CI/CD.

Der Fokus liegt bewusst auf der Validierung: der Wahrnehmungsalgorithmus (Kamera-Detektion, Radarverarbeitung, Fusion) ist das System under Test; das eigentliche Ergebnis ist eine reproduzierbare Validierungsumgebung mit rückverfolgbaren Anforderungen, automatisierten Metriken und CI/CD.

1 - Systemgrenze & Ansatz

Die Architektur trennt zwei klar abgegrenzte Teile: das System under Test (das Wahrnehmungssystem) und das Test Harness (die Validierungsumgebung). Diese Trennung spiegelt die reale ADAS-Entwicklung wider - die Wahrnehmungssoftware läuft im Fahrzeug, die Validierung läuft offline gegen annotierte Daten.

Die Validierung läuft in zwei Stufen:

  1. Synthetische SiL (umgesetzt): Ein Szenariogenerator mit festem Seed erzeugt bewegte Verkehrsteilnehmer mit exakt bekannter Ground Truth. Objektbasierte Kamera- und Radarmodelle bilden typische Sensorschwächen nach (Tiefenfehler, begrenzte Reichweite, mehrere Radarechos pro Fahrzeug, Clutter). Damit wird die Fusionslogik validiert, nicht die Sensoren selbst.
  2. Realdaten-SiL (teilweise umgesetzt): Radarpunkte und Annotationen werden aus nuScenes v1.0-mini abgespielt; die Radardaten werden auf den Kamerazeitstempel bewegungskompensiert. Die Kamera ist noch modelliert, da der Detektor noch fehlt. Parameter werden auf 5 Szenen eingestellt und auf 5 anderen einmalig geprüft.

In beiden Stufen wird die Ausgabe gegen die Ground Truth verglichen; Recall, Precision und Latenz werden automatisch berechnet und je Anforderung mit PASS/FAIL bewertet.

2 - Architektur (Capella / MBSE)

Die logische Architektur wurde in Capella (Arcadia / MBSE) modelliert. Sie zeigt die beiden getrennten Bereiche und die Component Exchanges zwischen den Blöcken.

Logische Architektur: Perception System und Test Harness

Der Data Loader liest wahlweise synthetische Szenarien oder nuScenes-Daten; Architektur und Validierung bleiben gleich.

BlockAufgabe
Data LoaderSensordaten einlesen, Kamera & Radar zeitlich synchronisieren
Camera PerceptionObjekte im Bild erkennen und klassifizieren (aktuell Platzhalter, Detektor geplant)
Radar ProcessingRadarechos zu Objekten clustern (Position, Geschwindigkeit, Konfidenz)
FusionKamera- und Radardetektionen per optimaler Datenassoziation zusammenführen
OutputHindernisliste filtern und strukturiert ausgeben
Ground TruthReferenzobjekte bereitstellen (synthetische Szenarien oder nuScenes-Annotationen, mit dokumentierten Bewertungsregeln)
Szenario & SensormodelleSynthetische Szenarien mit Ground Truth, objektbasierte Kamera- und Radarmodelle
ValidationRecall / Precision gegen Ground Truth (klassenbewusst, nach Konfidenz sortiert)
SiL-RunnerSzenario → System → Metriken → Urteil je Anforderung
Metrics ReportBericht (JSON / Markdown) bei jedem CI-Lauf veröffentlicht

3 - Datenmodell (Design → Code)

Die zwischen den Blöcken ausgetauschten Datenstrukturen wurden zuerst im Design festgelegt und als Python-dataclasses implementiert und mit Unit-Tests abgesichert.

Klassendiagramm der Datenstrukturen
@dataclass
class DetectedObject:
    object_class: str      # "car", "pedestrian", ...
    x: float               # longitudinale Position
    y: float               # laterale Position
    velocity: float        # Relativgeschwindigkeit
    confidence: float      # Detektionskonfidenz 0..1
    timestamp: float       # zugehöriger Frame

4 - Fusion: Datenassoziation

Kamera und Radar können dasselbe reale Objekt erfassen. Die Fusion ordnet Detektionen desselben Frames einander zu und übernimmt die Klasse von der Kamera sowie Position und Geschwindigkeit vom Radar.

Version 2, abgeleitet aus den Validierungsergebnissen:

Version 3, abgestimmt auf realen nuScenes-Daten (auf 5 Szenen eingestellt, auf 5 anderen einmalig geprüft):

Ablaufdiagramm der Fusionslogik

Ablauf der Version 1

5 - Anforderungen & Traceability

Jeder Test ist im Code mit seiner Anforderung markiert (@pytest.mark.requirement("REQ-XX")). Ein automatischer Test prüft bei jedem Lauf, dass die Traceability-Matrix exakt mit diesen Markierungen übereinstimmt.

Verifikationsstufen: L1 = Logik (Unit-Test), L2 = synthetische SiL, L3 = reale Daten. Nachweisregel: Ein Zielwert gilt nur als erfüllt, wenn das gesamte 95-%-Konfidenzintervall über dem Zielwert liegt.

Ergebnisse auf realen Daten: nuScenes v1.0-mini, nur Validierungsszenen (nie zum Einstellen verwendet), reales Radar, reale Ground Truth, modellierte Kamera.

IDAnforderungZielwertGemessen [95-%-KI]StufeStatus
REQ-04Reichweite RadarRecall > 0,5 (120–180 m)0,67 [0,21–0,94], n = 3L3⚠️ nicht schlüssig
REQ-05Reichweite GesamtsystemRecall > 0,5 (80–180 m)0,21 [0,13–0,31], n = 82L3❌
REQ-08Recall Fahrzeuge < 30 m≥ 0,900,78 [0,73–0,82], n = 318L3❌
REQ-09Precision≥ 0,800,47 [0,44–0,49]L3❌
REQ-10Latenz pro Frame≤ 100 ms2,1 ms (nur Fusionsstufe)L3⚠️ ohne Detektor
REQ-11nuScenes-Daten einlesen–alle 404 SamplesL3✅
REQ-12Synchronisation Kamera / Radar≤ 100 ms, bewegungskompensiertmax. 72 ms gemessenL1✅
REQ-03Reichweite Kamera≥ 80 m––❌ benötigt echten Kameradetektor

Das System erfüllt seine Anforderungen auf realen Daten nicht. Auf dem synthetischen Prüfstand erfüllte es sie (Precision 0,81, Recall 0,92), doch das synthetische Radarmodell hatte rund 40-mal weniger Clutter als das reale Radar. Die verbleibende Lücke ist eine Grenze der Architektur (keine zeitliche Verfolgung über mehrere Frames), keine Frage der Parametrierung.

REQ-04, REQ-05 und REQ-12 wurden auf Basis der Messungen präzisiert; die Änderungen sind im Repository mit Begründung versioniert.

6 - Was die Validierung gefunden hat

Jeder der folgenden Fehler wurde von der Validierungsumgebung selbst gefunden, mit einem Test reproduziert und in einem eigenen Commit behoben.

BefundWie gefundenBehebung
Matrix meldete Anforderungen als verifiziert durch Tests, die nicht fehlschlagen konntenFrage an jeden Test: „Schlägt er fehl, wenn die Anforderung verletzt ist?"Ehrliche Verifikationsstufen (L1 / L2 / L3)
Metriken ignorierten Klassen und hingen von der Listenreihenfolge abGezielte GegenbeispieleKlassenbewusste, nach Konfidenz sortierte Zuordnung
Precision 0,50: jedes Radarecho wurde ein eigenes ObjektErster SiL-Lauf, dann Ein-Fahrzeug-ExperimentClustering der Radarechos
Feste 3-m-Schwelle trennte ferne Objekte (46 % bei 75 m)Experiment über die EntfernungUngarischer Algorithmus, entfernungsabhängige Schwelle
Zeitstempel dokumentiert geprüft, aber nie geprüftDetektion aus fremdem Frame fusioniertSynchronizationError (REQ-12)
Ergebnisse schwankten leicht zwischen Läufen und RechnernGleicher Seed, anderer PYTHONHASHSEEDDeterministische Reihenfolge, prozessübergreifender Test
Handgepflegte Matrix wich vom Code abAutomatischer Abgleich mit den Test-MarkierungenMatrix wird bei jedem Testlauf geprüft
Synthetische Ergebnisse waren nicht übertragbar: Precision 0,81 synthetisch, 0,08 mit realem RadarErster Lauf mit realen nuScenes-RadardatenAnforderungsnachweis auf reale Daten (L3) verlagert; synthetischer Prüfstand nur noch als Logik-Regressionstest
Ein Zuordnungsschwellwert von 5 m ließ unabhängige Detektionen Fahrzeuge „finden" (Zufallsniveau 60–68 %)Gleiche Detektionen gegen die Ground Truth eines fremden FramesEinheitlich 2 m, Zufallsniveau wird mit ausgewiesen
Mit realem Radar war die Fusion schlechter als die Kamera alleinKontrollierte Experimente (Radar aus, Gate-Form)Elliptisches Gate, unbestätigte Radarobjekte müssen sich bewegen
REQ-04, REQ-05 und REQ-12 waren in ihrer Formulierung nicht prüfbarReale SensordatenAnforderungen präzisiert, mit Änderungshistorie

Auf dem synthetischen Prüfstand:

VersionPrecision (REQ-09)Recall < 30 m (REQ-08)
Ausgangsstand0,50 ❌0,97
+ Clustering der Radarechos0,76 ❌0,93
+ optimale Zuordnung, entfernungsabhängige Schwelle0,81 ✅0,92

Auf realen Daten (Validierungsszenen):

KonfigurationPrecision (REQ-09)Recall < 30 m (REQ-08)Recall 80–180 m (REQ-05)
Vorher (auf synthetischen Daten eingestellt)0,07 ❌0,68 ❌0,62
Jetzt (auf realen Daten eingestellt)0,47 ❌0,78 ❌0,21 ❌
Kamera allein (modelliert, Referenz)0,700,810,00

7 - Projektmanagement

Das Projekt wird mit GitHub Issues und einem Kanban-Board organisiert (Todo / In Progress / Done), der frei verfügbaren Entsprechung eines Jira-Boards. Entwickelt wird über Feature-Branches und Pull Requests; main bleibt jederzeit stabil.

GitHub Project Board (Kanban)
Git-Workflow mit Feature-Branches und Pull Requests

8 - Aktueller Stand

KomponenteTechnologieStatus
Requirements-SpezifikationID-basiert, rückverfolgbar, mit Änderungshistorie✅
SystemarchitekturCapella / MBSE✅
Detailed DesignDatenstrukturen, Klassendiagramm✅
Blöcke (Loader, Radar, Fusion, Output)Python✅
nuScenes-AnbindungEigener Loader (JSON, PCD), Koordinatentransformationen, Bewegungskompensation✅
Realdaten-SiLReales Radar + reale Ground Truth, Konfidenzintervalle, Zufallsniveau, Tune/Validate-Aufteilung✅
Synthetische SiLLogik-Regressionstest (Sensormodelle nicht kalibriert)✅
Validation & MetrikenRecall / Precision, TP/FP/FN, Urteil je Anforderung✅
Tests135 Tests: 127 in der CI, 8 benötigen nuScenes-Daten (lokal)✅
Traceabilitypytest-Marker + automatisch geprüfte Matrix✅
CI/CDGitHub Actions, Validierungsbericht je Lauf✅
ReproduzierbarkeitProzess- und plattformübergreifend geprüft✅
Git WorkflowFeature-Branches, Pull Requests✅
Zeitliche Verfolgung (Tracking)Bestätigung statischer Objekte über mehrere Frames🚧 nächster Schritt
Kamera-DetektorErsetzt das Kameramodell🚧 geplant
DockerContainerisierte Läufe🚧 geplant

Hinweis: Die Ergebnisse auf realen Daten nutzen noch eine modellierte Kamera und nuScenes v1.0-mini (10 Szenen, urban, ≤ 55 km/h). Sie zeigen, dass die aktuelle Architektur ohne zeitliche Verfolgung die Anforderungen nicht erfüllt; die Ursachen sind gemessen und dokumentiert.