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):
@staticmethod
def
estimateCameraToTarget( cameraToTargetTranslation: wpimath.geometry._geometry.Translation2d, fieldToTarget: wpimath.geometry._geometry.Pose2d, gyroAngle: wpimath.geometry._geometry.Rotation2d):
@staticmethod
def
estimateFieldToCamera( cameraToTarget: wpimath.geometry._geometry.Transform2d, fieldToTarget: wpimath.geometry._geometry.Pose2d):
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):