# trackerGNN

Multi-sensor, multi-object tracker using GNN assignment

## Description

The `trackerGNN` System object™ is a tracker capable of processing detections of many targets from multiple sensors. The tracker uses a global nearest-neighbor (GNN) assignment algorithm. The tracker initializes, confirms, predicts, corrects, and deletes tracks. Inputs to the tracker are detection reports generated by `objectDetection`, `fusionRadarSensor`, `irSensor`, or `sonarSensor` objects. The tracker estimates the state vector and state vector covariance matrix for each track. Each detection is assigned to at most one track. If the detection cannot be assigned to any track, the tracker initializes a new track.

Any new track starts in a tentative state. If enough detections are assigned to a tentative track, its status changes to confirmed. If the detection already has a known classification (the `ObjectClassID` field of the returned track is nonzero), that track is confirmed immediately. When a track is confirmed, the tracker considers the track to represent a physical object. If detections are not assigned to the track within a specifiable number of updates, the track is deleted.

To track objects using this object:

1. Create the `trackerGNN` object and set its properties.

2. Call the object with arguments, as if it were a function.

## Creation

### Syntax

``tracker = trackerGNN``
``tracker = trackerGNN(Name,Value)``

### Description

````tracker = trackerGNN` creates a `trackerGNN` System object with default property values.```

example

````tracker = trackerGNN(Name,Value)` sets properties for the tracker using one or more name-value pairs. For example, `trackerGNN('FilterInitializationFcn',@initcvukf,'MaxNumTracks',100)` creates a multi-object tracker that uses a constant-velocity, unscented Kalman filter and allows a maximum of 100 tracks. Enclose each property name in quotes.```

## Properties

expand all

Unless otherwise indicated, properties are nontunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the `release` function unlocks them.

If a property is tunable, you can change its value at any time.

Unique tracker identifier, specified as a nonnegative integer. This property is used as the `SourceIndex` in the tracker outputs, and distinguishes tracks that come from different trackers in a multiple-tracker system. You must specify this property as a positive integer to use the track outputs as inputs to a track fuser.

Example: `1`

Filter initialization function, specified as a function handle or as a character vector containing the name of a filter initialization function. The tracker uses a filter initialization function when creating new tracks.

Sensor Fusion and Tracking Toolbox™ supplies many initialization functions that you can use to specify `FilterInitializationFcn`.

Initialization FunctionFunction Definition
`initcvabf`Initialize constant-velocity alpha-beta filter
`initcaabf`Initialize constant-acceleration alpha-beta filter
`initcvekf`Initialize constant-velocity extended Kalman filter.
`initcackf`Initialize constant-acceleration cubature filter.
`initctckf`Initialize constant-turn-rate cubature filter.
`initcvckf`Initialize constant-velocity cubature filter.
`initcapf`Initialize constant-acceleration particle filter.
`initctpf`Initialize constant-turn-rate particle filter.
`initcvpf`Initialize constant-velocity particle filter.
`initcvkf`Initialize constant-velocity linear Kalman filter.
`initcvukf`Initialize constant-velocity unscented Kalman filter.
`initcaekf`Initialize constant-acceleration extended Kalman filter.
`initcakf`Initialize constant-acceleration linear Kalman filter.
`initcaukf `Initialize constant-acceleration unscented Kalman filter.
`initctekf `Initialize constant-turn-rate extended Kalman filter.
`initctukf`Initialize constant-turn-rate unscented Kalman filter.
`initcvmscekf`Initialize constant-velocity modified spherical coordinates extended Kalman filter.
`initrpekf`Initialize constant-velocity range-parametrized extended Kalman filter.
`initapekf`Initialize constant-velocity angle-parametrized extended Kalman filter.
`initekfimm`Initialize tracking IMM filter.
`initsingerekf`Initialize singer acceleration extended Kalman filter.

You can also write your own initialization function. The function must have the following syntax:

