2023-12-16 12:32:49 -06:00
|
|
|
from dataclasses import dataclass, field
|
2024-11-12 16:53:43 +11:00
|
|
|
from typing import TYPE_CHECKING, ClassVar
|
2024-11-10 13:42:16 +08:00
|
|
|
|
2026-05-26 21:47:48 -04:00
|
|
|
from wpimath import Transform3d
|
2024-11-10 13:42:16 +08:00
|
|
|
|
2024-08-31 13:44:19 -04:00
|
|
|
from ..packet import Packet
|
|
|
|
|
from .TargetCorner import TargetCorner
|
2023-12-16 12:32:49 -06:00
|
|
|
|
2024-11-12 16:53:43 +11:00
|
|
|
if TYPE_CHECKING:
|
2024-11-14 02:39:02 +11:00
|
|
|
from ..generated.PhotonTrackedTargetSerde import PhotonTrackedTargetSerde
|
2024-11-12 16:53:43 +11:00
|
|
|
|
2023-12-16 12:32:49 -06:00
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
class PhotonTrackedTarget:
|
|
|
|
|
yaw: float = 0.0
|
|
|
|
|
pitch: float = 0.0
|
|
|
|
|
area: float = 0.0
|
|
|
|
|
skew: float = 0.0
|
|
|
|
|
fiducialId: int = -1
|
|
|
|
|
bestCameraToTarget: Transform3d = field(default_factory=Transform3d)
|
|
|
|
|
altCameraToTarget: Transform3d = field(default_factory=Transform3d)
|
2024-11-09 10:58:56 +11:00
|
|
|
minAreaRectCorners: list[TargetCorner] = field(default_factory=list[TargetCorner])
|
|
|
|
|
detectedCorners: list[TargetCorner] = field(default_factory=list[TargetCorner])
|
2023-12-16 12:32:49 -06:00
|
|
|
poseAmbiguity: float = 0.0
|
2024-11-10 09:32:35 +11:00
|
|
|
objDetectId: int = -1
|
|
|
|
|
objDetectConf: float = 0.0
|
2023-12-16 12:32:49 -06:00
|
|
|
|
|
|
|
|
def getYaw(self) -> float:
|
|
|
|
|
return self.yaw
|
|
|
|
|
|
|
|
|
|
def getPitch(self) -> float:
|
|
|
|
|
return self.pitch
|
|
|
|
|
|
|
|
|
|
def getArea(self) -> float:
|
|
|
|
|
return self.area
|
|
|
|
|
|
|
|
|
|
def getSkew(self) -> float:
|
|
|
|
|
return self.skew
|
|
|
|
|
|
|
|
|
|
def getFiducialId(self) -> int:
|
|
|
|
|
return self.fiducialId
|
|
|
|
|
|
|
|
|
|
def getPoseAmbiguity(self) -> float:
|
|
|
|
|
return self.poseAmbiguity
|
|
|
|
|
|
2024-11-09 10:58:56 +11:00
|
|
|
def getMinAreaRectCorners(self) -> list[TargetCorner]:
|
2023-12-16 12:32:49 -06:00
|
|
|
return self.minAreaRectCorners
|
|
|
|
|
|
2024-11-09 10:58:56 +11:00
|
|
|
def getDetectedCorners(self) -> list[TargetCorner]:
|
2023-12-16 12:32:49 -06:00
|
|
|
return self.detectedCorners
|
|
|
|
|
|
|
|
|
|
def getBestCameraToTarget(self) -> Transform3d:
|
|
|
|
|
return self.bestCameraToTarget
|
|
|
|
|
|
|
|
|
|
def getAlternateCameraToTarget(self) -> Transform3d:
|
|
|
|
|
return self.altCameraToTarget
|
|
|
|
|
|
|
|
|
|
def _decodeTargetList(self, packet: Packet, numTargets: int) -> list[TargetCorner]:
|
|
|
|
|
retList = []
|
|
|
|
|
for _ in range(numTargets):
|
|
|
|
|
cx = packet.decodeDouble()
|
|
|
|
|
cy = packet.decodeDouble()
|
|
|
|
|
retList.append(TargetCorner(cx, cy))
|
|
|
|
|
return retList
|
|
|
|
|
|
2024-11-14 02:39:02 +11:00
|
|
|
photonStruct: ClassVar["PhotonTrackedTargetSerde"]
|