# What delta-v per orbit would a spacecraft need to hover next to Saturn's rings?

In order to collect Saturn's ring particles for sample return to Earth, a spacecraft would need to share the orbit of this debris. If it is inclined it will have to pass through the rings twice each orbit. But since the rings are so absurdly thin and well behaved, only a small constant inclination change should be required to orbit in parallel with the ring system, from where the spacecraft could dive in and pick up a sample of interest. Would RTG nuclear electric propulsion be enough to stay in an orbit parallel to Saturn's rings?

• Answers to Parallel orbits around the Earth - effectively? were successful without using propulsion because of the SAR scenario, but now I think you've got them boxed in and someone will have to find a real propulsive answer, good job! – uhoh Dec 10 '18 at 17:42

Here are some effective ring parameters. To simplify I'm just using the monopole term GM and not including the "extra gravity" near the planet from the oblateness which is okay since I'm rounding. (see this answer to Equation for orbital period around oblate bodies, based on J2?)

 ring     a       T        ω      a_z/1km     Δv/day
x1E-06    x1E-06    (@ 1km)
(km)     (hr)     (s)      (s^-2)     (m/s)
----  ------   -----   --------   -------    -----
C     80000     6.4     272        74        6.4
B    105000     9.6     181        32        2.8
A    130000    13.3     131        17        1.5
F    140000    14.8     118        14        1.2


Omega is the rotational rate in radians per second. Since you are talking about extremely low inclinations, we can approximate the motion ($$z, v_z, a_z$$) of the spacecraft (thrust off) as sinusoidal:

$$z = h_0 \cos(\omega t)$$ $$v_z = -h_0 \omega \sin(\omega t)$$ $$a_z = -h_0 \omega^2 \cos(\omega t)$$

$$\Delta v/\text{day} = h_0 \omega^2 \times 24 \times 3600$$

At $$t=0$$ and a maximum height $$h_0$$ the acceleration is $$-h_0 \omega^2$$, so the acceleration per meter of initial height is just $$\omega^2$$. The acceleration to cancel the oscillations and hover is the same magnitude and opposite sign; point your thrust toward the ring.

I chose 1,000 meters as the "safe distance". While I am surprised to read Wikipedia suggest that the rings are often only of order 10 meters thick, that does not mean that they are flat to the same degree. Of course the spacecraft would tend to follow the same wiggles as the ring in general since they orbit together, there may be local knotting or other effects, or the rings could have a "halo" above and below.

If you would like to hover at 100 meters instead of 1,000, you can divide the delta-v by the same factor, since to first order everything is linear in height.

The last plot at 45% thrust suggests some fun you can have.

I checked this by numerical integration. Seems okay. You can watch the z position "hover" at 1,000 meters, then oscillate when thrust is turned off (by setting thrustfactor = 0.)

class Ring(object):
def __init__(self, name, a):
self.name       = name
self.a          = a
self.T          = twopi * np.sqrt(self.a**3/GM)
self.T_hours    = self.T/3600.
self.omega      = twopi/self.T
self.v0         = np.sqrt(GM/self.a)   # vis-viva equation, assume circular orbit
self.acc_thrust = 1000. * self.omega**2

def deriv(X, t):
x, v = X.reshape(2, -1)
x    = x.reshape(-1, 3)
rm3  = (((x**2).sum(axis=1))**-1.5)[:, None]
acc  = -GM * x * rm3
acc += thrustfactor * acc_thrust      # for hovering
return np.hstack((v, acc.flatten()))

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint as ODEint

halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)]

GM       = 3.793119E+16  #m^3/s^2

ringdict = {'C':  80000E+03, 'B': 105000E+03,
'A': 130000E+03, 'F': 140000E+03}  # meters

rings = []
for name, a in ringdict.items():
ring = Ring(name, a)
rings.append(ring)

rings.sort(key=lambda x: x.a, reverse=False)   # put them back in order

acc_thrust   = np.array(sum([[0, 0, ring.acc_thrust] for ring in rings], []))
acc_thrust   = acc_thrust.reshape(-1, 3)

thrustfactor = 1.0

X0x = np.array(sum([[ring.a, 0,  1000] for ring in rings], []))
X0v = np.array(sum([[0, ring.v0,    0] for ring in rings], []))
X0  = np.hstack((X0x, X0v))

hours = np.linspace(0, 36, 501)
time  = 3600. * hours

answer, info = ODEint(deriv, X0, time, full_output=True)

print (2, -1, 3, s0)
positions, velocities = answer.T.reshape(2, -1, 3, s0)
print "positions.shape: ", positions.shape

for ring, posn, vel in zip(rings, positions, velocities):
ring.posn = posn
ring.vel  = vel

if True:
for i, ring in enumerate(rings):

plt.subplot(len(rings), 2, 2*i+1)
for p in ring.posn[:2]:
plt.plot(hours, p)
plt.title('ring ' + ring.name + ': x, y (thrust ON)')

plt.subplot(len(rings), 2, 2*i+1+1)
for p in ring.posn[2:]:
plt.plot(hours, p)
# plt.plot(hours, np.zeros_like(hours), '-k', linewidth=0.5)
plt.title('ring ' + ring.name + ': z (thrust ON)')
plt.ylim(-1190, 1190)

plt.suptitle('Saturn: x: (hours), y: (meters)', fontsize=16)

plt.show()

• Ah! I fugued out, not knowing what a_z was, and ignored the units. Sorry about that. – Russell Borogove Dec 11 '18 at 3:14