`filter = filterInitializationFcn(detection)`
The input to this function is a detection report like those created by `objectDetection`. The output of this function must be a filter object: `trackingKF`, `trackingEKF`, `trackingUKF`, `trackingCKF`, `trackingPF`, `trackingMSCEKF`, `trackingGSF`, `trackingIMM`, or `trackingABF`.

To guide you in writing this function, you can examine the details of the supplied functions from within MATLAB®. For example:

`type initcvekf`

Data Types: `function_handle` | `char`

Assignment algorithm, specified as `'MatchPairs'`, `'Munkres'`, `'Jonker-Volgenant'`, `'Auction'`, or `'Custom'`. Munkres is the only assignment algorithm that guarantees an optimal solution, but it is also the slowest, especially for large numbers of detections and tracks. The other algorithms do not guarantee an optimal solution but can be faster for problems with 20 or more tracks and detections. Use`'Custom'` to define your own assignment function and specify its name in the `CustomAssignmentFcn` property.

Example: `'Custom'`

Data Types: `char`

Custom assignment function name, specified as a character string. An assignment function must have the following syntax:

` [assignment,unTrs,unDets] = f(cost,costNonAssignment)`
For an example of an assignment function and a description of its arguments, see `assignmunkres`.

#### Dependencies

To enable this property, set the `Assignment` property to `'Custom'`.

Data Types: `char`

Clustering of detections and tracks for assignment, specified as `'off'` or `'on'`.

• `'off'` — The tracker solves the global nearest neighbor assignment problem per sensor using a cost matrix. The number of columns in the cost matrix is equal to the number of detections by the sensor, and the number of rows is equal to the number of tracks maintained by the tracker. Forbidden assignments (assignments with a cost greater than the `AssignmentThreshold`) have an infinite cost of assignment.

• `'on'` — The tracker creates a cluster after separating out the forbidden assignments (assignments with a cost greater than the `AssignmentThreshold`) and uses the forbidden assignments to form new clusters based on the `AssignmentThreshold` property. A cluster is a collection of detections and tracks considered to be assigned to each other. In this case, the tracker solves the global nearest neighbor assignment problem per cluster.

When you both specify this property as `'on'` and specify the `EnableMemoryManagement` property as `true`, you can use these three properties to specify bounds for certain variable-sized arrays in the tracker, as well as determine how the tracker handles cluster-size violations:

• `MaxNumDetectionsPerCluster`

• `MaxNumTracksPerCluster`

• `ClusterViolationHandling`

Specifying bounds for variable-sized arrays enables you to manage the memory footprint of the tracker, especially in the generated C/C++ code.

Data Types: `char` | `string`

Detection assignment threshold (or gating threshold), specified as a positive scalar or an 1-by-2 vector of [C1,C2], where C1C2. If specified as a scalar, the specified value, val, will be expanded to [val, `Inf`].

Initially, the tracker executes a coarse estimation for the normalized distance between all the tracks and detections. The tracker only calculates the accurate normalized distance for the combinations whose coarse normalized distance is less than C2. Also, the tracker can only assign a detection to a track if their accurate normalized distance is less than C1. See Algorithms for an explanation of the normalized distance.

• Increase the value of C2 if there are combinations of track and detection that should be calculated for assignment but are not. Decrease it if cost calculation takes too much time.

• Increase the value of C1 if there are detections that should be assigned to tracks but are not. Decrease it if there are detections that are assigned to tracks they should not be assigned to (too far away).

Note

If the value of C2 is finite, the state transition function and measurement function, specified in the tracking filter used in the tracker, must be able to take an M-by-N matrix of states as input and output N predicted states and N measurements, respectively. M is the size of the state. N, the number of states, is an arbitrary nonnegative integer.

Confirmation and deletion logic type, specified as `'History'` or `'Score'`.

• `'History'` – Track confirmation and deletion is based on the number of times the track has been assigned to a detection in the latest tracker updates.

