Compare commits
7 Commits
e1745500cc
...
daccec4fdd
| Author | SHA1 | Date | |
|---|---|---|---|
| daccec4fdd | |||
| 33300876ef | |||
| 0dbf155608 | |||
| 313eeeaa95 | |||
| b28647373a | |||
| 7e7254aaea | |||
| e7dfa11196 |
@@ -710,7 +710,7 @@ public class ProtoAutoClose_V3 extends LinearOpMode {
|
||||
bearing = result.getTx();
|
||||
}
|
||||
}
|
||||
double turretPos = robot.turr1Pos.getCurrentPosition() - (bearing / 1300);
|
||||
double turretPos = (bearing / 1300);
|
||||
robot.turr1.setPosition(turretPos);
|
||||
robot.turr2.setPosition(1 - turretPos);
|
||||
}
|
||||
|
||||
@@ -42,4 +42,8 @@ public class ServoPositions {
|
||||
public static double turret_detectBlueClose = 0.6;
|
||||
public static double turrDefault = 0.4;
|
||||
|
||||
public static double turrMin = 0.2;
|
||||
public static double turrMax = 0.8;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import org.firstinspires.ftc.teamcode.utils.Flywheel;
|
||||
import org.firstinspires.ftc.teamcode.utils.Robot;
|
||||
import org.firstinspires.ftc.teamcode.utils.Servos;
|
||||
import org.firstinspires.ftc.teamcode.utils.Spindexer;
|
||||
import org.firstinspires.ftc.teamcode.utils.Targeting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -53,6 +54,8 @@ public class TeleopV3 extends LinearOpMode {
|
||||
public static boolean manualTurret = true;
|
||||
public double vel = 3000;
|
||||
public boolean autoVel = true;
|
||||
public boolean targetingVel = true;
|
||||
public boolean targetingHood = true;
|
||||
public double manualOffset = 0.0;
|
||||
public boolean autoHood = true;
|
||||
public boolean green1 = false;
|
||||
@@ -72,6 +75,8 @@ public class TeleopV3 extends LinearOpMode {
|
||||
Flywheel flywheel;
|
||||
MecanumDrive drive;
|
||||
Spindexer spindexer;
|
||||
Targeting targeting;
|
||||
Targeting.Settings targetingSettings;
|
||||
double autoHoodOffset = 0.0;
|
||||
|
||||
int shooterTicker = 0;
|
||||
@@ -146,18 +151,20 @@ public class TeleopV3 extends LinearOpMode {
|
||||
flywheel = new Flywheel(hardwareMap);
|
||||
drive = new MecanumDrive(hardwareMap, teleStart);
|
||||
spindexer = new Spindexer(hardwareMap);
|
||||
targeting = new Targeting();
|
||||
targetingSettings = new Targeting.Settings(0.0,0.0);
|
||||
|
||||
PIDFController tController = new PIDFController(tp, ti, td, tf);
|
||||
|
||||
tController.setTolerance(0.001);
|
||||
//
|
||||
// if (redAlliance) {
|
||||
// robot.limelight.pipelineSwitch(3);
|
||||
// } else {
|
||||
// robot.limelight.pipelineSwitch(2);
|
||||
// }
|
||||
|
||||
if (redAlliance) {
|
||||
robot.limelight.pipelineSwitch(3);
|
||||
} else {
|
||||
robot.limelight.pipelineSwitch(2);
|
||||
}
|
||||
|
||||
robot.limelight.start();
|
||||
// robot.limelight.start();
|
||||
|
||||
waitForStart();
|
||||
if (isStopRequested()) return;
|
||||
@@ -402,13 +409,14 @@ public class TeleopV3 extends LinearOpMode {
|
||||
pos = 0.83;
|
||||
}
|
||||
|
||||
//SHOOTER:
|
||||
|
||||
flywheel.manageFlywheel(vel);
|
||||
targetingSettings = targeting.calculateSettings
|
||||
(robotX,robotY,robotHeading,0.0);
|
||||
|
||||
//VELOCITY AUTOMATIC
|
||||
|
||||
if (autoVel) {
|
||||
if (targetingVel) {
|
||||
vel = targetingSettings.flywheelRPM;
|
||||
} else if (autoVel) {
|
||||
vel = velPrediction(distanceToGoal);
|
||||
} else {
|
||||
vel = manualVel;
|
||||
@@ -430,32 +438,35 @@ public class TeleopV3 extends LinearOpMode {
|
||||
manualVel = 3100;
|
||||
}
|
||||
|
||||
//SHOOTER:
|
||||
flywheel.manageFlywheel(vel);
|
||||
|
||||
//TODO: test the camera teleop code
|
||||
|
||||
TELE.addData("posS2", pos);
|
||||
|
||||
if (y < 0.3 && y > -0.3 && x < 0.3 && x > -0.3 && rx < 0.3 && rx > -0.3) { //not moving
|
||||
double bearing;
|
||||
|
||||
LLResult result = robot.limelight.getLatestResult();
|
||||
if (result != null) {
|
||||
if (result.isValid()) {
|
||||
bearing = result.getTx() * bMult;
|
||||
|
||||
double bearingCorrection = bearing / bDiv;
|
||||
|
||||
error += bearingCorrection;
|
||||
|
||||
camTicker++;
|
||||
TELE.addData("tx", bearingCorrection);
|
||||
TELE.addData("ty", result.getTy());
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
camTicker = 0;
|
||||
overrideTurr = false;
|
||||
}
|
||||
// if (y < 0.3 && y > -0.3 && x < 0.3 && x > -0.3 && rx < 0.3 && rx > -0.3) { //not moving
|
||||
// double bearing;
|
||||
//
|
||||
// LLResult result = robot.light.getLatestResult();
|
||||
// if (result != null) {
|
||||
// if (result.isValid()) {
|
||||
// bearing = result.getTx() * bMult;
|
||||
//
|
||||
// double bearingCorrection = bearing / bDiv;
|
||||
//
|
||||
// error += bearingCorrection;
|
||||
//
|
||||
// camTicker++;
|
||||
// TELE.addData("tx", bearingCorrection);
|
||||
// TELE.addData("ty", result.getTy());
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// } else {
|
||||
// camTicker = 0;
|
||||
// overrideTurr = false;
|
||||
// }
|
||||
|
||||
if (!overrideTurr) {
|
||||
turretPos = pos;
|
||||
@@ -480,7 +491,9 @@ public class TeleopV3 extends LinearOpMode {
|
||||
|
||||
//HOOD:
|
||||
|
||||
if (autoHood) {
|
||||
if (targetingHood) {
|
||||
robot.hood.setPosition(targetingSettings.hoodAngle);
|
||||
} else if (autoHood) {
|
||||
robot.hood.setPosition(0.15 + hoodOffset);
|
||||
} else {
|
||||
robot.hood.setPosition(hoodDefaultPos + hoodOffset);
|
||||
@@ -845,16 +858,27 @@ public class TeleopV3 extends LinearOpMode {
|
||||
TELE.addData("shootOrder", shootOrder);
|
||||
TELE.addData("oddColor", oddBallColor);
|
||||
|
||||
// Spindexer Debug
|
||||
TELE.addData("spinEqual", servo.spinEqual(spindexer_intakePos1));
|
||||
TELE.addData("spinCommmandedPos", spindexer.commandedIntakePosition);
|
||||
TELE.addData("spinIntakeState", spindexer.currentIntakeState);
|
||||
TELE.addData("spinTestCounter", spindexer.counter);
|
||||
TELE.addData("autoSpintake", autoSpintake);
|
||||
TELE.addData("distanceRearCenter", spindexer.distanceRearCenter);
|
||||
TELE.addData("distanceFrontDriver", spindexer.distanceFrontDriver);
|
||||
TELE.addData("distanceFrontPassenger", spindexer.distanceFrontPassenger);
|
||||
//TELE.addData("distanceRearCenter", spindexer.distanceRearCenter);
|
||||
//TELE.addData("distanceFrontDriver", spindexer.distanceFrontDriver);
|
||||
//TELE.addData("distanceFrontPassenger", spindexer.distanceFrontPassenger);
|
||||
TELE.addData("shootall commanded", shootAll);
|
||||
// Targeting Debug
|
||||
TELE.addData("robotX", robotX);
|
||||
TELE.addData( "robotY", robotY);
|
||||
TELE.addData("robotInchesX", targeting.robotInchesX);
|
||||
TELE.addData( "robotInchesY", targeting.robotInchesY);
|
||||
TELE.addData("Targeting GridX", targeting.robotGridX);
|
||||
TELE.addData("Targeting GridY", targeting.robotGridY);
|
||||
TELE.addData("Targeting FlyWheel", targetingSettings.flywheelRPM);
|
||||
TELE.addData("Targeting HoodAngle", targetingSettings.hoodAngle);
|
||||
TELE.addData("timeSinceStamp", getRuntime() - shootStamp);
|
||||
|
||||
TELE.update();
|
||||
|
||||
ticker++;
|
||||
|
||||
@@ -52,7 +52,6 @@ public class PIDServoTest extends LinearOpMode {
|
||||
}
|
||||
|
||||
telemetry.addData("pos", pos);
|
||||
telemetry.addData("Turret Voltage", robot.turr1Pos.getCurrentPosition());
|
||||
telemetry.addData("Spindex Voltage", robot.spin1Pos.getVoltage());
|
||||
telemetry.addData("target", target);
|
||||
telemetry.addData("Mode", mode);
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package org.firstinspires.ftc.teamcode.tests;
|
||||
|
||||
import com.acmerobotics.dashboard.FtcDashboard;
|
||||
import com.acmerobotics.dashboard.config.Config;
|
||||
import com.acmerobotics.dashboard.telemetry.MultipleTelemetry;
|
||||
import com.acmerobotics.roadrunner.Pose2d;
|
||||
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
|
||||
import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
|
||||
|
||||
import org.firstinspires.ftc.teamcode.libs.RR.MecanumDrive;
|
||||
import org.firstinspires.ftc.teamcode.utils.AprilTagWebcam;
|
||||
import org.firstinspires.ftc.teamcode.utils.Robot;
|
||||
import org.firstinspires.ftc.teamcode.utils.Turret;
|
||||
import org.firstinspires.ftc.vision.apriltag.AprilTagDetection;
|
||||
|
||||
@Autonomous
|
||||
@Config
|
||||
public class TurretTest extends LinearOpMode {
|
||||
@Override
|
||||
public void runOpMode() throws InterruptedException {
|
||||
|
||||
Robot robot = new Robot(hardwareMap);
|
||||
MultipleTelemetry TELE = new MultipleTelemetry(
|
||||
telemetry, FtcDashboard.getInstance().getTelemetry()
|
||||
);
|
||||
|
||||
AprilTagWebcam webcam = new AprilTagWebcam();
|
||||
webcam.init(robot, TELE);
|
||||
|
||||
Turret turret = new Turret(robot, TELE, webcam);
|
||||
waitForStart();
|
||||
|
||||
MecanumDrive drive = new MecanumDrive(hardwareMap, new Pose2d(10, 0,0));
|
||||
|
||||
while(opModeIsActive()){
|
||||
|
||||
drive.updatePoseEstimate();
|
||||
turret.trackGoal(drive.localizer.getPose());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,13 @@
|
||||
package org.firstinspires.ftc.teamcode.utils;
|
||||
|
||||
import static org.firstinspires.ftc.teamcode.constants.ShooterVars.kP;
|
||||
import static org.firstinspires.ftc.teamcode.constants.ShooterVars.maxStep;
|
||||
import com.arcrobotics.ftclib.controller.PIDFController;
|
||||
import com.qualcomm.robotcore.hardware.DcMotor;
|
||||
import com.qualcomm.robotcore.hardware.HardwareMap;
|
||||
|
||||
import com.acmerobotics.dashboard.telemetry.MultipleTelemetry;
|
||||
import com.qualcomm.robotcore.hardware.PIDFCoefficients;
|
||||
|
||||
public class Flywheel {
|
||||
Robot robot;
|
||||
MultipleTelemetry TELE;
|
||||
|
||||
double initPos = 0.0;
|
||||
double stamp = 0.0;
|
||||
double stamp1 = 0.0;
|
||||
double ticker = 0.0;
|
||||
double currentPos = 0.0;
|
||||
public PIDFCoefficients shooterPIDF1, shooterPIDF2;
|
||||
double velo = 0.0;
|
||||
double velo1 = 0.0;
|
||||
double velo2 = 0.0;
|
||||
@@ -25,6 +16,10 @@ public class Flywheel {
|
||||
boolean steady = false;
|
||||
public Flywheel (HardwareMap hardwareMap) {
|
||||
robot = new Robot(hardwareMap);
|
||||
shooterPIDF1 = new PIDFCoefficients
|
||||
(robot.shooterPIDF_P, robot.shooterPIDF_I, robot.shooterPIDF_D, robot.shooterPIDF_F);
|
||||
shooterPIDF2 = new PIDFCoefficients
|
||||
(robot.shooterPIDF_P, robot.shooterPIDF_I, robot.shooterPIDF_D, robot.shooterPIDF_F);
|
||||
}
|
||||
|
||||
public double getVelo () {
|
||||
@@ -48,10 +43,6 @@ public class Flywheel {
|
||||
robot.shooterPIDF.d = d;
|
||||
robot.shooterPIDF.f = f;
|
||||
}
|
||||
private double getTimeSeconds ()
|
||||
{
|
||||
return (double) System.currentTimeMillis()/1000.0;
|
||||
}
|
||||
|
||||
// Convert from RPM to Ticks per Second
|
||||
private double RPM_to_TPS (double RPM) { return (RPM*28.0)/60.0;}
|
||||
@@ -62,13 +53,14 @@ public class Flywheel {
|
||||
public double manageFlywheel(double commandedVelocity) {
|
||||
targetVelocity = commandedVelocity;
|
||||
|
||||
// Turn PIDF for Target Velocities
|
||||
// Add code here to set PIDF based on desired RPM
|
||||
//robot.shooterPIDF.p = P;
|
||||
//robot.shooterPIDF.i = I;
|
||||
//robot.shooterPIDF.d = D;
|
||||
//robot.shooterPIDF.f = F;
|
||||
robot.shooter1.setPIDFCoefficients(DcMotor.RunMode.RUN_USING_ENCODER, robot.shooterPIDF);
|
||||
robot.shooter2.setPIDFCoefficients(DcMotor.RunMode.RUN_USING_ENCODER, robot.shooterPIDF);
|
||||
|
||||
robot.shooter1.setPIDFCoefficients(DcMotor.RunMode.RUN_USING_ENCODER, shooterPIDF1);
|
||||
robot.shooter2.setPIDFCoefficients(DcMotor.RunMode.RUN_USING_ENCODER, shooterPIDF2);
|
||||
robot.shooter1.setVelocity(RPM_to_TPS(targetVelocity));
|
||||
robot.shooter2.setVelocity(RPM_to_TPS(targetVelocity));
|
||||
|
||||
|
||||
@@ -71,7 +71,6 @@ public class PositionalServoProgrammer extends LinearOpMode {
|
||||
TELE.addData("spindexer voltage 2", robot.spin2Pos.getVoltage());
|
||||
TELE.addData("hood pos", robot.hood.getPosition());
|
||||
TELE.addData("transferServo voltage", robot.transferServoPos.getVoltage());
|
||||
TELE.addData("turret voltage", robot.turr1Pos.getCurrentPosition());
|
||||
TELE.addData("spindexer pow", robot.spin1.getPower());
|
||||
TELE.update();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.firstinspires.ftc.teamcode.utils;
|
||||
|
||||
import com.acmerobotics.dashboard.config.Config;
|
||||
import com.qualcomm.hardware.limelightvision.Limelight3A;
|
||||
import com.qualcomm.hardware.rev.RevColorSensorV3;
|
||||
import com.qualcomm.robotcore.hardware.AnalogInput;
|
||||
@@ -14,10 +15,13 @@ import com.qualcomm.robotcore.hardware.Servo;
|
||||
import org.firstinspires.ftc.robotcore.external.hardware.camera.WebcamName;
|
||||
import org.firstinspires.ftc.vision.apriltag.AprilTagProcessor;
|
||||
|
||||
@Config
|
||||
public class Robot {
|
||||
|
||||
//Initialize Public Components
|
||||
|
||||
public static boolean usingLimelight = false;
|
||||
public static boolean usingCamera = true;
|
||||
public DcMotorEx frontLeft;
|
||||
public DcMotorEx frontRight;
|
||||
public DcMotorEx backLeft;
|
||||
@@ -29,7 +33,6 @@ public class Robot {
|
||||
public double shooterPIDF_I = 0.6;
|
||||
public double shooterPIDF_D = 5.0;
|
||||
public double shooterPIDF_F = 10.0;
|
||||
|
||||
public double[] shooterPIDF_StepSizes = {10.0, 1.0, 0.001, 0.0001};
|
||||
public DcMotorEx shooter1;
|
||||
public DcMotorEx shooter2;
|
||||
@@ -41,7 +44,7 @@ public class Robot {
|
||||
public CRServo spin2;
|
||||
public AnalogInput spin1Pos;
|
||||
public AnalogInput spin2Pos;
|
||||
public DcMotorEx turr1Pos;
|
||||
public AnalogInput turr1Pos;
|
||||
public AnalogInput transferServoPos;
|
||||
public AprilTagProcessor aprilTagProcessor;
|
||||
public WebcamName webcam;
|
||||
@@ -50,10 +53,6 @@ public class Robot {
|
||||
public RevColorSensorV3 color3;
|
||||
public Limelight3A limelight;
|
||||
|
||||
public static boolean usingLimelight = true;
|
||||
|
||||
public static boolean usingCamera = true;
|
||||
|
||||
public Robot(HardwareMap hardwareMap) {
|
||||
|
||||
//Define components w/ hardware map
|
||||
@@ -89,7 +88,7 @@ public class Robot {
|
||||
|
||||
turr2 = hardwareMap.get(Servo.class, "t2");
|
||||
|
||||
turr1Pos = intake; // Encoder of turret plugged in intake port
|
||||
turr1Pos = hardwareMap.get(AnalogInput.class, "t1Pos"); // Encoder of turret plugged in intake port
|
||||
|
||||
//TODO: check spindexer configuration (both servo and analog input) - check comments in PositionalServoProgrammer
|
||||
spin1 = hardwareMap.get(CRServo.class, "spin1");
|
||||
|
||||
@@ -44,17 +44,15 @@ public class Servos {
|
||||
}
|
||||
|
||||
public double getTurrPos() {
|
||||
return (double) ((double) robot.turr1Pos.getCurrentPosition() / 1024.0) * ((double) 44.0 / (double) 77.0);
|
||||
return 1.0;
|
||||
|
||||
}
|
||||
|
||||
public double setTurrPos(double pos) {
|
||||
turretPID.setPIDF(turrP, turrI, turrD, turrF);
|
||||
|
||||
return spinPID.calculate(this.getTurrPos(), pos);
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
public boolean turretEqual(double pos) {
|
||||
return Math.abs(pos - this.getTurrPos()) < 0.01;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,12 +9,17 @@ import com.qualcomm.robotcore.hardware.HardwareMap;
|
||||
public class Targeting {
|
||||
MultipleTelemetry TELE;
|
||||
|
||||
double unitConversionFactor = 1.02;
|
||||
double cancelOffsetX = 7.071067811;
|
||||
double cancelOffsetY = 7.071067811;
|
||||
double unitConversionFactor = 0.95;
|
||||
|
||||
int tileSize = 24; //inches
|
||||
|
||||
public double robotInchesX, robotInchesY = 0.0;
|
||||
|
||||
public int robotGridX, robotGridY = 0;
|
||||
|
||||
|
||||
public static class Settings {
|
||||
public double flywheelRPM = 0.0;
|
||||
public double hoodAngle = 0.0;
|
||||
@@ -32,47 +37,47 @@ public class Targeting {
|
||||
static {
|
||||
KNOWNTARGETING = new Settings[6][6];
|
||||
// ROW 0 - Closet to the goals
|
||||
KNOWNTARGETING[0][0] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[0][1] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[0][2] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[0][3] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[0][4] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[0][5] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[0][0] = new Settings (3000.0, 0.25);
|
||||
KNOWNTARGETING[0][1] = new Settings (3001.0, 0.25);
|
||||
KNOWNTARGETING[0][2] = new Settings (3002.0, 0.25);
|
||||
KNOWNTARGETING[0][3] = new Settings (3302.0, 0.2);
|
||||
KNOWNTARGETING[0][4] = new Settings (3503.0, 0.15);
|
||||
KNOWNTARGETING[0][5] = new Settings (3505.0, 0.15);
|
||||
// ROW 1
|
||||
KNOWNTARGETING[1][0] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[1][1] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[1][2] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[1][3] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[1][4] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[1][5] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[1][0] = new Settings (3010.0, 0.25);
|
||||
KNOWNTARGETING[1][1] = new Settings (3011.0, 0.25);
|
||||
KNOWNTARGETING[1][2] = new Settings (3012.0, 0.25);
|
||||
KNOWNTARGETING[1][3] = new Settings (3313.0, 0.15);
|
||||
KNOWNTARGETING[1][4] = new Settings (3514.0, 0.15);
|
||||
KNOWNTARGETING[1][5] = new Settings (3515.0, 0.15);
|
||||
// ROW 2
|
||||
KNOWNTARGETING[2][0] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[2][1] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[2][2] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[2][3] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[2][4] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[2][5] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[2][0] = new Settings (3020.0, 0.1);
|
||||
KNOWNTARGETING[2][1] = new Settings (3000.0, 0.25);
|
||||
KNOWNTARGETING[2][2] = new Settings (3000.0, 0.15);
|
||||
KNOWNTARGETING[2][3] = new Settings (3000.0, 0.15);
|
||||
KNOWNTARGETING[2][4] = new Settings (3524.0, 0.15);
|
||||
KNOWNTARGETING[2][5] = new Settings (3525.0, 0.15);
|
||||
// ROW 3
|
||||
KNOWNTARGETING[3][0] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[3][1] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[3][2] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[3][3] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[3][4] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[3][5] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[3][0] = new Settings (3030.0, 0.15);
|
||||
KNOWNTARGETING[3][1] = new Settings (3031.0, 0.15);
|
||||
KNOWNTARGETING[3][2] = new Settings (3000.0, 0.15);
|
||||
KNOWNTARGETING[3][3] = new Settings (3000.0, 0.15);
|
||||
KNOWNTARGETING[3][4] = new Settings (3000.0, 0.03);
|
||||
KNOWNTARGETING[3][5] = new Settings (3535.0, 0.1);
|
||||
// ROW 4
|
||||
KNOWNTARGETING[4][0] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[4][1] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[4][2] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[4][3] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[4][4] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[4][5] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[4][0] = new Settings (4540.0, 0.1);
|
||||
KNOWNTARGETING[4][1] = new Settings (4541.0, 0.1);
|
||||
KNOWNTARGETING[4][2] = new Settings (4542.0, 0.1);
|
||||
KNOWNTARGETING[4][3] = new Settings (4543.0, 0.1);
|
||||
KNOWNTARGETING[4][4] = new Settings (4544.0, 0.1);
|
||||
KNOWNTARGETING[4][5] = new Settings (4545.0, 0.1);
|
||||
// ROW 1
|
||||
KNOWNTARGETING[5][0] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[5][1] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[5][2] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[5][3] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[5][4] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[5][5] = new Settings (4500.0, 0.1);
|
||||
KNOWNTARGETING[5][0] = new Settings (4550.0, 0.1);
|
||||
KNOWNTARGETING[5][1] = new Settings (4551.0, 0.1);
|
||||
KNOWNTARGETING[5][2] = new Settings (4552.0, 0.1);
|
||||
KNOWNTARGETING[5][3] = new Settings (4553.0, 0.1);
|
||||
KNOWNTARGETING[5][4] = new Settings (4554.0, 0.1);
|
||||
KNOWNTARGETING[5][5] = new Settings (4555.0, 0.1);
|
||||
}
|
||||
|
||||
public Targeting()
|
||||
@@ -82,19 +87,25 @@ public class Targeting {
|
||||
public Settings calculateSettings(double robotX, double robotY, double robotHeading, double robotVelocity) {
|
||||
Settings recommendedSettings = new Settings(0.0, 0.0);
|
||||
|
||||
double cos45 = Math.cos(Math.toRadians(-45));
|
||||
double sin45 = Math.sin(Math.toRadians(-45));
|
||||
double rotatedY = (robotX -40.0) * sin45 + (robotY +7.0) * cos45;
|
||||
double rotatedX = (robotX -40.0) * cos45 - (robotY +7.0) * sin45;
|
||||
|
||||
// Convert robot coordinates to inches
|
||||
double robotInchesX = robotX * unitConversionFactor;
|
||||
double robotInchesY = robotY * unitConversionFactor;
|
||||
robotInchesX = rotatedX * unitConversionFactor;
|
||||
robotInchesY = rotatedY * unitConversionFactor;
|
||||
|
||||
// Find approximate location in the grid
|
||||
robotGridX = Math.floorDiv((int) robotInchesX, tileSize);
|
||||
robotGridY = Math.floorDiv((int) robotInchesY, tileSize);
|
||||
robotGridX = Math.abs(Math.floorDiv((int) robotInchesX, tileSize) +1);
|
||||
robotGridY = Math.abs(Math.floorDiv((int) robotInchesY, tileSize));
|
||||
|
||||
// Use Grid Location to perform lookup
|
||||
// Keep it simple for now but may want to interpolate results
|
||||
if ((robotGridY < 6) && (robotGridX <6)) {
|
||||
recommendedSettings.flywheelRPM = KNOWNTARGETING[robotGridY][robotGridX].flywheelRPM;
|
||||
recommendedSettings.hoodAngle = KNOWNTARGETING[robotGridY][robotGridX].hoodAngle;
|
||||
|
||||
}
|
||||
return recommendedSettings;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
package org.firstinspires.ftc.teamcode.utils;
|
||||
|
||||
import static org.firstinspires.ftc.teamcode.constants.Color.redAlliance;
|
||||
|
||||
import com.acmerobotics.dashboard.config.Config;
|
||||
import com.acmerobotics.dashboard.telemetry.MultipleTelemetry;
|
||||
import com.acmerobotics.roadrunner.Pose2d;
|
||||
|
||||
import org.firstinspires.ftc.vision.apriltag.AprilTagDetection;
|
||||
|
||||
@Config
|
||||
public class Turret {
|
||||
|
||||
public static double turretTolerance = 0.02;
|
||||
public static double turrPosScalar = 1.009;
|
||||
public static double turret180Range = 0.6;
|
||||
public static double turrDefault = 0.4;
|
||||
public static double cameraBearingEqual = 1.5;
|
||||
public static double errorLearningRate = 2;
|
||||
public static double turrMin = 0.2;
|
||||
public static double turrMax = 0.8;
|
||||
Robot robot;
|
||||
MultipleTelemetry TELE;
|
||||
AprilTagWebcam webcam;
|
||||
private int obeliskID = 0;
|
||||
private double turrPos = 0.0;
|
||||
private double offset = 0.0;
|
||||
private double bearing = 0.0;
|
||||
|
||||
public Turret(Robot rob, MultipleTelemetry tele, AprilTagWebcam cam) {
|
||||
this.TELE = tele;
|
||||
this.robot = rob;
|
||||
this.webcam = cam;
|
||||
}
|
||||
|
||||
public double getTurrPos() {
|
||||
return turrPosScalar * (robot.turr1Pos.getVoltage() / 3.3);
|
||||
|
||||
}
|
||||
|
||||
public void manualSetTurret(double pos){
|
||||
robot.turr1.setPosition(pos);
|
||||
robot.turr2.setPosition(1-pos);
|
||||
}
|
||||
|
||||
public boolean turretEqual(double pos) {
|
||||
return Math.abs(pos - this.getTurrPos()) < turretTolerance;
|
||||
}
|
||||
|
||||
public double getBearing() {
|
||||
if (redAlliance) {
|
||||
AprilTagDetection d24 = webcam.getTagById(24);
|
||||
if (d24 != null) {
|
||||
bearing = d24.ftcPose.bearing;
|
||||
return bearing;
|
||||
} else {
|
||||
return 1000.0;
|
||||
}
|
||||
} else {
|
||||
AprilTagDetection d20 = webcam.getTagById(20);
|
||||
if (d20 != null) {
|
||||
bearing = d20.ftcPose.bearing;
|
||||
return bearing;
|
||||
} else {
|
||||
return 1000.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int detectObelisk() {
|
||||
AprilTagDetection id21 = webcam.getTagById(21);
|
||||
AprilTagDetection id22 = webcam.getTagById(22);
|
||||
AprilTagDetection id23 = webcam.getTagById(23);
|
||||
if (id21 != null) {
|
||||
obeliskID = 21;
|
||||
} else if (id22 != null) {
|
||||
obeliskID = 22;
|
||||
} else if (id23 != null) {
|
||||
obeliskID = 23;
|
||||
}
|
||||
return obeliskID;
|
||||
}
|
||||
|
||||
public int getObeliskID() {
|
||||
return obeliskID;
|
||||
}
|
||||
|
||||
public void update() {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Param @deltaPos = Pose2d when subtracting robot x, y, heading from goal x, y, heading
|
||||
*/
|
||||
public void trackGoal(Pose2d deltaPos) {
|
||||
|
||||
/* ---------------- FIELD → TURRET GEOMETRY ---------------- */
|
||||
|
||||
// Angle from robot to goal in robot frame
|
||||
double desiredTurretAngleDeg = Math.toDegrees(
|
||||
Math.atan2(deltaPos.position.y, deltaPos.position.x)
|
||||
);
|
||||
|
||||
// Robot heading (field → robot)
|
||||
double robotHeadingDeg = Math.toDegrees(deltaPos.heading.toDouble());
|
||||
|
||||
// Turret angle needed relative to robot
|
||||
double turretAngleDeg = desiredTurretAngleDeg - robotHeadingDeg;
|
||||
|
||||
// Normalize to [-180, 180]
|
||||
while (turretAngleDeg > 180) turretAngleDeg -= 360;
|
||||
while (turretAngleDeg < -180) turretAngleDeg += 360;
|
||||
|
||||
/* ---------------- APRILTAG CORRECTION ---------------- */
|
||||
|
||||
double tagBearingDeg = getBearing(); // + = target is to the left
|
||||
|
||||
if (tagBearingDeg != 1000.0 && Math.abs(tagBearingDeg) < cameraBearingEqual) {
|
||||
// Slowly learn turret offset (persistent calibration)
|
||||
offset -= tagBearingDeg * errorLearningRate;
|
||||
}
|
||||
|
||||
turretAngleDeg += offset;
|
||||
|
||||
/* ---------------- ANGLE → SERVO ---------------- */
|
||||
|
||||
double turretPos = turrDefault + (turretAngleDeg / (turret180Range * 2.0));
|
||||
|
||||
// Clamp to servo range
|
||||
turretPos = Math.max(turrMin, Math.min(turretPos, turrMax));
|
||||
|
||||
robot.turr1.setPosition(turretPos);
|
||||
robot.turr2.setPosition(1.0 - turretPos);
|
||||
|
||||
/* ---------------- TELEMETRY ---------------- */
|
||||
|
||||
TELE.addData("Turret Angle", turretAngleDeg);
|
||||
TELE.addData("Bearing", tagBearingDeg);
|
||||
TELE.addData("Offset", offset);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user