Note
Click here to download the full example code
An example scheduler for trackingΒΆ
Out:
Space object 1: <Time object: scale='utc' format='mjd' value=53005.0>:
a : 7.2000e+06 x : -9.2921e+05
e : 1.0000e-02 y : 3.7192e+06
i : 7.5000e+01 z : 6.0527e+06
omega: 0.0000e+00 vx: -2.1772e+03
Omega: 7.9000e+01 vy: -6.2065e+03
anom : 6.0000e+01 vz: 3.5565e+03
Parameters: C_D=2.3, m=1.0, C_R=1.0, d=1.0
Space object 42: <Time object: scale='utc' format='mjd' value=53005.0>:
a : 7.2000e+06 x : 1.9647e+06
e : 1.0000e-02 y : 6.8519e+06
i : 6.9000e+01 z : 0.0000e+00
omega: 0.0000e+00 vx: -2.5889e+03
Omega: 7.4000e+01 vy: 7.4236e+02
anom : 0.0000e+00 vz: 7.0161e+03
Parameters: C_D=2.3, m=1.0, C_R=1.0, d=1.0
2020-10-15 13:25:07.012 INFO ; Tracking:get_passes(ind=0):propagating 32467 steps
2020-10-15 13:25:07.323 INFO ; Tracking:get_passes(ind=0):propagating complete
2020-10-15 13:25:07.343 INFO ; Tracking:get_passes(ind=0):tx0-rx0 5 passes
2020-10-15 13:25:07.343 INFO ; Tracking:get_passes(ind=0):tx0-rx1 5 passes
2020-10-15 13:25:07.343 INFO ; Tracking:get_passes(ind=0):tx0-rx2 5 passes
2020-10-15 13:25:07.344 INFO ; Tracking:get_passes(ind=1):propagating 32467 steps
2020-10-15 13:25:07.708 INFO ; Tracking:get_passes(ind=1):propagating complete
2020-10-15 13:25:07.727 INFO ; Tracking:get_passes(ind=1):tx0-rx0 3 passes
2020-10-15 13:25:07.727 INFO ; Tracking:get_passes(ind=1):tx0-rx1 3 passes
2020-10-15 13:25:07.728 INFO ; Tracking:get_passes(ind=1):tx0-rx2 3 passes
t [s] rx0 az rx0 el rx1 az rx1 el rx2 az rx2 el Controller Target
--------- -------- -------- -------- -------- -------- -------- ------------ ---------
131.731 216.13 46.6683 229.657 47.2974 222.079 52.7021 Tracker Object 1
324.671 50.888 49.0413 40.7894 48.7283 43.3103 44.011 Tracker Object 1
6413.59 -48.0509 52.8083 -44.9576 46.2558 -38.0438 48.5331 Tracker Object 1
6606.53 43.5413 30.4887 38.9828 30.0099 39.5514 27.3577 Tracker Object 1
12746 30.7813 45.4085 23.2488 43.2993 26.9295 40.0694 Tracker Object 1
18865.5 -25.0317 51.5186 -26.1979 45.4591 -19.1973 45.9287 Tracker Object 1
19058.5 97.4958 40.5511 92.9755 44.4608 87.8783 39.9397 Tracker Object 1
25118.1 261.275 62.5315 -83.5205 57.4678 -79.0123 63.7625 Tracker Object 1
25311.1 163.834 30.986 169.08 34.5103 160.01 34.6522 Tracker Object 1
7331.72 253.646 30.0609 261.399 28.2752 259.755 31.6237 Tracker Object 42
7355.67 253.064 35.0062 261.755 32.9105 260.308 36.856 Tracker Object 42
7379.62 252.22 40.8511 262.207 38.3734 261.054 43.0626 Tracker Object 42
7403.57 250.924 47.7954 262.816 44.8651 262.144 50.4523 Tracker Object 42
7427.52 248.747 56.0139 263.717 52.5938 263.948 59.1937 Tracker Object 42
7451.48 244.474 65.54 265.258 61.7093 267.66 69.289 Tracker Object 42
7475.43 233.033 75.9531 268.692 72.1663 -79.862 80.2639 Tracker Object 42
7499.38 176.398 83.8848 -75.8299 83.3889 26.2546 85.2344 Tracker Object 42
7523.33 106.949 77.4746 56.235 83.5115 63.8875 74.8802 Tracker Object 42
7547.28 93.1786 67.1633 72.0856 72.3816 70.108 64.3605 Tracker Object 42
7571.23 88.3804 57.6262 75.5549 62.0612 72.6141 55.0814 Tracker Object 42
7595.18 86.0116 49.379 77.1063 53.0963 73.9944 47.1814 Tracker Object 42
7619.13 84.6265 42.4057 78.0126 45.5076 74.888 40.5392 Tracker Object 42
7643.08 83.7341 36.5361 78.6249 39.1353 75.5277 34.953 Tracker Object 42
7667.04 83.1232 31.571 79.0787 33.7698 76.0182 30.2199 Tracker Object 42
13575 -82.5089 33.3807 -76.1741 30.2224 -75.3584 33.2528 Tracker Object 42
13598.9 -83.3905 38.8372 -76.2466 35.1317 -74.8291 38.7016 Tracker Object 42
13622.9 -84.6997 45.289 -76.3834 40.9257 -74.1097 45.1591 Tracker Object 42
13646.8 -86.7957 52.9114 -76.6304 47.8055 -73.0388 52.8225 Tracker Object 42
13670.8 269.414 61.7847 -77.0917 55.9619 -71.2032 61.8275 Tracker Object 42
13694.7 260.872 71.6729 -78.0627 65.4949 -67.1339 72.1125 Tracker Object 42
13718.7 231.01 81.002 -80.8398 76.2745 -49.7025 83.0317 Tracker Object 42
13742.6 151.976 80.5195 248.361 87.4934 73.1889 83.5312 Tracker Object 42
13766.6 125.024 71.093 114.336 80.1447 92.5828 72.718 Tracker Object 42
13790.6 117.023 61.3871 109.675 69.1472 96.8525 62.5149 Tracker Object 42
13814.5 113.401 52.7461 108.358 59.3053 98.7441 53.5966 Tracker Object 42
13838.5 111.375 45.347 107.775 50.8356 99.8374 46.0138 Tracker Object 42
13862.4 110.102 39.0882 107.471 43.6779 100.568 39.6253 Tracker Object 42
13886.4 109.24 33.7906 107.302 37.6532 101.102 34.2334 Tracker Object 42
19795.6 -81.3969 31.0712 -75.4759 28.1323 -74.8653 30.898 Tracker Object 42
19819.6 -85.8548 35.3173 -78.9956 32.1254 -78.2883 35.4351 Tracker Object 42
19843.5 268.292 39.8977 -83.565 36.5341 -82.9017 40.5201 Tracker Object 42
19867.5 260.485 44.6193 -89.6281 41.2908 -89.3311 46.0803 Tracker Object 42
19891.4 250.054 49.0581 262.187 46.1744 261.427 51.8199 Tracker Object 42
19915.4 236.557 52.4965 251.126 50.7018 248.009 57.023 Tracker Object 42
19939.3 220.568 54.0721 236.737 54.0637 229.595 60.4226 Tracker Object 42
19963.3 204.186 53.2843 219.855 55.3342 208.365 60.6984 Tracker Object 42
19987.3 189.808 50.4228 203.019 54.0829 189.35 57.748 Tracker Object 42
20011.2 178.474 46.3065 188.731 50.773 175.272 52.8108 Tracker Object 42
20035.2 169.948 41.7219 177.769 46.3333 165.55 47.2053 Tracker Object 42
20059.1 163.571 37.1721 169.659 41.556 158.808 41.7079 Tracker Object 42
20083.1 158.74 32.9049 163.648 36.9074 153.99 36.6506 Tracker Object 42
import numpy as np
import matplotlib.pyplot as plt
from tabulate import tabulate
from astropy.time import Time
import sorts
from sorts.scheduler import PriorityTracking, ObservedParameters
from sorts import SpaceObject
from sorts.profiling import Profiler
from sorts.propagator import SGP4
eiscat3d = sorts.radars.eiscat3d
poptions = dict(
settings = dict(
in_frame='GCRS',
out_frame='ITRS',
),
)
epoch = Time(53005.0, format='mjd')
logger = sorts.profiling.get_logger('tracking')
objs = [
SpaceObject(
SGP4,
propagator_options = poptions,
a = 7200e3,
e = 0.01,
i = 75,
raan = 79,
aop = 0,
mu0 = 60,
epoch = epoch,
parameters = dict(
d = 1.0,
),
oid = 1,
),
SpaceObject(
SGP4,
propagator_options = poptions,
a = 7200e3,
e = 0.01,
i = 69,
raan = 74,
aop = 0,
mu0 = 0,
epoch = epoch,
parameters = dict(
d = 1.0,
),
oid = 42,
)
]
for obj in objs: print(obj)
class ObservedTracking(PriorityTracking, ObservedParameters):
def generate_schedule(self, t, generator):
data = np.empty((len(t),len(self.radar.rx)*2+1), dtype=np.float64)
data[:,0] = t
names = []
targets = []
for ind,mrad in enumerate(generator):
radar, meta = mrad
names.append(meta['controller_type'].__name__)
targets.append(meta['target'])
for ri, rx in enumerate(radar.rx):
data[ind,1+ri*2] = rx.beam.azimuth
data[ind,2+ri*2] = rx.beam.elevation
data = data.T.tolist() + [names, targets]
data = list(map(list, zip(*data)))
return data
scheduler = ObservedTracking(
radar = eiscat3d,
space_objects = objs,
timeslice = 0.1,
allocation = 0.1*50,
end_time = 3600*12.0,
max_dpos = 1e4,
epoch = epoch,
priority = [0.2, 1.0],
logger = logger,
use_pass_states = True,
collect_passes = True,
)
scheduler.update()
scheduler.set_measurements()
sched_data = scheduler.schedule()
rx_head = [f'rx{i} {co}' for i in range(len(scheduler.radar.rx)) for co in ['az', 'el']]
sched_tab = tabulate(sched_data, headers=["t [s]"] + rx_head + ['Controller', 'Target'])
print(sched_tab)
datas = []
for ind in range(len(objs)):
data = scheduler.observe_passes(scheduler.passes[ind], space_object = objs[ind], snr_limit=False)
datas.append(data)
fig = plt.figure(figsize=(15,15))
axes = [
[
fig.add_subplot(221, projection='3d'),
fig.add_subplot(222),
],
[
fig.add_subplot(223),
fig.add_subplot(224),
],
]
for ind in range(len(objs)):
for pi, ps in enumerate(scheduler.passes[ind][0][0]):
zang = ps.zenith_angle()
snr = ps.calculate_snr(eiscat3d.tx[0], eiscat3d.rx[0], diameter=objs[ind].d)
axes[0][0].plot(ps.enu[0][0,:], ps.enu[0][1,:], ps.enu[0][2,:], '-', label=f'pass-{pi}')
axes[0][0].set_xlabel('East-North-Up coordinates')
axes[0][1].plot((ps.t - ps.start())/3600.0, zang[0], '-', label=f'pass-{pi}')
axes[0][1].set_xlabel('Time past epoch [h]')
axes[0][1].set_ylabel('Zenith angle from TX [deg]')
axes[1][0].plot((ps.t - ps.start())/3600.0, ps.range()[0]*1e-3, '-', label=f'pass-{pi}')
axes[1][0].set_xlabel('Time past epoch [h]')
axes[1][0].set_ylabel('Range from TX [km]')
axes[1][1].plot((ps.t - ps.start())/3600.0, 10*np.log10(snr), '-', label=f'optimal-pass-{pi}')
axes[1][1].plot((datas[ind][0][0][pi]['t'] - ps.start())/3600.0, 10*np.log10(datas[ind][0][0][pi]['snr']), '.', label=f'observed-pass-{pi}')
axes[1][1].set_xlabel('Time past epoch [h]')
axes[1][1].set_ylabel('SNR [dB]')
axes[1][1].legend()
plt.show()
Total running time of the script: ( 0 minutes 10.727 seconds)