• `'Score'` – Track confirmation and deletion is based on a log-likelihood track score. A high score means that the track is more likely to be valid. A low score means that the track is more likely to be a false alarm.

Threshold for track confirmation, specified as a scalar or a 1-by-2 vector. The threshold depends on the type of track confirmation and deletion logic you set using the `TrackLogic` property.

• History – Specify the confirmation threshold as 1-by-2 vector ```[M N]```. A track is confirmed if it receives at least `M` detections in the last `N` updates. The default value is `[2,3]`.

• Score – Specify the confirmation threshold as a scalar. A track is confirmed if its score is at least as high as the confirmation threshold. The default value is `20`.

Data Types: `single` | `double`

Minimum score required to delete track, specified as a scalar or a real-valued 1-by-2 vector. The threshold depends on the type of track confirmation and deletion logic you set using the `TrackLogic` property:

• History – Specify the confirmation threshold as `[P R]`. If a confirmed track is not assigned to any detection `P` times in the last `R` tracker updates, then the track is deleted.

• Score – A track is deleted if its score decreases by at least the threshold from the maximum track score.

Example: `3`

Data Types: `single` | `double`

Probability of detection, specified as a positive scalar between 0 and 1. This property is used to compute track score.

Example: `0.5`

Data Types: `single` | `double`

The probability of false alarm, specified as a scalar. This property is used to compute track score.

Example: `1e-5`

Data Types: `single` | `double`

The rate of new tracks per unit volume, specified as a positive scalar. The rate of new tracks is used in calculating the track score during track initialization.

Example: `2.5`

Data Types: `single` | `double`

The volume of a sensor measurement bin, specified as a positive scalar. For example, if a radar produces a 4-D measurement, which includes azimuth, elevation, range, and range rate, the 4-D volume is defined by the radar angular beam width, the range bin width and the range-rate bin width. Volume is used in calculating the track score when initializing and updating a track.

Example: `1.5`

Data Types: `single` | `double`

Maximum number of tracks that the tracker can maintain, specified as a positive integer.

Data Types: `single` | `double`

Maximum number of sensors that can be connected to the tracker, specified as a positive integer. `MaxNumSensors` must be greater than or equal to the largest value of `SensorIndex` found in all the detections used to update the tracker. `SensorIndex` is a property of an `objectDetection` object. The `MaxNumSensors` property determines how many sets of `ObjectAttributes` fields each output track can have.

Data Types: `single` | `double`

Maximum number of detections that the tracker can take as inputs, specified as a positive integer.

Data Types: `single` | `double`

Handling of out-of-sequence measurement (OOSM), specified as `'Terminate'`, `'Neglect'`, or `'Retrodiction'`. Each detection has an associated timestamp, td, and the tracker has its own timestamp, tt, which is updated in each call to the tracker. The tracker considers a measurement as an OOSM if td < tt.

When you specify this property as

• `'Terminate'` — The tracker stops running when it encounters an out-of-sequence measurement.

• `'Neglect'` — The tracker neglects any out-of-sequence measurements and continues to run.

• `'Retrodiction'` — The tracker uses a retrodiction algorithm to update the tracker by either neglecting the OOSM, updating existing tracks, or creating new tracks using the OOSM. You must specify a filter initialization function that returns a `trackingKF`, `trackingEKF`, or `trackingIMM` object in the `FilterInitializationFcn` property.

If you specify this property as `'Retrodiction'`, the tracker follows these steps to handle the OOSM:

• If the OOSM timestamp is beyond the oldest correction timestamp (specified by the `MaxNumOOSMSteps` property) maintained by the tracker, the tracker discards the OOSMs.

• If the OOSM timestamp is within the oldest correction timestamp maintained by the tracker, the tracker first retrodicts all the existing tracks to the time of the OOSM. Then, the tracker applies the global nearest neighbor algorithm to try to associate the OOSM to any of the retrodicted tracks.

