swarmflow op• Datenarten: table → table
• Aufruf: import fullseye as fs; fs.ledger.obstacle_fit_doublet(field, speed=None, upstream_only: 'bool' = False, exclude_margin: 'float' = 1.25, min_explained: 'float' = 0.5, min_radius=None) -> 'dict' (die Implementierung direkt: import swarmflow; swarmflow.obstacle_fit_doublet(field, speed=None, upstream_only: 'bool' = False, exclude_margin: 'float' = 1.25, min_explained: 'float' = 0.5, min_radius=None) -> 'dict'; aus dem Register: opsdrive.get("obstacle_fit_doublet"))
Passt die Potentialströmung um einen Zylinder u − i v = U (1 − R²/(z − z_c)²) an das Geschwindigkeitsfeld an (Implementierung 2, 2-D nichtlineare kleinste Quadrate).
Unbekannte sind (x_c, y_c, R², U). Zwei Startpunkte: stagnation_from_centerline und eine grobe Suche mit den Gitterknoten als Mittelpunktkandidaten (bei festem U ist das Modell linear in R² und daher geschlossen lösbar). Genommen wird der mit dem größeren erklärten Anteil. Gitterpunkte innerhalb des exclude_margin-Fachen des Kreises werden nicht verwendet (weil der Kern, der auf das Gitter überträgt, die Wand überspannt und die Geschwindigkeit ausmittelt) —— neu schätzen und 3-mal iterieren. Mit upstream_only wird nur mit Gitterpunkten stromaufwärts des Auftreffpunkts (x < x_c − R) angepasst (lässt es sich „vor dem Aufprall“ erkennen?).
Entscheidung: Bezogen auf das Residuum RSS₀ eines reinen Parallelströmungsmodells (u, v konstant) ist der vom Zylindermodell reduzierte Anteil 1 − RSS₁/RSS₀ (der Anteil der Störung, der durch den Zylinder erklärt wird) mindestens min_explained, der Radius mindestens min_radius (Standard = 2 Gitterabstände), und der Mittelpunkt liegt im Feld —— diese 3 ergeben detected. Ein negatives Urteil (kein Hindernis) ergibt sich daraus, dass dieser Anteil klein ist. ★Die Untergrenze des Radius ist die Auflösungsgrenze: Das Gitter von swarm_field_from_tracks hat den Individuenabstand s, daher werden standardmäßig Hindernisse mit R < 2s nicht als „vorhanden“ gemeldet. Dass die Ablehnung berechtigt ist, wurde durch Messung bestätigt (gleichmäßig verteilte Partikel, R = 0.6 m: bei R/s ≈ 5 Mittelpunkt und Radius beide innerhalb 2 %, bei R/s ≈ 2.5 innerhalb 5 %, bei R/s ≈ 1.2 fällt der Radius 48 % zu klein aus).
Returns:
dict: center, radius, speed, stagnation, explained, detected, n_used, rms_residual
(m/s), rms_null (m/s).
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.
• poc_swarm_obstacle_from_flow — py -3.11 examples/poc_swarm_obstacle_from_flow.py
table als Eingabe)course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same
swarmflow)sph_kernel · sph_density_pressure · swarm_simulate · swarm_render_overhead · swarm_field_from_tracks · swarm_field_from_piv · potential_flow_cylinder · velocity_deficit_map
*Provenance: swarmflow.py — DRIVE Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.