scene_service.scene_graph.geometric_loop

Fast geometric relation loop.

Produces the one metric, robot-actionable relation geometry still owns under the VLM-primary scene graph — reachable_by (a real 3D gripper→object distance) — at a high rate so it reaches Pilot within ~1-2 s of an object stabilizing, independent of (and far faster than) the LLM scene-graph builder. Writes the geometric slice (nodes + edges) into SceneGraphStore; the image-grounded builder fills the relational + semantic edges asynchronously.

Contact/containment (on_top_of/under/inside/contains) is no longer computed here: the AABB tests misfired on full-volume boxes and same-surface objects, so the image-grounded VLM owns those now. near is not emitted as an edge either — proximity is served as a query (get_object_context.nearby_objects).

Classes

GeometricRelationLoop(registry, store, *[, ...])

High-rate geometric relation producer; owns the store's geometric slice.

class scene_service.scene_graph.geometric_loop.GeometricRelationLoop(registry, store: SceneGraphStore, *, hz: float | None = None, min_observations: int | None = None)[source]

Bases: object

High-rate geometric relation producer; owns the store’s geometric slice.

Each tick recomputes contact/containment + reachable_by from the registry and runs the result through a debounce hysteresis band so EMA pose jitter (object_registry alpha=0.3) does not flicker the graph, while keeping emission latency under ~1 s. Read path: callers use SceneGraphStore.get_snapshot(); this loop only writes.

async start() None[source]
async stop() None[source]