• If the tracker successfully associates the OOSM to a retrodicted track, then the tracker updates the retrodicted track using the OOSM by applying the retro-correction algorithm to obtain a current, corrected track.

• If the tracker cannot associate the OOSM to any retrodicted track, then the tracker creates a new track based on the OOSM and predicts the track to the current time.

For more details on the retrodiction and retro-correction algorithms, see Retrodiction and Retro-Correction. To simulate out-of-sequence detections, use `objectDetectionDelay`.

Note

• When you select `'Retrodiction'`, you cannot use the costMatrix input.

Tunable: Yes

Maximum number of out-of-sequence measurement (OOSM) steps, specified as a positive integer.

Increasing the value of this property requires more memory, but enables you to call the tracker with OOSMs that have a larger lag relative to the last timestamp. However, as the lag increases, the impact of the OOSM on the current state of the track diminishes. The recommended value for this property is `3`.

#### Dependencies

To enable this argument, set the `OOSMHandling` property to `'Retrodiction'`.

Parameters of the track state reference frame, specified as a structure or a structure array. The tracker passes its `StateParameters` property values to the `StateParameters` property of the generated tracks. You can use these parameters to define the reference frame in which the track is reported or other desirable attributes of the generated tracks.

For example, you can use the following structure to define a rectangular reference frame whose origin position is at `[10 10 0]` meters and whose origin velocity is [2 -2 0] meters per second with respect to the scenario frame.

Field NameValue
`Frame``"Rectangular"`
`Position``[10 10 0]`
`Velocity``[2 -2 0]`

Tunable: Yes

Data Types: `struct`

Enable the input of detectable track IDs at each object update, specified as `false` or `true`. Set this property to `true` if you want to provide a list of detectable track IDs. This list tells the tracker of all tracks that the sensors are expected to detect and, optionally, the probability of detection for each track.

Data Types: `logical`

Enable a cost matrix, specified as `false` or `true`. If `true`, you can provide an assignment cost matrix as an input argument when calling the object.

Data Types: `logical`

Number of tracks maintained by the tracker, returned as a nonnegative integer.

Data Types: `double`

Number of confirmed tracks, returned as a nonnegative integer. If the `IsConfirmed` field of an output track structure is `true`, the track is confirmed.

Data Types: `double`

Enable memory management properties, specified as a logical `1` (`true`) or `false` (`0`).

Setting this property to `true` enables you to use the `MaxNumDetectionsPerSensor` property to specify the maximum number of detections that each sensor can pass to the tracker during one call of the tracker.

Additionally, if the `AssignmentClustering` property is specified as `'on'`, you can use three more properties to specify bounds for certain variable-sized arrays in the tracker as well as determine how the tracker handles cluster-size violations:

• `MaxNumDetectionsPerCluster`

• `MaxNumTracksPerCluster`

• `ClusterViolationHandling`

Specifying bounds for variable-sized arrays enables you to manage the memory footprint of the tracker in the generated C/C++ code.

Data Types: `logical`

Maximum number of detections per sensor, specified as a positive integer. This property determines the maximum number of detections that each sensor can pass to the tracker in each call of the tracker.

Set this property to a finite value if you want the tracker to establish efficient bounds on local variables for C/C++ code generation. Set this property to `Inf` if you do not want to bound the maximum number of detections per sensor.

#### Dependencies

To enable this property, set the `EnableMemoryManagement` property to `true`.

Data Types: `single` | `double`

Maximum number of detections per cluster during the run-time of the tracker, specified as a positive integer.

Setting this property to a finite value enables the tracker to bound cluster sizes and reduces the memory footprint of the tracker in generated C/C++ code. Set this property to `Inf` if you do not want to bound the maximum number of detections per cluster.

If, during run-time, the number of detections in a cluster exceeds the specified `MaxNumDetectionsPerCluster`, the tracker reacts based on the `ClusterViolationHandling` property.

#### Dependencies

To enable this property, specify the `AssignmentClustering` property as `'on'` and set the `EnableMemoryManagement` property to `true`.

