photonlibpy 2025.0.0a0__py3-none-any.whl → 2025.0.0b1__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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
|