photonUtils

  1import math
  2from typing import overload
  3
  4from wpimath.geometry import (
  5    Pose2d,
  6    Pose3d,
  7    Rotation2d,
  8    Transform2d,
  9    Transform3d,
 10    Translation2d,
 11)
 12
 13
 14class PhotonUtils:
 15    def __init__():
 16        pass
 17
 18    @staticmethod
 19    def calculateDistanceToTargetMeters(
 20        cameraHeightMeters: float,
 21        targetHeightMeters: float,
 22        cameraPitchRadians: float,
 23        targetPitchRadians: float,
 24    ) -> float:
 25        return (targetHeightMeters - cameraHeightMeters) / math.tan(
 26            cameraPitchRadians + targetPitchRadians
 27        )
 28
 29    @staticmethod
 30    def estimateCameraToTargetTranslation(targetDistanceMeters: float, yaw: Rotation2d):
 31        return Translation2d(
 32            yaw.cos() * targetDistanceMeters, yaw.sin() * targetDistanceMeters
 33        )
 34
 35    @staticmethod
 36    def estimateCameraToTarget(
 37        cameraToTargetTranslation: Translation2d,
 38        fieldToTarget: Pose2d,
 39        gyroAngle: Rotation2d,
 40    ):
 41        return Transform2d(
 42            cameraToTargetTranslation, gyroAngle * (-1) - fieldToTarget.rotation()
 43        )
 44
 45    @staticmethod
 46    def estimateFieldToCamera(cameraToTarget: Transform2d, fieldToTarget: Pose2d):
 47        targetToCamera = cameraToTarget.inverse()
 48        return fieldToTarget.transformBy(targetToCamera)
 49
 50    @staticmethod
 51    @overload
 52    def estimateFieldToRobot(
 53        cameraToTarget: Transform2d, fieldToTarget: Pose2d, cameraToRobot: Transform2d
 54    ):
 55        return PhotonUtils.estimateFieldToCamera(
 56            cameraToTarget, fieldToTarget
 57        ).transformBy(cameraToRobot)
 58
 59    @staticmethod
 60    def estimateFieldToRobotAprilTag(
 61        cameraToTarget: Transform3d,
 62        fieldRelativeTagPose: Pose3d,
 63        cameraToRobot: Transform3d,
 64    ):
 65        return fieldRelativeTagPose + cameraToTarget.inverse() + cameraToRobot
 66
 67    @staticmethod
 68    def getYawToPose(robotPose: Pose2d, targetPose: Pose2d):
 69        relativeTr1 = targetPose.relativeTo(robotPose).translation()
 70        return Rotation2d(relativeTr1.X(), relativeTr1.Y())
 71
 72    @staticmethod
 73    def getDistanceToPose(robotPose: Pose2d, targetPose: Pose2d):
 74        return robotPose.translation().distance(targetPose.translation())
 75
 76    @staticmethod
 77    @overload
 78    def estimateFieldToRobot(
 79        cameraHeightMeters: float,
 80        targetHeightMeters: float,
 81        cameraPitchRadians: float,
 82        targetPitchRadians: float,
 83        targetYaw: Rotation2d,
 84        gyroAngle: Rotation2d,
 85        fieldToTarget: Pose2d,
 86        cameraToRobot: Transform2d,
 87    ):
 88        return PhotonUtils.estimateFieldToRobot(
 89            PhotonUtils.estimateCameraToTarget(
 90                PhotonUtils.estimateCameraToTargetTranslation(
 91                    PhotonUtils.calculateDistanceToTargetMeters(
 92                        cameraHeightMeters,
 93                        targetHeightMeters,
 94                        cameraPitchRadians,
 95                        targetPitchRadians,
 96                    ),
 97                    targetYaw,
 98                ),
 99                fieldToTarget,
100                gyroAngle,
101            ),
102            fieldToTarget,
103            cameraToRobot,
104        )
class PhotonUtils:
 15class PhotonUtils:
 16    def __init__():
 17        pass
 18
 19    @staticmethod
 20    def calculateDistanceToTargetMeters(
 21        cameraHeightMeters: float,
 22        targetHeightMeters: float,
 23        cameraPitchRadians: float,
 24        targetPitchRadians: float,
 25    ) -> float:
 26        return (targetHeightMeters - cameraHeightMeters) / math.tan(
 27            cameraPitchRadians + targetPitchRadians
 28        )
 29
 30    @staticmethod
 31    def estimateCameraToTargetTranslation(targetDistanceMeters: float, yaw: Rotation2d):
 32        return Translation2d(
 33            yaw.cos() * targetDistanceMeters, yaw.sin() * targetDistanceMeters
 34        )
 35
 36    @staticmethod
 37    def estimateCameraToTarget(
 38        cameraToTargetTranslation: Translation2d,
 39        fieldToTarget: Pose2d,
 40        gyroAngle: Rotation2d,
 41    ):
 42        return Transform2d(
 43            cameraToTargetTranslation, gyroAngle * (-1) - fieldToTarget.rotation()
 44        )
 45
 46    @staticmethod
 47    def estimateFieldToCamera(cameraToTarget: Transform2d, fieldToTarget: Pose2d):
 48        targetToCamera = cameraToTarget.inverse()
 49        return fieldToTarget.transformBy(targetToCamera)
 50
 51    @staticmethod
 52    @overload
 53    def estimateFieldToRobot(
 54        cameraToTarget: Transform2d, fieldToTarget: Pose2d, cameraToRobot: Transform2d
 55    ):
 56        return PhotonUtils.estimateFieldToCamera(
 57            cameraToTarget, fieldToTarget
 58        ).transformBy(cameraToRobot)
 59
 60    @staticmethod
 61    def estimateFieldToRobotAprilTag(
 62        cameraToTarget: Transform3d,
 63        fieldRelativeTagPose: Pose3d,
 64        cameraToRobot: Transform3d,
 65    ):
 66        return fieldRelativeTagPose + cameraToTarget.inverse() + cameraToRobot
 67
 68    @staticmethod
 69    def getYawToPose(robotPose: Pose2d, targetPose: Pose2d):
 70        relativeTr1 = targetPose.relativeTo(robotPose).translation()
 71        return Rotation2d(relativeTr1.X(), relativeTr1.Y())
 72
 73    @staticmethod
 74    def getDistanceToPose(robotPose: Pose2d, targetPose: Pose2d):
 75        return robotPose.translation().distance(targetPose.translation())
 76
 77    @staticmethod
 78    @overload
 79    def estimateFieldToRobot(
 80        cameraHeightMeters: float,
 81        targetHeightMeters: float,
 82        cameraPitchRadians: float,
 83        targetPitchRadians: float,
 84        targetYaw: Rotation2d,
 85        gyroAngle: Rotation2d,
 86        fieldToTarget: Pose2d,
 87        cameraToRobot: Transform2d,
 88    ):
 89        return PhotonUtils.estimateFieldToRobot(
 90            PhotonUtils.estimateCameraToTarget(
 91                PhotonUtils.estimateCameraToTargetTranslation(
 92                    PhotonUtils.calculateDistanceToTargetMeters(
 93                        cameraHeightMeters,
 94                        targetHeightMeters,
 95                        cameraPitchRadians,
 96                        targetPitchRadians,
 97                    ),
 98                    targetYaw,
 99                ),
100                fieldToTarget,
101                gyroAngle,
102            ),
103            fieldToTarget,
104            cameraToRobot,
105        )
@staticmethod
def calculateDistanceToTargetMeters( cameraHeightMeters: float, targetHeightMeters: float, cameraPitchRadians: float, targetPitchRadians: float) -> float:
19    @staticmethod
20    def calculateDistanceToTargetMeters(
21        cameraHeightMeters: float,
22        targetHeightMeters: float,
23        cameraPitchRadians: float,
24        targetPitchRadians: float,
25    ) -> float:
26        return (targetHeightMeters - cameraHeightMeters) / math.tan(
27            cameraPitchRadians + targetPitchRadians
28        )
@staticmethod
def estimateCameraToTargetTranslation( targetDistanceMeters: float, yaw: wpimath.geometry._geometry.Rotation2d):
30    @staticmethod
31    def estimateCameraToTargetTranslation(targetDistanceMeters: float, yaw: Rotation2d):
32        return Translation2d(
33            yaw.cos() * targetDistanceMeters, yaw.sin() * targetDistanceMeters
34        )
@staticmethod
def estimateCameraToTarget( cameraToTargetTranslation: wpimath.geometry._geometry.Translation2d, fieldToTarget: wpimath.geometry._geometry.Pose2d, gyroAngle: wpimath.geometry._geometry.Rotation2d):
36    @staticmethod
37    def estimateCameraToTarget(
38        cameraToTargetTranslation: Translation2d,
39        fieldToTarget: Pose2d,
40        gyroAngle: Rotation2d,
41    ):
42        return Transform2d(
43            cameraToTargetTranslation, gyroAngle * (-1) - fieldToTarget.rotation()
44        )
@staticmethod
def estimateFieldToCamera( cameraToTarget: wpimath.geometry._geometry.Transform2d, fieldToTarget: wpimath.geometry._geometry.Pose2d):
46    @staticmethod
47    def estimateFieldToCamera(cameraToTarget: Transform2d, fieldToTarget: Pose2d):
48        targetToCamera = cameraToTarget.inverse()
49        return fieldToTarget.transformBy(targetToCamera)
def estimateFieldToRobot(*args, **kwds):
2639def _overload_dummy(*args, **kwds):
2640    """Helper for @overload to raise when called."""
2641    raise NotImplementedError(
2642        "You should not call an overloaded function. "
2643        "A series of @overload-decorated functions "
2644        "outside a stub module should always be followed "
2645        "by an implementation that is not @overload-ed.")

