Testing the limits of interferometry; Resolving Charon, Pluto's Moon

Attempts at direct imaging of Pluto’s moon Charon using a 1.0-meter telescope

Imaging Charon, Pluto’s largest moon, is at (or beyond..) the limits of speckle interferometry with a 1.0-meter telescope. The small ~0.7″ angular separation, the low brightness of Charon, and the glare from Pluto make the observation challenging, even under (the comparatively excellent) ‘average’ seeing conditions in the Atacama Desert in Chile, and using state-of-the-art optics and a low-noise, high-framerate CMOS sensor.

Pluto & Charon, NASA New Horizons
Pluto & Charon, NASA New Horizons

June 2022

In June 2022, I made a first an attempt to observe Pluto’s moon Charon using (bispectrum) speckle interferometry.

Simulation of a possible interferometry result using a 1.0-meter telescope before attempting it
Simulation of a possible interferometry result using a 1.0-meter telescope before attempting it
Initial observations, unfortunately showing an inconclusive signal
Initial observations, unfortunately showing an inconclusive signal

The encircled dot could be Charon, but with very (and unscientifically) low confidence.

August 2023

New observations are hindered by weather during the Chilean winter.

To verify the moon’s position if a detection is made, I now calculate the expected position angle and separation.

Separation

# CC BY-SA
# Leon Bewersdorff

#!pip install spiceypy

import spiceypy as spice
import numpy as np
from datetime import datetime, timedelta

# Required fíles from the NASA Jet Propulsion Laboratory's Navigation 
# and Ancillary Information Facility (NAIF). Link:
# https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/satellites/
spice.furnsh('naif0012.tls')
spice.furnsh('plu058.bsp')

start = datetime.strptime("2023-07-15T00:00:00.000", '%Y-%m-%dT%H:%M:%S.%f')
end = datetime.strptime("2023-07-25T00:00:00.000", '%Y-%m-%dT%H:%M:%S.%f')
step = timedelta(hours=int("4"))

results = []
current_time = start
entry_number = 1
while current_time <= end:
    et = spice.str2et(str(current_time))

    state_pluto, lt_pluto = spice.spkgeo(targ=9, et=et, ref='J2000', obs=399)
    state_charon, lt_charon = spice.spkgeo(targ=901, et=et, ref='J2000', obs=399)

    pluto_vector = np.array(state_pluto[:3])
    charon_vector = np.array(state_charon[:3])

    unit_pluto = pluto_vector / np.linalg.norm(pluto_vector)
    unit_charon = charon_vector / np.linalg.norm(charon_vector)

    dot_product = np.dot(unit_pluto, unit_charon)
    angular_separation = np.arccos(dot_product) * 180/np.pi * 3600

    results.append((entry_number, current_time, angular_separation))

    current_time += step
    entry_number += 1

for entry, time, separation in results:
    print(f"{entry} {time.strftime('%Y-%m-%dT%H:%M:%S.%f')} {separation:.6f}")

Feel free to use this code with updated NAIF data. An array is printed containing the separation and position angle in specified time steps (hours).

October 2023

Two attempts to observe Charon were rendered unusable due to suboptimal sky conditions.

November 2023

Processing another attempt did not generate a result that showed any indication of Charon.

Files being prepared for speckle processing:

Negative speckle interferometry result:

Inconclusive result, stretched significantly less compared to the eight images shown above
Inconclusive result, stretched significantly less compared to the eight images shown above

Maybe a 1.5-meter would do.

Leon Bewersdorff
Leon Bewersdorff
Computer Science at RWTH Aachen University | Software Engineering & Sensor Network Operations at OurSky