99from wpimath .kinematics import ChassisSpeeds
1010
1111from components .chassis import ChassisComponent
12+ from components .hopper import HopperComponent
1213from components .leds import LEDComponent
1314from components .shooter import ShooterComponent
1415from components .turret import TurretComponent
2829TIME_LOOKUP_PASS = np .array ([1.139 , 1.293 , 1.376 , 1.431 ], dtype = float )
2930# fmt: on
3031
31- type ForcedSolution = tuple [units .turns_per_second , units .radians , units .radians ]
32+ type ForcedSolution = tuple [
33+ units .turns_per_second , units .radians , units .radians , units .meters_per_second
34+ ]
3235
3336
3437@dataclass
@@ -47,6 +50,7 @@ class LookupTable:
4750 The flight time for a "pass shot" should be once its hit the ground
4851 """
4952 hood_angle : units .radians
53+ hopper_surface_speed : units .meters_per_second
5054 name : str
5155
5256 def is_within_range (self , distance : units .meters ) -> bool :
@@ -64,6 +68,7 @@ class BallisticsComponent:
6468 shooter : ShooterComponent
6569 turret : TurretComponent
6670 leds : LEDComponent
71+ hopper : HopperComponent
6772
6873 forced_solution = will_reset_to [ForcedSolution | None ](None )
6974 should_energise_flywheels = will_reset_to (False )
@@ -83,20 +88,23 @@ def __init__(self) -> None:
8388 SPEED_LOOKUP_25 ,
8489 TIME_LOOKUP_25 ,
8590 math .radians (25 ),
91+ 10 ,
8692 "Score Table 25" ,
8793 ),
8894 LookupTable (
8995 DISTANCE_LOOKUP_45 ,
9096 SPEED_LOOKUP_45 ,
9197 TIME_LOOKUP_45 ,
9298 math .radians (45 ),
99+ 12 ,
93100 "Score Table 45" ,
94101 ),
95102 LookupTable (
96103 DISTANCE_LOOKUP_PASS ,
97104 SPEED_LOOKUP_PASS ,
98105 TIME_LOOKUP_PASS ,
99106 math .radians (54 ),
107+ 12 ,
100108 "Pass Table" ,
101109 ),
102110 )
@@ -121,11 +129,13 @@ def force_solution(
121129 desired_flywheel_speed : units .turns_per_second ,
122130 desired_turret_bearing : units .radians ,
123131 desired_hood_angle : units .radians ,
132+ desired_hopper_surface_speed : units .meters_per_second ,
124133 ) -> None :
125134 self .forced_solution = (
126135 desired_flywheel_speed ,
127136 desired_turret_bearing ,
128137 desired_hood_angle ,
138+ desired_hopper_surface_speed ,
129139 )
130140
131141 def solve_moving_shot (self , current_pose : Pose2d , current_velocity : ChassisSpeeds ):
@@ -194,11 +204,15 @@ def execute(self) -> None:
194204 target_flywheel_speed : units .turns_per_second = self .active_table .speed_for (
195205 distance_to_target
196206 )
207+ target_hopper_surface_speed = self .active_table .hopper_surface_speed
197208
198209 else :
199- target_flywheel_speed , target_turret_angle , target_hood_angle = (
200- self .forced_solution
201- )
210+ (
211+ target_flywheel_speed ,
212+ target_turret_angle ,
213+ target_hood_angle ,
214+ target_hopper_surface_speed ,
215+ ) = self .forced_solution
202216
203217 if self .should_energise_flywheels :
204218 self .shooter .set_flywheel (target_flywheel_speed )
@@ -212,3 +226,4 @@ def execute(self) -> None:
212226
213227 if self .is_driving_faster_than_max_shoot_speed ():
214228 self .leds .driving_faster_than_shoot_speed ()
229+ self .hopper .set_desired_surface_speed (target_hopper_surface_speed )
0 commit comments