Data Types: `single` | `double`

Maximum number of tracks per cluster during the run-time of the tracker, specified as a positive integer.

Setting this property to a finite value enables the tracker to bound cluster sizes and reduces the memory footprint of the tracker in generated C/C++ code. Set this property to `Inf` if you do not want to bound the maximum number of tracks per cluster.

If, during run-time, the number of tracks in a cluster exceeds the specified `MaxNumTracksPerCluster`, the tracker reacts based on the `ClusterViolationHandling` property.

#### Dependencies

To enable this argument, specify the `AssignmentClustering` property as `'on'` and set the `EnableMemoryManagement` property to `true`.

Data Types: `single` | `double`

Handling of a run-time violation of cluster bounds, specified as one of these options:

• `'Teminate'` — The tracker reports an error if, during run-time, any cluster violates the cluster bounds specified in the `MaxNumDetectionsPerCluster` and `MaxNumTracksPerCluster` properties.

• `'Split and warn'` — The tracker splits the size-violating cluster into smaller clusters using a suboptimal approach. The tracker also reports a warning to indicate the violation.

• `'Split'` — The tracker splits the size-violating cluster into smaller clusters by using a suboptimal approach. The tracker does not report a warning.

In the suboptimal approach, the tracker separates out detections or tacks that have the smallest likelihoods of association to other tracks or detections until the cluster bounds are satisfied. These separated-out detections or tracks can form one or many new clusters depends on their association likelihoods with each other and the `AssignmentThreshold` property.

#### Dependencies

To enable this property, specify the `AssignmentClustering` property as `'on'` and set the `EnableMemoryManagement` property to `true`.

Data Types: `char` | `string`

Class fusion method, specified as:

• `"None"` — The tracker does not fuse classification information from detections. When the tracker initializes a track from a detection that has a nonzero class ID, the tracker immediately confirms the track and assigns the class ID of the detection to the track. In the subsequent updates to the track, the tracker assigns only detections with the same class ID or a class ID of 0 to the track. As a result, the track classification cannot change once established.

• `"Bayes"` — The tracker fuses classification information from detections. When the tracker initializes a tentative track from a detection, the tracker determines the class probability of the track based on the a priori class distribution and the class information of the detection. In the subsequent updates to the track, the tracker considers all possible detections for association with the track regardless of their classifications. The tracker uses the kinematic state as well as class information of the detection to calculate the detection-track assignment cost. Once the tracker assigns a detection to the track, the tracker uses the classification information of the detection to update the classification of the track.

See Detection Class Fusion, [2], and [3] for details.

Note

When you specify the `ClassFusionMethod` as `"Bayes"`:

• You must specify the `HasCostMatrixInput` property as `false`.

• You cannot specify the `OOSMHandling` property as `"Retrodiction"`.

Data Types: `char` | `string`

Prior class probability distribution for new tracks, specified as an N-element vector of nonnegative scalars that sum to `1`. The number of vector elements must be equal to the total number of classes.

For each `objectDetection` object specified through the `detections` input, the `ObjectClassID` property of the `objectDetection` object must be less than or equal to N.

Example: `[0.2 0.8]`

Data Types: `single` | `double`

Weight factor of class cost in overall assignment cost, specified as a scalar in the range `[0,1]`. When you set the `ClassFusionWeight` property to `"Bayes"`, the tracker calculates the overall assignment cost as:

`$C=\left(1-\alpha \right){C}_{k}+\alpha {C}_{c},$`

where:

• α — Weight factor of the class fusion cost

• Ck — Kinematic assignment cost matrix obtained from the kinematic states of the tracks and detections

• Cc — Class fusion assignment cost matrix obtained from the class information of tracks and detections

Data Types: `single` | `double`

## Usage

To process detections and update tracks, call the tracker with arguments, as if it were a function (described here).

### Syntax

