I remember waiting for the ISS as night fell. Standing next to a lake just after sunset, waiting for that little fleck of light to come over the horizon. For a few moments as it passed overhead, the astronauts aboard were no farther away than my grandparents, a few states over. But this proximity was fleeting; moving at over 17,000 mph, it rapidly dimmed, and disappeared over the horizon, daring me to meet it again another night.

How to find it? There were, and are, quite a few excellent sites that will predict visible passes of the ISS and other satellites. But the process was always opaque and mysterious to me. You put in your current location, and it tells you, to the nearest second, when it will appear, and without fail, it always does.

A few years ago, I set out to learn how this process works, and finding a lack of quality explanations, decided to document it myself. This is the beginning of that journey. I hope you’ll join me as we attempt to build a minimal satellite tracker.

I’ll be writing this project in python, and posting code to a GitHub repository. I recommend you install Python locally, so you can follow along easily. If you’re familiar with setting up a development environment, you can safely skip this portion. Otherwise, the easiest way to get up and running is to go install Anaconda. Make sure you install **Python 3**. I’m going to assume a knowledge of very basic programming, or the ability to read python.

There’s quite a few concepts that are essential to understanding how to predict orbits. I’m going to touch on the most important ones, and provide links to Wikipedia and other references for more details. I’m also going to skip the derivations of several formulas, because other, much more skilled authors have done a better job than I can. However, I’m going to assume a knowledge of basic physics, derivative calculus, and linear algebra. If you’re not comfortable with any of these, go check out Khan Academy and/or MIT OpenCourseWare. They’re both great and have helped me a lot.

Ellipses are curves that surround two focal points, such that for each point on the curve, the sum of the distances to the two focal points is constant. You might know them as ovals. We’ll use them to model the path an orbiting object makes around its attractive body. The short “radius” is the semi-minor axis, and the long “radius” is the semi-major axis. We represent how “squished” the ellipse is with a dimensionless quantity called eccentricity, which is defined as