The previous question How much time does it take to circularize a GTO orbit using ion propulsion? has a good, quantitative answer based on a known delta-v.
But I'm wondering how would you actually aim a continuous ion thrust as you move around in a highly elliptical orbit at the beginning? Is there a way to do this without wasting a lot of propellant? Or do you use the thrust only during a fraction of the orbit (in the beginning) when near periapsis, and therefore it takes longer to accumulate the delta-v because the thruster is actually turned off a lot of the time?
Here's a quick, silly calculation showing that for 0.2N and 2200kg, starting at 300km LEO, it takes about 600 days to slowly spiral out to GEO. The satellite rotates once per revolution around the earth, so I have to slow down the rotation rate a teeny tiny bit once in a while to keep them synchronized so the thrust is always tangent to the circular orbit.
Now suppose I want to start from a standard Hohman transfer ellipse (GTO), and run my program again. Periapsis altitude 300km, apoapsis at GEO. Let's assume there's nothing else at GEO to collide with to make it simple.
Q1: In order to use the least amount of ion propellant, should the spacecraft be slowly rotating, or have a fixed attitude, perhaps tangent to apoapsis? If rotating, at a constant, or ramped rate?
Q2: How would one modulate the thrust and attitude to circularize a standard elliptical GTO using the 0.2N ion propulsion in the least amount of time?
def deriv(X, t):
r, v = X.reshape(2, -1)
vhat = v / np.sqrt((v**2).sum())
rhat = r / np.sqrt((r**2).sum())
rsq = (r**2).sum()
acc_grav = -GMe * rhat / rsq
acc_thrust = vhat * acc # right now, thrust is just in vhat direction
return np.hstack((v, acc_grav + acc_thrust))
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint as ODEint
GMe = 3.986004418E+14 # m^3/s^2
re = 6371.E+03 # m
alt = 300.E+03 # m
a = re + alt # m
v0 = np.sqrt(GMe / a) # vis-viva equation for circular
T = 2. * np.pi * a / v0
print "period (min) ", T/60., " at ", alt, " km altitude."
acc = 0.2/2200. # m/s^2 0.2N and 2200kg
X0 = np.array([a, 0, 0, 0, v0, 0]) # initial state vector
days = np.linspace(0, 600, 100000)
t = days * 24. * 3600.
tol = 1E-10 # good enough for rough answer but not an accurate trajectory
answer, blob = ODEint(deriv, X0, t, rtol=tol, atol=tol, full_output=True)
xp, yp = 0.001*answer.T[:2]
alti_km = np.sqrt(xp**2 + yp**2) - 0.001*re
if 1 == 1:
plt.figure()
plt.subplot(3, 1, 1)
plt.plot(days, xp)
plt.plot(days, yp)
plt.title('x, y (km)')
plt.subplot(3, 1, 2)
plt.plot(xp, yp)
plt.title('xy (km)')
plt.subplot(3, 1, 3)
plt.plot(days, alti_km)
plt.title('altitude (km)')
plt.show()