Dome
The Dome page (left nav) controls an observatory dome: it keeps the slit aligned with the telescope's optical axis (ASDM slaving), plus direct rotation, home, park, shutter, a sync-calibration workflow, and an on-page geometry editor with a live top-down diagram. It is logic-complete and capability-guarded, but actual dome motion is hardware-pending and not yet bench-verified — see Status at the end.
Enclosure type comes first
Starship needs to know what kind of observatory you have. Set it in Settings → Observatory → Enclosure type ([observatory] type, roll_off or dome):
- Roll-off roof (
roll_off, the default) — the roof clears the OTA in any position, so there is no azimuth to track. Nothing on this page applies. - Dome (
dome) — the slit is a fixed-width opening that must follow the telescope. This unlocks ASDM.
Slaving and sync capture both refuse to run unless the enclosure type is dome — the console returns "enclosure type is not 'dome'". The Dome page shows this state and points you back to the setting.
ASDM — Adaptive Sync Dome Modelling
ASDM decides where the slit should point. It has two layers (a third, the calibration solver, is a later gated stage):
1. Geometry. A ray cast from the aperture origin through the dome sphere. The origin is the mount-axis position plus the GEM offset (d_ota) along the declination axis, and that offset flips sign with pier side — mandatory for a German equatorial. The intersection's azimuth is the slit azimuth. Sign conventions are pinned for both hemispheres: azimuth from North through East, signed latitude (Southern Hemisphere negative), polar axis toward the elevated pole. The southern-hemisphere azimuth sign is the classic silent dome-slaving failure; here it is an explicit unit test. Core invariant: mount at dome centre with no GEM offset means slit azimuth equals pointing azimuth.
2. Adaptive correction. Geometry is never perfect on a real dome. Operator sync points store the residual (measured minus predicted azimuth) per pier side, and ASDM interpolates it by inverse-distance weighting (no splines — they overshoot and clip the slit). Where no nearby sync exists it falls back to pure geometry and says so (state GEOMETRIC_FALLBACK rather than CORRECTED). The slit is never silently mispositioned.
Dome parameters live in Settings → Observatory (dome_radius_m, dome_mount_east_m/north/up, dome_gem_offset_m, dome_pier_sign, dome_slit_half_width_deg, dome_deadband_margin_deg, dome_zenith_freeze_alt_deg, dome_interp_radius_deg) — and the most-used ones can also be edited straight from the Dome page (see Geometry & offsets below).
The Dome page controls
Live status — a row of cards for enclosure type, connected, azimuth, shutter status, slewing, at-home, at-park, and whether the dome is slaved, refreshed every couple of seconds. Under the Slave button a detail panel shows the current slave state, the last pointing (HA/Dec/pier/altitude), last target azimuth, moves commanded so far, and any last error — or, when the enclosure is still a roll-off roof or the geometry config is invalid, it tells you exactly that.
Slave / Unslave — the big button. Slaving starts the ASDM background loop; unslaving stops it.
Motion controls:
- Rotate — an absolute slew to the azimuth you type in the box (0–360°).
- Find home — start the driver's home-sensor search. Since v22.2.10 this returns at once (a driver may block for the whole rotation) and the At home card shows when the dome is there; Starship remembers the azimuth it reports there.
- Go home — rotate to the remembered home azimuth without the sensor search (
[observatory] dome_home_azimuth_degoverrides it; until an azimuth is known the button is refused with the reason). Like Park, both drop slaving: you are taking over. - Park — park the dome. A manual park (or abort) also drops slaving, so the loop won't immediately un-park it on the next tick.
- Open / close shutter — these drive the same slit shutter as the roof Open/Close on the Console, so the usual roof interlock applies: closing checks for an unparked mount first.
- Abort — stop motion now; also drops slaving (you are taking over).
Each command is greyed out or refused if the driver reports it can't do it — a device with CanSetAzimuth, CanFindHome, CanPark, or CanSetShutter false won't be commanded, and you'll see the reason rather than a silent no-op.
Sync calibration — once you have centred the slit on the current pointing by eye, capture a sync at the current pointing. ASDM records the residual against the model for this HA/Dec/pier side. The captured points are listed in two columns (East pier / West pier, with counts), you can delete any one with its ✕, or clear all (East and West) with one button. East and West syncs never mix. Sync points remember the geometry they were measured against: change the dome radius, the mount or GEM offsets, the pier sign or the site latitude and they are set aside as dome_sync.json.stale-<time>.json (never deleted) - the page says so - and you capture new ones.
Geometry & offsets — a live top-down diagram (North up, East right) of your dome: the amber wedge is the slit at the dome's reported azimuth, the amber mark the ASDM target, the blue arrow the telescope's pointing, the grey tick the remembered home. Beside it with an inline editor for the parameters that shape the model: dome radius, mount offset East/North (and Up in Settings), GEM offset d_ota, pier-side sign, and slit half-width. The dashed line is the mount's offset from the dome centre, the bright arm is the GEM offset, and the amber wedge is the open slit — the picture redraws live as you type, so you can see a change before you commit it. Save geometry writes the values back to the config. Below the diagram, a read-out line shows every current ASDM parameter (radius, all three mount offsets, d_ota and pier sign, slit half-width, dead-band, zenith-freeze altitude, sync radius) and flags the config in red if it's invalid.
Southern hemisphere. Nothing to set: the model points the polar axis at the elevated pole and applies the GEM offset on the correct side for your latitude (v22.2.10). Pier-side sign only means "my mount reports SideOfPier the other way round" - flip it if a meridian flip sends the slit to the wrong side and nothing else explains it.
Live slaving
When slaved, a fail-safe background loop polls every couple of seconds: read the mount's HA/Dec/pier-side, run ASDM for the corrected slit azimuth, and move the dome only if it is outside the dead-band — so the slit edge nears the optical axis before any motor runs (no hunting, no needless wear).
It is deliberately conservative:
- Frozen near the zenith. Inside the zenith cone (
dome_zenith_freeze_alt_deg, default 80°) dome azimuth is ill-conditioned — a tiny pointing change swings the azimuth wildly — so azimuth commands are frozen. - Any uncertainty STOPS commanding rather than driving to a wrong azimuth. The loop does not command when the mount or dome is missing or unreadable, the mount is mid-slew, the pier side is unknown while a GEM offset is configured, the geometry config is invalid, the dome is already slewing, or the dome's azimuth is unknown. Each surfaces as a named slave state (
NO_MOUNT,MOUNT_SLEWING,NO_PIER,PARAMS_INVALID,ZENITH_FROZEN,DOME_SLEWING,NO_DOME_AZ). - Geometry sanity-checked. Slaving refuses to start if the mount offset plus GEM offset reach outside the dome radius — physically impossible, and the ray-sphere model would be undefined.
If the site is left at the unset (0,0) sentinel, the loop cannot compute hour angle and stops rather than guess — set real coordinates in Settings → Site before any on-sky test.
Sequencer integration
A night can drive the dome through the sequencer with these actions:
slave_dome/unslave_dome— turn ASDM slaving on/off.dome_park— park the dome.dome_find_home— find home (the sensor search).dome_home— go home (rotate to the remembered / configured home azimuth).dome_goto— rotate to an absoluteazimuth(degrees).
The usual pattern is slave_dome at startup and unslave_dome then dome_park at the end of the run.
API
The page calls these endpoints (status views need STATUS_VIEW; motion needs CONSOLE_OPERATE):
GET /api/console/dome/status,GET /api/console/dome/sync-listPOST /api/console/dome/goto,/home(find home, returns ajob_id),/gohome,/park,/abortPOST /api/console/dome/slave,/sync,/sync-delete,/sync-clear
Sync points persist to dome_sync.json next to config.toml.
Status — what is and isn't proven
- The ASDM engine (geometry, sign conventions, sync interpolation, dead-band, zenith freeze, config validation) is a pure, unit-tested module — 16 tests, including the centre-of-dome invariant and the southern-hemisphere azimuth sign.
- The slaving loop, the page, the sequencer actions, and all the fail-safe guards are built and capability-guarded.
- Actual dome motion can only be proven on a real dome. It is hardware-pending / not bench-verified — bring it up supervised, with a finger on Abort.
- The calibration solver (recovering the physical offsets from sync data automatically) is a later, gated stage — for now, set the dome parameters by measurement and refine with sync points.