10
2
Fork 0
has-writeup/space/wheres-the-sat
Erin Moon d6078fcf45 scrub ticket 2020-06-03 18:00:56 -05:00
..
README.md wheres-the-sat 2020-06-03 17:59:52 -05:00
wheres.py scrub ticket 2020-06-03 18:00:56 -05:00

README.md

Where's the Sat?

Category: Space and Things Points (final): 43 Solves: 107

Let's start with an easy one, I tell you where I'm looking at a satellite, you tell me where to look for it later.

Given files: stations.zip

Write-up

by erin (barzamin).

Like all 106 other teams probably did, we used Python and Skyfield, an astronomical computation library. The challenge gives us questions like

Please use the following time to find the correct satellite:(2020, 3, 18, 11, 43, 3.0)
Please use the following Earth Centered Inertial reference frame coordinates to find the satellite:
[-305.58833718148855, 5030.717506174544, 4485.770450701875]
Current attempt:1
What is the X coordinate at the time of:(2020, 3, 18, 4, 24, 46.0)?

We can easily grab the time and ECI coordinates (which turned out to be International Terrestrial Reference Frame coordinates) with some expect-style goodness:

r.readuntil('find the correct satellite:')
t = ts.utc(*[float(x) for x in r.readuntil('\n').decode().strip()[1:-1].split(', ')])

r.readuntil('coordinates to find the satellite:')
eci_coords = np.array([float(x) for x in r.readuntil('\n').decode().strip()[1:-1].split(', ')])

We're given a list of candidate satellites (or space stations, rather) in two-line element form; find the closest one at the given time:

satellites = load.tle_file('./stations.txt')

match = satellites[np.argmin([np.linalg.norm(s.at(t).position.km-eci_coords) for s in satellites])]

The challenge then wants us to project ITRF coordinates for three times it gives us. Read the challenge timestamps and tell it where the satellite is:

for _ in range(3):
	r.readuntil('X coordinate at the time of:')
	new_t = ts.utc(*[float(x)
		for x in r.readuntil('?\n', drop=True).decode().strip()[1:-1].split(', ')])
	print(new_t.utc_jpl())

	x,y,z = match.at(new_t).position.km
	r.send(f'{x}\n')
	r.send(f'{y}\n')
	r.send(f'{z}\n')

r.interactive()

The key can easily be grabbed from the output.

Full code

Resources and other writeups