nrl-tracker 0.13.2__py3-none-any.whl → 0.21.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/METADATA +8 -3
- {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/RECORD +37 -23
- pytcl/__init__.py +1 -1
- pytcl/assignment_algorithms/__init__.py +27 -1
- pytcl/assignment_algorithms/jpda.py +43 -29
- pytcl/assignment_algorithms/three_dimensional/__init__.py +24 -0
- pytcl/assignment_algorithms/three_dimensional/assignment.py +659 -0
- pytcl/assignment_algorithms/two_dimensional/__init__.py +14 -1
- pytcl/assignment_algorithms/two_dimensional/assignment.py +14 -7
- pytcl/assignment_algorithms/two_dimensional/kbest.py +568 -0
- pytcl/clustering/dbscan.py +23 -5
- pytcl/clustering/hierarchical.py +23 -10
- pytcl/clustering/kmeans.py +5 -10
- pytcl/containers/__init__.py +34 -1
- pytcl/containers/cluster_set.py +784 -0
- pytcl/containers/measurement_set.py +461 -0
- pytcl/containers/track_list.py +477 -0
- pytcl/dynamic_estimation/__init__.py +50 -0
- pytcl/dynamic_estimation/imm.py +41 -32
- pytcl/dynamic_estimation/information_filter.py +647 -0
- pytcl/dynamic_estimation/kalman/linear.py +17 -13
- pytcl/dynamic_estimation/kalman/unscented.py +26 -23
- pytcl/dynamic_estimation/particle_filters/bootstrap.py +57 -19
- pytcl/dynamic_estimation/smoothers.py +668 -0
- pytcl/mathematical_functions/numerical_integration/quadrature.py +36 -7
- pytcl/mathematical_functions/special_functions/__init__.py +82 -0
- pytcl/mathematical_functions/special_functions/bessel.py +260 -0
- pytcl/mathematical_functions/special_functions/debye.py +288 -0
- pytcl/mathematical_functions/special_functions/hypergeometric.py +420 -0
- pytcl/mathematical_functions/special_functions/lambert_w.py +294 -0
- pytcl/mathematical_functions/special_functions/marcum_q.py +370 -0
- pytcl/navigation/__init__.py +70 -0
- pytcl/navigation/great_circle.py +799 -0
- pytcl/navigation/rhumb.py +722 -0
- {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/LICENSE +0 -0
- {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/WHEEL +0 -0
- {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/top_level.txt +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: nrl-tracker
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.21.4
|
|
4
4
|
Summary: Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms
|
|
5
5
|
Author: Original: David F. Crouse, Naval Research Laboratory
|
|
6
6
|
Maintainer: Python Port Contributors
|
|
7
|
-
Project-URL: Homepage, https://
|
|
7
|
+
Project-URL: Homepage, https://pytcl.readthedocs.io/en
|
|
8
|
+
Project-URL: Documentation, https://pytcl.readthedocs.io/en/latest/docs.html
|
|
9
|
+
Project-URL: Repository, https://github.com/nedonatelli/TCL
|
|
8
10
|
Project-URL: Bug Tracker, https://github.com/nedonatelli/TCL/issues
|
|
9
|
-
Project-URL: Documentation, https://github.com/nedonatelli/TCL#readme
|
|
10
11
|
Project-URL: Original MATLAB Library, https://github.com/USNavalResearchLaboratory/TrackerComponentLibrary
|
|
11
12
|
Keywords: tracking,kalman-filter,target-tracking,data-association,estimation,navigation,coordinate-systems,signal-processing
|
|
12
13
|
Classifier: Development Status :: 3 - Alpha
|
|
@@ -59,12 +60,16 @@ Requires-Dist: plotly>=5.15.0; extra == "visualization"
|
|
|
59
60
|
|
|
60
61
|
# Tracker Component Library (Python)
|
|
61
62
|
|
|
63
|
+
[](https://pypi.org/project/nrl-tracker/)
|
|
62
64
|
[](https://www.python.org/downloads/)
|
|
63
65
|
[](https://en.wikipedia.org/wiki/Public_domain)
|
|
64
66
|
[](https://github.com/psf/black)
|
|
67
|
+
[](https://github.com/nedonatelli/TCL)
|
|
65
68
|
|
|
66
69
|
A Python port of the [U.S. Naval Research Laboratory's Tracker Component Library](https://github.com/USNavalResearchLaboratory/TrackerComponentLibrary), a comprehensive collection of algorithms for target tracking, estimation, coordinate systems, and related mathematical functions.
|
|
67
70
|
|
|
71
|
+
**800+ functions** | **144 modules** | **1,530 tests** | **15+ algorithm categories**
|
|
72
|
+
|
|
68
73
|
## Overview
|
|
69
74
|
|
|
70
75
|
The Tracker Component Library provides building blocks for developing target tracking algorithms, including:
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
pytcl/__init__.py,sha256=
|
|
2
|
-
pytcl/assignment_algorithms/__init__.py,sha256=
|
|
1
|
+
pytcl/__init__.py,sha256=gskiDd7_BZ-aWQ3h_uxnX6oGP3ylOmb69Mws0xLnEAQ,1894
|
|
2
|
+
pytcl/assignment_algorithms/__init__.py,sha256=f9V-TkEVmiKYYyth4PTpDfJvA7yYV_ys6Zix-QwWIYY,2136
|
|
3
3
|
pytcl/assignment_algorithms/data_association.py,sha256=X6Kww9-J2WLxU1790w7dRvAFdM90RSXHvs7IF26zweQ,11427
|
|
4
4
|
pytcl/assignment_algorithms/gating.py,sha256=fN_oAOkv7nYYOWE1oPOLrcCn3xEpKdMVlFSbRMAURxY,10815
|
|
5
|
-
pytcl/assignment_algorithms/jpda.py,sha256=
|
|
6
|
-
pytcl/assignment_algorithms/
|
|
7
|
-
pytcl/assignment_algorithms/
|
|
5
|
+
pytcl/assignment_algorithms/jpda.py,sha256=Hv55j3J9qVwzlUfWdXdSasodTyB1ZKdgEpo5dBh95O8,19582
|
|
6
|
+
pytcl/assignment_algorithms/three_dimensional/__init__.py,sha256=1Q40OUlUQoo7YKEucwdrSNo3D4A0Zibvkr8z4TpueBg,526
|
|
7
|
+
pytcl/assignment_algorithms/three_dimensional/assignment.py,sha256=9BJhwlYu3JJ0kZ9sRyKKfpdvQdL4WYYHCtLbvaWycBw,19212
|
|
8
|
+
pytcl/assignment_algorithms/two_dimensional/__init__.py,sha256=4Evsn__9hTfI2i8m8Ngl-Zy0Fa2OydKmDKlZlH6jaao,778
|
|
9
|
+
pytcl/assignment_algorithms/two_dimensional/assignment.py,sha256=eh87MBb-uiUSI1MXj4HrreRKB6Z8rxAyDkNQ8-u4SbM,11848
|
|
10
|
+
pytcl/assignment_algorithms/two_dimensional/kbest.py,sha256=yiTToLuP7xWxQlQ8E-fpgXg-5iu0nnXcJXStjUB0nOE,17284
|
|
8
11
|
pytcl/astronomical/__init__.py,sha256=SKELDaDhxpvCo1dMswBQYOQr_Th3ShuzZTzxZMdhE-U,5650
|
|
9
12
|
pytcl/astronomical/lambert.py,sha256=Lc8FT1JmpI9WSXsG2s5vIRkSoBSV7r5hd3o2bGh2Ojo,15607
|
|
10
13
|
pytcl/astronomical/orbital_mechanics.py,sha256=8GssRanwTowCl6PJYqmB_SDnNznLUq5gkPa3j6iEo3U,19965
|
|
@@ -13,14 +16,17 @@ pytcl/astronomical/time_systems.py,sha256=Jg0Zaq60hc4Ts1aQtb5bK4KSZhz-uQse8gYC89
|
|
|
13
16
|
pytcl/atmosphere/__init__.py,sha256=QAYgJYzgs0kreRV8fByii4p477LCxBDfrXB_cL7SYkM,706
|
|
14
17
|
pytcl/atmosphere/models.py,sha256=pMLv8D7qoFqLZrlbTHLJJULOdDdhPskJ1m7KVKLV63E,9584
|
|
15
18
|
pytcl/clustering/__init__.py,sha256=bYdhC_XJEt6KUUni9bIPxaddXNEGmIJQvGkA14rK4J8,1697
|
|
16
|
-
pytcl/clustering/dbscan.py,sha256=
|
|
19
|
+
pytcl/clustering/dbscan.py,sha256=PS6QlOwHFerbZNEb3zcNhN4oNQpgOOw5y0WskQzyKIo,7364
|
|
17
20
|
pytcl/clustering/gaussian_mixture.py,sha256=U5U0Z46tZWdTLNdNNNJenoeviwZRAOvexVFYVLt4QMc,22865
|
|
18
|
-
pytcl/clustering/hierarchical.py,sha256=
|
|
19
|
-
pytcl/clustering/kmeans.py,sha256=
|
|
20
|
-
pytcl/containers/__init__.py,sha256=
|
|
21
|
+
pytcl/clustering/hierarchical.py,sha256=Hw9BFCn5df_ATpJX63R3B31MHz27ztCw9ihMDIlI688,14202
|
|
22
|
+
pytcl/clustering/kmeans.py,sha256=250FQyDol5S_Y4TznNn9cEuE96UDp7wvEkPZJ1DLul8,10697
|
|
23
|
+
pytcl/containers/__init__.py,sha256=t8oRtusBrh6G2dEk2PcofmxrpLPQ9nOJwH19GyKnNcc,1699
|
|
24
|
+
pytcl/containers/cluster_set.py,sha256=_lZ39PNHTL7fUEZAwBF2ICK6v0GjZKpeUOg0knEdPzo,22760
|
|
21
25
|
pytcl/containers/covertree.py,sha256=1JWqXxoUFLxuMnjwj2qf0iz2uPzdujQYdwJW3l5qsOs,13282
|
|
22
26
|
pytcl/containers/kd_tree.py,sha256=pxRC62RYkqz9zXPz6c1fubmtPPBDLYA5I9AXMAoGanw,16348
|
|
27
|
+
pytcl/containers/measurement_set.py,sha256=Kr29mlJOCyGMYhMnE89f-W72aunlv4p04QAdfCZcm-0,12687
|
|
23
28
|
pytcl/containers/rtree.py,sha256=gv2EztvPnaAXEa6OoFnOYBY1MfTwjNMYh_BCiIomHJk,15450
|
|
29
|
+
pytcl/containers/track_list.py,sha256=6q9Qgcwm-8H_JqtOCsMssF27av4XaSkhfDl-MWb1ABc,12520
|
|
24
30
|
pytcl/containers/vptree.py,sha256=6fBNHrezkmj7L2nH0-2bONRN92f5cZAhS-5vaI1JZnA,8814
|
|
25
31
|
pytcl/coordinate_systems/__init__.py,sha256=jwYhu_-9AvOeP9WLG9PYtyDwfe0GjxNZ9-xCqiLymW4,3909
|
|
26
32
|
pytcl/coordinate_systems/conversions/__init__.py,sha256=PkNevB78vBw0BkalydJBbQO91AyiMJxKRrgJNt4HsYc,1100
|
|
@@ -36,17 +42,19 @@ pytcl/core/__init__.py,sha256=H5JJPS-43DfF1UG7fSgV-VMTcZFBO8GuzDW1lM_1sm4,1152
|
|
|
36
42
|
pytcl/core/array_utils.py,sha256=SsgEiAoRCWxAVKq1aa5-nPdOi-2AB6XNObu0IaGClUk,13983
|
|
37
43
|
pytcl/core/constants.py,sha256=lZVDK5zsSR02_4b2Nqx9KDtZT9QaYhkZ9wuoODbifd4,8693
|
|
38
44
|
pytcl/core/validation.py,sha256=WRlzMlUihtqc3XZoWOTFK0sBAZVDIwTMGCiWcX5OZVY,13093
|
|
39
|
-
pytcl/dynamic_estimation/__init__.py,sha256=
|
|
40
|
-
pytcl/dynamic_estimation/imm.py,sha256=
|
|
45
|
+
pytcl/dynamic_estimation/__init__.py,sha256=jA5FF6kHYklY5LMOfZaKcCeiPTpVe8vHIMp3ECDOmsc,4582
|
|
46
|
+
pytcl/dynamic_estimation/imm.py,sha256=t4dlutWeCLtAMl-ylNbxMUC3gbRBF_sXI3bX4PAk-OQ,22080
|
|
47
|
+
pytcl/dynamic_estimation/information_filter.py,sha256=x7iQwO_iJT1dCSvDws5LqD3yAtjw9QVGUfMPcXn1IA4,17349
|
|
48
|
+
pytcl/dynamic_estimation/smoothers.py,sha256=qC_g0YG0U4L_7rGBpcZzYcb11A--Hc8tb0fxWXIJdxM,18931
|
|
41
49
|
pytcl/dynamic_estimation/batch_estimation/__init__.py,sha256=JQ0s76Enov5a7plA4EnUua4t-7etikQrwr5z4WIjUeo,46
|
|
42
50
|
pytcl/dynamic_estimation/kalman/__init__.py,sha256=yoFLj0n-NRkdZnRVL-BkHBlATk8pfZEVlsY3BhSYgKc,2387
|
|
43
51
|
pytcl/dynamic_estimation/kalman/extended.py,sha256=_deQTnUGOp_BlhP-FDEY0LOjgUMN32FQn0V12unCM4A,10397
|
|
44
|
-
pytcl/dynamic_estimation/kalman/linear.py,sha256=
|
|
52
|
+
pytcl/dynamic_estimation/kalman/linear.py,sha256=1Zgg9gZya0Vxs9im7sPUqLj0Luo463vS-RSa6GCReFI,12248
|
|
45
53
|
pytcl/dynamic_estimation/kalman/square_root.py,sha256=Hw1F4_Zc7IA6Mt1WCkjx1UuLAUmNhM5vPLvueb7oRSA,26931
|
|
46
|
-
pytcl/dynamic_estimation/kalman/unscented.py,sha256=
|
|
54
|
+
pytcl/dynamic_estimation/kalman/unscented.py,sha256=VmYE8LuM1nWpFTmD39iXdEZ3m41IsurCCbXJ19-ERFs,15440
|
|
47
55
|
pytcl/dynamic_estimation/measurement_update/__init__.py,sha256=8rlyJwVpxf0fZj-AFo1hlewvryZRhUzcy3F8uMe6I8c,48
|
|
48
56
|
pytcl/dynamic_estimation/particle_filters/__init__.py,sha256=-DRF5rVF2749suLlArmkTvVkqeMcV_mIx0eLeTj6wNU,906
|
|
49
|
-
pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=
|
|
57
|
+
pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=FcF4W_NM5ZqJnw5fq4rq6fLY9X1r4uFJOiAX9a-NGG8,13371
|
|
50
58
|
pytcl/dynamic_models/__init__.py,sha256=Cd8MyyYuB8gMnepkPA-HSwTaKFPThnqoKOhdjVOsXWg,2783
|
|
51
59
|
pytcl/dynamic_models/continuous_time/__init__.py,sha256=dAkfEddLkfMvDalK9v2GRBvaZV1KgqYpFBLOnoiFClw,1023
|
|
52
60
|
pytcl/dynamic_models/continuous_time/dynamics.py,sha256=CDwqn-66eUwXA5xfIjaG6A4EDBqtOyQ3aWarJr9QH4g,12858
|
|
@@ -80,17 +88,21 @@ pytcl/mathematical_functions/geometry/geometry.py,sha256=l63wQnhCtJwVHZOJeONX1qy
|
|
|
80
88
|
pytcl/mathematical_functions/interpolation/__init__.py,sha256=HDhP7ZsgUrXFBNJ_eCZEdp5gizWJ-BxvkQSCMnvBg3A,677
|
|
81
89
|
pytcl/mathematical_functions/interpolation/interpolation.py,sha256=2cXMDgWBjWDGHnK1K_lawFlJL8oPl5AQGf9MNgsESfo,12610
|
|
82
90
|
pytcl/mathematical_functions/numerical_integration/__init__.py,sha256=iXiHzyV_KIhCv7tXErXlN1_fUEACN6yN3CYDHRA7esw,974
|
|
83
|
-
pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=
|
|
91
|
+
pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=ZRMKs0vbcgFDe1Sr8sjyEOkALLmJU4zKRJjoPEcXrUc,15670
|
|
84
92
|
pytcl/mathematical_functions/polynomials/__init__.py,sha256=WJWZcoQhnvy5f59-kncMTgD9mCtgwfDgULvDYYHS5ys,43
|
|
85
93
|
pytcl/mathematical_functions/signal_processing/__init__.py,sha256=_SzzBVtxmSvP8FKeogRdNmFo8FOVDDoexVOqd-lE7do,2325
|
|
86
94
|
pytcl/mathematical_functions/signal_processing/detection.py,sha256=9F0xdy3hMat1czSWAQYMExn0kY5DBRpyBneAfjjHUVI,30377
|
|
87
95
|
pytcl/mathematical_functions/signal_processing/filters.py,sha256=8Ojf4h4rfiucBXqUmB1odvHH41Gf3rPwmWCMKb-qzWk,23435
|
|
88
96
|
pytcl/mathematical_functions/signal_processing/matched_filter.py,sha256=AahJZRZk2IIXzRL7www0n8bc0XoKabaLOe8yYNSjuDY,22893
|
|
89
|
-
pytcl/mathematical_functions/special_functions/__init__.py,sha256=
|
|
90
|
-
pytcl/mathematical_functions/special_functions/bessel.py,sha256=
|
|
97
|
+
pytcl/mathematical_functions/special_functions/__init__.py,sha256=qDPGfee1i1NkVi9LXJKnsWXL3CWHkPQINrkwqLqB8YU,3796
|
|
98
|
+
pytcl/mathematical_functions/special_functions/bessel.py,sha256=M0mwLQBaUXEHA8wyKReJ2D66I1v1XR7y-txAipd-WDs,14377
|
|
99
|
+
pytcl/mathematical_functions/special_functions/debye.py,sha256=Nchjwkl1vzSL1L7nQpslb-lvT49LgTfdTIQMeSNn4vQ,6689
|
|
91
100
|
pytcl/mathematical_functions/special_functions/elliptic.py,sha256=WyzBkrfZufIR5dUmCKGcxp6KNpVDrU89NGLDyRrZOqQ,7418
|
|
92
101
|
pytcl/mathematical_functions/special_functions/error_functions.py,sha256=a3SS8FYAMRv1KdCmebOZL95yjvVt9gZRF2XOjHvQ9M8,6253
|
|
93
102
|
pytcl/mathematical_functions/special_functions/gamma_functions.py,sha256=xXN_9SCokH10HjE8PpaPKHYVK_RZRHRAbZgR2mZYIAA,10191
|
|
103
|
+
pytcl/mathematical_functions/special_functions/hypergeometric.py,sha256=gKn_tXboEst7pVDiW15IbKFAANM4XVqKtDc1dmWL-2A,9768
|
|
104
|
+
pytcl/mathematical_functions/special_functions/lambert_w.py,sha256=ivRc4KH5Lwoxb_yijrJEwG0ITa0hhcYF7_gCfVBBNW4,6855
|
|
105
|
+
pytcl/mathematical_functions/special_functions/marcum_q.py,sha256=OZ5QjIB1e_XvRG8A-3dbZ13YXHtdk2EYVEPaqtgVr14,9580
|
|
94
106
|
pytcl/mathematical_functions/statistics/__init__.py,sha256=dfypStgmnFmOrnWcm-3CEvLinONHraFgx9O66_37bqw,1278
|
|
95
107
|
pytcl/mathematical_functions/statistics/distributions.py,sha256=icfFIIKCEFzkpFHuYGWL197nm8wvS7UPJlr9kd_uEgw,19373
|
|
96
108
|
pytcl/mathematical_functions/statistics/estimators.py,sha256=TLnYXSwk5MzBakZrzDBupbOB3ONmJI7q1-oB2xuSVQM,10831
|
|
@@ -99,10 +111,12 @@ pytcl/mathematical_functions/transforms/fourier.py,sha256=QH6OaTzw4kN6M-DuSmwB_5
|
|
|
99
111
|
pytcl/mathematical_functions/transforms/stft.py,sha256=zQapXl-v69_RDPwMqci83jah17GyAfnr3gx0budv2Cg,18619
|
|
100
112
|
pytcl/mathematical_functions/transforms/wavelets.py,sha256=dm273Z_t13BlEVSlHTaGE7jR1ocugL7lEkcO499U7bY,21656
|
|
101
113
|
pytcl/misc/__init__.py,sha256=SCHf_lQVfdl2gwUluHBiIloTF8HRH8EkgYfbNr7zOug,33
|
|
102
|
-
pytcl/navigation/__init__.py,sha256=
|
|
114
|
+
pytcl/navigation/__init__.py,sha256=9tUhEgPVugA8nmZ9rvOaAntCd7rDPgW2RBLHqaDAXSc,5864
|
|
103
115
|
pytcl/navigation/geodesy.py,sha256=M9XXfBTMCRdaWMV2-ViDSTEt94WZnMtxMeJQ1FAgQHY,17227
|
|
116
|
+
pytcl/navigation/great_circle.py,sha256=TtlkWZbzr-HzSt4ultG_h137ZnX0pJZx_87kr3uvpjI,20923
|
|
104
117
|
pytcl/navigation/ins.py,sha256=V3ZA4z8y5E6PBCd1FhifR5VaCU7DRAn2fb7W0LilByo,31168
|
|
105
118
|
pytcl/navigation/ins_gnss.py,sha256=euKF5JGgwmVBsw3jBf7_wa2z1BpZeVbSNmBuwzhGS6c,30157
|
|
119
|
+
pytcl/navigation/rhumb.py,sha256=lr1c3iEXfoOSfIyyXSRWv6He5TlaxEHbJy-dhqM1gRw,18224
|
|
106
120
|
pytcl/performance_evaluation/__init__.py,sha256=tM2pnBfDb2XbnLt4Y5MQ6w6XBwFy_5bf_y0toZmxx88,1859
|
|
107
121
|
pytcl/performance_evaluation/estimation_metrics.py,sha256=X1ZCpp8m6DV14N2wbMvlRwfORRKga8DgKmG3dROyJqA,12351
|
|
108
122
|
pytcl/performance_evaluation/track_metrics.py,sha256=Nd3royJkAelZV-Qggl8i72e7WocCxWomgliArvVAEkc,13342
|
|
@@ -127,8 +141,8 @@ pytcl/trackers/mht.py,sha256=7mwhMmja3ri2wnx7W1wueDGn2r3ArwAxJDPUJ7IZAkQ,20617
|
|
|
127
141
|
pytcl/trackers/multi_target.py,sha256=7ZL8V25TO_rEMtQm2eYkScesDQHC9qXZVHLHyVbxy3M,10529
|
|
128
142
|
pytcl/trackers/single_target.py,sha256=Yy3FwaNTArMWcaod-0HVeiioNV4xLWxNDn_7ZPVqQYs,6562
|
|
129
143
|
pytcl/transponders/__init__.py,sha256=5fL4u3lKCYgPLo5uFeuZbtRZkJPABntuKYGUvVgMMEI,41
|
|
130
|
-
nrl_tracker-0.
|
|
131
|
-
nrl_tracker-0.
|
|
132
|
-
nrl_tracker-0.
|
|
133
|
-
nrl_tracker-0.
|
|
134
|
-
nrl_tracker-0.
|
|
144
|
+
nrl_tracker-0.21.4.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
|
|
145
|
+
nrl_tracker-0.21.4.dist-info/METADATA,sha256=kfdnUMvBqNlpI3skCRZZQIQF8gYBLHSGcgSZ5gGwDXw,10005
|
|
146
|
+
nrl_tracker-0.21.4.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
|
|
147
|
+
nrl_tracker-0.21.4.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
|
|
148
|
+
nrl_tracker-0.21.4.dist-info/RECORD,,
|
pytcl/__init__.py
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
Assignment algorithms for data association in target tracking.
|
|
3
3
|
|
|
4
4
|
This module provides:
|
|
5
|
-
- 2D assignment algorithms (Hungarian, Auction
|
|
5
|
+
- 2D assignment algorithms (Hungarian, Auction)
|
|
6
|
+
- K-best 2D assignment (Murty's algorithm)
|
|
7
|
+
- 3D assignment algorithms (Lagrangian relaxation, Auction)
|
|
6
8
|
- Gating methods (ellipsoidal, rectangular)
|
|
7
9
|
- Data association algorithms (GNN, JPDA)
|
|
8
10
|
"""
|
|
@@ -30,12 +32,24 @@ from pytcl.assignment_algorithms.jpda import (
|
|
|
30
32
|
jpda_probabilities,
|
|
31
33
|
jpda_update,
|
|
32
34
|
)
|
|
35
|
+
from pytcl.assignment_algorithms.three_dimensional import (
|
|
36
|
+
Assignment3DResult,
|
|
37
|
+
assign3d,
|
|
38
|
+
assign3d_auction,
|
|
39
|
+
assign3d_lagrangian,
|
|
40
|
+
decompose_to_2d,
|
|
41
|
+
greedy_3d,
|
|
42
|
+
)
|
|
33
43
|
from pytcl.assignment_algorithms.two_dimensional import (
|
|
34
44
|
AssignmentResult,
|
|
45
|
+
KBestResult,
|
|
35
46
|
assign2d,
|
|
36
47
|
auction,
|
|
37
48
|
hungarian,
|
|
49
|
+
kbest_assign2d,
|
|
38
50
|
linear_sum_assignment,
|
|
51
|
+
murty,
|
|
52
|
+
ranked_assignments,
|
|
39
53
|
)
|
|
40
54
|
|
|
41
55
|
__all__ = [
|
|
@@ -45,6 +59,18 @@ __all__ = [
|
|
|
45
59
|
"linear_sum_assignment",
|
|
46
60
|
"assign2d",
|
|
47
61
|
"AssignmentResult",
|
|
62
|
+
# K-Best 2D Assignment
|
|
63
|
+
"KBestResult",
|
|
64
|
+
"murty",
|
|
65
|
+
"kbest_assign2d",
|
|
66
|
+
"ranked_assignments",
|
|
67
|
+
# 3D Assignment
|
|
68
|
+
"Assignment3DResult",
|
|
69
|
+
"assign3d",
|
|
70
|
+
"assign3d_lagrangian",
|
|
71
|
+
"assign3d_auction",
|
|
72
|
+
"greedy_3d",
|
|
73
|
+
"decompose_to_2d",
|
|
48
74
|
# Gating
|
|
49
75
|
"ellipsoidal_gate",
|
|
50
76
|
"rectangular_gate",
|
|
@@ -12,6 +12,7 @@ as JPDA can handle measurement origin uncertainty in cluttered environments.
|
|
|
12
12
|
from typing import List, NamedTuple, Optional, Tuple
|
|
13
13
|
|
|
14
14
|
import numpy as np
|
|
15
|
+
from numba import njit
|
|
15
16
|
from numpy.typing import ArrayLike, NDArray
|
|
16
17
|
from scipy.stats import chi2
|
|
17
18
|
|
|
@@ -314,45 +315,34 @@ def _jpda_exact(
|
|
|
314
315
|
return beta
|
|
315
316
|
|
|
316
317
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
318
|
+
@njit(cache=True)
|
|
319
|
+
def _jpda_approximate_core(
|
|
320
|
+
likelihood_matrix: np.ndarray,
|
|
321
|
+
gated: np.ndarray,
|
|
320
322
|
detection_prob: float,
|
|
321
323
|
clutter_density: float,
|
|
322
|
-
) ->
|
|
323
|
-
"""
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
References
|
|
329
|
-
----------
|
|
330
|
-
.. [1] Fitzgerald, R.J., "Development of Practical PDA Logic for
|
|
331
|
-
Multitarget Tracking by Microprocessor", American Control
|
|
332
|
-
Conference, 1986.
|
|
333
|
-
"""
|
|
334
|
-
n_tracks, n_meas = likelihood_matrix.shape
|
|
335
|
-
beta = np.zeros((n_tracks, n_meas + 1))
|
|
336
|
-
|
|
337
|
-
# For each track, compute association probabilities independently
|
|
338
|
-
# then apply correction for shared measurements
|
|
324
|
+
) -> np.ndarray:
|
|
325
|
+
"""JIT-compiled core of approximate JPDA computation."""
|
|
326
|
+
n_tracks = likelihood_matrix.shape[0]
|
|
327
|
+
n_meas = likelihood_matrix.shape[1]
|
|
328
|
+
beta = np.zeros((n_tracks, n_meas + 1), dtype=np.float64)
|
|
339
329
|
|
|
340
330
|
# Likelihood ratio for each measurement given each track
|
|
341
|
-
|
|
342
|
-
L = np.zeros((n_tracks, n_meas))
|
|
331
|
+
L = np.zeros((n_tracks, n_meas), dtype=np.float64)
|
|
343
332
|
for i in range(n_tracks):
|
|
344
333
|
for j in range(n_meas):
|
|
345
334
|
if gated[i, j] and clutter_density > 0:
|
|
346
335
|
L[i, j] = likelihood_matrix[i, j] / clutter_density
|
|
347
336
|
elif gated[i, j]:
|
|
348
|
-
L[i, j] = likelihood_matrix[i, j] * 1e10
|
|
337
|
+
L[i, j] = likelihood_matrix[i, j] * 1e10
|
|
349
338
|
|
|
350
339
|
# Compute delta factors (accounts for other tracks)
|
|
351
|
-
delta = np.ones((n_tracks, n_meas))
|
|
340
|
+
delta = np.ones((n_tracks, n_meas), dtype=np.float64)
|
|
352
341
|
|
|
353
342
|
for j in range(n_meas):
|
|
354
|
-
|
|
355
|
-
|
|
343
|
+
sum_L = 0.0
|
|
344
|
+
for i in range(n_tracks):
|
|
345
|
+
sum_L += L[i, j]
|
|
356
346
|
for i in range(n_tracks):
|
|
357
347
|
if sum_L > 0:
|
|
358
348
|
delta[i, j] = 1.0 / (1.0 + sum_L - L[i, j])
|
|
@@ -361,7 +351,6 @@ def _jpda_approximate(
|
|
|
361
351
|
|
|
362
352
|
# Compute association probabilities
|
|
363
353
|
for i in range(n_tracks):
|
|
364
|
-
# Denominator for normalization
|
|
365
354
|
denom = 1.0 - detection_prob
|
|
366
355
|
|
|
367
356
|
for j in range(n_meas):
|
|
@@ -369,9 +358,9 @@ def _jpda_approximate(
|
|
|
369
358
|
beta[i, j] = detection_prob * L[i, j] * delta[i, j]
|
|
370
359
|
denom += beta[i, j]
|
|
371
360
|
|
|
372
|
-
# Normalize
|
|
373
361
|
if denom > 0:
|
|
374
|
-
|
|
362
|
+
for j in range(n_meas):
|
|
363
|
+
beta[i, j] /= denom
|
|
375
364
|
beta[i, n_meas] = (1.0 - detection_prob) / denom
|
|
376
365
|
else:
|
|
377
366
|
beta[i, n_meas] = 1.0
|
|
@@ -379,6 +368,31 @@ def _jpda_approximate(
|
|
|
379
368
|
return beta
|
|
380
369
|
|
|
381
370
|
|
|
371
|
+
def _jpda_approximate(
|
|
372
|
+
likelihood_matrix: NDArray,
|
|
373
|
+
gated: NDArray,
|
|
374
|
+
detection_prob: float,
|
|
375
|
+
clutter_density: float,
|
|
376
|
+
) -> NDArray:
|
|
377
|
+
"""
|
|
378
|
+
Approximate JPDA using parametric approach.
|
|
379
|
+
|
|
380
|
+
Uses the approach from [1] which is O(n_tracks * n_meas^2).
|
|
381
|
+
|
|
382
|
+
References
|
|
383
|
+
----------
|
|
384
|
+
.. [1] Fitzgerald, R.J., "Development of Practical PDA Logic for
|
|
385
|
+
Multitarget Tracking by Microprocessor", American Control
|
|
386
|
+
Conference, 1986.
|
|
387
|
+
"""
|
|
388
|
+
return _jpda_approximate_core(
|
|
389
|
+
likelihood_matrix.astype(np.float64),
|
|
390
|
+
gated.astype(np.bool_),
|
|
391
|
+
detection_prob,
|
|
392
|
+
clutter_density,
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
|
|
382
396
|
def jpda_update(
|
|
383
397
|
track_states: List[ArrayLike],
|
|
384
398
|
track_covariances: List[ArrayLike],
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Three-dimensional assignment algorithms.
|
|
3
|
+
|
|
4
|
+
This module provides algorithms for solving 3D assignment problems,
|
|
5
|
+
which arise in multi-sensor data fusion and multi-scan tracking.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pytcl.assignment_algorithms.three_dimensional.assignment import (
|
|
9
|
+
Assignment3DResult,
|
|
10
|
+
assign3d,
|
|
11
|
+
assign3d_auction,
|
|
12
|
+
assign3d_lagrangian,
|
|
13
|
+
decompose_to_2d,
|
|
14
|
+
greedy_3d,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"Assignment3DResult",
|
|
19
|
+
"assign3d",
|
|
20
|
+
"assign3d_lagrangian",
|
|
21
|
+
"assign3d_auction",
|
|
22
|
+
"greedy_3d",
|
|
23
|
+
"decompose_to_2d",
|
|
24
|
+
]
|