示例#1
0
    def test_TrackerEvaluator(self):

        eval = trackers.TrackerEvaluator(
            tracker=trackers.GNN(sensor=sensors.BaseSensor(R=np.diag(
                [0.001, 0.001]),
                                                           PD=0.7,
                                                           VC=1.0,
                                                           PFA=1e-6,
                                                           BNT=0.03,
                                                           y_mins=[-250, -250],
                                                           y_maxs=[+250, +250],
                                                           y_stps=[1, 1]),
                                 model_factory=models.SimpleModelFactory(
                                     model=models.KalmanModel, dT=1.0, q=1.0),
                                 track_factory=tracks.BaseTrackFactory(
                                     track=tracks.ScoreManagedTrack)),
            tgt_list=[
                models.SimpleTarget(SD=2,
                                    x0=[0., 0., +0., +1.],
                                    start_time=0.0),
                models.SimpleTarget(SD=2,
                                    x0=[0., 10., +1., -1.],
                                    start_time=0.0),
                models.SimpleTarget(SD=2,
                                    x0=[10., 10., -1., -1.],
                                    start_time=0.0),
                models.SimpleTarget(SD=2,
                                    x0=[10., 0., +0., +1.],
                                    start_time=1.0)
            ])

        # eval.plot_position()
        eval.estimate_track_statistics()
示例#2
0
    def test_TrackEvaluator(self):

        scan_time = 1.0
        sigma_o   = 1.0
        time_m    = 2.0
        sigma_mx  = 4.0
        sigma_my  = 1.0
        sigma_vx  = 18.0
        sigma_vy  =  4.0
        vx0 = np.random.normal(0.0, sigma_vx)
        vy0 = np.random.normal(0.0, sigma_vy)

        eval = tracks.TrackEvaluator(
            sensor=sensors.BaseSensor(
                PD=0.7,
                VC=1.0,
                PFA=1e-6,
                BNT=0.03
            ),
            model_factory=models.SingerModelFactory(
                model=models.KalmanModel,
                dT=1.0,
                tm=time_m,
                sm=[sigma_mx, sigma_my],
                SD=2,
                P0=np.diag([sigma_o**2, sigma_o**2, sigma_vx**2, sigma_vy**2])
            ),
            track_factory=tracks.BaseTrackFactory(
                track=tracks.ScoreManagedTrack
            ),
            target=models.SimpleTarget(
                x0=[0.0, 0.0, vx0, vy0],
                SD=2
            ),
            R=np.diag([sigma_o**2, sigma_o**2])
        )

        # eval.plot_score()
