photonlibpy 2025.0.0b4__py3-none-any.whl → 2025.0.0b6__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,4 @@
1
+ import logging
1
2
  import math
2
3
  from typing import Any
3
4
 
@@ -11,6 +12,8 @@ from .rotTrlTransform3d import RotTrlTransform3d
11
12
  NWU_TO_EDN = Rotation3d(np.array([[0, -1, 0], [0, 0, -1], [1, 0, 0]]))
12
13
  EDN_TO_NWU = Rotation3d(np.array([[0, 0, 1], [-1, 0, 0], [0, -1, 0]]))
13
14
 
15
+ logger = logging.getLogger(__name__)
16
+
14
17
 
15
18
  class OpenCVHelp:
16
19
  @staticmethod
@@ -243,7 +246,7 @@ class OpenCVHelp:
243
246
 
244
247
  # solvePnP failed
245
248
  if reprojectionError is None or math.isnan(reprojectionError[0, 0]):
246
- print("SolvePNP_Square failed!")
249
+ logger.error("SolvePNP_Square failed!")
247
250
  return None
248
251
 
249
252
  if alt:
@@ -303,6 +306,7 @@ class OpenCVHelp:
303
306
  )
304
307
 
305
308
  if math.isnan(error):
309
+ logger.error("SolvePNP_SQPNP failed!")
306
310
  return None
307
311
 
308
312
  # We have no alternative so set it to best as well
@@ -42,9 +42,7 @@ class PhotonPipelineResultSerde:
42
42
  ret = Packet()
43
43
 
44
44
  # metadata is of non-intrinsic type PhotonPipelineMetadata
45
- ret.encodeBytes(
46
- PhotonPipelineMetadata.photonStruct.pack(value.metadata).getData()
47
- )
45
+ ret.encodeBytes(PhotonPipelineMetadata.photonStruct.pack(value.metadata).getData())
48
46
 
49
47
  # targets is a custom VLA!
50
48
  ret.encodeList(value.targets, PhotonTrackedTarget.photonStruct)
@@ -17,10 +17,11 @@ class NTTopicSet:
17
17
  different for sim vs. real camera
