from stonesoup.updater.kalman import KalmanUpdater updater = KalmanUpdater(measurement_model) #%% # .. note:: # # For more information on the above classes and how they operate you can refer to the Stone # Soup tutorial on # `using the Kalman Filter <https://stonesoup.readthedocs.io/en/latest/auto_tutorials/01_KalmanFilterTutorial.html>`_. # # Data Association # **************** # We utilise a :class:`~.DistanceHypothesiser` to generate hypotheses between tracks and # measurements, where :class:`~.Mahalanobis` distance is used as a measure of quality: from stonesoup.hypothesiser.distance import DistanceHypothesiser from stonesoup.measures import Mahalanobis hypothesiser = DistanceHypothesiser(predictor, updater, Mahalanobis(), 10) # %% # Continuing the :class:`~.GNNWith2DAssigment` class is used to perform fast joint data association, # based on the Global Nearest Neighbour (GNN) algorithm: from stonesoup.dataassociator.neighbour import GNNWith2DAssignment data_associator = GNNWith2DAssignment(hypothesiser) #%% # .. note:: # For more information on the above classes and how they operate you can refer to the # `Data Association - clutter <https://stonesoup.readthedocs.io/en/latest/auto_tutorials/05_DataAssociation-Clutter.html>`_ # and `Data Association - Multi-Target Tracking <https://stonesoup.readthedocs.io/en/latest/auto_tutorials/06_DataAssociation-MultiTargetTutorial.html>`_ # tutorials. # %% # Track Initiation # ****************
return set() deleter = MyDeleter() # %% # Setup Hypothesiser and Associator # --------------------------------- # Since we know there is only one measurement per scan, we can just use the # :class:`~.NearestNeighbour` associator to achieve our desired result. from stonesoup.measures import Euclidean from stonesoup.dataassociator.neighbour import NearestNeighbour from stonesoup.hypothesiser.distance import DistanceHypothesiser from stonesoup.tracker.simple import SingleTargetTracker meas = Euclidean() hypothesiser = DistanceHypothesiser(predictor, updater, meas) associator = NearestNeighbour(hypothesiser) tracker = SingleTargetTracker(initiator, deleter, detector, associator, updater) # %% # Run the Tracker # --------------------------------- # We extract the ground truth from the detector and then run the tracker. # While running the tracker we: # # - Extract the measurement that is associated with it. # - Extract the position components of the estimated state vector. # # This allows us to plot the measurements, ground truth, and state estimates.
# %% # Creating a Tracker # ------------------ # We'll now create the tracker components as we did with the multi-target examples previously. from stonesoup.predictor.kalman import KalmanPredictor predictor = KalmanPredictor(transition_model) from stonesoup.updater.kalman import KalmanUpdater updater = KalmanUpdater(measurement_model) from stonesoup.hypothesiser.distance import DistanceHypothesiser from stonesoup.measures import Mahalanobis hypothesiser = DistanceHypothesiser(predictor, updater, measure=Mahalanobis(), missed_distance=3) from stonesoup.dataassociator.neighbour import GNNWith2DAssignment data_associator = GNNWith2DAssignment(hypothesiser) # %% # Creating a Deleter # ------------------ # Here we are going to create an error based deleter, which will delete any :class:`~.Track` where # trace of the covariance is over a certain threshold, i.e. when we have a high uncertainty. This # simply requires a threshold to be defined, which will depend on units and number of dimensions of # your state vector. So the higher the threshold value, the longer tracks that haven't been # updated will remain. from stonesoup.deleter.error import CovarianceBasedDeleter deleter = CovarianceBasedDeleter(4)
updater = KalmanUpdater(measurement_model) # %% # Creating data associators # ------------------------- # To associate our detections to track objects generate hypotheses using a hypothesiser. In this # case we are using a :class:`~.Mahalanobis` distance measure. In addition, we are exploiting the # fact that the detections should have the same |MMSI|_ for a single vessel, by "gating" out # detections that don't match the tracks |MMSI|_ (this being populated by detections used to create # the track). from stonesoup.gater.filtered import FilteredDetectionsGater from stonesoup.hypothesiser.distance import DistanceHypothesiser from stonesoup.measures import Mahalanobis measure = Mahalanobis() hypothesiser = FilteredDetectionsGater(DistanceHypothesiser(predictor, updater, measure, missed_distance=3), metadata_filter="MMSI") # %% # We will use a nearest-neighbour association algorithm, passing in the Mahalanobis distance # hypothesiser built in the previous step. from stonesoup.dataassociator.neighbour import NearestNeighbour data_associator = NearestNeighbour(hypothesiser) # %% # Creating track initiators and deleters # -------------------------------------- # We need a method to initiate tracks. For this we will create an initiator component # and have it generate a :class:`~.GaussianState`. In this case, we'll use a measurement initiator # which uses the measurements value and model covariance where possible. In this case, as we are