photonlibpy 2025.0.0b2__py3-none-any.whl → 2025.0.0b4__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- photonlibpy/estimation/openCVHelp.py +117 -7
- photonlibpy/estimation/rotTrlTransform3d.py +43 -1
- photonlibpy/estimation/targetModel.py +126 -80
- photonlibpy/estimation/visionEstimation.py +26 -4
- photonlibpy/generated/MultiTargetPNPResultSerde.py +7 -1
- photonlibpy/generated/PhotonPipelineMetadataSerde.py +6 -1
- photonlibpy/generated/PhotonPipelineResultSerde.py +9 -1
- photonlibpy/generated/PhotonTrackedTargetSerde.py +7 -1
- photonlibpy/generated/PnpResultSerde.py +6 -1
- photonlibpy/generated/TargetCornerSerde.py +6 -1
- photonlibpy/networktables/NTTopicSet.py +11 -2
- photonlibpy/photonCamera.py +69 -2
- photonlibpy/simulation/photonCameraSim.py +127 -51
- photonlibpy/simulation/simCameraProperties.py +184 -63
- photonlibpy/simulation/visionSystemSim.py +104 -7
- photonlibpy/simulation/visionTargetSim.py +10 -0
- photonlibpy/targeting/TargetCorner.py +2 -2
- photonlibpy/targeting/multiTargetPNPResult.py +4 -15
- photonlibpy/targeting/photonPipelineResult.py +4 -3
- photonlibpy/targeting/photonTrackedTarget.py +2 -2
- photonlibpy/version.py +2 -2
- {photonlibpy-2025.0.0b2.dist-info → photonlibpy-2025.0.0b4.dist-info}/METADATA +8 -9
- photonlibpy-2025.0.0b4.dist-info/RECORD +36 -0
- photonlibpy-2025.0.0b2.dist-info/RECORD +0 -36
- {photonlibpy-2025.0.0b2.dist-info → photonlibpy-2025.0.0b4.dist-info}/WHEEL +0 -0
- {photonlibpy-2025.0.0b2.dist-info → photonlibpy-2025.0.0b4.dist-info}/top_level.txt +0 -0
@@ -15,7 +15,22 @@ from .visionTargetSim import VisionTargetSim
|
|
15
15
|
|
16
16
|
|
17
17
|
class VisionSystemSim:
|
18
|
+
"""A simulated vision system involving a camera(s) and coprocessor(s) mounted on a mobile robot
|
19
|
+
running PhotonVision, detecting targets placed on the field. :class:`.VisionTargetSim`s added to
|
20
|
+
this class will be detected by the :class:`.PhotonCameraSim`s added to this class. This class
|
21
|
+
should be updated periodically with the robot's current pose in order to publish the simulated
|
22
|
+
camera target info.
|
23
|
+
"""
|
24
|
+
|
18
25
|
def __init__(self, visionSystemName: str):
|
26
|
+
"""A simulated vision system involving a camera(s) and coprocessor(s) mounted on a mobile robot
|
27
|
+
running PhotonVision, detecting targets placed on the field. :class:`.VisionTargetSim`s added to
|
28
|
+
this class will be detected by the :class:`.PhotonCameraSim`s added to this class. This class
|
29
|
+
should be updated periodically with the robot's current pose in order to publish the simulated
|
30
|
+
camera target info.
|
31
|
+
|
32
|
+
:param visionSystemName: The specific identifier for this vision system in NetworkTables.
|
33
|
+
"""
|
19
34
|
self.dbgField: Field2d = Field2d()
|
20
35
|
self.bufferLength: seconds = 1.5
|
21
36
|
|
@@ -32,12 +47,21 @@ class VisionSystemSim:
|
|
32
47
|
wpilib.SmartDashboard.putData(self.tableName + "/Sim Field", self.dbgField)
|
33
48
|
|
34
49
|
def getCameraSim(self, name: str) -> PhotonCameraSim | None:
|
50
|
+
"""Get one of the simulated cameras."""
|
35
51
|
return self.camSimMap.get(name, None)
|
36
52
|
|
37
53
|
def getCameraSims(self) -> list[PhotonCameraSim]:
|
54
|
+
"""Get all the simulated cameras."""
|
38
55
|
return [*self.camSimMap.values()]
|
39
56
|
|
40
57
|
def addCamera(self, cameraSim: PhotonCameraSim, robotToCamera: Transform3d) -> None:
|
58
|
+
"""Adds a simulated camera to this vision system with a specified robot-to-camera transformation.
|
59
|
+
The vision targets registered with this vision system simulation will be observed by the
|
60
|
+
simulated :class:`.PhotonCamera`.
|
61
|
+
|
62
|
+
:param cameraSim: The camera simulation
|
63
|
+
:param robotToCamera: The transform from the robot pose to the camera pose
|
64
|
+
"""
|
41
65
|
name = cameraSim.getCamera().getName()
|
42
66
|
if name not in self.camSimMap:
|
43
67
|
self.camSimMap[name] = cameraSim
|
@@ -49,10 +73,15 @@ class VisionSystemSim:
|
|
49
73
|
)
|
50
74
|
|
51
75
|
def clearCameras(self) -> None:
|
76
|
+
"""Remove all simulated cameras from this vision system."""
|
52
77
|
self.camSimMap.clear()
|
53
78
|
self.camTrfMap.clear()
|
54
79
|
|
55
80
|
def removeCamera(self, cameraSim: PhotonCameraSim) -> bool:
|
81
|
+
"""Remove a simulated camera from this vision system.
|
82
|
+
|
83
|
+
:returns: If the camera was present and removed
|
84
|
+
"""
|
56
85
|
name = cameraSim.getCamera().getName()
|
57
86
|
if name in self.camSimMap:
|
58
87
|
del self.camSimMap[name]
|
@@ -65,6 +94,14 @@ class VisionSystemSim:
|
|
65
94
|
cameraSim: PhotonCameraSim,
|
66
95
|
time: seconds = wpilib.Timer.getFPGATimestamp(),
|
67
96
|
) -> Transform3d | None:
|
97
|
+
"""Get a simulated camera's position relative to the robot. If the requested camera is invalid, an
|
98
|
+
empty optional is returned.
|
99
|
+
|
100
|
+
:param cameraSim: The specific camera to get the robot-to-camera transform of
|
101
|
+
:param timeSeconds: Timestamp in seconds of when the transform should be observed
|
102
|
+
|
103
|
+
:returns: The transform of this camera, or an empty optional if it is invalid
|
104
|
+
"""
|
68
105
|
if cameraSim in self.camTrfMap:
|
69
106
|
trfBuffer = self.camTrfMap[cameraSim]
|
70
107
|
sample = trfBuffer.sample(time)
|
@@ -80,15 +117,34 @@ class VisionSystemSim:
|
|
80
117
|
cameraSim: PhotonCameraSim,
|
81
118
|
time: seconds = wpilib.Timer.getFPGATimestamp(),
|
82
119
|
) -> Pose3d | None:
|
120
|
+
"""Get a simulated camera's position on the field. If the requested camera is invalid, an empty
|
121
|
+
optional is returned.
|
122
|
+
|
123
|
+
:param cameraSim: The specific camera to get the field pose of
|
124
|
+
|
125
|
+
:returns: The pose of this camera, or an empty optional if it is invalid
|
126
|
+
"""
|
83
127
|
robotToCamera = self.getRobotToCamera(cameraSim, time)
|
84
128
|
if robotToCamera is None:
|
85
129
|
return None
|
86
130
|
else:
|
87
|
-
|
131
|
+
pose = self.getRobotPose(time)
|
132
|
+
if pose:
|
133
|
+
return pose + robotToCamera
|
134
|
+
else:
|
135
|
+
return None
|
88
136
|
|
89
137
|
def adjustCamera(
|
90
138
|
self, cameraSim: PhotonCameraSim, robotToCamera: Transform3d
|
91
139
|
) -> bool:
|
140
|
+
"""Adjust a camera's position relative to the robot. Use this if your camera is on a gimbal or
|
141
|
+
turret or some other mobile platform.
|
142
|
+
|
143
|
+
:param cameraSim: The simulated camera to change the relative position of
|
144
|
+
:param robotToCamera: New transform from the robot to the camera
|
145
|
+
|
146
|
+
:returns: If the cameraSim was valid and transform was adjusted
|
147
|
+
"""
|
92
148
|
if cameraSim in self.camTrfMap:
|
93
149
|
self.camTrfMap[cameraSim].addSample(
|
94
150
|
wpilib.Timer.getFPGATimestamp(), Pose3d() + robotToCamera
|
@@ -98,6 +154,7 @@ class VisionSystemSim:
|
|
98
154
|
return False
|
99
155
|
|
100
156
|
def resetCameraTransforms(self, cameraSim: PhotonCameraSim | None = None) -> None:
|
157
|
+
"""Reset the transform history for this camera to just the current transform."""
|
101
158
|
now = wpilib.Timer.getFPGATimestamp()
|
102
159
|
|
103
160
|
def resetSingleCamera(self, cameraSim: PhotonCameraSim) -> bool:
|
@@ -129,12 +186,30 @@ class VisionSystemSim:
|
|
129
186
|
def addVisionTargets(
|
130
187
|
self, targets: list[VisionTargetSim], targetType: str = "targets"
|
131
188
|
) -> None:
|
189
|
+
"""Adds targets on the field which your vision system is designed to detect. The {@link
|
190
|
+
PhotonCamera}s simulated from this system will report the location of the camera relative to
|
191
|
+
the subset of these targets which are visible from the given camera position.
|
192
|
+
|
193
|
+
:param targets: Targets to add to the simulated field
|
194
|
+
:param type: Type of target (e.g. "cargo").
|
195
|
+
"""
|
196
|
+
|
132
197
|
if targetType not in self.targetSets:
|
133
198
|
self.targetSets[targetType] = targets
|
134
199
|
else:
|
135
200
|
self.targetSets[targetType] += targets
|
136
201
|
|
137
202
|
def addAprilTags(self, layout: AprilTagFieldLayout) -> None:
|
203
|
+
"""Adds targets on the field which your vision system is designed to detect. The {@link
|
204
|
+
PhotonCamera}s simulated from this system will report the location of the camera relative to
|
205
|
+
the subset of these targets which are visible from the given camera position.
|
206
|
+
|
207
|
+
The AprilTags from this layout will be added as vision targets under the type "apriltag".
|
208
|
+
The poses added preserve the tag layout's current alliance origin. If the tag layout's alliance
|
209
|
+
origin is changed, these added tags will have to be cleared and re-added.
|
210
|
+
|
211
|
+
:param tagLayout: The field tag layout to get Apriltag poses and IDs from
|
212
|
+
"""
|
138
213
|
targets: list[VisionTargetSim] = []
|
139
214
|
for tag in layout.getTags():
|
140
215
|
tag_pose = layout.getTagPose(tag.ID)
|
@@ -167,10 +242,16 @@ class VisionSystemSim:
|
|
167
242
|
|
168
243
|
def getRobotPose(
|
169
244
|
self, timestamp: seconds = wpilib.Timer.getFPGATimestamp()
|
170
|
-
) -> Pose3d:
|
245
|
+
) -> Pose3d | None:
|
246
|
+
"""Get the robot pose in meters saved by the vision system at this timestamp.
|
247
|
+
|
248
|
+
:param timestamp: Timestamp of the desired robot pose
|
249
|
+
"""
|
250
|
+
|
171
251
|
return self.robotPoseBuffer.sample(timestamp)
|
172
252
|
|
173
253
|
def resetRobotPose(self, robotPose: Pose2d | Pose3d) -> None:
|
254
|
+
"""Clears all previous robot poses and sets robotPose at current time."""
|
174
255
|
if type(robotPose) is Pose2d:
|
175
256
|
robotPose = Pose3d(robotPose)
|
176
257
|
assert type(robotPose) is Pose3d
|
@@ -182,16 +263,23 @@ class VisionSystemSim:
|
|
182
263
|
return self.dbgField
|
183
264
|
|
184
265
|
def update(self, robotPose: Pose2d | Pose3d) -> None:
|
266
|
+
"""Periodic update. Ensure this is called repeatedly-- camera performance is used to automatically
|
267
|
+
determine if a new frame should be submitted.
|
268
|
+
|
269
|
+
:param robotPoseMeters: The simulated robot pose in meters
|
270
|
+
"""
|
185
271
|
if type(robotPose) is Pose2d:
|
186
272
|
robotPose = Pose3d(robotPose)
|
187
273
|
assert type(robotPose) is Pose3d
|
188
274
|
|
275
|
+
# update vision targets on field
|
189
276
|
for targetType, targets in self.targetSets.items():
|
190
277
|
posesToAdd: list[Pose2d] = []
|
191
278
|
for target in targets:
|
192
279
|
posesToAdd.append(target.getPose().toPose2d())
|
193
280
|
self.dbgField.getObject(targetType).setPoses(posesToAdd)
|
194
281
|
|
282
|
+
# save "real" robot poses over time
|
195
283
|
now = wpilib.Timer.getFPGATimestamp()
|
196
284
|
self.robotPoseBuffer.addSample(now, robotPose)
|
197
285
|
self.dbgField.setRobotPose(robotPose.toPose2d())
|
@@ -204,27 +292,36 @@ class VisionSystemSim:
|
|
204
292
|
visTgtPoses2d: list[Pose2d] = []
|
205
293
|
cameraPoses2d: list[Pose2d] = []
|
206
294
|
processed = False
|
295
|
+
# process each camera
|
207
296
|
for camSim in self.camSimMap.values():
|
297
|
+
# check if this camera is ready to process and get latency
|
208
298
|
optTimestamp = camSim.consumeNextEntryTime()
|
209
299
|
if optTimestamp is None:
|
210
300
|
continue
|
211
301
|
else:
|
212
302
|
processed = True
|
213
303
|
|
304
|
+
# when this result "was" read by NT
|
214
305
|
timestampNt = optTimestamp
|
215
306
|
latency = camSim.prop.estLatency()
|
307
|
+
# the image capture timestamp in seconds of this result
|
216
308
|
timestampCapture = timestampNt * 1.0e-6 - latency
|
217
309
|
|
310
|
+
# use camera pose from the image capture timestamp
|
218
311
|
lateRobotPose = self.getRobotPose(timestampCapture)
|
219
|
-
|
220
|
-
|
221
|
-
|
312
|
+
robotToCamera = self.getRobotToCamera(camSim, timestampCapture)
|
313
|
+
if lateRobotPose is None or robotToCamera is None:
|
314
|
+
return None
|
315
|
+
lateCameraPose = lateRobotPose + robotToCamera
|
222
316
|
cameraPoses2d.append(lateCameraPose.toPose2d())
|
223
317
|
|
318
|
+
# process a PhotonPipelineResult with visible targets
|
224
319
|
camResult = camSim.process(latency, lateCameraPose, allTargets)
|
320
|
+
# publish this info to NT at estimated timestamp of receive
|
225
321
|
camSim.submitProcessedFrame(camResult, timestampNt)
|
226
|
-
|
227
|
-
|
322
|
+
# display debug results
|
323
|
+
for tgt in camResult.getTargets():
|
324
|
+
trf = tgt.getBestCameraToTarget()
|
228
325
|
if trf == Transform3d():
|
229
326
|
continue
|
230
327
|
|
@@ -6,7 +6,16 @@ from ..estimation.targetModel import TargetModel
|
|
6
6
|
|
7
7
|
|
8
8
|
class VisionTargetSim:
|
9
|
+
"""Describes a vision target located somewhere on the field that your vision system can detect."""
|
10
|
+
|
9
11
|
def __init__(self, pose: Pose3d, model: TargetModel, id: int = -1):
|
12
|
+
"""Describes a fiducial tag located somewhere on the field that your vision system can detect.
|
13
|
+
|
14
|
+
:param pose: Pose3d of the tag in field-relative coordinates
|
15
|
+
:param model: TargetModel which describes the shape of the target(tag)
|
16
|
+
:param id: The ID of this fiducial tag
|
17
|
+
"""
|
18
|
+
|
10
19
|
self.pose: Pose3d = pose
|
11
20
|
self.model: TargetModel = model
|
12
21
|
self.fiducialId: int = id
|
@@ -47,4 +56,5 @@ class VisionTargetSim:
|
|
47
56
|
return self.model
|
48
57
|
|
49
58
|
def getFieldVertices(self) -> list[Translation3d]:
|
59
|
+
"""This target's vertices offset from its field pose."""
|
50
60
|
return self.model.getFieldVertices(self.pose)
|
@@ -2,7 +2,7 @@ from dataclasses import dataclass
|
|
2
2
|
from typing import TYPE_CHECKING, ClassVar
|
3
3
|
|
4
4
|
if TYPE_CHECKING:
|
5
|
-
from .. import
|
5
|
+
from ..generated.TargetCornerSerde import TargetCornerSerde
|
6
6
|
|
7
7
|
|
8
8
|
@dataclass
|
@@ -10,4 +10,4 @@ class TargetCorner:
|
|
10
10
|
x: float = 0
|
11
11
|
y: float = 9
|
12
12
|
|
13
|
-
photonStruct: ClassVar["
|
13
|
+
photonStruct: ClassVar["TargetCornerSerde"]
|
@@ -3,10 +3,9 @@ from typing import TYPE_CHECKING, ClassVar
|
|
3
3
|
|
4
4
|
from wpimath.geometry import Transform3d
|
5
5
|
|
6
|
-
from ..packet import Packet
|
7
|
-
|
8
6
|
if TYPE_CHECKING:
|
9
|
-
from .. import
|
7
|
+
from ..generated.MultiTargetPNPResultSerde import MultiTargetPNPResultSerde
|
8
|
+
from ..generated.PnpResultSerde import PnpResultSerde
|
10
9
|
|
11
10
|
|
12
11
|
@dataclass
|
@@ -17,7 +16,7 @@ class PnpResult:
|
|
17
16
|
bestReprojErr: float = 0.0
|
18
17
|
altReprojErr: float = 0.0
|
19
18
|
|
20
|
-
photonStruct: ClassVar["
|
19
|
+
photonStruct: ClassVar["PnpResultSerde"]
|
21
20
|
|
22
21
|
|
23
22
|
@dataclass
|
@@ -27,14 +26,4 @@ class MultiTargetPNPResult:
|
|
27
26
|
estimatedPose: PnpResult = field(default_factory=PnpResult)
|
28
27
|
fiducialIDsUsed: list[int] = field(default_factory=list)
|
29
28
|
|
30
|
-
|
31
|
-
self.estimatedPose = PnpResult()
|
32
|
-
self.estimatedPose.createFromPacket(packet)
|
33
|
-
self.fiducialIDsUsed = []
|
34
|
-
for _ in range(MultiTargetPNPResult._MAX_IDS):
|
35
|
-
fidId = packet.decode16()
|
36
|
-
if fidId >= 0:
|
37
|
-
self.fiducialIDsUsed.append(fidId)
|
38
|
-
return packet
|
39
|
-
|
40
|
-
photonStruct: ClassVar["generated.MultiTargetPNPResultSerde"]
|
29
|
+
photonStruct: ClassVar["MultiTargetPNPResultSerde"]
|
@@ -5,7 +5,8 @@ from .multiTargetPNPResult import MultiTargetPNPResult
|
|
5
5
|
from .photonTrackedTarget import PhotonTrackedTarget
|
6
6
|
|
7
7
|
if TYPE_CHECKING:
|
8
|
-
from .. import
|
8
|
+
from ..generated.PhotonPipelineMetadataSerde import PhotonPipelineMetadataSerde
|
9
|
+
from ..generated.PhotonPipelineResultSerde import PhotonPipelineResultSerde
|
9
10
|
|
10
11
|
|
11
12
|
@dataclass
|
@@ -20,7 +21,7 @@ class PhotonPipelineMetadata:
|
|
20
21
|
|
21
22
|
timeSinceLastPong: int = -1
|
22
23
|
|
23
|
-
photonStruct: ClassVar["
|
24
|
+
photonStruct: ClassVar["PhotonPipelineMetadataSerde"]
|
24
25
|
|
25
26
|
|
26
27
|
@dataclass
|
@@ -69,4 +70,4 @@ class PhotonPipelineResult:
|
|
69
70
|
return None
|
70
71
|
return self.getTargets()[0]
|
71
72
|
|
72
|
-
photonStruct: ClassVar["
|
73
|
+
photonStruct: ClassVar["PhotonPipelineResultSerde"]
|
@@ -7,7 +7,7 @@ from ..packet import Packet
|
|
7
7
|
from .TargetCorner import TargetCorner
|
8
8
|
|
9
9
|
if TYPE_CHECKING:
|
10
|
-
from .. import
|
10
|
+
from ..generated.PhotonTrackedTargetSerde import PhotonTrackedTargetSerde
|
11
11
|
|
12
12
|
|
13
13
|
@dataclass
|
@@ -63,4 +63,4 @@ class PhotonTrackedTarget:
|
|
63
63
|
retList.append(TargetCorner(cx, cy))
|
64
64
|
return retList
|
65
65
|
|
66
|
-
photonStruct: ClassVar["
|
66
|
+
photonStruct: ClassVar["PhotonTrackedTargetSerde"]
|
photonlibpy/version.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
PHOTONLIB_VERSION="v2025.0.0.beta.
|
2
|
-
PHOTONVISION_VERSION="v2025.0.0-beta-
|
1
|
+
PHOTONLIB_VERSION="v2025.0.0.beta.4"
|
2
|
+
PHOTONVISION_VERSION="v2025.0.0-beta-4"
|
@@ -1,17 +1,16 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: photonlibpy
|
3
|
-
Version: 2025.0.
|
4
|
-
Summary: Pure-python implementation of PhotonLib for interfacing with PhotonVision on coprocessors. Implemented with PhotonVision version v2025.0.0-beta-
|
3
|
+
Version: 2025.0.0b4
|
4
|
+
Summary: Pure-python implementation of PhotonLib for interfacing with PhotonVision on coprocessors. Implemented with PhotonVision version v2025.0.0-beta-4 .
|
5
5
|
Home-page: https://photonvision.org
|
6
6
|
Author: Photonvision Development Team
|
7
7
|
Description-Content-Type: text/markdown
|
8
|
-
Requires-Dist: numpy~=1
|
9
|
-
Requires-Dist: wpilib<2025
|
10
|
-
Requires-Dist: robotpy-wpimath<2025
|
11
|
-
Requires-Dist: robotpy-apriltag<2025
|
12
|
-
Requires-Dist: robotpy-cscore<2025
|
13
|
-
Requires-Dist: pyntcore<2025
|
8
|
+
Requires-Dist: numpy~=2.1
|
9
|
+
Requires-Dist: wpilib<2026,>=2025.0.0b1
|
10
|
+
Requires-Dist: robotpy-wpimath<2026,>=2025.0.0b1
|
11
|
+
Requires-Dist: robotpy-apriltag<2026,>=2025.0.0b1
|
12
|
+
Requires-Dist: robotpy-cscore<2026,>=2025.0.0b1
|
13
|
+
Requires-Dist: pyntcore<2026,>=2025.0.0b1
|
14
14
|
Requires-Dist: opencv-python; platform_machine != "roborio"
|
15
|
-
Requires-Dist: robotpy-opencv; platform_machine == "roborio"
|
16
15
|
|
17
16
|
A Pure-python implementation of PhotonLib
|
@@ -0,0 +1,36 @@
|
|
1
|
+
photonlibpy/__init__.py,sha256=WW1OGrrcNXwwxaHSZlkxmhH2GYiQIHHxSxGVTJZhZbY,1136
|
2
|
+
photonlibpy/estimatedRobotPose.py,sha256=X7wF9xdPXGKSVy0MY0qrWZJOEbuZPd721lYp0KXKlP0,1603
|
3
|
+
photonlibpy/packet.py,sha256=5YomViVFwOljL2FGOetWM9FbPc_yCQ15ylzkYlgLIs8,9724
|
4
|
+
photonlibpy/photonCamera.py,sha256=80-UKakvcgJ79vw80e2yUqZZfoQtpC1_lopnXpfgvOY,12823
|
5
|
+
photonlibpy/photonPoseEstimator.py,sha256=2iMqxPFsQHTsq95yv-WCSv1a6wXNcHPqOyMc4Bu6IG0,12584
|
6
|
+
photonlibpy/version.py,sha256=Ew1xD5CpZetX_p3ReR01MPCVsroMfk2ZpgH42q0Fubg,77
|
7
|
+
photonlibpy/estimation/__init__.py,sha256=pZ-d6fN1DJvT-lRl4FfIos5HAvlzmetIOrGIinrdv7k,223
|
8
|
+
photonlibpy/estimation/cameraTargetRelation.py,sha256=i7DPBXtkZve4ToXQscEIe-5F1oGQ1Qmf5QBaE__EeMQ,1158
|
9
|
+
photonlibpy/estimation/openCVHelp.py,sha256=h36tOunGaDfs1yp1kAyK-BX0DqdNXZSN8T8ms-ReQas,12277
|
10
|
+
photonlibpy/estimation/rotTrlTransform3d.py,sha256=oRYk4V1XF7guNxefJsCPcBWPIkKZl0HYD_Gs86wwToE,2671
|
11
|
+
photonlibpy/estimation/targetModel.py,sha256=fIhkf0-_Sfv-KhYEBnhFWMF4Xu84FfF6B-KUEsuuGjQ,6459
|
12
|
+
photonlibpy/estimation/visionEstimation.py,sha256=Q4KWdLCV1H0wJUJCzG7OYNhVmk2jR1iPUmX_PFylLdA,4174
|
13
|
+
photonlibpy/generated/MultiTargetPNPResultSerde.py,sha256=CzsCosHUnzxAoSC_sSAqpsXsDp54KW-BClnIXdzfMPc,2506
|
14
|
+
photonlibpy/generated/PhotonPipelineMetadataSerde.py,sha256=9pq5XUEDEoRowCd7sRnuGV7xtugu5HZCRrnwqZG2xXc,2887
|
15
|
+
photonlibpy/generated/PhotonPipelineResultSerde.py,sha256=jTf1obU2jPNDsxvt-tl9Ty_qzJws9Wqron3C1QiHkP8,3137
|
16
|
+
photonlibpy/generated/PhotonTrackedTargetSerde.py,sha256=-6vKir_ABDVBGbg8ktM48IKm_nBMFBbiyuZLiO_fP9U,4437
|
17
|
+
photonlibpy/generated/PnpResultSerde.py,sha256=YoTKdQ51oSdxC-7Poy6hunL0-zkMKvP5uedqaHWPudY,2693
|
18
|
+
photonlibpy/generated/TargetCornerSerde.py,sha256=kziD_rQIwyhzPfgOaDgn-3d87tvtXiAYbBjzu76biYU,2190
|
19
|
+
photonlibpy/generated/__init__.py,sha256=mElM8M88---wxTWO-SRqIJ4EfxN0fdIUwZBZ-UIGuRw,428
|
20
|
+
photonlibpy/networktables/NTTopicSet.py,sha256=TXJyVg6S8gONeuRqX_NI0FdxYw51bNLlFIAQ4Y2wyVg,3104
|
21
|
+
photonlibpy/networktables/__init__.py,sha256=o_LxTdyIylAszMy_zhUtTkXHyu6jqxccccj78d44OrI,35
|
22
|
+
photonlibpy/simulation/__init__.py,sha256=HKJV02of5d8bOnuI7syLzSYtOYge7XUrHSaLvawh99M,227
|
23
|
+
photonlibpy/simulation/photonCameraSim.py,sha256=5GTPdU7SRAahhtXYHcbm0GJEzARWA7lyBG3v279pqGk,19891
|
24
|
+
photonlibpy/simulation/simCameraProperties.py,sha256=bJ6Xvos2glO0-R_a0Wv4eKESnQD13GSYqhwPQdVr1eQ,27082
|
25
|
+
photonlibpy/simulation/videoSimUtil.py,sha256=xMuTvJ2Jx9IoQqmAJi_zUm06MdEwhVpIz9OyzYQp0k4,29
|
26
|
+
photonlibpy/simulation/visionSystemSim.py,sha256=ln1TYVMXUreg6nxrVZJ7lw8puvgLbBBde_ciM2CH5G4,13788
|
27
|
+
photonlibpy/simulation/visionTargetSim.py,sha256=FH85fKE4NntowUvssfgZ1KlE-I_3Z-QuAgb2bFqvfdY,2219
|
28
|
+
photonlibpy/targeting/TargetCorner.py,sha256=ouKj3E5uD76OZSNHHuSDzKOY65a8HqtcOsuejH-MVsU,276
|
29
|
+
photonlibpy/targeting/__init__.py,sha256=YzINSpq6A0cjr-yAQcFqHoiYdLGKPFXThlVYlMjY11w,295
|
30
|
+
photonlibpy/targeting/multiTargetPNPResult.py,sha256=Y9rweHtMzoCZ6mv6F8CutQi2Thq5pHN0ydBWvTCsOwY,806
|
31
|
+
photonlibpy/targeting/photonPipelineResult.py,sha256=MbaSyHZTJpoKTtLOZztpSGSt9xWWFqhzgwj8medObVA,2732
|
32
|
+
photonlibpy/targeting/photonTrackedTarget.py,sha256=zCoFp32hX-3GmBYEmsYBQieBoMzXtP2F_55_q0zPOXA,1956
|
33
|
+
photonlibpy-2025.0.0b4.dist-info/METADATA,sha256=zybpLt0J7EMylub2yKyAugXJ-lt7-uwrAhFV7KGv51U,689
|
34
|
+
photonlibpy-2025.0.0b4.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
|
35
|
+
photonlibpy-2025.0.0b4.dist-info/top_level.txt,sha256=T8Xc6U6he2VjKUAca6zawSkHdUZuLanxYIc4nxw2ctc,12
|
36
|
+
photonlibpy-2025.0.0b4.dist-info/RECORD,,
|
@@ -1,36 +0,0 @@
|
|
1
|
-
photonlibpy/__init__.py,sha256=WW1OGrrcNXwwxaHSZlkxmhH2GYiQIHHxSxGVTJZhZbY,1136
|
2
|
-
photonlibpy/estimatedRobotPose.py,sha256=X7wF9xdPXGKSVy0MY0qrWZJOEbuZPd721lYp0KXKlP0,1603
|
3
|
-
photonlibpy/packet.py,sha256=5YomViVFwOljL2FGOetWM9FbPc_yCQ15ylzkYlgLIs8,9724
|
4
|
-
photonlibpy/photonCamera.py,sha256=wz55_9XoKzGX6UQ-2Oa3kjrz9KM6R7-wExiaUPkUeto,10176
|
5
|
-
photonlibpy/photonPoseEstimator.py,sha256=2iMqxPFsQHTsq95yv-WCSv1a6wXNcHPqOyMc4Bu6IG0,12584
|
6
|
-
photonlibpy/version.py,sha256=gk9q-HkZ3pUpfERPbTZbPNGvNy0gR9d01A_Db5oMkZ4,77
|
7
|
-
photonlibpy/estimation/__init__.py,sha256=pZ-d6fN1DJvT-lRl4FfIos5HAvlzmetIOrGIinrdv7k,223
|
8
|
-
photonlibpy/estimation/cameraTargetRelation.py,sha256=i7DPBXtkZve4ToXQscEIe-5F1oGQ1Qmf5QBaE__EeMQ,1158
|
9
|
-
photonlibpy/estimation/openCVHelp.py,sha256=ThJDVuJ_QFteuuSeo7wQHoE4YzPQOx60_bmFRnILS1Y,6544
|
10
|
-
photonlibpy/estimation/rotTrlTransform3d.py,sha256=nX60k9rgei7bkLRR3Ykl2lhnjpsiSNuImk6fERFcy2w,915
|
11
|
-
photonlibpy/estimation/targetModel.py,sha256=e5IaDKFdNtek6pJLrzw2poit5wxvraIRtHPDmN-rqUk,4416
|
12
|
-
photonlibpy/estimation/visionEstimation.py,sha256=jCOBHHOjhzjNOD-_kn-jpTOXqlGxek24oKL51GiRSKU,2999
|
13
|
-
photonlibpy/generated/MultiTargetPNPResultSerde.py,sha256=WoCdln8kkciBltG-YdFn5OjdLGMD3VwwHymfe95QF4s,2342
|
14
|
-
photonlibpy/generated/PhotonPipelineMetadataSerde.py,sha256=0beAVUFeQ1Shq5ku4q5IgE-sYkMzk3XoemRnC5Vx8Hg,2767
|
15
|
-
photonlibpy/generated/PhotonPipelineResultSerde.py,sha256=q2w8ei-8X1ZJgHnYsTfX7NHTybUboP-DqQkdGY5bj1M,2847
|
16
|
-
photonlibpy/generated/PhotonTrackedTargetSerde.py,sha256=TT18q7jb2WzcPDOf26NOo1l23W9gY80CyrNYUBXbHYs,4271
|
17
|
-
photonlibpy/generated/PnpResultSerde.py,sha256=FVvv34GzQ856uGobpRSUO8TbV-h7IVipkTqgqfRa35Y,2586
|
18
|
-
photonlibpy/generated/TargetCornerSerde.py,sha256=rUJUBfs02gTWgkHvSjuaGLQdSzZcfpRRcSLDlFo8-_E,2080
|
19
|
-
photonlibpy/generated/__init__.py,sha256=mElM8M88---wxTWO-SRqIJ4EfxN0fdIUwZBZ-UIGuRw,428
|
20
|
-
photonlibpy/networktables/NTTopicSet.py,sha256=9jagxRAxO6nN7LvHZti86qA9V_d9_FStoDz5C3siM7Y,2545
|
21
|
-
photonlibpy/networktables/__init__.py,sha256=o_LxTdyIylAszMy_zhUtTkXHyu6jqxccccj78d44OrI,35
|
22
|
-
photonlibpy/simulation/__init__.py,sha256=HKJV02of5d8bOnuI7syLzSYtOYge7XUrHSaLvawh99M,227
|
23
|
-
photonlibpy/simulation/photonCameraSim.py,sha256=xul2eXUe1XgJ-RWALG6cgU4zDPcDOvHHvjFjAASS188,14706
|
24
|
-
photonlibpy/simulation/simCameraProperties.py,sha256=LAmxwm9FSyx-CTsVO-TRhfn4Pz5oanJV0Jh7KUnCNgM,20557
|
25
|
-
photonlibpy/simulation/videoSimUtil.py,sha256=xMuTvJ2Jx9IoQqmAJi_zUm06MdEwhVpIz9OyzYQp0k4,29
|
26
|
-
photonlibpy/simulation/visionSystemSim.py,sha256=q4ifF4q_XkCJ9jIkHBX6lYY6INc-uvFBi4c2OLQR3WA,8615
|
27
|
-
photonlibpy/simulation/visionTargetSim.py,sha256=AN7jXW3guQfNUu2EiQl23Jj8Mkgn4gYmRphGXL0-Dqk,1734
|
28
|
-
photonlibpy/targeting/TargetCorner.py,sha256=5a7RdK_WLCgui7BVE3KnHmb3jHbXeM5_SfFSDbnmd0M,251
|
29
|
-
photonlibpy/targeting/__init__.py,sha256=YzINSpq6A0cjr-yAQcFqHoiYdLGKPFXThlVYlMjY11w,295
|
30
|
-
photonlibpy/targeting/multiTargetPNPResult.py,sha256=zcUF1rIAgovURXu9saiLHIjuspSpRn3r7-J6tB_YlU4,1125
|
31
|
-
photonlibpy/targeting/photonPipelineResult.py,sha256=Sy_KBvI0ps1pQOJ80XYHTrz50aqUDBcuvIC_b1ku3G4,2617
|
32
|
-
photonlibpy/targeting/photonTrackedTarget.py,sha256=m6y-dBqP8iVt5J0WcGDxYpmgctVy6SNL358ZY1YgjCc,1917
|
33
|
-
photonlibpy-2025.0.0b2.dist-info/METADATA,sha256=EdH_l3RSbxbU8Z2s7SIBpIwca7DCOPRaOwVuniX1fro,752
|
34
|
-
photonlibpy-2025.0.0b2.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
|
35
|
-
photonlibpy-2025.0.0b2.dist-info/top_level.txt,sha256=T8Xc6U6he2VjKUAca6zawSkHdUZuLanxYIc4nxw2ctc,12
|
36
|
-
photonlibpy-2025.0.0b2.dist-info/RECORD,,
|
File without changes
|
File without changes
|