``confirmedTracks = tracker(detections,time)``
``confirmedTracks = tracker(detections,time,costMatrix)``
``confirmedTracks = tracker(___,detectableTrackIDs)``
``[confirmedTracks,tentativeTracks,allTracks] = tracker(___)``
``[confirmedTracks,tentativeTracks,allTracks,analysisInformation] = tracker(___)``

### Description

````confirmedTracks = tracker(detections,time)` returns a list of confirmed tracks that are updated from a list of detections, `detections`, at the update time, `time`. Confirmed tracks are corrected and predicted to the update time.```
````confirmedTracks = tracker(detections,time,costMatrix)` also specifies a cost matrix, `costMatrix`.To enable this syntax, set the `HasCostMatrixInput` property to `true`.```
````confirmedTracks = tracker(___,detectableTrackIDs)` also specifies a list of expected detectable tracks, `detectableTrackIDs`.To enable this syntax, set the `HasDetectableTrackIDsInput` property to `true`.```
````[confirmedTracks,tentativeTracks,allTracks] = tracker(___)` also returns a list of tentative tracks, `tentativeTracks`, and a list of all tracks, `allTracks`.```
````[confirmedTracks,tentativeTracks,allTracks,analysisInformation] = tracker(___)` also returns information, `analysisInformation`, which can be used for track analysis.```

### Input Arguments

expand all

Detection list, specified as a cell array of `objectDetection` objects. The `Time` property value of each `objectDetection` object must be less than or equal to the current update time, `time`, and greater than the previous time value used to update the tracker. Also, the `Time` differences between different `objectDetection` objects in the cell array do not need to be equal.

Time of update, specified as a scalar. The tracker updates all tracks to this time. Units are in seconds.

`time` must be greater than or equal to the largest `Time` property value of the `objectDetection` objects in the input `detections` list. `time` must increase in value with each update to the tracker.

Data Types: `single` | `double`

Cost matrix, specified as a real-valued N-by-M matrix, where N is the number of existing tracks, and M is the number of current detections. The cost matrix rows must be in the same order as the list of tracks. The columns must be in the same order as the list of detections. Obtain the correct order of the list of tracks from the third output argument, `allTracks`, when is the tracker is updated.

At the first update of the object or when the tracker has no previous tracks, specify the cost matrix to have a size of `[0,numDetections]`. Note that the cost must be calculated so that lower costs indicate a higher likelihood of assigning a detection to a track. To prevent certain detections from being assigned to certain tracks, set the appropriate cost matrix entry to `Inf`.

#### Dependencies

To enable this argument, set the `HasCostMatrixInput` property to `true`.

Data Types: `double` | `single`

Detectable track IDs, specified as a real-valued M-by-1 vector or M-by-2 matrix. Detectable tracks are tracks that the sensors expect to detect. The first column of the matrix contains a list of track IDs that the sensors report as detectable. The second column contains the detection probability for the track. The detection probability is either reported by a sensor or, if not reported, obtained from the `DetectionProbability` property.

Tracks whose identifiers are not included in `detectableTrackIDs` are considered as undetectable. The track deletion logic does not count the lack of detection as a 'missed detection' for track deletion purposes.

#### Dependencies

To enable this input argument, set the `detectableTrackIDs` property to `true`.

Data Types: `single` | `double`

### Output Arguments

expand all

Confirmed tracks, returned as an array of `objectTrack` objects in MATLAB, and returned as an array of structures in code generation. In code generation, the field names of the returned structure are same with the property names of `objectTrack`.

A track is confirmed if it satisfies the confirmation threshold specified in the `ConfirmationThreshold` property. In that case, the `IsConfirmed` property of the object or field of the structure is `true`.

Data Types: `struct` | `object`

Tentative tracks, returned as an array of `objectTrack` objects in MATLAB, and returned as an array of structures in code generation. In code generation, the field names of the returned structure are same with the property names of `objectTrack`.