18
18
  """
19
19
 
20
- def __init__(self, tableName: str, cameraName: str) -> None:
21
- instance = nt.NetworkTableInstance.getDefault()
22
- photonvision_root_table = instance.getTable(tableName)
23
- self.subTable = photonvision_root_table.getSubTable(cameraName)
20
+ def __init__(
21
+ self,
22
+ ntSubTable: nt.NetworkTable,
23
+ ) -> None:
24
+ self.subTable = ntSubTable
24
25
 
25
26
  def updateEntries(self) -> None:
26
27
  options = nt.PubSubOptions()
@@ -298,43 +298,42 @@ class PhotonCamera:
298
298
 
299
299
  # Check mdef UUID
300
300
  localUUID = PhotonPipelineResult.photonStruct.MESSAGE_VERSION
301
- remoteUUID = str(self._rawBytesEntry.getTopic().getProperty("message_uuid"))
301
+ remoteUUID = self._rawBytesEntry.getTopic().getProperty("message_uuid")
302
302
 
303
- if not remoteUUID:
303
+ if remoteUUID is None:
304
304
  wpilib.reportWarning(
305
305
  f"PhotonVision coprocessor at path {self._path} has not reported a message interface UUID - is your coprocessor's camera started?",
306
306
  True,
307
307
  )
308
-
309
- assert isinstance(remoteUUID, str)
310
- # ntcore hands us a JSON string with leading/trailing quotes - remove those
311
- remoteUUID = remoteUUID.replace('"', "")
312
-
313
- if localUUID != remoteUUID:
314
- # Verified version mismatch
315
-
316
- bfw = """
317
- \n\n\n
318
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
319
- >>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
320
- >>>
321
- >>> You are running an incompatible version
322
- >>> of PhotonVision on your coprocessor!
323
- >>>
324
- >>> This is neither tested nor supported.
325
- >>> You MUST update PhotonVision,
326
- >>> PhotonLib, or both.
327
- >>>
328
- >>> Your code will now crash.
329
- >>> We hope your day gets better.
330
- >>>
331
- >>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
332
- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
333
- \n\n
334
- """
335
-
336
- wpilib.reportWarning(bfw)
337
-
338
- errText = f"Photonlibpy version {PHOTONLIB_VERSION} (With message UUID {localUUID}) does not match coprocessor version {versionString} (with message UUID {remoteUUID}). Please install photonlibpy version {versionString}, or update your coprocessor to {PHOTONLIB_VERSION}."
339
- wpilib.reportError(errText, True)
340
- raise Exception(errText)
308
+ else:
309
+ # ntcore hands us a JSON string with leading/trailing quotes - remove those
310
+ remoteUUID = str(remoteUUID).replace('"', "")
311
+
312
+ if localUUID != remoteUUID:
313
+ # Verified version mismatch
314
+
315
+ bfw = """
316
+ \n\n\n
317
+ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
318
+ >>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
319
+ >>>
320
+ >>> You are running an incompatible version
321
+ >>> of PhotonVision on your coprocessor!
322
+ >>>
323
+ >>> This is neither tested nor supported.
324
+ >>> You MUST update PhotonVision,
325
+ >>> PhotonLib, or both.
326
+ >>>
327
+ >>> Your code will now crash.
328
+ >>> We hope your day gets better.
329
+ >>>
330
+ >>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
331
+ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
332
+ \n\n
333
+ """
334
+
335
+ wpilib.reportWarning(bfw)
336
+
337
+ errText = f"Photonlibpy version {PHOTONLIB_VERSION} (With message UUID {localUUID}) does not match coprocessor version {versionString} (with message UUID {remoteUUID}). Please install photonlibpy version {versionString}, or update your coprocessor to {PHOTONLIB_VERSION}."
338
+ wpilib.reportError(errText, True)
339
+ raise Exception(errText)
photonlibpy/py.typed ADDED
@@ -0,0 +1 @@
1
+
@@ -60,11 +60,10 @@ class PhotonCameraSim:
60
60
  self.videoSimRawEnabled: bool = False
61
61
  self.videoSimWireframeEnabled: bool = False
62
62
  self.videoSimWireframeResolution: float = 0.1
63
- self.videoSimProcEnabled: bool = (
64
- False # TODO switch this back to default True when the functionality is enabled
65
- )
63
+ # TODO switch this back to default True when the functionality is enabled
64
+ self.videoSimProcEnabled: bool = False
66
65
  self.heartbeatCounter: int = 0
67
- self.nextNtEntryTime = int(wpilib.Timer.getFPGATimestamp() * 1e6)
66
+ self.nextNtEntryTime = wpilib.Timer.getFPGATimestamp()
68
67
  self.tagLayout = AprilTagFieldLayout.loadField(AprilTagField.k2024Crescendo)
69
68
 
70
69
  self.cam = camera
@@ -95,7 +94,7 @@ class PhotonCameraSim:
95
94
  (self.prop.getResWidth(), self.prop.getResHeight())
96
95
  )
97
96
 
98
- self.ts = NTTopicSet("photonvision", self.cam.getName())
97
+ self.ts = NTTopicSet(self.cam._cameraTable)
99
98
  self.ts.updateEntries()
100
99
 
101
100
  # Handle this last explicitly for this function signature because the other constructor is called in the initialiser list
@@ -173,20 +172,20 @@ class PhotonCameraSim:
173
172
  def consumeNextEntryTime(self) -> float | None:
174
173
  """Determine if this camera should process a new frame based on performance metrics and the time
175
174
  since the last update. This returns an Optional which is either empty if no update should occur
176
- or a Long of the timestamp in microseconds of when the frame which should be received by NT. If
175
+ or a float of the timestamp in seconds of when the frame which should be received by NT. If
177
176
  a timestamp is returned, the last frame update time becomes that timestamp.
