solve: prefer the estate's own Astrometry.net over nova for blind solves
The estate now runs Astrometry.net itself (ankh-morpork-infra astrometry/):
solve-field against ~5 GB of local index files, sized from this repo's
TELESCOPES.md so the whole iTelescope fleet's fields of view are covered.
blind.py now tries it before nova.astrometry.net. Speed is the least of the
reasons - a blind solve of a real DSS field returns in 0.7s where nova queues
for minutes. The reasons that matter are that nova requires UPLOADING the
master to a third party and holding an API key, and neither is necessary any
more for the ordinary case. nova remains the fallback, so an estate outage
costs speed and privacy rather than the ability to solve.
pipeline/astrometry_net.py is the client and nothing more: stdlib-only POST,
parses the returned .wcs so the full TAN solution is used rather than a
re-derivation from the summary numbers. It deliberately does NOT decide whether
to trust a solution - blind.py already verifies every blind solve against Gaia
and applies a star-count and residual gate, and two gates that can disagree is
worse than one that is trusted.
The source ('estate' or 'nova') is threaded through the log lines, the returned
method, and the ASTRSOLV card, because a year from now that card is the only
way to tell whether a frame was solved in-house or uploaded.
Also corrected astrometry.py's 'cannot solve without a blind solver' message,
which has been untrue since run.py started falling through to blind.py.
Tested against the live service: blind solve of a DSS2 field with a known
centre returned within ~4 arcsec in 0.7s; the WCS round-trips through astropy;
and an unreachable service falls through to nova instead of raising.
This commit is contained in:
parent
2f268c7ca9
commit
118dc36e92
4 changed files with 269 additions and 39 deletions
|
|
@ -245,8 +245,10 @@ def run(session, verbose=True):
|
|||
centre = pointing(header)
|
||||
scale = plate_scale(header, session)
|
||||
if centre is None or not scale:
|
||||
# Not fatal, and no longer the end of the road: returning None sends
|
||||
# run.py to blind.py, which needs neither the pointing nor the scale.
|
||||
print(" no pointing or plate scale in the header - "
|
||||
"cannot solve without a blind solver")
|
||||
"handing off to the blind solver")
|
||||
return None
|
||||
# Match over the frame's INSCRIBED circle, not its circumscribed one. A
|
||||
# cone big enough to reach the corners also reaches well outside the
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue