Note
Click here to download the full example code
Custom SchedulerΒΆ
Out:
3 Orbits
t [s] rx0 az rx0 el rx1 az rx1 el rx2 az rx2 el Controller Target
------- -------- -------- -------- -------- -------- -------- ------------ --------
0 203.943 46.5256 231.709 49.1046 214.582 61.7606 Tracker Orbit 0
2.5 202.786 48.268 232.222 51.0681 213.731 64.3278 Tracker Orbit 0
5 201.479 50.0824 232.81 53.1294 212.654 66.9925 Tracker Orbit 0
7.5 199.994 51.9669 233.491 55.2907 211.252 69.7462 Tracker Orbit 0
10 198.296 53.9177 234.289 57.5528 209.356 72.5759 Tracker Orbit 0
20 166.892 61.836 216.587 75.0216 118.693 77.679 Tracker Orbit 1
22.5 161.709 63.2424 214.862 78.0311 105.335 76.6988 Tracker Orbit 1
25 155.908 64.4613 211.916 81.0846 94.3637 75.1457 Tracker Orbit 1
27.5 149.512 65.442 205.823 84.1363 85.7867 73.2056 Tracker Orbit 1
30 142.608 66.1363 187.217 87.0117 79.1745 71.0296 Tracker Orbit 1
40 105.756 57.7511 70.7657 70.4847 69.722 54.1572 Tracker Orbit 2
42.5 101.266 56.7187 66.9397 67.9711 67.6062 52.2986 Tracker Orbit 2
45 97.1296 55.5586 63.9658 65.4691 65.7474 50.4864 Tracker Orbit 2
47.5 93.3457 54.299 61.6005 63.0098 64.1051 48.7281 Tracker Orbit 2
50 89.9 52.9661 59.6809 60.6132 62.6461 47.0286 Tracker Orbit 2
from tabulate import tabulate
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
import pyorb
import sorts
from sorts.controller import Tracker
import sorts
eiscat3d = sorts.radars.eiscat3d
from sorts import Scheduler
from sorts.propagator import SGP4
Prop_cls = SGP4
Prop_opts = dict(
settings = dict(
out_frame='ITRF',
),
)
prop = Prop_cls(**Prop_opts)
class MyScheduler(Scheduler):
'''
'''
def __init__(self, radar, propagator):
super().__init__(radar)
self.propagator = propagator
self.orbits = None
def update(self, orbits):
'''Update the scheduler information.
'''
self.orbits = orbits
def get_controllers(self):
'''This should init all controllers and return a list of them.
'''
tv = [np.linspace(x*20,x*20+10,num=5) for x in range(len(self.orbits))]
ctrls = []
for ind in range(len(self.orbits)):
states = self.propagator.propagate(tv[ind], self.orbits.cartesian[:,ind], orb.epoch, A=1.0, C_R = 1.0, C_D = 1.0)
ctrl = Tracker(radar = self.radar, t=tv[ind], ecefs = states[:3,:])
ctrl.meta['target'] = f'Orbit {ind}'
ctrls.append(ctrl)
return ctrls
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
orb = pyorb.Orbit(M0 = pyorb.M_earth, direct_update=True, auto_update=True, degrees=True, num=3, a=6700e3, e=0, i=75, omega=0, Omega=np.linspace(79,82,num=3), anom=72, epoch=53005)
print(orb)
e3d = MyScheduler(radar = eiscat3d, propagator=prop)
e3d.update(orb)
data = e3d.schedule()
rx_head = [f'rx{i} {co}' for i in range(len(eiscat3d.rx)) for co in ['az', 'el']]
sched_tab = tabulate(data, headers=["t [s]"] + rx_head + ['Controller', 'Target'])
print(sched_tab)
fig = plt.figure(figsize=(15,15))
ax = fig.add_subplot(121)
for i in range(3):
ax.plot([x[0] for x in data], [x[1+i*2] for x in data], '.', label=f'RX{i}')
ax.legend()
ax.set_ylabel('Azimuth')
ax = fig.add_subplot(122)
for i in range(3):
ax.plot([x[0] for x in data], [x[2+i*2] for x in data], '.', label=f'RX{i}')
ax.legend()
ax.set_ylabel('Elevation')
plt.show()
# fig, ax =plt.subplots()
# collabel=("Time [s]",)
# for i in range(3):
# collabel += (f'RX{i} Az [deg]', f'RX{i} El [deg]')
# collabel += ('Dwell [s]',)
# ax.axis('tight')
# ax.axis('off')
# table = ax.table(cellText=data,colLabels=collabel,loc='center')
# table.set_fontsize(22)
# plt.show()
Total running time of the script: ( 0 minutes 0.446 seconds)