178
177
 
179
- :returns: Optional long which is empty while blocked or the NT entry timestamp in microseconds if
178
+ :returns: Optional float which is empty while blocked or the NT entry timestamp in seconds if
180
179
  ready
181
180
  """
182
181
  # check if this camera is ready for another frame update
183
- now = int(wpilib.Timer.getFPGATimestamp() * 1e6)
184
- timestamp = 0
182
+ now = wpilib.Timer.getFPGATimestamp()
183
+ timestamp = 0.0
185
184
  iter = 0
186
185
  # prepare next latest update
187
186
  while now >= self.nextNtEntryTime:
188
- timestamp = int(self.nextNtEntryTime)
189
- frameTime = int(self.prop.estSecUntilNextFrame() * 1e6)
187
+ timestamp = self.nextNtEntryTime
188
+ frameTime = self.prop.estSecUntilNextFrame()
190
189
  self.nextNtEntryTime += frameTime
191
190
 
192
191
  # if frame time is very small, avoid blocking
@@ -432,7 +431,9 @@ class PhotonCameraSim:
432
431
  )
433
432
 
434
433
  def submitProcessedFrame(
435
- self, result: PhotonPipelineResult, receiveTimestamp: float | None
434
+ self,
435
+ result: PhotonPipelineResult,
436
+ receiveTimestamp_us: float | None = None,
436
437
  ):
437
438
  """Simulate one processed frame of vision data, putting one result to NT. Image capture timestamp
438
439
  overrides :meth:`.PhotonPipelineResult.getTimestampSeconds` for more
@@ -441,44 +442,45 @@ class PhotonCameraSim:
441
442
  :param result: The pipeline result to submit
442
443
  :param receiveTimestamp: The (sim) timestamp when this result was read by NT in microseconds. If not passed image capture time is assumed be (current time - latency)
