Files
allwpilib/robotpyExamples/snippets/EventLoop/robot.py
PJ Reiniger dca59147e1 [robotpy][examples] Split examples and snippets (#8944)
This also updates the bazel scripts to behave more like the C++ and Java
examples, and updates the copybara scripts to be able to sync up
`mostrobotpy`
2026-06-03 19:43:16 -07:00

88 lines
2.7 KiB
Python

#!/usr/bin/env python3
#
# Copyright (c) FIRST and other WPILib contributors.
# Open Source Software; you can modify and/or share it under the terms of
# the WPILib BSD license file in the root directory of this project.
#
import wpilib
import wpimath
SHOT_VELOCITY = 200.0 # rpm
TOLERANCE = 8.0 # rpm
class MyRobot(wpilib.TimedRobot):
def __init__(self) -> None:
super().__init__()
self.shooter = wpilib.PWMSparkMax(0)
self.shooterEncoder = wpilib.Encoder(0, 1)
self.controller = wpimath.PIDController(0.3, 0, 0)
self.feedforward = wpimath.SimpleMotorFeedforwardMeters(0.1, 0.065)
self.kicker = wpilib.PWMSparkMax(1)
self.intake = wpilib.PWMSparkMax(2)
self.loop = wpilib.EventLoop()
self.joystick = wpilib.Joystick(0)
# Called once at the beginning of the robot program.
self.controller.setTolerance(TOLERANCE)
isBallAtKickerEvent = wpilib.BooleanEvent(
self.loop, lambda: False
) # self.kickerSensor.getRange() < KICKER_THRESHOLD
intakeButton = wpilib.BooleanEvent(
self.loop, lambda: self.joystick.getRawButton(2)
)
# if the thumb button is held
intakeButton.and_(isBallAtKickerEvent.negate()).ifHigh(
# and there is not a ball at the kicker
# activate the intake
lambda: self.intake.set(0.5)
)
# if the thumb button is not held
intakeButton.negate().or_(isBallAtKickerEvent).ifHigh(
# or there is a ball in the kicker
# stop the intake
self.intake.stopMotor
)
shootTrigger = wpilib.BooleanEvent(self.loop, self.joystick.getTrigger)
# if the trigger is held
shootTrigger.ifHigh(
# accelerate the shooter wheel
lambda: self.shooter.setVoltage(
self.controller.calculate(self.shooterEncoder.getRate(), SHOT_VELOCITY)
+ self.feedforward.calculate(SHOT_VELOCITY)
)
)
# if not, stop
shootTrigger.negate().ifHigh(self.shooter.stopMotor)
atTargetVelocity = wpilib.BooleanEvent(
self.loop, self.controller.atSetpoint
).debounce(
# debounce for more stability
0.2
)
# if we're at the target velocity, kick the ball into the shooter wheel
atTargetVelocity.ifHigh(lambda: self.kicker.set(0.7))
# when we stop being at the target velocity, it means the ball was shot
atTargetVelocity.falling().ifHigh(
# so stop the kicker
self.kicker.stopMotor
)
def robotPeriodic(self) -> None:
# poll all the bindings
self.loop.poll()