Part of #83.
Build an assembly-line scene: an operator (COCO-17 skeleton) moves along a line of 4-5 fixed workstations while 4-5 cameras give overlapping coverage of the line. Analytic geometry only (no renderer).
Scope
- New scene builder, e.g.
src/multicam_sim/assembly_line.py (build_assembly_line_scene(seed=0, fps=..., ...) -> Scene) mirroring mtmc.build_mtmc_scene and examples/assembly_station.py.
- Workstations in 3D along the line, domain-neutral ids:
station_1 (frame/base), station_2 (subassembly), station_3 (fasten), station_4 (inspect), station_5 (pack) — names illustrative; keep them generic. Use topology.Station + TransitEdge for adjacency/transit time down the line.
- Camera rig via
dsl/rig.CameraRig — overlapping FOVs over the line (start from .ring(...) for guaranteed overlap; a .stations(...)/.custom(...) layout with deliberate overlap between adjacent stations is the stretch goal).
- Operator motion via the
dsl/motion path DSL: walk station_1 -> station_2 -> ... -> station_5 with a dwell (pause = the operation) at each station. Chain with .then(...), pace with .at_speed(...).
- Emit the standard manifest (calibration + per-cam projection +
in_view/visible) plus the topology field.
Acceptance
build_assembly_line_scene() is deterministic (byte-stable manifest for a fixed seed), with a golden/round-trip test in the repo style.
- The operator is
in_view on at least two cameras simultaneously during station-to-station transits (proves overlap).
- Pure typed pydantic, mypy-strict clean, ruff clean. No renderer/GL dependency.
Pointers
src/multicam_sim/mtmc.py, examples/assembly_station.py, src/multicam_sim/dsl/rig.py, src/multicam_sim/dsl/motion.py, src/multicam_sim/topology.py, src/multicam_sim/pose.py.
Part of #83.
Build an assembly-line scene: an operator (COCO-17 skeleton) moves along a line of 4-5 fixed workstations while 4-5 cameras give overlapping coverage of the line. Analytic geometry only (no renderer).
Scope
src/multicam_sim/assembly_line.py(build_assembly_line_scene(seed=0, fps=..., ...) -> Scene) mirroringmtmc.build_mtmc_sceneandexamples/assembly_station.py.station_1 (frame/base),station_2 (subassembly),station_3 (fasten),station_4 (inspect),station_5 (pack)— names illustrative; keep them generic. Usetopology.Station+TransitEdgefor adjacency/transit time down the line.dsl/rig.CameraRig— overlapping FOVs over the line (start from.ring(...)for guaranteed overlap; a.stations(...)/.custom(...)layout with deliberate overlap between adjacent stations is the stretch goal).dsl/motionpath DSL: walkstation_1 -> station_2 -> ... -> station_5with a dwell (pause = the operation) at each station. Chain with.then(...), pace with.at_speed(...).in_view/visible) plus the topology field.Acceptance
build_assembly_line_scene()is deterministic (byte-stable manifest for a fixed seed), with a golden/round-trip test in the repo style.in_viewon at least two cameras simultaneously during station-to-station transits (proves overlap).Pointers
src/multicam_sim/mtmc.py,examples/assembly_station.py,src/multicam_sim/dsl/rig.py,src/multicam_sim/dsl/motion.py,src/multicam_sim/topology.py,src/multicam_sim/pose.py.