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()
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()
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()
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()
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