From a810199c520c16826ec2282634511a6441d61007 Mon Sep 17 00:00:00 2001 From: gatorgrad96 Date: Wed, 28 Jan 2026 10:07:47 -0500 Subject: [PATCH] Red Auto Front Added the red auto (untested) Removed the unused autos --- .../firstinspires/ftc/teamcode/AutoMain.java | 20 +- .../ftc/teamcode/LimeLightAutoBlue.java | 7 +- .../ftc/teamcode/LimeLightAutoBlueTEST.java | 2 +- .../ftc/teamcode/LimeLightAutoRed.java | 317 +++++++++++++++++ .../ftc/teamcode/MecanumDrive.java | 321 +++++++++--------- .../ftc/teamcode/OTOSLocalizer.java | 20 +- .../ftc/teamcode/PinpointLocalizer.java | 23 +- .../ftc/teamcode/QuickAutoBlue.java | 2 +- .../ftc/teamcode/QuickAutoForward.java | 2 +- .../ftc/teamcode/QuickAutoRed.java | 2 +- .../firstinspires/ftc/teamcode/TankDrive.java | 303 ++++++++--------- .../ftc/teamcode/TeleOpMain.java | 8 +- .../ftc/teamcode/ThreeDeadWheelLocalizer.java | 54 ++- .../ftc/teamcode/TwoDeadWheelLocalizer.java | 65 ++-- .../ftc/teamcode/tuning/LocalizationTest.java | 23 +- .../teamcode/tuning/ManualFeedbackTuner.java | 16 +- .../ftc/teamcode/tuning/SplineTest.java | 16 +- .../ftc/teamcode/tuning/TuningOpModes.java | 160 ++++----- 18 files changed, 834 insertions(+), 527 deletions(-) create mode 100644 TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoRed.java diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/AutoMain.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/AutoMain.java index 7bc1c93..3dd1698 100644 --- a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/AutoMain.java +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/AutoMain.java @@ -26,22 +26,14 @@ import org.firstinspires.ftc.teamcode.Utils_13233.CommonAutoMethods; import org.firstinspires.ftc.teamcode.Utils_13233.MotorConstructor; -@Autonomous(name = "AutoMain", group = "Auto") +//@Autonomous(name = "AutoMain", group = "Auto") public class AutoMain extends LinearOpMode { + // Global Variables to store Game Specific Information + AutoMode autoMode = AutoMode.AUTO_MODE_NOT_SELECTED; // store autonomous mode selected private AutoDrive drive; private AutoTurn turn; private CommonAutoMethods autoMethods; - // Possible Autonomous Modes - public enum AutoMode { - AUTO_MODE_NOT_SELECTED, - AUTO_MODE_DEFAULT, - } - - // Global Variables to store Game Specific Information - AutoMode autoMode = AutoMode.AUTO_MODE_NOT_SELECTED; // store autonomous mode selected - - // OpMode for autonomous code @Override public void runOpMode() throws InterruptedException { @@ -119,4 +111,10 @@ public void runOpMode() throws InterruptedException { private void defaultAuto() { drive.driveForward(10.0, AutoConstants.quarterPower); } + + // Possible Autonomous Modes + public enum AutoMode { + AUTO_MODE_NOT_SELECTED, + AUTO_MODE_DEFAULT, + } } diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoBlue.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoBlue.java index aa66945..327032e 100644 --- a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoBlue.java +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoBlue.java @@ -18,7 +18,7 @@ import java.util.List; -@Autonomous(name = "LimeLightAutoBlue", group = "Auto") +//@Autonomous(name = "LimeLightAutoBlue", group = "Auto") public class LimeLightAutoBlue extends LinearOpMode { @@ -207,7 +207,8 @@ public void runOpMode() { break; } - }switch (limelightCont.getTagID()) { + } + switch (limelightCont.getTagID()) { case 23: //runs PPG telemetry.addLine("AUTO: Purple Purple Green"); @@ -254,6 +255,6 @@ public void runOpMode() { sleep(1000); drive.setDrivePower(1.0f);//strafes over to balls, ensuring ally has space to shoot, and moves off line sleep(1000); + } } } -} diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoBlueTEST.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoBlueTEST.java index 0b48764..ae0e13c 100644 --- a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoBlueTEST.java +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoBlueTEST.java @@ -17,7 +17,7 @@ import org.firstinspires.ftc.teamcode.Utils_13233.MotorConstructor; import org.firstinspires.ftc.teamcode.Utils_13233.SorterControls; -@Autonomous(name = "LimeLightBlueTEST ", group = "Auto") +@Autonomous(name = "LimeLightBlue", group = "Auto") public class LimeLightAutoBlueTEST extends LinearOpMode { // ================= HARDWARE ================= diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoRed.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoRed.java new file mode 100644 index 0000000..c688960 --- /dev/null +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/LimeLightAutoRed.java @@ -0,0 +1,317 @@ +package org.firstinspires.ftc.teamcode; + +import com.qualcomm.robotcore.eventloop.opmode.Autonomous; +import com.qualcomm.robotcore.eventloop.opmode.Disabled; +import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; +import com.qualcomm.hardware.limelightvision.Limelight3A; +import com.qualcomm.hardware.limelightvision.LLResult; +import com.qualcomm.hardware.limelightvision.LLResultTypes.FiducialResult; +import com.qualcomm.robotcore.eventloop.opmode.Autonomous; +import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; +import com.qualcomm.robotcore.hardware.Servo; + + +import org.firstinspires.ftc.teamcode.Utils_13233.DriveControls; +import org.firstinspires.ftc.teamcode.Utils_13233.LaunchControls; +import org.firstinspires.ftc.teamcode.Utils_13233.LimelightControls; +import org.firstinspires.ftc.teamcode.Utils_13233.MotorConstructor; +import org.firstinspires.ftc.teamcode.Utils_13233.SorterControls; + +@Autonomous(name = "LimeLightRed", group = "Auto") +public class LimeLightAutoRed extends LinearOpMode { + + // ================= HARDWARE ================= + + private DriveControls drive; + private LaunchControls launch; + private SorterControls sorter; + private MotorConstructor motors; + private LimelightControls limelightCont; + + @Override + public void runOpMode() { + + //INIT + drive = new DriveControls(hardwareMap); + launch = new LaunchControls(hardwareMap); + motors = new MotorConstructor(hardwareMap); + limelightCont = new LimelightControls(hardwareMap); + sorter = new SorterControls(motors); + telemetry.addLine("Initialized. Waiting for start..."); + telemetry.update(); + + waitForStart(); + + if (isStopRequested()) return; + + // - PHASE 1: MOVE TO SEE TAG +// preMove(); + drive.setDrivePower(0, 1.0f, 0, 0);//strafes over to launch + sleep(1400); + + int tagID = scanTag(); + + drive.setDrivePower(0.0f, 0.0f, 1.0f, 0.0f); + sleep(550); + + drive.setDrivePower(0.0f); + + // - PHASE 2: DETECT TAG + + telemetry.addData("ID", limelightCont.getTagID()); + telemetry.update(); + sleep(500); + + // PHASE 3: RUN AUTO + runAuto(tagID); + + // END + requestOpModeStop(); + } + + // ========================================================== + // ===================== PHASE METHODS ====================== + // ========================================================== + +// private void preMove() { +// } + + private int scanTag() { + int tagID = -1; + long startTime = System.currentTimeMillis(); + + while (opModeIsActive() + && tagID == -1 + && System.currentTimeMillis() - startTime < 2000) { + + tagID = limelightCont.getTagID(); + + telemetry.addData("Scanning Tag", tagID); + telemetry.update(); + } + + return tagID; + } + + private void runAuto(int tagID) { + + switch (tagID) { + + case 21: + telemetry.addLine("AUTO: Green Purple Purple"); + telemetry.update(); + auto21(); + break; + + case 22: + telemetry.addLine("AUTO: Purple Green Purple"); + telemetry.update(); + auto22(); + break; + + case 23: + telemetry.addLine("AUTO: Purple Purple Green"); + telemetry.update(); + auto23(); + break; + + default: + telemetry.addLine("AUTO: DEFAULT (NO TAG)"); + telemetry.update(); + auto24(); + break; + } + } + + // ========================================================== + // ===================== AUTO PATHS ========================= + // ========================================================== + + private void auto21() { + //runs GPP + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 1); + //sets position to ensure the ball is correctly lined up + launch.setLaunchPower(true, 0.8f); + + sleep(2500);//wait state to wait for launcher to spin up + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 1st ball + motors.Flipper.setPosition(0.0); + sleep(1000);//runs flipper servo into motor + motors.Flipper.setDirection(Servo.Direction.REVERSE); + motors.Flipper.setPosition(0.15); + sleep(2000); + + //2nd ball code + sleep(750);//waits to spin turntable + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 2); + sleep(1500);//waits while turntable spins + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 2nd ball + motors.Flipper.setPosition(0.0); + sleep(1000); + motors.Flipper.setDirection(Servo.Direction.REVERSE); + motors.Flipper.setPosition(0.15);//brings servo back up to avoid turn table collision + sleep(2000); + + //3rd ball code + sleep(1000); + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 3); + sleep(1000);//turns off ramp + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 3rd ball + motors.Flipper.setPosition(0.0); + sleep(1000);// sets servo back to init pos + motors.Flipper.setDirection(Servo.Direction.REVERSE);//runs servo forward, shooting 1st ball + motors.Flipper.setPosition(0.15); + sleep(1000); + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 1);//brings sorter back to init + launch.setLaunchPower(false);//turns off launcher and ramp + + //strafing section + drive.setDrivePower(0, -1.0f, 0, 0); + sleep(1000); + drive.setDrivePower(1.0f);//strafes over to balls, ensuring ally has space to shoot, and moves off line + sleep(1000); + //id 21 + } + + private void auto22() { + //runs PGP + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 2); + //sets position to ensure the ball is correctly lined up + launch.setLaunchPower(true, 0.9f); + + sleep(2500);//wait state to wait for launcher to spin up + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 1st ball + motors.Flipper.setPosition(0.0); + sleep(1000);//runs flipper servo into motor + motors.Flipper.setDirection(Servo.Direction.REVERSE); + motors.Flipper.setPosition(0.15); + sleep(2000); + + //2nd ball code + sleep(750);//waits to spin turntable + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 1); + sleep(1500);//waits while turntable spins + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 2nd ball + motors.Flipper.setPosition(0.0); + sleep(1000); + motors.Flipper.setDirection(Servo.Direction.REVERSE); + motors.Flipper.setPosition(0.15);//brings servo back up to avoid turn table collision + sleep(2000); + + //3rd ball code + sleep(1000); + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 3); + sleep(1000);//turns off ramp + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 3rd ball + motors.Flipper.setPosition(0.0); + sleep(1000);// sets servo back to init pos + motors.Flipper.setDirection(Servo.Direction.REVERSE);//runs servo forward, shooting 1st ball + motors.Flipper.setPosition(0.15); + sleep(1000); + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 1);//brings sorter back to init + launch.setLaunchPower(false);//turns off launcher and ramp + + //strafing section + drive.setDrivePower(0, -1.0f, 0, 0); + sleep(1000); + drive.setDrivePower(1.0f);//strafes over to balls, ensuring ally has space to shoot, and moves off line + sleep(1000); + } + + private void auto23() { + //runs PPG + + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 2); + //sets position to ensure the ball is correctly lined up + launch.setLaunchPower(true, 0.9f); + + sleep(2500);//wait state to wait for launcher to spin up + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 1st ball + motors.Flipper.setPosition(0.0); + sleep(1000);//runs flipper servo into motor + motors.Flipper.setDirection(Servo.Direction.REVERSE); + motors.Flipper.setPosition(0.15); + sleep(2000); + + //2nd ball code + sleep(750);//waits to spin turntable + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 3); + sleep(1500);//waits while turntable spins + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 2nd ball + motors.Flipper.setPosition(0.0); + sleep(1000); + motors.Flipper.setDirection(Servo.Direction.REVERSE); + motors.Flipper.setPosition(0.15);//brings servo back up to avoid turn table collision + sleep(2000); + + //3rd ball code + sleep(1000); + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 1); + sleep(1000);//turns off ramp + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 3rd ball + motors.Flipper.setPosition(0.0); + sleep(1000);// sets servo back to init pos + motors.Flipper.setDirection(Servo.Direction.REVERSE);//runs servo forward, shooting 1st ball + motors.Flipper.setPosition(0.15); + sleep(1000); + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 1);//brings sorter back to init + launch.setLaunchPower(false);//turns off launcher and ramp + + //strafing section + drive.setDrivePower(0, -1.0f, 0, 0); + sleep(1000); + drive.setDrivePower(1.0f);//strafes over to balls, ensuring ally has space to shoot, and moves off line + sleep(1000); + + } + + + private void auto24() { + //runs default (PPG) + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 2); + //sets position to ensure the ball is correctly lined up + launch.setLaunchPower(true, 0.9f); + + sleep(2500);//wait state to wait for launcher to spin up + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 1st ball + motors.Flipper.setPosition(0.0); + sleep(1000);//runs flipper servo into motor + motors.Flipper.setDirection(Servo.Direction.REVERSE); + motors.Flipper.setPosition(0.15); + sleep(2000); + + //2nd ball code + sleep(750);//waits to spin turntable + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 3); + sleep(1500);//waits while turntable spins + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 2nd ball + motors.Flipper.setPosition(0.0); + sleep(1000); + motors.Flipper.setDirection(Servo.Direction.REVERSE); + motors.Flipper.setPosition(0.15);//brings servo back up to avoid turn table collision + sleep(2000); + + //3rd ball code + sleep(1000); + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 1); + sleep(1000);//turns off ramp + motors.Flipper.setDirection(Servo.Direction.FORWARD);//runs servo forward, shooting 3rd ball + motors.Flipper.setPosition(0.0); + sleep(1000);// sets servo back to init pos + motors.Flipper.setDirection(Servo.Direction.REVERSE);//runs servo forward, shooting 1st ball + motors.Flipper.setPosition(0.15); + sleep(1000); + sorter.moveSorterToPos(SorterControls.sorterModes.LAUNCH, 1);//brings sorter back to init + launch.setLaunchPower(false);//turns off launcher and ramp + + //strafing section + drive.setDrivePower(0, -1.0f, 0, 0); + sleep(1000); + drive.setDrivePower(1.0f);//strafes over to balls, ensuring ally has space to shoot, and moves off line + sleep(1000); + } + + +} + + diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/MecanumDrive.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/MecanumDrive.java index e1f5556..c57b0f0 100644 --- a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/MecanumDrive.java +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/MecanumDrive.java @@ -32,6 +32,7 @@ import com.acmerobotics.roadrunner.ftc.RawEncoder; import com.qualcomm.hardware.lynx.LynxModule; import com.qualcomm.hardware.rev.RevHubOrientationOnRobot; +import com.qualcomm.robotcore.eventloop.opmode.Disabled; import com.qualcomm.robotcore.hardware.DcMotor; import com.qualcomm.robotcore.hardware.DcMotorEx; import com.qualcomm.robotcore.hardware.HardwareMap; @@ -50,16 +51,134 @@ import java.util.LinkedList; import java.util.List; +@Disabled @Config public final class MecanumDrive { + public static Params PARAMS = new Params(); + public final MecanumKinematics kinematics = new MecanumKinematics( + PARAMS.inPerTick * PARAMS.trackWidthTicks, PARAMS.inPerTick / PARAMS.lateralInPerTick); + public final TurnConstraints defaultTurnConstraints = new TurnConstraints( + PARAMS.maxAngVel, -PARAMS.maxAngAccel, PARAMS.maxAngAccel); + public final VelConstraint defaultVelConstraint = + new MinVelConstraint(Arrays.asList( + kinematics.new WheelVelConstraint(PARAMS.maxWheelVel), + new AngularVelConstraint(PARAMS.maxAngVel) + )); + public final AccelConstraint defaultAccelConstraint = + new ProfileAccelConstraint(PARAMS.minProfileAccel, PARAMS.maxProfileAccel); + public final DcMotorEx leftFront, leftBack, rightBack, rightFront; + public final VoltageSensor voltageSensor; + public final LazyImu lazyImu; + public final Localizer localizer; + private final LinkedList poseHistory = new LinkedList<>(); + private final DownsampledWriter estimatedPoseWriter = new DownsampledWriter("ESTIMATED_POSE", 50_000_000); + private final DownsampledWriter targetPoseWriter = new DownsampledWriter("TARGET_POSE", 50_000_000); + private final DownsampledWriter driveCommandWriter = new DownsampledWriter("DRIVE_COMMAND", 50_000_000); + private final DownsampledWriter mecanumCommandWriter = new DownsampledWriter("MECANUM_COMMAND", 50_000_000); + public MecanumDrive(HardwareMap hardwareMap, Pose2d pose) { + LynxFirmware.throwIfModulesAreOutdated(hardwareMap); + + for (LynxModule module : hardwareMap.getAll(LynxModule.class)) { + module.setBulkCachingMode(LynxModule.BulkCachingMode.AUTO); + } + + // TODO: make sure your config has motors with these names (or change them) + // see https://ftc-docs.firstinspires.org/en/latest/hardware_and_software_configuration/configuring/index.html + leftFront = hardwareMap.get(DcMotorEx.class, "leftFront"); + leftBack = hardwareMap.get(DcMotorEx.class, "leftBack"); + rightBack = hardwareMap.get(DcMotorEx.class, "rightBack"); + rightFront = hardwareMap.get(DcMotorEx.class, "rightFront"); + + leftFront.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE); + leftBack.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE); + rightBack.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE); + rightFront.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE); + + // TODO: reverse motor directions if needed + // leftFront.setDirection(DcMotorSimple.Direction.REVERSE); + + // TODO: make sure your config has an IMU with this name (can be BNO or BHI) + // see https://ftc-docs.firstinspires.org/en/latest/hardware_and_software_configuration/configuring/index.html + lazyImu = new LazyHardwareMapImu(hardwareMap, "imu", new RevHubOrientationOnRobot( + PARAMS.logoFacingDirection, PARAMS.usbFacingDirection)); + + voltageSensor = hardwareMap.voltageSensor.iterator().next(); + + localizer = new DriveLocalizer(pose); + + FlightRecorder.write("MECANUM_PARAMS", PARAMS); + } + + public void setDrivePowers(PoseVelocity2d powers) { + MecanumKinematics.WheelVelocities