*B. Track maintenance*

Step 1: State prediction. For each initiated or maintained track with *n* plots, denote **xˆ** *<sup>k</sup>*−<sup>1</sup> = [*x*ˆ*k*−1, *<sup>v</sup>*ˆ*xk*−<sup>1</sup> , *<sup>y</sup>*ˆ*k*−1, *<sup>v</sup>*ˆ*yk*−<sup>1</sup> ] *<sup>T</sup>* as its previous plot at time *<sup>k</sup>* <sup>−</sup> 1, its predicted state **xˆ** *<sup>k</sup>*|*k*−<sup>1</sup> <sup>=</sup> [*x*ˆ*k*|*k*−1, *<sup>v</sup>*ˆ*xk*|*k*−<sup>1</sup> , *<sup>y</sup>*ˆ*k*|*k*−1, *<sup>v</sup>*ˆ*yk*|*k*−<sup>1</sup> ] *<sup>T</sup>* at time *<sup>k</sup>* is obtained by **xˆ** *<sup>k</sup>*|*k*−<sup>1</sup> <sup>=</sup> **F ˆx***k*−1. Meanwhile, the corresponding state prediction covariance **<sup>P</sup>***k*|*k*−<sup>1</sup> is calculated according to **<sup>P</sup>***k*|*k*−<sup>1</sup> = **FP***k*−1**<sup>F</sup>** + **<sup>Q</sup>***k*.

Step 2: Coordinate conversion. The predicted state **xˆ** *<sup>k</sup>*|*k*−<sup>1</sup> is converted from Cartesian coordinate to polar coordinate by

$$\begin{split} R\_{Rk}^p &= \sqrt{\hat{\mathfrak{x}}\_{k|k-1}^2 + \hat{\mathfrak{y}}\_{k|k-1}^2}, \\ \sigma\_{Rk}^p &= \arctan(\frac{\hat{\mathfrak{y}}\_{k|k-1}}{\hat{\mathfrak{x}}\_{k|k-1}}) \; , \\ \upsilon\_{dRk}^p &= \frac{\pounds\_{k|k-1} \mathfrak{o}\_{\mathbb{X}\_{k|k-1}} + \hat{\mathfrak{y}}\_{k|k-1} \mathfrak{o}\_{\mathbb{X}\_{k|k-1}}}{\sqrt{\hat{\mathfrak{x}}\_{k|k-1}^2 + \hat{\mathfrak{y}}\_{k|k-1}^2}} \; . \end{split} \tag{8}$$

Step 3: Data association. The data association method based on the minimal cost in Equation (9) is utilized to find the most likely measurements [*R<sup>m</sup> Rk <sup>θ</sup><sup>m</sup> Rk <sup>v</sup><sup>m</sup> dRk*] at time *k* within a predefined validation gate. The minimal cost criterion is defined by

$$cost = 1 - \left(cost\_{\upsilon\_d} + cost\_R + cost\_\theta\right),\tag{9}$$

where *costvd* , *costR*, *cost<sup>θ</sup>* represent the association cost of Doppler velocity, range, and azimuth, respectively, which are defined as

$$\begin{aligned} \text{cost}\_{\upsilon\_d} &= W\_{\upsilon\_d} \ast \exp(-\left|\upsilon\_{dRk}^{\text{m}} - \upsilon\_{dRk}^p\right|^2 \Big/ \sigma\_{\upsilon\_d}^2), \\ \text{cost}\_{R} &= W\_{R} \ast \exp(-\left|R\_{Rk}^{\text{m}} - R\_{Rk}^p\right|^2 \Big/ \sigma\_{R}^2), \\ \text{cost}\_{\theta} &= W\_{\theta} \ast \exp(-\left|\theta\_{Rk}^{\text{m}} - \theta\_{Rk}^p\right|^2 \Big/ \sigma\_{\theta}^2), \end{aligned} \tag{10}$$

where *Wvd* , *WR* , *W<sup>θ</sup>* are the corresponding weights of three parameters, while *σvd* , *σR*, and *σθ* denote their corresponding standard deviations. The candidate with the minimum *cost* value is associated with the current target. If a track can associate a measurement, go to step 4; otherwise, go to step 6.

Step 4: Measurement conversion. The associated measurement [*R<sup>m</sup> Rk <sup>θ</sup><sup>m</sup> Rk <sup>v</sup><sup>m</sup> dRk*] is converted from polar coordinate to Cartesian coordinate to obtain the measured target state **z***<sup>k</sup>* = [*x*˜*k*, *v*˜*xk* , *y*˜*k*, *v*˜*yk* ] *<sup>T</sup>* by

$$\begin{aligned} \vec{x}\_k &= R\_{Rk}^{\rm m} \cos \theta\_{Rk}^{\rm m} \\ \vec{y}\_k &= R\_{Rk}^{\rm m} \sin \theta\_{Rk}^{\rm m} \\ \vec{w}\_{x\_k} &= (\vec{x}\_k - \vec{x}\_{k-1}) / T, \\ \vec{w}\_{y\_k} &= (\vec{y}\_k - \vec{y}\_{k-1}) / T. \end{aligned} \tag{11}$$

In practice, averaging is usually carried out with a longer time interval to make a more robust estimation of *v*˜*xk* and *v*˜*yk* .

Step 5: State estimation. The target state **xˆ** *<sup>k</sup>* at time *k*, as well as the state estimation covariance matrix **P***k*, is updated by

$$\begin{aligned} \mathbf{K}\_k &= \mathbf{P}\_{k|k-1} \mathbf{H}^T (\mathbf{H} \mathbf{P}\_{k|k-1} \mathbf{H}^T + \mathbf{R}\_k), \\ \mathbf{S}\_k &= \mathbf{S}\_{k|k-1} + \mathbf{K}\_k (\mathbf{z}\_k - \mathbf{H} \mathbf{S}\_{k|k-1}), \\ \mathbf{P}\_k &= \mathbf{P}\_{k|k-1} - \mathbf{K}\_k \mathbf{H} \mathbf{P}\_{k|k-1}. \end{aligned} \tag{12}$$

where **K***<sup>k</sup>* is the Kalman gain at time *k*. Then the estimated target state **xˆ** *<sup>k</sup>* is used to update the current track, and *n* = *n* + 1.

Step 6: Determine if the track termination conditions are satisfied. If the conditions are met, the track will be terminated; otherwise, *k* is increased by 1 and go to step 1.