示例#3
0
def sample_MultiSensorGNN():
    """
    This program calculate two target / two sensor case with GNN, and animate it.
    """
    PD = 0.99
    PFA = 1e-7
    scan_time = 0.5
    sigma_o   = 1.0
    time_m    = 2.0
    sigma_mx  = 4.0
    sigma_my  = 1.0
    sigma_vx  = 18.0
    sigma_vy  =  4.0

    class Radar2DSensor(sensors.Polar2DSensor):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)

        def is_trk_in_range(self, trk):
            dist, azim = cmath.polar( (trk.model.x[0]-self.x[0]) + 1j*(trk.model.x[1]-self.x[1]) )
            return self.range_min < dist < self.range_max and abs(azim-self.angle) < self.width/2

        def is_tgt_in_range(self, tgt):
            dist, azim = cmath.polar( (tgt.x[0]-self.x[0]) + 1j*(tgt.x[1]-self.x[1]) )
            return self.range_min < dist < self.range_max and abs(azim-self.angle) < self.width/2

    sen_list = [
        Radar2DSensor(
            PD=PD,
            VC=1.0,
            PFA=PFA,
            BNT=0.03,
            x0=np.array([0.0, 10.0, 1.0, 0.0]),
            angle0=15/180*cmath.pi,
            DETECT_RANGE_MAX=40,
            DETECT_RANGE_MIN=10,
            DETECT_WIDTH=120/180*cmath.pi
        ),
        Radar2DSensor(
            PD=PD,
            VC=1.0,
            PFA=PFA,
            BNT=0.03,
            x0=np.array([50.0, 10.0, 1.0, 0.0]),
            angle0=-15/180*cmath.pi,
            DETECT_RANGE_MAX=40,
            DETECT_RANGE_MIN=10,
            DETECT_WIDTH=120/180*cmath.pi
        )
    ]

    tgt_list = [
        models.SimpleTarget(SD=2, x0=[100., 00.,-1.,+0.3]),
        models.SimpleTarget(SD=2, x0=[100., 10.,-1.,-0.1]),
        models.SimpleTarget(SD=2, x0=[100., 20.,-1.,-0.2]),
    ]

    tracker = trackers.GNN(
        sen_list=sen_list,
        model_factory=models.SingerModelFactory(
            model=models.KalmanModel,
            dT=scan_time,
            tm=time_m,
            sm=[sigma_mx, sigma_my],
            SD=2,
            P0=np.diag([sigma_o**2, sigma_o**2, sigma_vx**2, sigma_vy**2])
        ),
        track_factory=tracks.BaseTrackFactory(
            track=tracks.ScoreManagedTrack
        )
    )

    obs_df = pd.DataFrame()
    tgt_df = pd.DataFrame()
    trk_df = pd.DataFrame()
    sen_df = pd.DataFrame()

    for i_scan in range(100):
        timestamp = pd.Timestamp(i_scan, unit="s")

        if not i_scan % 5:
            # scan by sensor0 (once in 5 times)
            sensor = sen_list[0]
            R = np.eye(2) * 0.01
            obs_list = [models.Obs(np.random.multivariate_normal(tgt.x[:2], R), R) for tgt in tgt_list if sensor.is_tgt_in_range(tgt)]
            trk_list = tracker.register_scan(obs_list, sensor=sensor)
        else:
            # scan by sensor1 (everytime except sensor0 turn)
            sensor = sen_list[1]
            R = np.eye(2) * 0.01
            obs_list = [models.Obs(np.random.multivariate_normal(tgt.x[:2], R), R) for tgt in tgt_list if sensor.is_tgt_in_range(tgt)]
            trk_list = tracker.register_scan(obs_list, sensor=sensor)

        # tgt_list update
        [ tgt.update(tracker._dT()) for tgt in tgt_list ]

        # save as dataframe
        obs_df = obs_df.append( [ obs.to_record(timestamp, i_scan, tracker.y_mdl_type()) for obs in obs_list ], ignore_index=True )
        trk_df = trk_df.append( [ trk.to_record(timestamp, i_scan) for trk in trk_list ], ignore_index=True )
        tgt_df = tgt_df.append( [ tgt.to_record(timestamp, i_scan) for tgt in tgt_list ], ignore_index=True)
        sen_df = sen_df.append( [ sen.to_record(timestamp, i_scan) for sen in sen_list ], ignore_index=True )

    # export
    anal = analyzers.BaseAnalyzer.import_df(obs_df, trk_df, sen_df, tgt_df)
    anal.export_csv()
    anal.export_db()

    # analyse
    anal.animation()
示例#4
0
def sample_FGT(is_fgt=True):
    PD = 0.75
    PFA = 1e-7
    scan_time = 0.5
    sigma_o   = 1.0
    time_m    = 2.0
    sigma_mx  = 4.0
    sigma_my  = 1.0
    sigma_vx  = 18.0
    sigma_vy  =  4.0

    np.random.seed(0)
    class Radar2DSensor(sensors.Polar2DSensor):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)

        def is_trk_in_range(self, trk):
            dist, azim = cmath.polar( (trk.model.x[0]-self.x[0]) + 1j*(trk.model.x[1]-self.x[1]) )
            return self.range_min < dist < self.range_max and abs(azim-self.angle) < self.width/2

        def is_tgt_in_range(self, tgt):
            dist, azim = cmath.polar( (tgt.x[0]-self.x[0]) + 1j*(tgt.x[1]-self.x[1]) )
            return self.range_min < dist < self.range_max and abs(azim-self.angle) < self.width/2

    sen_list = [
        Radar2DSensor(
            PD=PD,
            VC=1.0,
            PFA=PFA,
            BNT=0.03,
            x0=np.array([0.0, 10.0, 0.0, 0.0]),
            angle0=0.0/180*cmath.pi,
            DETECT_RANGE_MAX=10000,
            DETECT_RANGE_MIN=10,
            DETECT_WIDTH=120/180*cmath.pi
        )
    ]

    tgt_list = [
        models.SimpleTarget(SD=2, x0=[10000., 00.,-10.,+0.0]),
        models.SimpleTarget(SD=2, x0=[10000., 10.,-10.,+0.0]),
        models.SimpleTarget(SD=2, x0=[10000., 20.,-10.,-0.0]),
        models.SimpleTarget(SD=2, x0=[10000., 30.,-10.,-0.0]),
        models.SimpleTarget(SD=2, x0=[10000., 40.,-10.,-0.0]),
        models.SimpleTarget(SD=2, x0=[10000., 50.,-10.,-0.0]),
        models.SimpleTarget(SD=2, x0=[10000., 60.,-10.,-0.0]),
        models.SimpleTarget(SD=2, x0=[10000., 70.,-10.,-0.0]),
        models.SimpleTarget(SD=2, x0=[10000., 80.,-10.,-0.0]),
    ]

    if is_fgt:
        tracker = trackers.FGT(
            sen_list=sen_list,
            model_factory=models.SingerModelFactory(
                model=models.KalmanModel,
                dT=scan_time,
                tm=time_m,
                sm=[sigma_mx, sigma_my],
                SD=2,
                P0=np.diag([sigma_o**2, sigma_o**2, sigma_vx**2, sigma_vy**2])
            ),
            track_factory=tracks.BaseTrackFactory(
                track=tracks.FormationTrack
            )
        )
    else:
        tracker = trackers.GNN(
            sen_list=sen_list,
            model_factory=models.SingerModelFactory(
                model=models.KalmanModel,
                dT=scan_time,
                tm=time_m,
                sm=[sigma_mx, sigma_my],
                SD=2,
                P0=np.diag([sigma_o**2, sigma_o**2, sigma_vx**2, sigma_vy**2])
            ),
            track_factory=tracks.BaseTrackFactory(
                track=tracks.SimpleManagedTrack
            )
        )

    obs_df = pd.DataFrame()
    tgt_df = pd.DataFrame()
    trk_df = pd.DataFrame()
    sen_df = pd.DataFrame()

    for i_scan in range(100):
        timestamp = pd.Timestamp(i_scan, unit="s")

        sensor = sen_list[0]
        R = np.eye(2) * 20.0
        obs_list = [
            models.Obs(np.random.multivariate_normal(tgt.x[:2], R), R)for tgt in tgt_list
            if sensor.is_tgt_in_range(tgt) and np.random.choice([True, False], p=[PD, 1-PD])
        ]
        trk_list = tracker.register_scan(obs_list, sensor=sensor)

        # tgt_list update
        [ tgt.update(tracker._dT()) for tgt in tgt_list ]

        # save as dataframe
        obs_df = obs_df.append( [ obs.to_record(timestamp, i_scan, tracker.y_mdl_type()) for obs in obs_list ], ignore_index=True )
        trk_df = trk_df.append( [ trk.to_record(timestamp, i_scan) for trk in trk_list ], ignore_index=True )
        tgt_df = tgt_df.append( [ tgt.to_record(timestamp, i_scan) for tgt in tgt_list ], ignore_index=True)
        sen_df = sen_df.append( [ sen.to_record(timestamp, i_scan) for sen in sen_list ], ignore_index=True )

    # export
    anal = analyzers.BaseAnalyzer.import_df(obs_df, trk_df, sen_df, tgt_df)
    if is_fgt:
        anal.export_db(fpath="data_fgt")
    else:
        anal.export_db(fpath="data_gnn")

    # analyze
    anal.plot2D()
