photonlibpy 2025.0.0a0__py3-none-any.whl → 2025.0.0b1__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.
- photonlibpy/generated/MultiTargetPNPResultSerde.py +12 -0
- photonlibpy/generated/PhotonPipelineMetadataSerde.py +23 -4
- photonlibpy/generated/PhotonPipelineResultSerde.py +19 -2
- photonlibpy/generated/PhotonTrackedTargetSerde.py +40 -0
- photonlibpy/generated/PnpResultSerde.py +19 -0
- photonlibpy/generated/TargetCornerSerde.py +12 -0
- photonlibpy/packet.py +108 -1
- photonlibpy/photonCamera.py +1 -1
- photonlibpy/photonPoseEstimator.py +2 -2
- photonlibpy/targeting/multiTargetPNPResult.py +2 -2
- photonlibpy/targeting/photonPipelineResult.py +5 -1
- photonlibpy/targeting/photonTrackedTarget.py +6 -4
- photonlibpy/version.py +2 -2
- {photonlibpy-2025.0.0a0.dist-info → photonlibpy-2025.0.0b1.dist-info}/METADATA +2 -2
- photonlibpy-2025.0.0b1.dist-info/RECORD +22 -0
- {photonlibpy-2025.0.0a0.dist-info → photonlibpy-2025.0.0b1.dist-info}/WHEEL +1 -1
- photonlibpy-2025.0.0a0.dist-info/RECORD +0 -22
- {photonlibpy-2025.0.0a0.dist-info → photonlibpy-2025.0.0b1.dist-info}/top_level.txt +0 -0
@@ -21,6 +21,7 @@
|
|
21
21
|
###############################################################################
|
22
22
|
|
23
23
|
from ..targeting import *
|
24
|
+
from ..packet import Packet
|
24
25
|
|
25
26
|
|
26
27
|
class MultiTargetPNPResultSerde:
|
@@ -28,6 +29,17 @@ class MultiTargetPNPResultSerde:
|
|
28
29
|
MESSAGE_VERSION = "541096947e9f3ca2d3f425ff7b04aa7b"
|
29
30
|
MESSAGE_FORMAT = "PnpResult:ae4d655c0a3104d88df4f5db144c1e86 estimatedPose;int16 fiducialIDsUsed[?];"
|
30
31
|
|
32
|
+
@staticmethod
|
33
|
+
def pack(value: "MultiTargetPNPResult") -> "Packet":
|
34
|
+
ret = Packet()
|
35
|
+
|
36
|
+
# estimatedPose is of non-intrinsic type PnpResult
|
37
|
+
ret.encodeBytes(PnpResult.photonStruct.pack(value.estimatedPose).getData())
|
38
|
+
|
39
|
+
# fiducialIDsUsed is a custom VLA!
|
40
|
+
ret.encodeShortList(value.fiducialIDsUsed)
|
41
|
+
return ret
|
42
|
+
|
31
43
|
@staticmethod
|
32
44
|
def unpack(packet: "Packet") -> "MultiTargetPNPResult":
|
33
45
|
ret = MultiTargetPNPResult()
|
@@ -21,14 +21,30 @@
|
|
21
21
|
###############################################################################
|
22
22
|
|
23
23
|
from ..targeting import *
|
24
|
+
from ..packet import Packet
|
24
25
|
|
25
26
|
|
26
27
|
class PhotonPipelineMetadataSerde:
|
27
28
|
# Message definition md5sum. See photon_packet.adoc for details
|
28
|
-
MESSAGE_VERSION = "
|
29
|
-
MESSAGE_FORMAT =
|
30
|
-
|
31
|
-
|
29
|
+
MESSAGE_VERSION = "ac0a45f686457856fb30af77699ea356"
|
30
|
+
MESSAGE_FORMAT = "int64 sequenceID;int64 captureTimestampMicros;int64 publishTimestampMicros;int64 timeSinceLastPong;"
|
31
|
+
|
32
|
+
@staticmethod
|
33
|
+
def pack(value: "PhotonPipelineMetadata") -> "Packet":
|
34
|
+
ret = Packet()
|
35
|
+
|
36
|
+
# sequenceID is of intrinsic type int64
|
37
|
+
ret.encodeLong(value.sequenceID)
|
38
|
+
|
39
|
+
# captureTimestampMicros is of intrinsic type int64
|
40
|
+
ret.encodeLong(value.captureTimestampMicros)
|
41
|
+
|
42
|
+
# publishTimestampMicros is of intrinsic type int64
|
43
|
+
ret.encodeLong(value.publishTimestampMicros)
|
44
|
+
|
45
|
+
# timeSinceLastPong is of intrinsic type int64
|
46
|
+
ret.encodeLong(value.timeSinceLastPong)
|
47
|
+
return ret
|
32
48
|
|
33
49
|
@staticmethod
|
34
50
|
def unpack(packet: "Packet") -> "PhotonPipelineMetadata":
|
@@ -43,6 +59,9 @@ class PhotonPipelineMetadataSerde:
|
|
43
59
|
# publishTimestampMicros is of intrinsic type int64
|
44
60
|
ret.publishTimestampMicros = packet.decodeLong()
|
45
61
|
|
62
|
+
# timeSinceLastPong is of intrinsic type int64
|
63
|
+
ret.timeSinceLastPong = packet.decodeLong()
|
64
|
+
|
46
65
|
return ret
|
47
66
|
|
48
67
|
|
@@ -21,12 +21,29 @@
|
|
21
21
|
###############################################################################
|
22
22
|
|
23
23
|
from ..targeting import *
|
24
|
+
from ..packet import Packet
|
24
25
|
|
25
26
|
|
26
27
|
class PhotonPipelineResultSerde:
|
27
28
|
# Message definition md5sum. See photon_packet.adoc for details
|
28
|
-
MESSAGE_VERSION = "
|
29
|
-
MESSAGE_FORMAT = "PhotonPipelineMetadata:
|
29
|
+
MESSAGE_VERSION = "4b2ff16a964b5e2bf04be0c1454d91c4"
|
30
|
+
MESSAGE_FORMAT = "PhotonPipelineMetadata:ac0a45f686457856fb30af77699ea356 metadata;PhotonTrackedTarget:cc6dbb5c5c1e0fa808108019b20863f1 targets[?];optional MultiTargetPNPResult:541096947e9f3ca2d3f425ff7b04aa7b multitagResult;"
|
31
|
+
|
32
|
+
@staticmethod
|
33
|
+
def pack(value: "PhotonPipelineResult") -> "Packet":
|
34
|
+
ret = Packet()
|
35
|
+
|
36
|
+
# metadata is of non-intrinsic type PhotonPipelineMetadata
|
37
|
+
ret.encodeBytes(
|
38
|
+
PhotonPipelineMetadata.photonStruct.pack(value.metadata).getData()
|
39
|
+
)
|
40
|
+
|
41
|
+
# targets is a custom VLA!
|
42
|
+
ret.encodeList(value.targets, PhotonTrackedTarget.photonStruct)
|
43
|
+
|
44
|
+
# multitagResult is optional! it better not be a VLA too
|
45
|
+
ret.encodeOptional(value.multitagResult, MultiTargetPNPResult.photonStruct)
|
46
|
+
return ret
|
30
47
|
|
31
48
|
@staticmethod
|
32
49
|
def unpack(packet: "Packet") -> "PhotonPipelineResult":
|
@@ -21,6 +21,7 @@
|
|
21
21
|
###############################################################################
|
22
22
|
|
23
23
|
from ..targeting import *
|
24
|
+
from ..packet import Packet
|
24
25
|
|
25
26
|
|
26
27
|
class PhotonTrackedTargetSerde:
|
@@ -28,6 +29,45 @@ class PhotonTrackedTargetSerde:
|
|
28
29
|
MESSAGE_VERSION = "cc6dbb5c5c1e0fa808108019b20863f1"
|
29
30
|
MESSAGE_FORMAT = "float64 yaw;float64 pitch;float64 area;float64 skew;int32 fiducialId;int32 objDetectId;float32 objDetectConf;Transform3d bestCameraToTarget;Transform3d altCameraToTarget;float64 poseAmbiguity;TargetCorner:16f6ac0dedc8eaccb951f4895d9e18b6 minAreaRectCorners[?];TargetCorner:16f6ac0dedc8eaccb951f4895d9e18b6 detectedCorners[?];"
|
30
31
|
|
32
|
+
@staticmethod
|
33
|
+
def pack(value: "PhotonTrackedTarget") -> "Packet":
|
34
|
+
ret = Packet()
|
35
|
+
|
36
|
+
# yaw is of intrinsic type float64
|
37
|
+
ret.encodeDouble(value.yaw)
|
38
|
+
|
39
|
+
# pitch is of intrinsic type float64
|
40
|
+
ret.encodeDouble(value.pitch)
|
41
|
+
|
42
|
+
# area is of intrinsic type float64
|
43
|
+
ret.encodeDouble(value.area)
|
44
|
+
|
45
|
+
# skew is of intrinsic type float64
|
46
|
+
ret.encodeDouble(value.skew)
|
47
|
+
|
48
|
+
# fiducialId is of intrinsic type int32
|
49
|
+
ret.encodeInt(value.fiducialId)
|
50
|
+
|
51
|
+
# objDetectId is of intrinsic type int32
|
52
|
+
ret.encodeInt(value.objDetectId)
|
53
|
+
|
54
|
+
# objDetectConf is of intrinsic type float32
|
55
|
+
ret.encodeFloat(value.objDetectConf)
|
56
|
+
|
57
|
+
ret.encodeTransform(value.bestCameraToTarget)
|
58
|
+
|
59
|
+
ret.encodeTransform(value.altCameraToTarget)
|
60
|
+
|
61
|
+
# poseAmbiguity is of intrinsic type float64
|
62
|
+
ret.encodeDouble(value.poseAmbiguity)
|
63
|
+
|
64
|
+
# minAreaRectCorners is a custom VLA!
|
65
|
+
ret.encodeList(value.minAreaRectCorners, TargetCorner.photonStruct)
|
66
|
+
|
67
|
+
# detectedCorners is a custom VLA!
|
68
|
+
ret.encodeList(value.detectedCorners, TargetCorner.photonStruct)
|
69
|
+
return ret
|
70
|
+
|
31
71
|
@staticmethod
|
32
72
|
def unpack(packet: "Packet") -> "PhotonTrackedTarget":
|
33
73
|
ret = PhotonTrackedTarget()
|
@@ -21,6 +21,7 @@
|
|
21
21
|
###############################################################################
|
22
22
|
|
23
23
|
from ..targeting import *
|
24
|
+
from ..packet import Packet
|
24
25
|
|
25
26
|
|
26
27
|
class PnpResultSerde:
|
@@ -28,6 +29,24 @@ class PnpResultSerde:
|
|
28
29
|
MESSAGE_VERSION = "ae4d655c0a3104d88df4f5db144c1e86"
|
29
30
|
MESSAGE_FORMAT = "Transform3d best;Transform3d alt;float64 bestReprojErr;float64 altReprojErr;float64 ambiguity;"
|
30
31
|
|
32
|
+
@staticmethod
|
33
|
+
def pack(value: "PnpResult") -> "Packet":
|
34
|
+
ret = Packet()
|
35
|
+
|
36
|
+
ret.encodeTransform(value.best)
|
37
|
+
|
38
|
+
ret.encodeTransform(value.alt)
|
39
|
+
|
40
|
+
# bestReprojErr is of intrinsic type float64
|
41
|
+
ret.encodeDouble(value.bestReprojErr)
|
42
|
+
|
43
|
+
# altReprojErr is of intrinsic type float64
|
44
|
+
ret.encodeDouble(value.altReprojErr)
|
45
|
+
|
46
|
+
# ambiguity is of intrinsic type float64
|
47
|
+
ret.encodeDouble(value.ambiguity)
|
48
|
+
return ret
|
49
|
+
|
31
50
|
@staticmethod
|
32
51
|
def unpack(packet: "Packet") -> "PnpResult":
|
33
52
|
ret = PnpResult()
|
@@ -21,6 +21,7 @@
|
|
21
21
|
###############################################################################
|
22
22
|
|
23
23
|
from ..targeting import *
|
24
|
+
from ..packet import Packet
|
24
25
|
|
25
26
|
|
26
27
|
class TargetCornerSerde:
|
@@ -28,6 +29,17 @@ class TargetCornerSerde:
|
|
28
29
|
MESSAGE_VERSION = "16f6ac0dedc8eaccb951f4895d9e18b6"
|
29
30
|
MESSAGE_FORMAT = "float64 x;float64 y;"
|
30
31
|
|
32
|
+
@staticmethod
|
33
|
+
def pack(value: "TargetCorner") -> "Packet":
|
34
|
+
ret = Packet()
|
35
|
+
|
36
|
+
# x is of intrinsic type float64
|
37
|
+
ret.encodeDouble(value.x)
|
38
|
+
|
39
|
+
# y is of intrinsic type float64
|
40
|
+
ret.encodeDouble(value.y)
|
41
|
+
return ret
|
42
|
+
|
31
43
|
@staticmethod
|
32
44
|
def unpack(packet: "Packet") -> "TargetCorner":
|
33
45
|
ret = TargetCorner()
|
photonlibpy/packet.py
CHANGED
@@ -22,7 +22,7 @@ import wpilib
|
|
22
22
|
|
23
23
|
|
24
24
|
class Packet:
|
25
|
-
def __init__(self, data: bytes):
|
25
|
+
def __init__(self, data: bytes = b""):
|
26
26
|
"""
|
27
27
|
* Constructs an empty packet.
|
28
28
|
*
|
@@ -198,3 +198,110 @@ class Packet:
|
|
198
198
|
return serde.unpack(self)
|
199
199
|
else:
|
200
200
|
return None
|
201
|
+
|
202
|
+
def _encodeGeneric(self, packFormat, value):
|
203
|
+
"""
|
204
|
+
Append bytes to the packet data buffer.
|
205
|
+
"""
|
206
|
+
self.packetData = self.packetData + struct.pack(packFormat, value)
|
207
|
+
self.size = len(self.packetData)
|
208
|
+
|
209
|
+
def encode8(self, value: int):
|
210
|
+
"""
|
211
|
+
Encodes a single byte and appends it to the packet.
|
212
|
+
"""
|
213
|
+
self._encodeGeneric("<b", value)
|
214
|
+
|
215
|
+
def encode16(self, value: int):
|
216
|
+
"""
|
217
|
+
Encodes a short (2 bytes) and appends it to the packet.
|
218
|
+
"""
|
219
|
+
self._encodeGeneric("<h", value)
|
220
|
+
|
221
|
+
def encodeInt(self, value: int):
|
222
|
+
"""
|
223
|
+
Encodes an int (4 bytes) and appends it to the packet.
|
224
|
+
"""
|
225
|
+
self._encodeGeneric("<l", value)
|
226
|
+
|
227
|
+
def encodeFloat(self, value: float):
|
228
|
+
"""
|
229
|
+
Encodes a float (4 bytes) and appends it to the packet.
|
230
|
+
"""
|
231
|
+
self._encodeGeneric("<f", value)
|
232
|
+
|
233
|
+
def encodeLong(self, value: int):
|
234
|
+
"""
|
235
|
+
Encodes a long (8 bytes) and appends it to the packet.
|
236
|
+
"""
|
237
|
+
self._encodeGeneric("<q", value)
|
238
|
+
|
239
|
+
def encodeDouble(self, value: float):
|
240
|
+
"""
|
241
|
+
Encodes a double (8 bytes) and appends it to the packet.
|
242
|
+
"""
|
243
|
+
self._encodeGeneric("<d", value)
|
244
|
+
|
245
|
+
def encodeBoolean(self, value: bool):
|
246
|
+
"""
|
247
|
+
Encodes a boolean as a single byte and appends it to the packet.
|
248
|
+
"""
|
249
|
+
self.encode8(1 if value else 0)
|
250
|
+
|
251
|
+
def encodeDoubleArray(self, values: list[float]):
|
252
|
+
"""
|
253
|
+
Encodes an array of doubles and appends it to the packet.
|
254
|
+
"""
|
255
|
+
self.encode8(len(values))
|
256
|
+
for value in values:
|
257
|
+
self.encodeDouble(value)
|
258
|
+
|
259
|
+
def encodeShortList(self, values: list[int]):
|
260
|
+
"""
|
261
|
+
Encodes a list of shorts, with length prefixed as a single byte.
|
262
|
+
"""
|
263
|
+
self.encode8(len(values))
|
264
|
+
for value in values:
|
265
|
+
self.encode16(value)
|
266
|
+
|
267
|
+
def encodeTransform(self, transform: Transform3d):
|
268
|
+
"""
|
269
|
+
Encodes a Transform3d (translation and rotation) and appends it to the packet.
|
270
|
+
"""
|
271
|
+
# Encode Translation3d part (x, y, z)
|
272
|
+
self.encodeDouble(transform.translation().x)
|
273
|
+
self.encodeDouble(transform.translation().y)
|
274
|
+
self.encodeDouble(transform.translation().z)
|
275
|
+
|
276
|
+
# Encode Rotation3d as Quaternion (w, x, y, z)
|
277
|
+
quaternion = transform.rotation().getQuaternion()
|
278
|
+
self.encodeDouble(quaternion.W())
|
279
|
+
self.encodeDouble(quaternion.X())
|
280
|
+
self.encodeDouble(quaternion.Y())
|
281
|
+
self.encodeDouble(quaternion.Z())
|
282
|
+
|
283
|
+
def encodeList(self, values: list[Any], serde: Type):
|
284
|
+
"""
|
285
|
+
Encodes a list of items using a specific serializer and appends it to the packet.
|
286
|
+
"""
|
287
|
+
self.encode8(len(values))
|
288
|
+
for item in values:
|
289
|
+
packed = serde.pack(item)
|
290
|
+
self.packetData = self.packetData + packed.getData()
|
291
|
+
self.size = len(self.packetData)
|
292
|
+
|
293
|
+
def encodeOptional(self, value: Optional[Any], serde: Type):
|
294
|
+
"""
|
295
|
+
Encodes an optional value using a specific serializer.
|
296
|
+
"""
|
297
|
+
if value is None:
|
298
|
+
self.encodeBoolean(False)
|
299
|
+
else:
|
300
|
+
self.encodeBoolean(True)
|
301
|
+
packed = serde.pack(value)
|
302
|
+
self.packetData = self.packetData + packed.getData()
|
303
|
+
self.size = len(self.packetData)
|
304
|
+
|
305
|
+
def encodeBytes(self, value: bytes):
|
306
|
+
self.packetData = self.packetData + value
|
307
|
+
self.size = len(self.packetData)
|
photonlibpy/photonCamera.py
CHANGED
@@ -124,7 +124,7 @@ class PhotonCamera:
|
|
124
124
|
pkt = Packet(byteList)
|
125
125
|
newResult = PhotonPipelineResult.photonStruct.unpack(pkt)
|
126
126
|
# NT4 allows us to correct the timestamp based on when the message was sent
|
127
|
-
newResult.ntReceiveTimestampMicros = timestamp
|
127
|
+
newResult.ntReceiveTimestampMicros = timestamp
|
128
128
|
ret.append(newResult)
|
129
129
|
|
130
130
|
return ret
|
@@ -269,8 +269,8 @@ class PhotonPoseEstimator:
|
|
269
269
|
def _multiTagOnCoprocStrategy(
|
270
270
|
self, result: PhotonPipelineResult
|
271
271
|
) -> Optional[EstimatedRobotPose]:
|
272
|
-
if result.
|
273
|
-
best_tf = result.
|
272
|
+
if result.multitagResult is not None:
|
273
|
+
best_tf = result.multitagResult.estimatedPose.best
|
274
274
|
best = (
|
275
275
|
Pose3d()
|
276
276
|
.transformBy(best_tf) # field-to-camera
|
@@ -8,8 +8,8 @@ class PnpResult:
|
|
8
8
|
best: Transform3d = field(default_factory=Transform3d)
|
9
9
|
alt: Transform3d = field(default_factory=Transform3d)
|
10
10
|
ambiguity: float = 0.0
|
11
|
-
|
12
|
-
|
11
|
+
bestReprojErr: float = 0.0
|
12
|
+
altReprojErr: float = 0.0
|
13
13
|
|
14
14
|
photonStruct: "PNPResultSerde" = None
|
15
15
|
|
@@ -15,6 +15,8 @@ class PhotonPipelineMetadata:
|
|
15
15
|
# Mirror of the heartbeat entry -- monotonically increasing
|
16
16
|
sequenceID: int = -1
|
17
17
|
|
18
|
+
timeSinceLastPong: int = -1
|
19
|
+
|
18
20
|
photonStruct: "PhotonPipelineMetadataSerde" = None
|
19
21
|
|
20
22
|
|
@@ -24,8 +26,10 @@ class PhotonPipelineResult:
|
|
24
26
|
ntReceiveTimestampMicros: int = -1
|
25
27
|
|
26
28
|
targets: list[PhotonTrackedTarget] = field(default_factory=list)
|
29
|
+
# Python users beware! We don't currently run a Time Sync Server, so these timestamps are in
|
30
|
+
# an arbitrary timebase. This is not true in C++ or Java.
|
27
31
|
metadata: PhotonPipelineMetadata = field(default_factory=PhotonPipelineMetadata)
|
28
|
-
|
32
|
+
multitagResult: Optional[MultiTargetPNPResult] = None
|
29
33
|
|
30
34
|
def getLatencyMillis(self) -> float:
|
31
35
|
return (
|
@@ -13,9 +13,11 @@ class PhotonTrackedTarget:
|
|
13
13
|
fiducialId: int = -1
|
14
14
|
bestCameraToTarget: Transform3d = field(default_factory=Transform3d)
|
15
15
|
altCameraToTarget: Transform3d = field(default_factory=Transform3d)
|
16
|
-
minAreaRectCorners: list[TargetCorner]
|
17
|
-
detectedCorners: list[TargetCorner]
|
16
|
+
minAreaRectCorners: list[TargetCorner] = field(default_factory=list[TargetCorner])
|
17
|
+
detectedCorners: list[TargetCorner] = field(default_factory=list[TargetCorner])
|
18
18
|
poseAmbiguity: float = 0.0
|
19
|
+
objDetectId: int = -1
|
20
|
+
objDetectConf: float = 0.0
|
19
21
|
|
20
22
|
def getYaw(self) -> float:
|
21
23
|
return self.yaw
|
@@ -35,10 +37,10 @@ class PhotonTrackedTarget:
|
|
35
37
|
def getPoseAmbiguity(self) -> float:
|
36
38
|
return self.poseAmbiguity
|
37
39
|
|
38
|
-
def getMinAreaRectCorners(self) -> list[TargetCorner]
|
40
|
+
def getMinAreaRectCorners(self) -> list[TargetCorner]:
|
39
41
|
return self.minAreaRectCorners
|
40
42
|
|
41
|
-
def getDetectedCorners(self) -> list[TargetCorner]
|
43
|
+
def getDetectedCorners(self) -> list[TargetCorner]:
|
42
44
|
return self.detectedCorners
|
43
45
|
|
44
46
|
def getBestCameraToTarget(self) -> Transform3d:
|
photonlibpy/version.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
PHOTONLIB_VERSION="v2025.0.0.
|
2
|
-
PHOTONVISION_VERSION="v2025.0.0-
|
1
|
+
PHOTONLIB_VERSION="v2025.0.0.beta.1"
|
2
|
+
PHOTONVISION_VERSION="v2025.0.0-beta-1"
|
@@ -1,7 +1,7 @@
|
|
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-
|
3
|
+
Version: 2025.0.0b1
|
4
|
+
Summary: Pure-python implementation of PhotonLib for interfacing with PhotonVision on coprocessors. Implemented with PhotonVision version v2025.0.0-beta-1 .
|
5
5
|
Home-page: https://photonvision.org
|
6
6
|
Author: Photonvision Development Team
|
7
7
|
Description-Content-Type: text/markdown
|
@@ -0,0 +1,22 @@
|
|
1
|
+
photonlibpy/__init__.py,sha256=JnwWj53fEM263hUjEFGmJ--M3XCX0LYovdrl4wcNRnU,1136
|
2
|
+
photonlibpy/estimatedRobotPose.py,sha256=X7wF9xdPXGKSVy0MY0qrWZJOEbuZPd721lYp0KXKlP0,1603
|
3
|
+
photonlibpy/packet.py,sha256=ppNJGN9bgWA4smefFvaxqF56Qwcjj0dnqwSIjP92JlE,9528
|
4
|
+
photonlibpy/photonCamera.py,sha256=c3Q9AFuccR41AkajkqCRt3mqUtv7a-TNSKOmXBi9p7M,10181
|
5
|
+
photonlibpy/photonPoseEstimator.py,sha256=vSpPbKR2WB-bNgWnskSP0Os2CcCzqcPGsE1lUVrcSw0,12584
|
6
|
+
photonlibpy/version.py,sha256=Cac9aJKhHkgx4HcwV63_46tpcc8q-mu8IN_P1THZx2Q,77
|
7
|
+
photonlibpy/generated/MultiTargetPNPResultSerde.py,sha256=t0hQgz0BvzQTsx-l0EJjr5eRfkY6piQRhu_2N2s2nlw,2342
|
8
|
+
photonlibpy/generated/PhotonPipelineMetadataSerde.py,sha256=RiSWwu6ftwc19U_5uexu8VjET7NksjrXanzV8GYEHkE,2767
|
9
|
+
photonlibpy/generated/PhotonPipelineResultSerde.py,sha256=DUrkUj2E6nS-Ru-drY-sX8odAl693VKJx_8lp0U-V9M,2847
|
10
|
+
photonlibpy/generated/PhotonTrackedTargetSerde.py,sha256=AFuvhmOTBdDtkAOfdS99MRnTk7P-94P0wXi3GHyvJco,4271
|
11
|
+
photonlibpy/generated/PnpResultSerde.py,sha256=tdHNHs9A7KBkYgqXQ5mUBc2TF3R_w3I_t922-DS6sQw,2586
|
12
|
+
photonlibpy/generated/TargetCornerSerde.py,sha256=K2GJ_t_Gl91lJX823TeR10dzch1IQEX28tfob3eIftg,2080
|
13
|
+
photonlibpy/generated/__init__.py,sha256=WdCA9k7QNY1i8B9u5kBilnibajDBg7zfU8GbV7F2H8g,505
|
14
|
+
photonlibpy/targeting/TargetCorner.py,sha256=iFWTWu5HcpkBQyvhz_klpAB0TEmy-7_SsD1FHeNfnkE,147
|
15
|
+
photonlibpy/targeting/__init__.py,sha256=1GUy4MC8NbZ-TEcFgsnvSm_X0LYeZ0HZagMMRmGpx8A,295
|
16
|
+
photonlibpy/targeting/multiTargetPNPResult.py,sha256=G_5Rll-a0wnV2iJhwVpODY1Ag52uOUkzZfsGu5ns04Q,1006
|
17
|
+
photonlibpy/targeting/photonPipelineResult.py,sha256=jXaZoyJvNYXg8N3senagkk2iduV5m_qsNnqWS3OsHx8,2508
|
18
|
+
photonlibpy/targeting/photonTrackedTarget.py,sha256=qNPqh8eKTP9IIkBMVvkS_dq7SoVOpIm7d5b1ZUtN8bE,1811
|
19
|
+
photonlibpy-2025.0.0b1.dist-info/METADATA,sha256=nS1JEF7rUJQSFhyUbfaQsGdook8yknRW74EkZqR0mi0,555
|
20
|
+
photonlibpy-2025.0.0b1.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
|
21
|
+
photonlibpy-2025.0.0b1.dist-info/top_level.txt,sha256=T8Xc6U6he2VjKUAca6zawSkHdUZuLanxYIc4nxw2ctc,12
|
22
|
+
photonlibpy-2025.0.0b1.dist-info/RECORD,,
|
@@ -1,22 +0,0 @@
|
|
1
|
-
photonlibpy/__init__.py,sha256=JnwWj53fEM263hUjEFGmJ--M3XCX0LYovdrl4wcNRnU,1136
|
2
|
-
photonlibpy/estimatedRobotPose.py,sha256=X7wF9xdPXGKSVy0MY0qrWZJOEbuZPd721lYp0KXKlP0,1603
|
3
|
-
photonlibpy/packet.py,sha256=gcikxwQZLoNGHuzNpAmnXjyLty-8w8HIVR3gGl4QPX4,6024
|
4
|
-
photonlibpy/photonCamera.py,sha256=nc80dRGm_4OT_EcJo9zmmCaiDY3FMmAgYoYDrTCKEfk,10187
|
5
|
-
photonlibpy/photonPoseEstimator.py,sha256=cgTW2Ja9cJK08bIKd-zW0l1V8mLL5NM_unaIOgEsedk,12596
|
6
|
-
photonlibpy/version.py,sha256=Fg2UjgOnC98Q0vrMlyrceRwAyQMW9fCGWswIYeblBQY,79
|
7
|
-
photonlibpy/generated/MultiTargetPNPResultSerde.py,sha256=vtcg17D83gVtXJBCAez8xFmxdENV020QcY4gfYZOBd4,1957
|
8
|
-
photonlibpy/generated/PhotonPipelineMetadataSerde.py,sha256=eXLgqVQfaK7nPLeu832Z2RsH3BfffGPDCXvw0DCvjTw,2081
|
9
|
-
photonlibpy/generated/PhotonPipelineResultSerde.py,sha256=jPq9C1895UO1fbipuO9V6TPrFZ5IOVbTNzctnlTjRBQ,2261
|
10
|
-
photonlibpy/generated/PhotonTrackedTargetSerde.py,sha256=v_VFmq8h6KIarAdmqsV1DLClF3mQUVJzRbk-DLDwjU4,3070
|
11
|
-
photonlibpy/generated/PnpResultSerde.py,sha256=LqQ2-25ac8o8BoV24UL0gkG4cQ6KrZNbajNZngYjSI4,2080
|
12
|
-
photonlibpy/generated/TargetCornerSerde.py,sha256=ehkIitRVneMppqnEn3XPn_giUNH-czT3O_YID5fxdos,1790
|
13
|
-
photonlibpy/generated/__init__.py,sha256=WdCA9k7QNY1i8B9u5kBilnibajDBg7zfU8GbV7F2H8g,505
|
14
|
-
photonlibpy/targeting/TargetCorner.py,sha256=iFWTWu5HcpkBQyvhz_klpAB0TEmy-7_SsD1FHeNfnkE,147
|
15
|
-
photonlibpy/targeting/__init__.py,sha256=1GUy4MC8NbZ-TEcFgsnvSm_X0LYeZ0HZagMMRmGpx8A,295
|
16
|
-
photonlibpy/targeting/multiTargetPNPResult.py,sha256=CZ7jULJV1VpTK5mxLvMVKHkBMKdTk9X428cNChzizAY,1010
|
17
|
-
photonlibpy/targeting/photonPipelineResult.py,sha256=t3fHHEb6YgucJyTajCi3-SIG9FSQGQ4sUQLadFfhIks,2316
|
18
|
-
photonlibpy/targeting/photonTrackedTarget.py,sha256=B1kMfx6Re0VF_RsMZ7H0ZyxaGy4PR4XITiaCbe0ViZ0,1708
|
19
|
-
photonlibpy-2025.0.0a0.dist-info/METADATA,sha256=zZc6rK9qOYvIQGeXfoCx6qorsNoMaYn2YKdcBMrib48,556
|
20
|
-
photonlibpy-2025.0.0a0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
|
21
|
-
photonlibpy-2025.0.0a0.dist-info/top_level.txt,sha256=T8Xc6U6he2VjKUAca6zawSkHdUZuLanxYIc4nxw2ctc,12
|
22
|
-
photonlibpy-2025.0.0a0.dist-info/RECORD,,
|
File without changes
|