A track is tentative if it does not satisfy the confirmation threshold specified in the `ConfirmationThreshold` property. In that case, the `IsConfirmed` property of the object or field of the structure is `false`.

Data Types: `struct` | `object`

All tracks, returned as an array of `objectTrack` objects in MATLAB, and returned as an array of structures in code generation. In code generation, the field names of the returned structure are same with the property names of `objectTrack`. All tracks consists of confirmed and tentative tracks.

Data Types: `struct` | `object`

Additional information for analyzing track updates, returned as a structure. The fields of this structure are:

 Field Description `OOSMDetectionIndices` Indices of out-of-sequence measurements at the current step of the tracker `TrackIDsAtStepBeginning` Track IDs when step began `CostMatrix` Cost matrix for kinematic assignment in which the (i, j) element denotes the kinematic cost of assigning track i to detection j. `Assignments` Assignments returned from the assignment function. `UnassignedTracks` IDs of unassigned tracks returned from the tracker `UnassignedDetections` Indices of unassigned detections in the `detections` input. `InitiatedTrackIDs` IDs of tracks initiated during the step `DeletedTrackIDs` IDs of tracks deleted during the step `TrackIDsAtStepEnd` Track IDs when the step ended `MaxNumDetectionsPerCluster ` The maximum number of detections in all the clusters generated during the step. The structure has this field only when you set both the `AssignmentClustering` and `EnableMemoryManagement` properties to `'on'`. `MaxNumTracksPerCluster` The maximum number of tracks in all the clusters generated during the step. The structure has this field only when you set both the `AssignmentClustering` and `EnableMemoryManagement` properties to `'on'`. `OOSMHandling` Analysis information for out-of-sequence measurements handling, returned as a structure. The structure has this field only when the `OOSMHandling` property of the tracker is specified as `'Retrodiction'`. `ClassCostMatrix` Cost matrix for classification assignment, in which the (i, j) elements denotes the classification cost of assigning track i to detection j. The structure only has this field when the `ClassFusionMethod` property is set to `"Bayes"`.

The `OOSMHandling` structure contains these fields:

FieldDescription
`DiscardedDetections`Indices of discarded out-of-sequence detections. An OOSM is discarded if it is not covered by the saved state history specified by the `MaxNumOOSMSteps` property.
`CostMatrix`

Cost of assignment matrix for the out-of-sequence measurements

`Assignments`

Assignments between the out-of-sequence detections and the maintained tracks

`UnassignedDetections`Indices of unassigned out-of-sequence detections. The tracker creates new tracks for unassigned out-of-sequence detections.

Data Types: `struct`

## Object Functions

To use an object function, specify the System object as the first input argument. For example, to release system resources of a System object named `obj`, use this syntax:

`release(obj)`

expand all

 `getTrackFilterProperties` Obtain track filter properties `setTrackFilterProperties` Set track filter properties `predictTrackToTime` Predict track state `initializeTrack` Initialize new track `confirmTrack` Confirm tentative track `deleteTrack` Delete existing track `exportToSimulink` Export tracker or track fuser to Simulink model
 `release` Release resources and allow changes to System object property values and input characteristics `reset` Reset internal states of System object `isLocked` Determine if System object is in use `clone` Create duplicate System object

## Examples

collapse all

Construct a `trackerGNN` object with the default 2-D constant-velocity Kalman filter initialization function, `initcvkf`.

```tracker = trackerGNN('FilterInitializationFcn', @initcvkf, ... 'ConfirmationThreshold', [4 5], ... 'DeletionThreshold', 10);```

Update the tracker with two detections both having nonzero `ObjectClassID`. These detections immediately create confirmed tracks.

```detections = {objectDetection(1,[10;0],'SensorIndex',1, ... 'ObjectClassID',5,'ObjectAttributes',{struct('ID',1)}); ... objectDetection(1,[0;10],'SensorIndex',1, ... 'ObjectClassID',2,'ObjectAttributes',{struct('ID',2)})}; time = 2; tracks = tracker(detections,time);```

