Skip to content

Commit ff13cf3

Browse files
authored
Merge pull request #241 from thedropbears/lookup-table-stuff
Set hopper surface speed in ballistics
2 parents 51487eb + 4bdf4b2 commit ff13cf3

3 files changed

Lines changed: 37 additions & 14 deletions

File tree

components/ballistics.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from wpimath.kinematics import ChassisSpeeds
1010

1111
from components.chassis import ChassisComponent
12+
from components.hopper import HopperComponent
1213
from components.leds import LEDComponent
1314
from components.shooter import ShooterComponent
1415
from components.turret import TurretComponent
@@ -28,7 +29,9 @@
2829
TIME_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)

components/hopper.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from math import pi, tau
22

3-
from magicbot import feedback, tunable, will_reset_to
3+
from magicbot import feedback, will_reset_to
44
from phoenix6.configs import (
55
FeedbackConfigs,
66
MotorOutputConfigs,
@@ -19,7 +19,7 @@
1919
class HopperComponent:
2020
leds: LEDComponent
2121

22-
desired_hopper_surface_speed = tunable(12.0) # meters / sec
22+
desired_surface_speed: units.meters_per_second = 12.0
2323

2424
INJECTOR_WHEEL_DIAMETER: units.meters = 0.05
2525
INDEXER_WHEEL_DIAMETER: units.meters = 0.137
@@ -79,6 +79,9 @@ def __init__(self) -> None:
7979
.with_slot0(injector_gains_config)
8080
)
8181

82+
def set_desired_surface_speed(self, desired_speed: units.meters_per_second) -> None:
83+
self.desired_surface_speed = desired_speed
84+
8285
@feedback
8386
def get_target_indexer_rps(self) -> float:
8487
return self.target_indexer_rps
@@ -111,10 +114,10 @@ def is_jammed(self) -> bool:
111114

112115
def feed(self) -> None:
113116

114-
self.target_indexer_rps = self.desired_hopper_surface_speed / (
117+
self.target_indexer_rps = self.desired_surface_speed / (
115118
pi * self.INDEXER_WHEEL_DIAMETER
116119
)
117-
self.target_injector_rps = self.desired_hopper_surface_speed / (
120+
self.target_injector_rps = self.desired_surface_speed / (
118121
pi * self.INJECTOR_WHEEL_DIAMETER
119122
)
120123

robot.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class MyRobot(magicbot.MagicRobot):
5454
test_flywheel_speed = tunable(0.0) # rotations/s
5555
test_turret_angle = tunable(0.0) # degrees
5656
test_hood_angle = tunable(45.0) # degrees
57+
test_hopper_surface_speed = tunable(12.0) # metres/s
5758

5859
START_POS_TOLERANCE = 0.2
5960

@@ -262,12 +263,16 @@ def testPeriodic(self) -> None:
262263
self.chassis.execute()
263264
self.targeter.execute()
264265

265-
if self.gamepad.getRightTriggerAxis() > 0.5:
266-
self.ballistics.force_solution(
267-
self.test_flywheel_speed,
268-
math.radians(self.test_turret_angle),
269-
math.radians(self.test_hood_angle),
270-
)
266+
if self.gamepad.getRightTriggerAxis() > 0.5 or self.gamepad.getXButton():
267+
if self.gamepad.getRightTriggerAxis() > 0.5:
268+
self.ballistics.solve_for(self.targeter.get_target())
269+
else:
270+
self.ballistics.force_solution(
271+
self.test_flywheel_speed,
272+
math.radians(self.test_turret_angle),
273+
math.radians(self.test_hood_angle),
274+
self.test_hopper_surface_speed,
275+
)
271276

272277
self.ballistics.energise_flywheels()
273278
self.ballistics.execute()

0 commit comments

Comments
 (0)