This is Artemis II / Orion "Integrity" captured on the night of April 9-10, 2026, a few hours before splashdown, on its return leg from the lunar flyby. The bright moving point is the spacecraft carrying Wiseman, Glover, Koch, and Hansen, the first crewed mission beyond low Earth orbit since Apollo 17.

I posted an earlier version of this to r/astronomy a day ago. Since then I've rebuilt the processing pipeline with significantly better output: cleaner annotation panel, trajectory line showing the spacecraft's path across the field, improved autostretch so the background is a bit more stable between frames, and a zoom-out reveal at the end. Reposting here because this subreddit is where the technical side of the work actually belongs.

Acquisition

  • Telescope: TEC APO140FL @ f/7.3 (1012mm)
  • Camera: ZWO ASI6200MM Pro, L filter, gain 100, offset 50, -10°C
  • Mount: Paramount MyT
  • Exposure: ~160 × 20s (from 246 captured, ~160 usable) = 50 min integration
  • Tracking: N.I.N.A. with a custom plugin I wrote (NINA.Plugin.HorizonTarget) that feeds JPL HORIZONS ephemeris directly into the mount control loop. Mount tracks the spacecraft's apparent motion (~25"/min at closest), not sidereal, so Orion stays as a point in each 20s sub.
  • Site: Southern Carina Observatory, Chile (-39.3° S, 350m)
  • Date: 2026-04-10, 05:03-07:08 UTC

Processing

Calibration and registration in PixInsight WBPP (bias, dark, flat, cosmetic correction, star alignment). ImageSolver plate-solved every sub with Gaia DR2.

Because the subs are star-registered, Orion drifts across the field frame-by-frame as it moves relative to the background, which is exactly the behavior needed for the "moving object across fixed starfield" look.

From there it's a Python pipeline I'm calling HorizonTracer:

  • WCS-based tracking — reads each XISF sub directly and reconstructs an astropy WCS from PixInsight's proprietary astrometric properties (LinearTransformationMatrix, ReferenceCelestialCoordinates, ReferenceImageCoordinates) since PI doesn't write standard FITS WCS keywords on export. Converts HORIZONS RA/Dec to pixel coordinates per frame, with rolling-average track smoothing to suppress WCS jitter and linear extrapolation past the ephemeris boundary so the track doesn't freeze if the HORIZONS file is a few minutes short.
  • Edge clamping — when the spacecraft approaches the source-image boundary, the crop window pins to the edge and Orion drifts naturally out of frame (the dramatic exit).
  • Photometric normalization — robust median + MAD matching per frame against a reference, removing atmospheric transparency drift and background pedestal changes. Eliminates the jumpy-brightness problem that kills most time-series animations. The display stretch is auto-locked to the reference frame's percentile bounds so the entire sequence has consistent tonality.
  • NoiseXTerminator integration — headless PI batch denoising via PJSR. Groups N crops into composite tiles with padding to amortize NXT's ~4s per-call TensorFlow overhead down to ~0.3s effective, restarts PI every N composites to avoid CUDA state degradation, with a stall watchdog that kills hung PI processes so the next chunk picks up where it left off. Probably the gnarliest part of the whole pipeline.
  • Zoom keyframes with easing — dynamic source-window sizing animates between zoom levels across the timeline (linear, cubic ease-in/out, smoothstep). Precrop tiles are sized to the maximum zoom-out so denoised tiles work at any zoom level without re-processing.
  • Annotation overlay — real-time ephemeris panel (UTC, ICRF RA/Dec, range in km + AU, range rate, solar elongation, phase angle, sky motion, frame counter, progress bar) with configurable placement. Trajectory line drawn as a polyline in the current crop's coordinate space, with off-screen clamping so the pointer snaps to the nearest edge and points toward the actual position when Orion exits the visible frame.
  • Output — raw BGR frames piped to ffmpeg via stdin for libx264 / nvenc encoding. Output resolution decoupled from crop size so text and overlays render natively at the higher resolution for crisp edges. Parallel per-frame rendering via ProcessPoolExecutor, with a crop-first optimization so the stretch and normalization run on the ~360K-pixel tracking window instead of the full 61MP source — about 170× less data to move around.

Open-source coming

I'm turning HorizonTracer into a proper open-source project that'll work for any HORIZONS-tracked object (ISS, comets, asteroids, future crewed missions). Targeting release in the coming weeks once I finish cleaning it up. If you're interested, you can follow along at GH or fluxa on IG.

Also built a free browser tool that answers the original question, "can I image this object from my location?", for any spacecraft, planet, or small body: liminal.fluxastro.space

Happy to answer questions about the tracking plugin, the WCS extraction, the NXT batching, or any other part of the pipeline.



by fluxa

Comments are closed.