translation_offset=np.array([[sensor_x], [sensor_y]])) # %% # Populate the measurement array measurements = [] for state in truth: measurement = measurement_model.function(state, noise=True) measurements.append( Detection(measurement, timestamp=state.timestamp, measurement_model=measurement_model)) # %% # Plot those measurements plotter.plot_measurements(measurements, [0, 2]) plotter.fig # %% # Set up the particle filter # ^^^^^^^^^^^^^^^^^^^^^^^^^^ # Analogously to the Kalman family, we create a :class:`~.ParticlePredictor` and a # :class:`~.ParticleUpdater` which take responsibility for the predict and update steps # respectively. These require a :class:`~.TransitionModel` and :class:`~.MeasurementModel` as # before. # To cope with sample sparsity we also include a resampler, in this instance # :class:`~.SystematicResampler`, which is passed to the updater. It should be noted that there are # many resampling schemes, and almost as many choices as to when to undertake resampling. The # systematic resampler is described in [#]_, and in what follows below resampling is undertaken # at each time-step. from stonesoup.predictor.particle import ParticlePredictor
timestamp=truth_state.timestamp, measurement_model=measurement_model)) # Generate clutter at this time-step for _ in range(np.random.poisson(clutter_rate)): x = uniform.rvs(-100, 200) y = uniform.rvs(-100, 200) measurement_set.add( Clutter(np.array([[x], [y]]), timestamp=timestamp, measurement_model=measurement_model)) all_measurements.append(measurement_set) # Plot true detections and clutter. plotter.plot_measurements(all_measurements, [0, 2], color='g') plotter.fig # %% # Create the Predicter and Updater # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # # The updater is a :class:`~.PHDUpdater`, and since it uses the mixed Gaussian paths, it is a # GM-PHD updater. For each individual track we use a :class:`~.KalmanUpdater`. Here we assume # that the measurement range and clutter spatial density are known to the filter. We # invite you to change these variables to mimic removing this assumption. from stonesoup.updater.kalman import KalmanUpdater kalman_updater = KalmanUpdater(measurement_model) # Area in which we look for target. Note that if a target appears outside of this area the # filter will not pick up on it.