# Set a constant velocity transition model for the targets transition_model = CombinedLinearGaussianTransitionModel( [ConstantVelocity(0.5), ConstantVelocity(0.5), ConstantVelocity(0.1)]) # Define the Gaussian State from which new targets are sampled on initialisation initial_target_state = GaussianState( StateVector([[0], [0], [0], [0], [9000], [0]]), CovarianceMatrix(np.diag([2000, 50, 2000, 50, 100, 1]))) groundtruth_sim = MultiTargetGroundTruthSimulator( transition_model=transition_model, # target transition model initial_state=initial_target_state, # add our initial state for targets timestep=timedelta(seconds=1), # time between measurements number_steps=120, # 2 minute birth_rate=0.10, # 10% chance of a new target being born death_probability=0.01 # 1% chance of a target being killed ) # %% # Now that we have set up our ground truth simulation we need to add our platform into the simulation capability. This # is done using the :class:`~.PlatformDetectionSimulator`. This simulator allows a *list* of platforms to be added into # the simulation, when the simulation is processed the platforms are able to make detections of both the ground truth # targets and other platforms. # # In this case we have a single platform, therefore the radar sensor on this platform will only be able to make # measurements of the ground truth objects generated by the simulator. # Import the PlatformDetectionSimulator from stonesoup.simulator.platform import PlatformDetectionSimulator
from stonesoup.types.state import GaussianState from stonesoup.updater.kalman import KalmanUpdater # Models transition_model = CombinedLinearGaussianTransitionModel( [ConstantVelocity(1), ConstantVelocity(1)], seed=1) measurement_model = LinearGaussian(4, [0, 2], np.diag([0.5, 0.5]), seed=2) # Simulators groundtruth_sim = MultiTargetGroundTruthSimulator( transition_model=transition_model, initial_state=GaussianState( StateVector([[0], [0], [0], [0]]), CovarianceMatrix(np.diag([1000, 10, 1000, 10]))), timestep=datetime.timedelta(seconds=5), number_steps=100, birth_rate=0.2, death_probability=0.05, seed=3 ) detection_sim = SimpleDetectionSimulator( groundtruth=groundtruth_sim, measurement_model=measurement_model, meas_range=np.array([[-1, 1], [-1, 1]]) * 5000, # Area to generate clutter detection_probability=0.9, clutter_rate=1, seed=4 ) # Filter
# %% # Create the transition model - default set to 2d nearly-constant velocity with small (0.05) # variance. from stonesoup.models.transition.linear import ( CombinedLinearGaussianTransitionModel, ConstantVelocity) transition_model = CombinedLinearGaussianTransitionModel( [ConstantVelocity(0.05), ConstantVelocity(0.05)]) # %% # Put this all together in a multi-target simulator. from stonesoup.simulator.simple import MultiTargetGroundTruthSimulator groundtruth_sim = MultiTargetGroundTruthSimulator( transition_model=transition_model, initial_state=initial_state, timestep=timestep_size, number_steps=number_of_steps, birth_rate=birth_rate, death_probability=death_probability) # %% # Initialise the measurement models # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # The simulated ground truth will then be passed to a simple detection simulator. This again has a # number of configurable parameters, e.g. where clutter is generated and at what rate, and # detection probability. This implements similar logic to the code in the previous tutorial section # :ref:`auto_tutorials/09_Initiators_&_Deleters:Generate Detections and Clutter`. from stonesoup.simulator.simple import SimpleDetectionSimulator from stonesoup.models.measurement.linear import LinearGaussian # initialise the measurement model