443
444
  """
444
- if receiveTimestamp is None:
445
- receiveTimestamp = wpilib.Timer.getFPGATimestamp() * 1e6
446
- receiveTimestamp = int(receiveTimestamp)
445
+ if receiveTimestamp_us is None:
446
+ receiveTimestamp_us = wpilib.Timer.getFPGATimestamp() * 1e6
447
+ receiveTimestamp_us = int(receiveTimestamp_us)
447
448
 
448
- self.ts.latencyMillisEntry.set(result.getLatencyMillis(), receiveTimestamp)
449
+ self.ts.latencyMillisEntry.set(result.getLatencyMillis(), receiveTimestamp_us)
449
450
 
450
451
  newPacket = PhotonPipelineResult.photonStruct.pack(result)
451
- self.ts.rawBytesEntry.set(newPacket.getData(), receiveTimestamp)
452
+ self.ts.rawBytesEntry.set(newPacket.getData(), receiveTimestamp_us)
452
453
 
453
454
  hasTargets = result.hasTargets()
454
- self.ts.hasTargetEntry.set(hasTargets, receiveTimestamp)
455
+ self.ts.hasTargetEntry.set(hasTargets, receiveTimestamp_us)
455
456
  if not hasTargets:
456
- self.ts.targetPitchEntry.set(0.0, receiveTimestamp)
457
- self.ts.targetYawEntry.set(0.0, receiveTimestamp)
458
- self.ts.targetAreaEntry.set(0.0, receiveTimestamp)
459
- self.ts.targetPoseEntry.set(Transform3d(), receiveTimestamp)
460
- self.ts.targetSkewEntry.set(0.0, receiveTimestamp)
457
+ self.ts.targetPitchEntry.set(0.0, receiveTimestamp_us)
458
+ self.ts.targetYawEntry.set(0.0, receiveTimestamp_us)
459
+ self.ts.targetAreaEntry.set(0.0, receiveTimestamp_us)
460
+ self.ts.targetPoseEntry.set(Transform3d(), receiveTimestamp_us)
461
+ self.ts.targetSkewEntry.set(0.0, receiveTimestamp_us)
461
462
  else:
462
463
  bestTarget = result.getBestTarget()
463
464
  assert bestTarget
464
465
 
465
- self.ts.targetPitchEntry.set(bestTarget.getPitch(), receiveTimestamp)
466
- self.ts.targetYawEntry.set(bestTarget.getYaw(), receiveTimestamp)
467
- self.ts.targetAreaEntry.set(bestTarget.getArea(), receiveTimestamp)
468
- self.ts.targetSkewEntry.set(bestTarget.getSkew(), receiveTimestamp)
466
+ self.ts.targetPitchEntry.set(bestTarget.getPitch(), receiveTimestamp_us)
467
+ self.ts.targetYawEntry.set(bestTarget.getYaw(), receiveTimestamp_us)
468
+ self.ts.targetAreaEntry.set(bestTarget.getArea(), receiveTimestamp_us)
469
+ self.ts.targetSkewEntry.set(bestTarget.getSkew(), receiveTimestamp_us)
469
470
 
470
471
  self.ts.targetPoseEntry.set(
471
- bestTarget.getBestCameraToTarget(), receiveTimestamp
472
+ bestTarget.getBestCameraToTarget(), receiveTimestamp_us
472
473
  )
473
474
 
474
- intrinsics = self.prop.getIntrinsics()
475
- intrinsicsView = intrinsics.flatten().tolist()
476
- self.ts.cameraIntrinsicsPublisher.set(intrinsicsView, receiveTimestamp)
475
+ intrinsics = self.prop.getIntrinsics()
476
+ intrinsicsView = intrinsics.flatten().tolist()
477
+ self.ts.cameraIntrinsicsPublisher.set(intrinsicsView, receiveTimestamp_us)
477
478
 
478
- distortion = self.prop.getDistCoeffs()
479
- distortionView = distortion.flatten().tolist()
480
- self.ts.cameraDistortionPublisher.set(distortionView, receiveTimestamp)
479
+ distortion = self.prop.getDistCoeffs()
480
+ distortionView = distortion.flatten().tolist()
481
+ self.ts.cameraDistortionPublisher.set(distortionView, receiveTimestamp_us)
481
482
 
482
- self.ts.heartbeatPublisher.set(self.heartbeatCounter, receiveTimestamp)
483
+ self.ts.heartbeatPublisher.set(self.heartbeatCounter, receiveTimestamp_us)
484
+ self.heartbeatCounter += 1
483
485
 
484
- self.ts.subTable.getInstance().flush()
486
+ self.ts.subTable.getInstance().flush()
@@ -4,11 +4,14 @@ import typing
4
4
 
5
5
  import cv2 as cv
6
6
  import numpy as np
7
+ import numpy.typing as npt
7
8
  from wpimath.geometry import Rotation2d, Rotation3d, Translation3d
8
9
  from wpimath.units import hertz, seconds
9
10
 
10
11
  from ..estimation import RotTrlTransform3d
11
12
 
13
+ logger = logging.getLogger(__name__)
14
+
12
15
 
13
16
  class SimCameraProperties:
14
17
  """Calibration and performance values for this camera.
@@ -29,8 +32,8 @@ class SimCameraProperties:
29
32
  """Default constructor which is the same as {@link #PERFECT_90DEG}"""
30
33
  self.resWidth: int = -1
31
34
  self.resHeight: int = -1
32
- self.camIntrinsics: np.ndarray = np.zeros((3, 3)) # [3,3]
33
- self.distCoeffs: np.ndarray = np.zeros((8, 1)) # [8,1]
35
+ self.camIntrinsics: npt.NDArray[np.floating] = np.zeros((3, 3)) # [3,3]
36
+ self.distCoeffs: npt.NDArray[np.floating] = np.zeros((8, 1)) # [8,1]
34
37
  self.avgErrorPx: float = 0.0
