Custom SchedulerΒΆ

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)

Gallery generated by Sphinx-Gallery