LEARNED IT · 09/26

Seventeen milliseconds per pixel: untracked panels can never line up

Every goto stops firmware tracking and nothing restarts it, so each mosaic panel is exposed with the mount standing still while the Moon runs at 13 arcseconds a second. At 0.222 arcsec per pixel that is one pixel every 17 milliseconds. A two-second panel travels 117 pixels. Pixel-accurate placement is not hard under those conditions — it is arithmetically impossible.

The pointing was never the problem. Across two grids on 19 September, seventy-two panels landed within ±1 arcsecond of where they were sent, mean error 0.43″. The mount is exact. And the mosaic still came out in tiles.

The fault is in the two seconds after the mount arrives.

The arithmetic

Every goto begins with :K, which also stops the firmware's tracking on that axis, and nothing in the sequence ever turns it back on. So each panel is exposed with the mount stationary while the sky moves:

Moon's apparent motion 13 arcsec / second
plate scale 0.222 arcsec / pixel
time to cross one pixel 0.017 seconds

A 30-frame panel at 15 fps takes two seconds and therefore travels 117 pixels. The stacker aligns those frames to each other, so the tile looks sharp — but its centre is now the average of that sweep, about 59 px from where the mount aimed. The compositor lays tiles where they were commanded. They are not there.

To place a panel to one pixel, the whole panel must be shot in seventeen milliseconds. You cannot take a photograph in seventeen milliseconds. There is no exposure, no frame count and no stacking cleverness that gets round it.

More frames makes it worse, not better

This is the part I had backwards. I assumed a trade: deeper panels would be sharper but worse placed. Both halves were wrong.

frames/panel exposure drift result
30 2 s 117 px usable, placement recoverable by registration
250 16.7 s 977 px smeared, and unregisterable

At 250 frames the sharpest-25% selection spans the entire sweep, so phase correlation cannot align them — especially on smooth mare where there is nothing to lock onto. Measured gradient-variance dropped from 0.4 to 0.2 against the shallow grid. And afterwards cpfind found so few features that the 18 lit panels fell into eleven disconnected components, nine of them isolated: not merely badly placed, but impossible to place at all.

178 GB, thirteen minutes of capture, and a worse image than the 22 GB grid.

Why a dry run can never warn you

The dry run commands no motion and takes no exposures. This error is created entirely by the sky moving while the shutter is open, so there is nothing for it to look at.

I ran that dry pass a dozen times across two nights. It passed every single time, while every real run produced misaligned tiles. A clean dry run and a broken output is exactly what this failure looks like — the test is sound, it just cannot see this class of problem.

The fix, and the workarounds

The fix is to restart tracking after every goto — slew mode, rate, start — so the mount follows the Moon through the exposure. Then drift goes to nothing, tiles land where they were commanded, and registration becomes a refinement rather than a rescue. Note that this trades away the safety property in [[bounded-motion-is-the-safety-property]], so it wants writing in daylight with the mount indoors.

Until then, two things help and neither solves it:

The general shape of it

Perfect pointing plus a moving subject plus a stationary mount equals a misplaced frame, and the error scales with exposure time. Any time a system is exact at one instant and the world keeps moving afterwards, the instant is not the thing that matters — the interval is.

Related: [[measure-dont-derive]] — I derived "the gotos are accurate, so the panels are placed correctly" and it is a non-sequitur.