35
38
  self.errorStdDevPx: float = 0.0
36
39
  self.frameSpeed: seconds = 0.0
@@ -46,7 +49,7 @@ class SimCameraProperties:
46
49
  ) -> None:
47
50
  if fovDiag.degrees() < 1.0 or fovDiag.degrees() > 179.0:
48
51
  fovDiag = Rotation2d.fromDegrees(max(min(fovDiag.degrees(), 179.0), 1.0))
49
- logging.error("Requested invalid FOV! Clamping between (1, 179) degrees...")
52
+ logger.error("Requested invalid FOV! Clamping between (1, 179) degrees...")
50
53
 
51
54
  resDiag = math.sqrt(width * width + height * height)
52
55
  diagRatio = math.tan(fovDiag.radians() / 2.0)
@@ -78,7 +81,6 @@ class SimCameraProperties:
78
81
  newCamIntrinsics: np.ndarray,
79
82
  newDistCoeffs: np.ndarray,
80
83
  ) -> None:
81
-
82
84
  self.resWidth = width
83
85
  self.resHeight = height
84
86
  self.camIntrinsics = newCamIntrinsics
@@ -171,10 +173,10 @@ class SimCameraProperties:
171
173
  def getAspectRatio(self) -> float:
172
174
  return 1.0 * self.resWidth / self.resHeight
173
175
 
174
- def getIntrinsics(self) -> np.ndarray:
176
+ def getIntrinsics(self) -> npt.NDArray[np.floating]:
175
177
  return self.camIntrinsics
176
178
 
177
- def getDistCoeffs(self) -> np.ndarray:
179
+ def getDistCoeffs(self) -> npt.NDArray[np.floating]:
178
180
  return self.distCoeffs
179
181
 
180
182
  def getFPS(self) -> hertz:
@@ -353,7 +355,6 @@ class SimCameraProperties:
353
355
 
354
356
  # find intersections
355
357
  for i, normal in enumerate(self.viewplanes):
356
-
357
358
  # // we want to know the value of t when the line intercepts this plane
358
359
  # // parametrized: v = t * ab + a, where v lies on the plane
359
360
  # // we can find the projection of a onto the plane normal
@@ -465,7 +466,7 @@ class SimCameraProperties:
465
466
 
466
467
  def estSecUntilNextFrame(self) -> seconds:
467
468
  """
468
- :returns: Estimate how long until the next frame should be processed in milliseconds
469
+ :returns: Estimate how long until the next frame should be processed in seconds
469
470
  """
470
471
  # // exceptional processing latency blocks the next frame
471
472
  return self.frameSpeed + max(0.0, self.estLatency() - self.frameSpeed)
@@ -305,7 +305,7 @@ class VisionSystemSim:
305
305
  timestampNt = optTimestamp
306
306
  latency = camSim.prop.estLatency()
307
307
  # the image capture timestamp in seconds of this result
308
- timestampCapture = timestampNt * 1.0e-6 - latency
308
+ timestampCapture = timestampNt - latency
309
309
 
310
310
  # use camera pose from the image capture timestamp
311
311
  lateRobotPose = self.getRobotPose(timestampCapture)
@@ -318,7 +318,8 @@ class VisionSystemSim:
318
318
  # process a PhotonPipelineResult with visible targets
319
319
  camResult = camSim.process(latency, lateCameraPose, allTargets)
320
320
  # publish this info to NT at estimated timestamp of receive
321
- camSim.submitProcessedFrame(camResult, timestampNt)
321
+ # needs a timestamp in microseconds
322
+ camSim.submitProcessedFrame(camResult, timestampNt * 1.0e6)
322
323
  # display debug results
323
324
  for tgt in camResult.getTargets():
324
325
  trf = tgt.getBestCameraToTarget()