Find the positions and velocities.

```positionSelector = [1 0 0 0; 0 0 1 0]; velocitySelector = [0 1 0 0; 0 0 0 1]; positions = getTrackPositions(tracks,positionSelector)```
```positions = 2×2 10 0 0 10 ```
`velocities = getTrackVelocities(tracks,velocitySelector)`
```velocities = 2×2 0 0 0 0 ```

Create two `objectDetection` objects at time $\mathit{t}$ = 0 and $\mathit{t}$ = 1, respectively. The `ObjectClassID` of the two detections is `1`. Specify the confusion matrix for each detection.

```detection0 = objectDetection(0,[0 0 0],... ObjectClassID=1,... ObjectClassParameters=struct("ConfusionMatrix",[0.6 0.2 0.2; 0.2 0.6 0.2; 0.2 0.2 0.6])); detection1 = objectDetection(1,[0 0 0],... ObjectClassID=1,... ObjectClassParameters=struct("ConfusionMatrix",[0.5 0.3 0.2; 0.3 0.5 0.2; 0.2 0.2 0.6]));```

Create a `trackerGNN` object. Specify the class fusion method as `"Bayes"` and specify the initial probability of each class as `1/3`.

`tracker = trackerGNN(ClassFusionMethod="Bayes",InitialClassProbabilities=[1/3 1/3 1/3])`
```tracker = trackerGNN with properties: TrackerIndex: 0 FilterInitializationFcn: 'initcvekf' MaxNumTracks: 100 MaxNumDetections: Inf MaxNumSensors: 20 Assignment: 'MatchPairs' AssignmentThreshold: [30 Inf] AssignmentClustering: 'off' OOSMHandling: 'Terminate' TrackLogic: 'History' ConfirmationThreshold: [2 3] DeletionThreshold: [5 5] HasCostMatrixInput: false HasDetectableTrackIDsInput: false StateParameters: [1x1 struct] NumTracks: 0 NumConfirmedTracks: 0 ClassFusionMethod: 'Bayes' InitialClassProbabilities: [0.3333 0.3333 0.3333] ClassFusionWeight: 0.7000 EnableMemoryManagement: false ```

Update the track with the first and second detections sequentially.

```tracker(detection0,0); [tracks,~,~,info] = tracker(detection1,1);```

Show the maintained tracks and analysis information.

`disp(tracks)`
``` objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 1 Age: 2 State: [6x1 double] StateCovariance: [6x6 double] StateParameters: [1x1 struct] ObjectClassID: 1 ObjectClassProbabilities: [0.7500 0.1500 0.1000] TrackLogic: 'History' TrackLogicState: [1 1 0 0 0] IsConfirmed: 1 IsCoasted: 0 IsSelfReported: 1 ObjectAttributes: [1x1 struct] ```
`disp(info)`
``` OOSMDetectionIndices: [1x0 uint32] TrackIDsAtStepBeginning: 1 CostMatrix: 13.8823 Assignments: [1 1] UnassignedTracks: [1x0 uint32] UnassignedDetections: [0x1 uint32] InitiatedTrackIDs: [1x0 uint32] DeletedTrackIDs: [1x0 uint32] TrackIDsAtStepEnd: 1 ClassCostMatrix: -0.1823 ```

expand all

## References

[1] Blackman, S., and R. Popoli. Design and Analysis of Modern Tracking Systems. Artech House Radar Library, Boston, 1999.

[2] Bar-Shalom, Y., et al. “Tracking with Classification-Aided Multiframe Data Association.” IEEE Transactions on Aerospace and Electronic Systems, vol. 41, no. 3, July 2005, pp. 868–78.

[3] Kuncheva, Ludmila I., et al. “Decision Templates for Multiple Classifier Fusion: An Experimental Comparison.” Pattern Recognition, vol. 34, no. 2, Feb. 2001, pp. 299–314.

## Version History

Introduced in R2018b

expand all