I want to make a motorized pointer to follow the International Space Station (ISS) as it orbits over my house. To do that, I need to compute the altitude and heading of the ISS, based on the ISS orbit data, the current time, and my latitude, longitude, and altitude. I found a lot of stuff via Google that looked like what I wanted, but the math was too ugly and foreign and I got impatient trying to make it work.

About a month ago, I ran into Nathan Bergey, a space junkie and originator of ISS-Notify. I knew he'd have a good opinion on how to compute this stuff. Sure enough, he recommended PyEphem, which is a delight to use. Tracking the ISS as it goes over is pretty simple. Here's the Python code I use:

import math
import time
from datetime import datetime
import ephem
degrees_per_radian = 180.0 / math.pi
home = ephem.Observer()
home.lon = '-122.63'   # +E
home.lat = '45.56'      # +N
home.elevation = 80 # meters
# Always get the latest ISS TLE data from:
# http://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/orbit/ISS/SVPOST.html
iss = ephem.readtle('ISS',
    '1 25544U 98067A   11290.51528320  .00016717  00000-0  10270-3 0  9006',
    '2 25544  51.6378 264.9380 0016170 337.7557  22.2896 15.60833726 20019'
)
while True:
    home.date = datetime.utcnow()
    iss.compute(home)
    print('iss: altitude %4.1f deg, azimuth %5.1f deg' % (iss.alt * degrees_per_radian, iss.az * degrees_per_radian))
    time.sleep(1.0)

When run, this program prints the current altitude (in degrees above the horizon) and azimuth (heading in degrees "clockwise" from North).

iss: altitude 78.1 deg, azimuth 249.8 deg
iss: altitude 79.1 deg, azimuth 250.7 deg
iss: altitude 80.2 deg, azimuth 251.7 deg
iss: altitude 81.2 deg, azimuth 253.0 deg
iss: altitude 82.2 deg, azimuth 254.7 deg
iss: altitude 83.3 deg, azimuth 256.9 deg
iss: altitude 84.3 deg, azimuth 259.9 deg

Sweet! Now all I have to do is pump these numbers out a serial port to an Arduino controlling a couple of servos, and I should be good to go!