示例#5
0
def generate_irst_example_p878(PD=0.7, PFA=1e-6, tracker_type="GNN"):
    """ IRST example of p.878

    unit is pixcel (=70urad)

    ref) Design and Analysis of Modern Tracking Systems
    13.3.5 IRST Example
    """

    scan_time = 1.0
    sigma_o = 1.0
    time_m = 2.0
    sigma_mx = 4.0
    sigma_my = 1.0
    sigma_vx = 18.0
    sigma_vy = 4.0
    vx0 = np.random.normal(0.0, sigma_vx)
    vy0 = np.random.normal(0.0, sigma_vy)

    if tracker_type == "JPDA":
        tracker = trackers.JPDA
        model = models.PDAKalmanModel
        track = tracks.PDATrack
    else:
        tracker = trackers.GNN
        model = models.KalmanModel
        track = tracks.ScoreManagedTrack

    ret = trackers.TrackerEvaluator(
        tracker=tracker(
            sensor=sensors.BaseSensor(
                R=np.diag([sigma_o**2, sigma_o**2]),
                PD=PD,
                VC=1.0,
                PFA=PFA,
                BNT=0.03,
                # y_mins=[-44880,-250],
                # y_maxs=[+44880,+250],
                y_mins=[-1125, -250],  # reduce calculation load
                y_maxs=[+1125, +250],  # reduce calculation load
                y_stps=[1, 1]),
            model_factory=models.SingerModelFactory(
                model=model,
                dT=scan_time,
                tm=time_m,
                sm=[sigma_mx, sigma_my],
                SD=2,
                P0=np.diag([sigma_o**2, sigma_o**2, sigma_vx**2,
                            sigma_vy**2])),
            track_factory=tracks.BaseTrackFactory(track=track)),
        tgt_list=[
            models.SimpleTarget(x0=[0.0, 0.0, vx0, vy0], SD=2),
        ],
        R=np.diag([sigma_o**2, sigma_o**2]))

    # TODO: implement SPRT, SMC(MHT), FMC(MHT), FMC(IPDA)

    # SPRT( Sequential Probability Ratio Test )
    # 13.3.3 SPRT Analysis of Track Confirmation (p874)

    # SMC ( Simplified Monte Carlo Simulation )
    # 13.3.4 Simplified Monte Carlo Simulation (p877)

    # FMC ( Full Monte Carlo Simulation ) (p878)
    # 13.3.5 IRST Example

    return ret