An example scheduler for trackingΒΆ

tracking scheduler

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)

Gallery generated by Sphinx-Gallery