Teleop and Auto

This commit is contained in:
Nathaniel Palme
2021-02-11 20:44:37 -06:00
parent 1810e70eb1
commit f75b05693f
12 changed files with 226 additions and 80 deletions

6
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
</component>
</project>

2
.idea/misc.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@@ -32,7 +32,7 @@ public class OdometryCalibration extends CyberarmState {
rotation += robot.getRelativeAngle(imu, rotationPrev);
rotationPrev = imu;
currentTick = robot.encoderBack.getCurrentPosition();
currentTick = (robot.encoderRight.getCurrentPosition() + robot.encoderLeft.getCurrentPosition()) / 2;
if (engine.gamepad1.x) {
robot.setDrivePower(power, -power, power, -power);

View File

@@ -3,12 +3,15 @@ package org.timecrafters.UltimateGoal.Competition.Autonomous;
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import org.cyberarm.engine.V2.CyberarmEngine;
import org.timecrafters.UltimateGoal.Competition.Launch;
import org.timecrafters.UltimateGoal.Competition.Robot;
import org.timecrafters.UltimateGoal.Competition.WobbleGrab;
@Autonomous (name = "Autonomous")
public class AutoEngine extends CyberarmEngine {
private Robot robot;
private TensorFlowCheck tensorFlowCheck;
@Override
public void init() {
@@ -20,8 +23,55 @@ public class AutoEngine extends CyberarmEngine {
@Override
public void setup() {
//drive to view
addState(new DriveToCoordinates(robot, "auto", "001_0"));
addState(new DriveToCoordinates(robot, "auto", "001_0"));
addState(new DriveToCoordinates(robot, "auto", "01_0"));
//select scoring area
tensorFlowCheck = new TensorFlowCheck(robot, "auto", "02_0");
addState(tensorFlowCheck);
//drive around ring stack
addState(new DriveToCoordinates(robot, "auto", "03_0"));
//drive to launch position
double launchTolerance = robot.inchesToTicks((double) robot.stateConfiguration.variable("auto","04_0","tolPos").value());
double launchPower = robot.stateConfiguration.variable("auto","04_0","power").value();
long launchBrakeTime = robot.stateConfiguration.variable("auto","04_0","bakeMS").value();
addState(new DriveToCoordinates(robot, robot.launchPositionX,robot.launchPositionY,robot.launchRotation,launchTolerance,launchPower,launchBrakeTime));
//launch rings
addState(new Launch(robot));
//drive to scoring area
float scoreAFaceAngle = robot.stateConfiguration.variable("auto","05_0","faceAngle").value();
double scoreATolerance = robot.inchesToTicks((double) robot.stateConfiguration.variable("auto","05_0","tolPos").value());
double scoreAPower = robot.stateConfiguration.variable("auto","05_0","power").value();
long scoreABrakeTime = robot.stateConfiguration.variable("auto","05_0","bakeMS").value();
addState(new DriveToCoordinates(robot, tensorFlowCheck.wobblePosX,tensorFlowCheck.wobblePosY,scoreAFaceAngle,scoreATolerance,scoreAPower,scoreABrakeTime));
//turn arm towards scoreing area.
addState(new Face(robot, "auto", "05_1"));
//open the wobble grab arm
addState(new WobbleGrab(robot, "auto", "06_0", true));
//drive to second wobble
addState(new DriveToCoordinates(robot, "auto", "07_0"));
addState(new DriveWithColorSensor(robot, "auto", "08_0"));
//close grabber
addState(new WobbleGrab(robot, "auto", "09_0", false));
//drive to scoring area
float scoreBFaceAngle = robot.stateConfiguration.variable("auto","05_0","faceAngle").value();
double scoreBTolerance = robot.inchesToTicks((double) robot.stateConfiguration.variable("auto","05_0","tolPos").value());
double scoreBPower = robot.stateConfiguration.variable("auto","05_0","power").value();
long scoreBBrakeTime = robot.stateConfiguration.variable("auto","05_0","bakeMS").value();
addState(new DriveToCoordinates(robot, tensorFlowCheck.wobblePosX,tensorFlowCheck.wobblePosY,scoreBFaceAngle,scoreBTolerance,scoreBPower,scoreBBrakeTime));
//release wobble goal 2
addState(new WobbleGrab(robot, "auto", "10_0", true));
//drive to park
addState(new DriveToCoordinates(robot, "auto", "11_0"));
}
}

View File

@@ -15,7 +15,7 @@ public class DriveToCoordinates extends CyberarmState {
private double power;
private boolean braking;
private long breakStartTime;
private long breakTime;
private long brakeTime;
private boolean autoFace;
public DriveToCoordinates(Robot robot, String groupName, String actionName) {
@@ -24,14 +24,14 @@ public class DriveToCoordinates extends CyberarmState {
this.actionName = actionName;
}
public DriveToCoordinates(Robot robot, double xTarget, double yTarget, float faceAngle, double tolerance, double power, long breakStartTime) {
public DriveToCoordinates(Robot robot, double xTarget, double yTarget, float faceAngle, double tolerance, double power, long brakeTime) {
this.robot = robot;
this.xTarget = xTarget;
this.yTarget = yTarget;
this.faceAngle = faceAngle;
this.tolerancePos = tolerance;
this.power = power;
this.breakTime = breakTime;
this.brakeTime = brakeTime;
}
@Override
@@ -41,7 +41,7 @@ public class DriveToCoordinates extends CyberarmState {
yTarget = robot.inchesToTicks((double) robot.stateConfiguration.variable(groupName, actionName, "yPos").value());
power = robot.stateConfiguration.variable(groupName, actionName, "power").value();
tolerancePos = robot.inchesToTicks((double) robot.stateConfiguration.variable(groupName, actionName, "tolPos").value());
breakTime = robot.stateConfiguration.variable(groupName, actionName, "brakeMS").value();
brakeTime = robot.stateConfiguration.variable(groupName, actionName, "brakeMS").value();
try {
faceAngle = robot.stateConfiguration.variable(groupName, actionName, "face").value();
@@ -53,6 +53,11 @@ public class DriveToCoordinates extends CyberarmState {
@Override
public void start() {
if (robot.stateConfiguration.action(groupName,actionName).enabled) {
setHasFinished(true);
}
if (autoFace) {
faceAngle = robot.getAngleToPosition(xTarget,yTarget);
}
@@ -73,7 +78,7 @@ public class DriveToCoordinates extends CyberarmState {
breakStartTime = currentTime;
braking = true;
}
setHasFinished(currentTime - breakStartTime >= breakTime);
setHasFinished(currentTime - breakStartTime >= brakeTime);
}
}

View File

@@ -0,0 +1,41 @@
package org.timecrafters.UltimateGoal.Competition.Autonomous;
import org.cyberarm.engine.V2.CyberarmState;
import org.firstinspires.ftc.robotcore.external.navigation.DistanceUnit;
import org.timecrafters.UltimateGoal.Competition.Robot;
public class DriveWithColorSensor extends CyberarmState {
private Robot robot;
private String groupName;
private String actionName;
private double power;
private double minimum;
private double maximum;
public DriveWithColorSensor(Robot robot, String groupName, String actionName) {
this.robot = robot;
this.groupName = groupName;
this.actionName = actionName;
}
@Override
public void init() {
power = robot.stateConfiguration.variable(groupName,actionName,"power").value();
minimum = robot.stateConfiguration.variable(groupName,actionName,"min").value();
maximum = robot.stateConfiguration.variable(groupName,actionName,"max").value();
}
@Override
public void exec() {
double sensorValue = robot.wobbleColorSensor.getDistance(DistanceUnit.MM);
if (sensorValue < minimum) {
robot.getMecanumPowers(180,power,0);
} else if (sensorValue > maximum) {
robot.getMecanumPowers(0,power,0);
} else {
robot.setDrivePower(0,0,0,0);
setHasFinished(true);
}
}
}

View File

@@ -17,12 +17,18 @@ public class TensorFlowCheck extends CyberarmState {
private long checkTime;
public double wobblePosX;
public double wobblePosY;
private int manualPath;
public TensorFlowCheck(Robot robot, String group, String action) {
this.robot = robot;
this.group = group;
this.action = action;
}
@Override
public void init() {
checkTime = robot.stateConfiguration.variable(group,action,"time").value();
manualPath = robot.stateConfiguration.variable(group,action,"path").value();
}
@Override
@@ -32,27 +38,41 @@ public class TensorFlowCheck extends CyberarmState {
@Override
public void exec() {
recognitions = robot.tfObjectDetector.getUpdatedRecognitions();
if (recognitions != null) {
if (manualPath == -1) {
recognitions = robot.tfObjectDetector.getUpdatedRecognitions();
if (recognitions.size() == 1) {
Recognition recognition = recognitions.get(0);
String label = recognition.getLabel();
if (label.equals("Single")) {
path = 1;
} else if (label.equals("Quad")) {
path = 2;
if (recognitions != null) {
if (recognitions.size() == 1) {
Recognition recognition = recognitions.get(0);
String label = recognition.getLabel();
if (label.equals("Single")) {
path = 1;
} else if (label.equals("Quad")) {
path = 2;
}
} else if (recognitions.size() > 1) {
path = 1;
}
} else if (recognitions.size() > 1) {
path = 1;
}
} else {
path = manualPath;
}
if (runTime() >= checkTime) {
if (checkTime == 0) {
wobblePosX = robot.stateConfiguration.variable("auto", "_goalPos1","x").value();
if (path == 0) {
wobblePosX = robot.stateConfiguration.variable("auto", "_goalPos0","x").value();
wobblePosY = robot.stateConfiguration.variable("auto", "_goalPos0","y").value();
}
if (path == 1) {
wobblePosX = robot.stateConfiguration.variable("auto", "_goalPos1","x").value();
wobblePosY = robot.stateConfiguration.variable("auto", "_goalPos1","y").value();
}
if (path == 2) {
wobblePosX = robot.stateConfiguration.variable("auto", "_goalPos2","x").value();
wobblePosY = robot.stateConfiguration.variable("auto", "_goalPos2","y").value();
}
}
}

View File

@@ -27,6 +27,11 @@ public class Launch extends CyberarmState {
if (hasCycled) {
robot.ringBeltMotor.setPower(0);
robot.ringBeltStage = 0;
if (!robot.initLauncher) {
robot.launchMotor.setPower(0);
}
setHasFinished(true);
} else {
hasCycled = true;
@@ -34,6 +39,5 @@ public class Launch extends CyberarmState {
}
detectedPass = detectingPass;
// if (robot.getBeltPos() > robot.loopPos(Robot.RING_BELT_GAP * 3) && hasCycled);
}
}

View File

@@ -6,17 +6,12 @@ public class ProgressRingBelt extends CyberarmState {
private Robot robot;
private int targetPos;
private boolean useLaunchPrep;
private boolean prepLaunch;
public ProgressRingBelt(Robot robot) {
this.robot = robot;
}
@Override
public void init() {
useLaunchPrep = (robot.launchMotor.getPower() == 0);
}
@Override
public void start() {
int currentPos = robot.getBeltPos();
@@ -28,6 +23,7 @@ public class ProgressRingBelt extends CyberarmState {
targetPos = robot.loopPos(currentPos + 160);
robot.ringBeltOn();
robot.ringBeltStage += 1;
prepLaunch = !robot.initLauncher;
}
}
@@ -38,7 +34,7 @@ public class ProgressRingBelt extends CyberarmState {
if (currentPos >= targetPos && currentPos < targetPos + Robot.RING_BELT_GAP) {
robot.ringBeltMotor.setPower(0);
if(useLaunchPrep) {
if(prepLaunch) {
robot.launchMotor.setPower(Robot.LAUNCH_POWER);
}

View File

@@ -5,6 +5,7 @@ import android.util.Log;
import com.qualcomm.hardware.bosch.BNO055IMU;
import com.qualcomm.hardware.rev.Rev2mDistanceSensor;
import com.qualcomm.hardware.rev.RevColorSensorV3;
import com.qualcomm.hardware.rev.RevTouchSensor;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.DcMotorSimple;
@@ -60,9 +61,9 @@ public class Robot {
//Steering Constants
static final double FINE_CORRECTION = 0.055 ;
static final double LARGE_CORRECTION = 0.025 ;
static final double MOMENTUM_CORRECTION = 1.02;
static final double MOMENTUM_MAX_CORRECTION = 1.3;
static final double LARGE_CORRECTION = 0.025;
static final double MOMENTUM_CORRECTION = 1.045;
static final double MOMENTUM_MAX_CORRECTION = 1.4;
static final double MOMENTUM_HORIZONTAL_CORRECTION = -(Math.log10(MOMENTUM_MAX_CORRECTION-1)/Math.log10(MOMENTUM_CORRECTION));
//Conversion Constants
@@ -95,13 +96,13 @@ public class Robot {
public static final double LAUNCH_POWER = 0.75;
private static final long LAUNCH_ACCEL_TIME = 500;
public static final double LAUNCH_POSITION_X = 36 * (COUNTS_PER_REVOLUTION/ENCODER_CIRCUMFERENCE);
public static final double LAUNCH_POSITION_Y = -8 * (COUNTS_PER_REVOLUTION/ENCODER_CIRCUMFERENCE);
public static final float LAUNCH_ROTATION = 0;
public double launchPositionX;
public double launchPositionY;
public float launchRotation;
public static final double LAUNCH_TOLERANCE_POS = 0.5 * (COUNTS_PER_REVOLUTION/ENCODER_CIRCUMFERENCE);
public static final double LAUNCH_TOLERANCE_FACE = 0.5;
public boolean initLauncher;
//Ring Intake
public DcMotor collectionMotor;
@@ -123,8 +124,8 @@ public class Robot {
public DcMotor wobbleArmMotor;
public Servo wobbleGrabServo;
public static final int WOBBLE_ARM_DOWN = -710;
public static final double WOBBLE_SERVO_MAX = 0.3;
public RevColorSensorV3 wobbleColorSensor;
//vuforia navigation
private WebcamName webcam;
@@ -249,8 +250,11 @@ public class Robot {
launchMotor = launcher;
launchMotor.setMotorType(launchMotorType);
launchMotor.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
launchMotor.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.FLOAT);
if (stateConfiguration.action("system","initLauncher").enabled) {
initLauncher = stateConfiguration.action("system","initLauncher").enabled;
if (initLauncher) {
double launcherPower = 0;
long launchAccelStart = System.currentTimeMillis();
while (launcherPower < LAUNCH_POWER) {
@@ -258,6 +262,10 @@ public class Robot {
launchMotor.setPower(launcherPower);
}
}
//
launchPositionX = stateConfiguration.variable("system", "launchPos","x").value();
launchPositionX = stateConfiguration.variable("system", "launchPos","y").value();
launchRotation = stateConfiguration.variable("system", "launchPos","rot").value();
}
@@ -353,7 +361,7 @@ public class Robot {
double ticksPerDegree;
if(rotationChange < 0) {
if (rotationChange < 0) {
ticksPerDegree = TICKS_PER_ROBOT_DEGREE_COUNTERCLOCKWISE;
} else {
ticksPerDegree = TICKS_PER_ROBOT_DEGREE_CLOCKWISE;

View File

@@ -14,11 +14,12 @@ public class TeleOpState extends CyberarmState {
private double leftJoystickMagnitude;
private float rightJoystickDegrees;
private double rightJoystickMagnitude;
private float cardinalSnapping;
private float pairSnapping;
private double[] powers = {0,0,0,0};
private double drivePower = 1;
private static final double TURN_POWER = 1;
private boolean toggleSpeedInput = false;
private Launch launchState;
private boolean launching;
private ProgressRingBelt ringBeltState;
@@ -27,11 +28,12 @@ public class TeleOpState extends CyberarmState {
private boolean yPrev;
private boolean aPrev;
private boolean bPrev;
private boolean rbPrev;
private boolean lbPrev;
private boolean wobbleArmUp = true;
private boolean wobbleGrabOpen = false;
private boolean launchInput = false;
@@ -40,8 +42,9 @@ public class TeleOpState extends CyberarmState {
}
@Override
public void start() {
public void init() {
cardinalSnapping = robot.stateConfiguration.variable("tele","control", "cardinalSnapping").value();
pairSnapping = robot.stateConfiguration.variable("tele","control", "pairSnapping").value();
}
@Override
@@ -57,14 +60,19 @@ public class TeleOpState extends CyberarmState {
double rightJoystickX = engine.gamepad1.right_stick_x;
double rightJoystickY = engine.gamepad1.right_stick_y;
rightJoystickDegrees = (float) Math.toDegrees(Math.atan2(rightJoystickX, -rightJoystickY));
rightJoystickDegrees = snapToCardinal((float) Math.toDegrees(Math.atan2(rightJoystickX, -rightJoystickY)),cardinalSnapping,0);
rightJoystickMagnitude = Math.hypot(rightJoystickX, rightJoystickY);
if (leftJoystickMagnitude > 0.66) {
drivePower = 1 ;
} else {
drivePower = 0.6;
boolean lb = engine.gamepad1.left_stick_button;
if (lb && !lbPrev) {
if (drivePower == 1) {
drivePower = 0.5;
} else {
drivePower = 1;
}
}
lbPrev = lb;
double[] powers = {0,0,0,0};
@@ -73,18 +81,18 @@ public class TeleOpState extends CyberarmState {
//Launch Sequence
double distanceToTarget = Math.hypot(Robot.LAUNCH_POSITION_X - robot.getLocationX(), Robot.LAUNCH_POSITION_Y - robot.getLocationY());
double distanceToTarget = Math.hypot(robot.launchPositionX - robot.getLocationX(), robot.launchPositionY - robot.getLocationY());
if (distanceToTarget > Robot.LAUNCH_TOLERANCE_POS) {
powers = robot.getMecanumPowers(robot.getAngleToPosition(Robot.LAUNCH_POSITION_X, Robot.LAUNCH_POSITION_Y), drivePower, Robot.LAUNCH_ROTATION);
powers = robot.getMecanumPowers(robot.getAngleToPosition(robot.launchPositionX, robot.launchPositionY), drivePower, robot.launchRotation);
} else if (robot.getRelativeAngle(Robot.LAUNCH_ROTATION, robot.getRotation()) > Robot.LAUNCH_TOLERANCE_FACE) {
} else if (robot.getRelativeAngle(robot.launchRotation, robot.getRotation()) > Robot.LAUNCH_TOLERANCE_FACE) {
launchState = new Launch(robot);
addParallelState(launchState);
} else {
double[] facePowers = robot.getFacePowers(Robot.LAUNCH_ROTATION, TURN_POWER);
double[] facePowers = robot.getFacePowers(robot.launchRotation, TURN_POWER);
powers = new double[]{facePowers[0], facePowers[1], facePowers[0], facePowers[1]};
}
@@ -97,14 +105,16 @@ public class TeleOpState extends CyberarmState {
if (rightJoystickMagnitude == 0) {
if (leftJoystickMagnitude !=0) {
powers = robot.getMecanumPowers(leftJoystickDegrees, drivePower, leftJoystickDegrees);
float direction = snapToCardinal(leftJoystickDegrees,cardinalSnapping,0);
powers = robot.getMecanumPowers(direction, drivePower, direction);
}
} else {
if (leftJoystickMagnitude == 0) {
double[] facePowers = robot.getFacePowers(rightJoystickDegrees, TURN_POWER * rightJoystickMagnitude);
powers = new double[]{facePowers[0], facePowers[1], facePowers[0], facePowers[1]};
} else {
powers = robot.getMecanumPowers(leftJoystickDegrees, drivePower, rightJoystickDegrees);
powers = robot.getMecanumPowers(snapToCardinal(leftJoystickDegrees,pairSnapping,rightJoystickDegrees), drivePower, rightJoystickDegrees);
}
}
}
@@ -113,16 +123,15 @@ public class TeleOpState extends CyberarmState {
this.powers = powers;
if (childrenHaveFinished()) {
robot.collectionMotor.setPower(engine.gamepad2.right_trigger);
} else {
robot.collectionMotor.setPower(0);
}
boolean x = engine.gamepad2.x;
if (x && !xPrev && childrenHaveFinished()) {
if (CollectorOn) {
robot.collectionMotor.setPower(0);
CollectorOn = false;
} else {
robot.collectionMotor.setPower(1);
CollectorOn = true;
}
addParallelState(new ProgressRingBelt(robot));
}
xPrev = x;
@@ -135,41 +144,48 @@ public class TeleOpState extends CyberarmState {
boolean a = engine.gamepad2.a;
if (a && !aPrev && childrenHaveFinished()) {
addParallelState(new ProgressRingBelt(robot));
wobbleGrabOpen = !wobbleGrabOpen;
addParallelState(new WobbleGrab( robot, wobbleGrabOpen, 100));
}
aPrev = a;
boolean b = engine.gamepad2.b;
if (b && !bPrev) {
if (b && !bPrev && childrenHaveFinished()) {
wobbleArmUp = !wobbleArmUp;
addParallelState(new WobbleArm(robot, wobbleArmUp, 100));
}
bPrev = b;
boolean rb = engine.gamepad2.right_bumper;
if (rb && !rbPrev) {
wobbleGrabOpen = !wobbleGrabOpen ;
addParallelState(new WobbleGrab( robot, wobbleGrabOpen, 100));
}
rbPrev = rb;
}
@Override
public void telemetry() {
engine.telemetry.addLine("Powers");
for (double power : powers) {
engine.telemetry.addData(" ", power);
}
engine.telemetry.addData("childrenHaveFinished", childrenHaveFinished());
for (CyberarmState state : children) {
engine.telemetry.addLine(""+state.getClass());
}
engine.telemetry.addLine("Location");
engine.telemetry.addData("Position ","("+round(robot.ticksToInches(robot.getLocationX()))+","+round(robot.ticksToInches(robot.getLocationY()))+")");
engine.telemetry.addData("Position ","("+round(robot.ticksToInches(robot.getLocationX()),0.1)+","+round(robot.ticksToInches(robot.getLocationY()),0.1)+")");
engine.telemetry.addData("Rotation ", robot.getRotation());
engine.telemetry.addData("totalV", robot.totalV);
}
private float round(double number) {
return ((float) Math.floor(number*100)) / 100;
private float round(double number,double unit) {
return (float) (Math.floor(number/unit) * unit);
}
private float snapToCardinal(float angle, float snapping, float offset) {
int o = (int) offset + 180;
o %= 90;
for (int cardinal = o-180; (cardinal <= 180+o && cardinal != angle); cardinal += 90) {
if (angle >= cardinal-snapping && angle <= cardinal+snapping) {
angle = cardinal;
}
}
return angle;
}

View File

@@ -17,9 +17,9 @@ public class WobbleGrab extends CyberarmState {
this.open = open;
}
public WobbleGrab(Robot robot, boolean armUp, long waitTime) {
public WobbleGrab(Robot robot, boolean open, long waitTime) {
this.robot = robot;
this.open = armUp;
this.open = open;
this.waitTime = waitTime;
}