photonlibpy/version.py CHANGED
@@ -1,2 +1,2 @@
1
- PHOTONLIB_VERSION="v2025.0.0.beta.4"
2
- PHOTONVISION_VERSION="v2025.0.0-beta-4"
1
+ PHOTONLIB_VERSION="v2025.0.0.beta.6"
2
+ PHOTONVISION_VERSION="v2025.0.0-beta-6"
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: photonlibpy
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 .
3
+ Version: 2025.0.0b6
4
+ Summary: Pure-python implementation of PhotonLib for interfacing with PhotonVision on coprocessors. Implemented with PhotonVision version v2025.0.0-beta-6 .
5
5
  Home-page: https://photonvision.org
6
6
  Author: Photonvision Development Team
7
7
  Description-Content-Type: text/markdown
@@ -1,36 +1,37 @@
1
1
  photonlibpy/__init__.py,sha256=WW1OGrrcNXwwxaHSZlkxmhH2GYiQIHHxSxGVTJZhZbY,1136
2
2
  photonlibpy/estimatedRobotPose.py,sha256=X7wF9xdPXGKSVy0MY0qrWZJOEbuZPd721lYp0KXKlP0,1603
3
3
  photonlibpy/packet.py,sha256=5YomViVFwOljL2FGOetWM9FbPc_yCQ15ylzkYlgLIs8,9724
4
- photonlibpy/photonCamera.py,sha256=80-UKakvcgJ79vw80e2yUqZZfoQtpC1_lopnXpfgvOY,12823
4
+ photonlibpy/photonCamera.py,sha256=ENBHp959it4aLnFtV66rHoAIYCvK4bTflZMrGSCwnZ8,12905
5
5
  photonlibpy/photonPoseEstimator.py,sha256=2iMqxPFsQHTsq95yv-WCSv1a6wXNcHPqOyMc4Bu6IG0,12584
6
- photonlibpy/version.py,sha256=Ew1xD5CpZetX_p3ReR01MPCVsroMfk2ZpgH42q0Fubg,77
6
+ photonlibpy/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
7
+ photonlibpy/version.py,sha256=YY1V7rjUvCOJd1hvNe4-JTENvAM9Hze8avCtEHLsp_8,77
7
8
  photonlibpy/estimation/__init__.py,sha256=pZ-d6fN1DJvT-lRl4FfIos5HAvlzmetIOrGIinrdv7k,223
8
9
  photonlibpy/estimation/cameraTargetRelation.py,sha256=i7DPBXtkZve4ToXQscEIe-5F1oGQ1Qmf5QBaE__EeMQ,1158
9
- photonlibpy/estimation/openCVHelp.py,sha256=h36tOunGaDfs1yp1kAyK-BX0DqdNXZSN8T8ms-ReQas,12277
10
+ photonlibpy/estimation/openCVHelp.py,sha256=O1dV7v7RHSyw7l5L0QXbal6t9K7iyvEG76tG-t4AFVg,12388
10
11
  photonlibpy/estimation/rotTrlTransform3d.py,sha256=oRYk4V1XF7guNxefJsCPcBWPIkKZl0HYD_Gs86wwToE,2671
11
12
  photonlibpy/estimation/targetModel.py,sha256=fIhkf0-_Sfv-KhYEBnhFWMF4Xu84FfF6B-KUEsuuGjQ,6459
12
13
  photonlibpy/estimation/visionEstimation.py,sha256=Q4KWdLCV1H0wJUJCzG7OYNhVmk2jR1iPUmX_PFylLdA,4174
13
14
  photonlibpy/generated/MultiTargetPNPResultSerde.py,sha256=CzsCosHUnzxAoSC_sSAqpsXsDp54KW-BClnIXdzfMPc,2506
14
15
  photonlibpy/generated/PhotonPipelineMetadataSerde.py,sha256=9pq5XUEDEoRowCd7sRnuGV7xtugu5HZCRrnwqZG2xXc,2887
