Skip to content

Instantly share code, notes, and snippets.

Last active May 25, 2023 21:20
Show Gist options
  • Save darksidelemm/60dd22c74ebe2e6d89bae9e6a845da5e to your computer and use it in GitHub Desktop.
Save darksidelemm/60dd22c74ebe2e6d89bae9e6a845da5e to your computer and use it in GitHub Desktop.
TLE Estimation for an Upcoming Rocket Launch

TLE Estimation for an Upcoming Rocket Launch

Scenario: RocketLab are launching 30 small-sats into space in a few days. We know that one of them is going to be transmitting on the amateur radio bands, but we haven't been able to obtain a pre-launch TLE yet. We want to get setup to use strf to listen for beacon signals (see my guide here), but we need to know when to expect the satellites. We have some basic orbital information from a press release, so how can we use this to estimate a TLE for prediction purposes?

Note: I am approaching this from the point-of-view of someone who really don't know much about orbital mechanics. I'm relying heavily on the experience of others, and the content below is my attempt at documenting the process taken.

Thanks to Cees Bassa for the amazing software as always...


The commands below assume you are in your sattools dir. You will also need to add details of your location into the sattools/data/sites.txt file.

Note: If you've previously been using strf, then you might have some environment variables (e.g. $ST_DATADIR) set to point to your strf directory. You will need to re-point these to the sattools directory, else many of the utilities will segfault.

Worked Example: RocketLab Return-to-Sender Launch (Originally 2020-10-16)

Basic launch stats from press kit ( )

  • Launch Time: 2020-11-16T01:44:00Z
  • Target Inclination: 97.3
  • Target Orbit: 500x500km

Generating and checking an estimated TLE

We will use the faketle tool to generate a TLE based on the above details. faketle requires the following information:

-q   Perigee altitude (km)
-Q   Apogee altitude (km)
-I   Orbital inclination (deg)
-n   RA of the ascending node (deg)
-w   Argument of perigee (deg)
-m   Mean anomaly (deg)
-t   Epoch (YYYY-mm-ddThh:mm:ss)
-i   Satellite number
-d   Time offset from epoch (s)

Scott Tilley's 'Basic Orbital Dynamics' guide has a good overview of the different elements.

Some of the above we can get directly from the above information:

  • Perigee / Apogee Altitudes: 500km, however we will set perigee to 499km, and apogee to 501km to avoid a resultant eccentricity of 0, which some satellite prediction software may have issues with.
  • Orbital Inclination: 97.3 degrees.
  • Epoch: We'll start with the launch time of 2020-11-16T01:44:00Z
  • Satellite Number: We'll just with 99999 for now.

Others we need to make some guesses about:

  • Argument of Perigee: The default value is 0, which is OK for orbits with low eccentricity.
  • Right-Angle of the Ascending Node (RAAN): The default value is 0. We're going to start with this and adjust it by trial-and-error.
  • Mean Anomaly: The default value is 0. We're going to start with this too, and adjust too.

We're also going to make use of the time-offset from epoch value to approximate the impact of the accelleration during launch. Cees has found that setting this to 5 minutes (300 seconds) works well.

Generate an initial TLE based on the above data:

$ ./faketle -q 499 -Q 501 -I 97.3 -t 2020-11-16T01:44:00 -n 0 -m 0 -d 300 > fake.txt

We now need to load this up in another tool, satorbit, which will give us a map of the world showing the position of the sat at a given time. Open another terminal and run:

$ ./satorbit -c fake.txt -q -t 2020-11-16T01:44:00 -L 178 -B -39

Note that we've provided satorbit with the TLE file we just generated, a time (the launch time), and a view latitude (-L) and longitude (-B). We've also told it to plot known launch sites (-q).

satorbit 1

We can see the sat on the lower right of the image. Use the . and , keys to step back/forward in time in one minute steps. You can get a listing of what commands can be used in in this mode by pressing h and looking in the terminal you loaded satorbit in. Note that whenever you step in time like this, satorbit will reload the TLE file. We're going to make use of this. Advance so the time reads 2020-11-16T01:49:00.

Now we have our next aim: We need to adjust the RAAN and Mean Anomaly parameters such that the sat is directly over the launch site (in this case, on the Mahia Peninsula of New Zealand) at 2020-11-16T01:49:00 (5 minutes after the epoch).

