Alternative Driver-based Solution
I used this question as an exercise to familiarize myself with drivers. The solution turned out well enough and different enough from the others that I figured I'd post it. I couldn't say whether it has any particular advantage or disadvantage compared to the other driver answer; it's just what I came up with. :)
This is a driver-based solution built on Script Expressions that uses only the primary objects (planet + satellite, no empties or curves).
In preparation use keyframes to animate the "planet" object so it does one rotation around the Z-axis over the course of the animation.
The drivers all target the satellite (Suzanne) and are all based on the planet's rotation. We need at least two: one for the satellite's X location and one for its Y location. If we want the satellite to have a synchronized orbit such that the same side always faces the planet then a third driver targets the satellite's Z rotation.
I created each driver by hovering over the appropriate field in the Object tab in the Properties window, entered Ctrl+D, and selected Manually Create Later (Single). (In 2.8x this will pop a dialog. Just dismiss it by moving mouse away.)
Next, open the Graph Editor (1) (in 2.8x choose Drivers rather than Graph Editor), select one of the drivers from the left panel (2), open the Properties drawer (N) and click the Drivers tab (3).
Create a variable (4) with these attributes (5):
Type: Transform Channel
Name: planetZRot
Object: Planet
Type: Z Rotation
Space: World
Now copy this variable to the other drivers using the "arrow & clipboard" buttons (6).
Configure each driver to have type Scripted Expression (7). The expressions for each of the drivers are as follows.
- X Location:
0 + (cos(planetZRot * m)) * r
- Y Location:
0 + (sin(planetZRot * m)) * r
- Z Rotation:
planetZRot * m
Here m
is Srot / Prot, the ratio of the satellite's rotation to the planet's rotation and r
is the radius of the orbit.
Result with m=2
and r=3
...