Added shooter syubsystem

This commit is contained in:
2025-11-01 12:03:04 -05:00
parent 846a0cccf3
commit 06e493aa2d

View File

@@ -0,0 +1,183 @@
package org.firstinspires.ftc.teamcode.subsystems;
import com.acmerobotics.dashboard.telemetry.MultipleTelemetry;
import com.arcrobotics.ftclib.controller.PIDController;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.DcMotorEx;
import com.qualcomm.robotcore.hardware.PIDCoefficients;
import com.qualcomm.robotcore.hardware.PIDFCoefficients;
import com.qualcomm.robotcore.hardware.Servo;
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
import org.firstinspires.ftc.robotcore.external.navigation.CurrentUnit;
import org.firstinspires.ftc.teamcode.utils.Robot;
import org.firstinspires.ftc.teamcode.subsystems.Subsystem;
import java.util.Objects;
public class Shooter implements Subsystem {
private final DcMotorEx fly1;
private final DcMotorEx fly2;
private final Servo hoodServo;
private final MultipleTelemetry telemetry;
private boolean telemetryOn = false;
private double manualPower = 0.0;
private double servoPos = 0.0;
private double velocity = 0.0;
private double posPower = 0.0;
private int targetPosition = 0;
private double p = 0.0003, i = 0, d = 0.00001;
private PIDController controller;
private String Mode = "MANUAL";
public Shooter(Robot robot, MultipleTelemetry TELE) {
this.fly1 = robot.shooter1;
this.fly2 = robot.shooter2;
this.telemetry = TELE;
this.hoodServo = robot.hood;
// Reset encoders
fly1.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
fly2.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
fly1.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
fly1.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
controller = new PIDController(p, i, d);
controller.setPID(p, i, d);
}
public void telemetryUpdate() {
// Telemetry
telemetry.addData("Mode", Mode);
telemetry.addData("ManualPower", manualPower);
telemetry.addData("Position", getPosition());
telemetry.addData("TargetPosition", targetPosition);
telemetry.addData("Velocity", getVelocity());
telemetry.addData("TargetVelocity", velocity);
telemetry.addData("ServoPos", getServoPosition());
telemetry.addData("PID Coefficients", "P: %.6f, I: %.6f, D: %.6f", p, i, d);
telemetry.addData("Current Fly 1", fly1.getCurrent(CurrentUnit.AMPS));
telemetry.addData("Current Fly 2", fly2.getCurrent(CurrentUnit.AMPS));
}
public double getServoPosition() {
return (hoodServo.getPosition());
}
public void setServoPosition(double pos) {servoPos = pos;}
public double getVelocity() {
return ((double) ((fly1.getVelocity(AngleUnit.DEGREES) + fly2.getVelocity(AngleUnit.DEGREES)) /2));
}
public void setVelocity(double vel){velocity = vel;}
public void setPosPower(double power){posPower = power;}
public void setTargetPosition(int pos){
targetPosition = pos;
}
public void setTolerance(int tolerance){
controller.setTolerance(tolerance);
}
public void setControllerCoefficients(double kp, double ki, double kd){
p = kp;
i = ki;
d = kd;
controller.setPID(p, i, d);
}
public PIDCoefficients getControllerCoefficients(){
return new PIDCoefficients(p, i, d);
}
public void setManualPower(double power){manualPower = power;}
public String getMode(){return Mode;}
public double getPosition(){
return ((double) ((fly1.getCurrentPosition() + fly2.getCurrentPosition()) /2));
}
public void setMode(String mode){ Mode = mode;}
public void setTelemetryOn(boolean state){telemetryOn = state;}
@Override
public void update() {
if (Objects.equals(Mode, "MANUAL")){
fly1.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
fly2.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
fly1.setPower(manualPower);
fly2.setPower(manualPower);
}
else if (Objects.equals(Mode, "VEL")){
fly1.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
fly2.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
fly1.setVelocity(velocity, AngleUnit.DEGREES);
fly2.setVelocity(velocity, AngleUnit.DEGREES);
}
else if (Objects.equals(Mode, "POS")){
double powPID = controller.calculate(getPosition(), targetPosition);
fly1.setPower(powPID);
fly2.setPower(powPID);
}
hoodServo.setPosition(servoPos);
if (telemetryOn) {telemetryUpdate();}
}
}