Helper for @overload to raise when called.

@staticmethod
def estimateFieldToRobotAprilTag( cameraToTarget: wpimath.geometry._geometry.Transform3d, fieldRelativeTagPose: wpimath.geometry._geometry.Pose3d, cameraToRobot: wpimath.geometry._geometry.Transform3d):
60    @staticmethod
61    def estimateFieldToRobotAprilTag(
62        cameraToTarget: Transform3d,
63        fieldRelativeTagPose: Pose3d,
64        cameraToRobot: Transform3d,
65    ):
66        return fieldRelativeTagPose + cameraToTarget.inverse() + cameraToRobot
@staticmethod
def getYawToPose( robotPose: wpimath.geometry._geometry.Pose2d, targetPose: wpimath.geometry._geometry.Pose2d):
68    @staticmethod
69    def getYawToPose(robotPose: Pose2d, targetPose: Pose2d):
70        relativeTr1 = targetPose.relativeTo(robotPose).translation()
71        return Rotation2d(relativeTr1.X(), relativeTr1.Y())
@staticmethod
def getDistanceToPose( robotPose: wpimath.geometry._geometry.Pose2d, targetPose: wpimath.geometry._geometry.Pose2d):
73    @staticmethod
74    def getDistanceToPose(robotPose: Pose2d, targetPose: Pose2d):
75        return robotPose.translation().distance(targetPose.translation())