15
- photonlibpy/generated/PhotonPipelineResultSerde.py,sha256=jTf1obU2jPNDsxvt-tl9Ty_qzJws9Wqron3C1QiHkP8,3137
16
+ photonlibpy/generated/PhotonPipelineResultSerde.py,sha256=8_YhW1icdhPOx5eAqwKadvnR29NABmhHr6ERAWK8wEo,3115
16
17
  photonlibpy/generated/PhotonTrackedTargetSerde.py,sha256=-6vKir_ABDVBGbg8ktM48IKm_nBMFBbiyuZLiO_fP9U,4437
17
18
  photonlibpy/generated/PnpResultSerde.py,sha256=YoTKdQ51oSdxC-7Poy6hunL0-zkMKvP5uedqaHWPudY,2693
18
19
  photonlibpy/generated/TargetCornerSerde.py,sha256=kziD_rQIwyhzPfgOaDgn-3d87tvtXiAYbBjzu76biYU,2190
19
20
  photonlibpy/generated/__init__.py,sha256=mElM8M88---wxTWO-SRqIJ4EfxN0fdIUwZBZ-UIGuRw,428
20
- photonlibpy/networktables/NTTopicSet.py,sha256=TXJyVg6S8gONeuRqX_NI0FdxYw51bNLlFIAQ4Y2wyVg,3104
21
+ photonlibpy/networktables/NTTopicSet.py,sha256=29wPgXcuqT-u72-YXwSjRHWhECNzU8eDsexcqlA8KQ0,2967
21
22
  photonlibpy/networktables/__init__.py,sha256=o_LxTdyIylAszMy_zhUtTkXHyu6jqxccccj78d44OrI,35
22
23
  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
24
+ photonlibpy/simulation/photonCameraSim.py,sha256=8ELLcOXUtDftV_OYzGG03wigANimJs2SehV-fluWy3k,19907
25
+ photonlibpy/simulation/simCameraProperties.py,sha256=ODVxnylF8zw9HZSbw0PzG_OEtUo9ChRo-G_iEgADOCg,27195
25
26
  photonlibpy/simulation/videoSimUtil.py,sha256=xMuTvJ2Jx9IoQqmAJi_zUm06MdEwhVpIz9OyzYQp0k4,29
26
- photonlibpy/simulation/visionSystemSim.py,sha256=ln1TYVMXUreg6nxrVZJ7lw8puvgLbBBde_ciM2CH5G4,13788
27
+ photonlibpy/simulation/visionSystemSim.py,sha256=GmKs0d32WE8B020YEWnj-0dQuCnVv1ScGdcFl1fOsKo,13835
27
28
  photonlibpy/simulation/visionTargetSim.py,sha256=FH85fKE4NntowUvssfgZ1KlE-I_3Z-QuAgb2bFqvfdY,2219
28
29
  photonlibpy/targeting/TargetCorner.py,sha256=ouKj3E5uD76OZSNHHuSDzKOY65a8HqtcOsuejH-MVsU,276
29
30
  photonlibpy/targeting/__init__.py,sha256=YzINSpq6A0cjr-yAQcFqHoiYdLGKPFXThlVYlMjY11w,295
30
31
  photonlibpy/targeting/multiTargetPNPResult.py,sha256=Y9rweHtMzoCZ6mv6F8CutQi2Thq5pHN0ydBWvTCsOwY,806
31
32
  photonlibpy/targeting/photonPipelineResult.py,sha256=MbaSyHZTJpoKTtLOZztpSGSt9xWWFqhzgwj8medObVA,2732
32
33
  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,,
34
+ photonlibpy-2025.0.0b6.dist-info/METADATA,sha256=luAf2JXb3eVzyqShMDsi_X0ulP9SRGVEsV1KpmYfo2w,689
35
+ photonlibpy-2025.0.0b6.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
36
+ photonlibpy-2025.0.0b6.dist-info/top_level.txt,sha256=T8Xc6U6he2VjKUAca6zawSkHdUZuLanxYIc4nxw2ctc,12
37
+ photonlibpy-2025.0.0b6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.45.0)
2
+ Generator: bdist_wheel (0.45.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5