Without getting too deep into orbital mechanics (not that I understand it that well anyway), adjusting RAAN will have the effect of moving the track around the earth in longitude, and Mean Anomaly will adjust where the sat is on that track at any particular time.

For example, lets increase RAAN by 90 degrees:

$ ./faketle -q 499 -Q 501 -I 97.3 -t 2020-11-16T01:44:00 -n 90 -m 0 -d 300 >fake.txt

Tweak the time back and forth by one step with the . and , keys, and we have this:

satorbit 2

We can see the track now passes near our launch site, but the sat is somewhere on the other side of the Earth. Let's adjust the Mean Anomaly by 180 degrees:

$ ./faketle -q 499 -Q 501 -I 97.3 -t 2020-11-16T01:44:00 -n 90 -m 180 -d 300 >fake.txt

satorbit 3

Closer! Now we need to keep adjusting these values until we end up with the sat over the right location. It helps to zoom in by holding the cursor over the target location and using the + key.

After some trial and error I ended up with:

$ ./faketle -q 499 -Q 501 -I 97.3 -t 2020-11-16T01:44:00 -n 87 -m 218.5 -d 300 >fake.txt

satorbit 4

Good Enough! The resultant TLE is:

1 99999U          20321.07569444  .00000000  00000-0  50000-4 0    04
2 99999  97.3000  87.0000 0001454   0.0000 218.5000 15.21937999    06

Running Predictions

We can now make use of the pass tool within sattools to perform some predictions for an observation location.

$ ./pass -c fake.txt -s 8650 -t 2020-11-16T01:44:00 -l 10h -A 1 -a
Observer: Mark Jessop (8650) [-34.7207, +138.6928, 80m]
Elements: fake.txt
UT Date/Time: 2020-11-16T01:44:00 for 10 h
99999 | 2020-11-16T03:19:45   55/ 1 | 03:24:18  111/14 | 03:28:54  167/ 1 |
99999 | 2020-11-16T04:52:30  350/ 1 | 04:57:44  277/30 | 05:03:05  204/ 1 |

Some explanation:

  • -c chooses the TLE file to load. In this case we're using fake.tle, which contains our one generated TLE.
  • -s chooses the site number to predict for. These are defined in sites.txt - go add your own!
  • -t provided the start time for the predictions, in this case I'm using the launch time.
  • -l tells pass to predict for up to 10 hours past the start time.
  • -A sets the minimum elevation. I've set it to 1 degree.
  • Finally, -a give us all passes, not just those that will be visible, as we're looking for radio signals here.

The results are provided as:

  • 99999 - Satellite ID
  • 2020-11-16T03:19:45 - Rise time (YYYY-MM-DDTHH:MM:SS)
  • 55/ 1 - Rise Azimuth and Elevation (Az/ El)
  • 03:24:18 - Time of closest approach
  • 111/14 - Azimuth/Elevation of closest approach.
  • 03:28:54 - Set time.
  • 167/ 1 - Azimuth/Elevation of set.

But wait... the launch has been delayed!

Oh no! We went through all this hard work and now RocketLab have bumped the launch a few days to the right. Now what?

Well, handily there's a utility designed just for this eventuality: launchtle

$ ./launchtle -c fake.txt -i 99999 -t 2020-11-16T01:44:00 -T 2020-11-19T01:44:00 -I 99998
1 99998U 14900A   20324.07569444  .00000000  00000-0  50000-4 0    00
2 99998  97.3000  89.9569 0001454   0.0000 218.5000 15.21937999    06

The arguments used are:

  • -c - File containing the source TLE.
  • -i - Satellite number to use
  • -t - Original aunch time (Remember, we set this to 2020-11-16T01:44:00 above.
  • -T - New launch time - 2020-11-19T01:44:00
  • -I - Satellite ID to use for the newly generated TLE.

We can save this to a file (add > fake2.txt to the end of the command), and plot this in satorbit to check it's in the right place at the right time:

$ ./satorbit -c fake2.txt -q -t 2020-11-19T01:49:00 -L 178 -B -3

(Remember we expect the sat to be over the launch site at epoch + 5 minutes)

satorbit 5

Looks good!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment