Compare commits

...

6 Commits

Author SHA1 Message Date
46ea23bef8 RedCrab: Fixed arm float position not working, claw wrist adjustments 2024-01-20 12:46:00 -06:00
NerdyBirdy460
513045b543 Merge remote-tracking branch 'origin/master' 2024-01-20 12:07:03 -06:00
NerdyBirdy460
2216ae2136 Trying to fix the weird drive problems on pizzabox, ready to test it. 2024-01-20 12:06:55 -06:00
SpencerPiha
f47ca4c8f2 Merge remote-tracking branch 'origin/master' 2024-01-20 11:27:17 -06:00
SpencerPiha
c109ce8ee4 worked on velocity implementation 2024-01-20 11:27:06 -06:00
SpencerPiha
bc014988fd tuning auto for left and right 2024-01-20 09:57:24 -06:00
11 changed files with 106 additions and 76 deletions

View File

@@ -253,7 +253,7 @@ public class RedCrabMinibot {
RedCrabMinibot.CLAW_ARM_POSITION_TOLERANCE = config.variable("Robot", "ClawArm_Tuning", "tolerance").value();
RedCrabMinibot.CLAW_ARM_STOW_ANGLE = config.variable("Robot", "ClawArm_Tuning", "stow_angle").value();
RedCrabMinibot.CLAW_ARM_DEPOSIT_ANGLE = config.variable("Robot", "ClawArm_Tuning", "deposit_angle").value();
RedCrabMinibot.CLAW_ARM_COLLECT_FLOAT_ANGLE = config.variable("Robot", "ClawArm_Tuning", "collect_angle").value();
RedCrabMinibot.CLAW_ARM_COLLECT_FLOAT_ANGLE = config.variable("Robot", "ClawArm_Tuning", "collect_float_angle").value();
RedCrabMinibot.CLAW_ARM_COLLECT_ANGLE = config.variable("Robot", "ClawArm_Tuning", "collect_angle").value();
RedCrabMinibot.CLAW_ARM_MOTOR_GEAR_RATIO = config.variable("Robot", "ClawArm_Tuning", "gear_ratio").value();

File diff suppressed because one or more lines are too long

View File

@@ -3,6 +3,7 @@ package org.timecrafters.CenterStage.Autonomous.CompetitionEngines;
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.hardware.DcMotor;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.CameraVisionState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawArmControlTask;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawArmState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawFingerState;
@@ -13,7 +14,7 @@ import org.timecrafters.CenterStage.Common.CompetitionRobotV1;
import dev.cyberarm.engine.V2.CyberarmEngine;
@Autonomous(name = "Burnsville audience blue")
@Autonomous(name = "Burnsville audience blue", preselectTeleOp = "Competition V1 TeleOp")
public class CompetitionBurnsvilleAudienceBlue extends CyberarmEngine {
@@ -42,15 +43,15 @@ public class CompetitionBurnsvilleAudienceBlue extends CyberarmEngine {
this.robot.setup();
addState(new ClawArmState(robot,"Burnsville audience blue", "0-01-0"));
// addState(new CameraVisionState(robot));
addState(new CameraVisionState(robot));
addState(new ClawArmState(robot,"Burnsville audience blue", "0-01-1"));
// drive to the left, center, or right spike mark
addState(new DriveToCoordinatesState(robot,"Burnsville audience blue", "1-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville audience blue", "1-02-1"));
addState(new DriveToCoordinatesState(robot,"Burnsville audience blue", "2-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville audience blue", "3-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville audience blue", "3-02-1"));
// addState(new DriveToCoordinatesState(robot,"Burnsville audience blue", "2-02-0"));
// addState(new DriveToCoordinatesState(robot,"Burnsville audience blue", "1-02-0"));
// place pixel
addState(new ClawFingerState(robot,"Burnsville audience blue", "0-02-1"));

View File

@@ -3,6 +3,7 @@ package org.timecrafters.CenterStage.Autonomous.CompetitionEngines;
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.hardware.DcMotor;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.CameraVisionState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawArmState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawFingerState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.DriveToCoordinatesState;
@@ -12,7 +13,7 @@ import org.timecrafters.CenterStage.Common.CompetitionRobotV1;
import dev.cyberarm.engine.V2.CyberarmEngine;
@Autonomous(name = "Burnsville audience red")
@Autonomous(name = "Burnsville audience red", preselectTeleOp = "Competition V1 TeleOp")
public class CompetitionBurnsvilleAudienceRed extends CyberarmEngine {
@@ -41,15 +42,15 @@ public class CompetitionBurnsvilleAudienceRed extends CyberarmEngine {
this.robot.setup();
addState(new ClawArmState(robot,"Burnsville audience red", "0-01-0"));
// addState(new CameraVisionState(robot));
addState(new CameraVisionState(robot));
addState(new ClawArmState(robot,"Burnsville audience red", "0-01-1"));
// drive to the left, center, or right spike mark
addState(new DriveToCoordinatesState(robot,"Burnsville audience red", "3-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville audience red", "3-02-1"));
// addState(new DriveToCoordinatesState(robot,"Burnsville audience red", "2-02-0"));
// addState(new DriveToCoordinatesState(robot,"Burnsville audience red", "1-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville audience red", "2-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville audience red", "1-02-0"));
// place pixel
addState(new ClawFingerState(robot,"Burnsville audience red", "0-02-1"));

View File

@@ -3,6 +3,7 @@ package org.timecrafters.CenterStage.Autonomous.CompetitionEngines;
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.hardware.DcMotor;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.CameraVisionState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawArmState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawFingerState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.DriveToCoordinatesState;
@@ -13,7 +14,7 @@ import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersConfig
import dev.cyberarm.engine.V2.CyberarmEngine;
@Autonomous(name = "Burnsville BackDrop blue")
@Autonomous(name = "Burnsville BackDrop blue", preselectTeleOp = "Competition V1 TeleOp")
public class CompetitionBurnsvilleBackDropBlue extends CyberarmEngine {
@@ -42,15 +43,15 @@ public class CompetitionBurnsvilleBackDropBlue extends CyberarmEngine {
this.robot.setup();
addState(new ClawArmState(robot,"Burnsville BackDrop blue", "0-01-0"));
// addState(new CameraVisionState(robot));
addState(new CameraVisionState(robot));
addState(new ClawArmState(robot,"Burnsville BackDrop blue", "0-01-1"));
// drive to the left, center, or right spike mark
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop blue", "3-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop blue", "3-02-1"));
// addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop blue", "2-02-0"));
// addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop blue", "1-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop blue", "2-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop blue", "1-02-0"));
addState(new ClawArmState(robot,"Burnsville BackDrop blue", "0-02-4"));

View File

@@ -3,6 +3,7 @@ package org.timecrafters.CenterStage.Autonomous.CompetitionEngines;
import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.hardware.DcMotor;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.CameraVisionState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawArmState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.ClawFingerState;
import org.timecrafters.CenterStage.Autonomous.CompetitionStates.DriveToCoordinatesState;
@@ -12,7 +13,7 @@ import org.timecrafters.CenterStage.Common.CompetitionRobotV1;
import dev.cyberarm.engine.V2.CyberarmEngine;
@Autonomous(name = "Burnsville BackDrop red")
@Autonomous(name = "Burnsville BackDrop red", preselectTeleOp = "Competition V1 TeleOp")
public class CompetitionBurnsvilleBackDropRed extends CyberarmEngine {
@@ -22,7 +23,6 @@ public class CompetitionBurnsvilleBackDropRed extends CyberarmEngine {
@Override
public void init() {
super.init();
robot.clawArm.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
robot.clawArm.setTargetPosition(0);
robot.clawArm.setPower(0);
robot.clawArm.setMode(DcMotor.RunMode.RUN_TO_POSITION);
@@ -36,19 +36,18 @@ public class CompetitionBurnsvilleBackDropRed extends CyberarmEngine {
this.robot = new CompetitionRobotV1("Burnsville BackDrop red");
addTask(new DriveToCoordinatesTask(robot));
addTask(new OdometryLocalizerTask(robot));
// addTask(new ClawArmControlTask(robot));
this.robot.setup();
addState(new ClawArmState(robot,"Burnsville BackDrop red", "0-01-0"));
// addState(new CameraVisionState(robot));
addState(new CameraVisionState(robot));
addState(new ClawArmState(robot,"Burnsville BackDrop red", "0-01-1"));
// drive to the left, center, or right spike mark
// addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "1-02-0"));
// addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "1-02-1"));
// addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "2-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "1-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "1-02-1"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "2-02-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "3-02-0"));
addState(new ClawArmState(robot,"Burnsville BackDrop red", "0-02-5"));
@@ -67,8 +66,8 @@ public class CompetitionBurnsvilleBackDropRed extends CyberarmEngine {
addState(new ClawArmState(robot,"Burnsville BackDrop red", "0-03-1"));
// addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "1-04-0"));
// addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "2-04-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "1-04-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "2-04-0"));
addState(new DriveToCoordinatesState(robot,"Burnsville BackDrop red", "3-04-0"));
addState(new ClawArmState(robot,"Burnsville BackDrop red", "0-04-1"));

View File

@@ -55,7 +55,7 @@ public class CameraVisionState extends CyberarmState {
@Override
public void exec() {
robot.clawArmControl();
if (System.currentTimeMillis() - initTime > 3000){
if (System.currentTimeMillis() - initTime > 4000){
robot.objectPos = pipeline.objectPos();
setHasFinished(true);
}

View File

@@ -40,11 +40,15 @@ public class DriveToCoordinatesState extends CyberarmState {
@Override
public void start() {
super.start();
robot.hTarget = hTarget;
robot.yTarget = yTarget;
robot.xTarget = xTarget;
robot.yMaxPower = maxYPower;
robot.xMaxPower = maxXPower;
if (posSpecific) {
robot.hTarget = hTarget;
robot.yTarget = yTarget;
robot.xTarget = xTarget;
robot.yMaxPower = maxYPower;
robot.xMaxPower = maxXPower;
} else {
setHasFinished(true);
}
Log.d("TTT?", "" + actionName + " CURRENT POSITION: x: " + robot.positionX + " Y: " + robot.positionY + "h: " + robot.imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.DEGREES));
Log.d("TTT?", "" + actionName + " TARGET POSITION: x: " + robot.xTarget + " Y: " + robot.yTarget + "h: " + robot.hTarget);

View File

@@ -17,6 +17,7 @@ import com.qualcomm.robotcore.util.ElapsedTime;
import org.firstinspires.ftc.robotcore.external.hardware.camera.WebcamName;
import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit;
import org.firstinspires.ftc.robotcore.external.navigation.Position;
import org.openftc.easyopencv.OpenCvCamera;
import org.openftc.easyopencv.OpenCvCameraFactory;
import org.openftc.easyopencv.OpenCvCameraRotation;
@@ -51,7 +52,9 @@ public class CompetitionRobotV1 extends Robot {
// ----------------------------------------------------------------------------------------------------------------- odometry variables:
public static double Hp = 0.8, Hi = 0, Hd = 0;
public static double Xp = -0.03, Xi = 0, Xd = 0;
public static double xvp = -0.03, xvi = 0, xvd = 0;
public static double Yp = 0.03, Yi = 0, Yd = 0;
public static double yvp = 0.03, yvi = 0, yvd = 0;
public double xMultiplier = 1;
public double yMultiplier = 1;
public double positionX = 1000;
@@ -60,6 +63,8 @@ public class CompetitionRobotV1 extends Robot {
public double xTarget = 1000;
public double yTarget = 1000;
public double hTarget = 0;
public double targetVelocityX = 0;
public double targetVelocityY = 0;
public int currentRightPosition = 0;
public int currentLeftPosition = 0;
@@ -75,14 +80,20 @@ public class CompetitionRobotV1 extends Robot {
// heading math variables for pid with imu
public double headingIntegralSum = 0;
public double xIntegralSum = 0;
public double xVeloIntegralSum = 0;
public double yIntegralSum = 0;
public double yVeloIntegralSum = 0;
public final double cm_per_tick = (2 * Math.PI * R) / N;
private double headingLastError = 0;
private double xLastError = 0;
private double xVeloLastError = 0;
private double yLastError = 0;
private double yVeloLastError = 0;
ElapsedTime headingTimer = new ElapsedTime();
ElapsedTime xTimer = new ElapsedTime();
ElapsedTime yTimer = new ElapsedTime();
ElapsedTime xVeloTimer = new ElapsedTime();
ElapsedTime yVeloTimer = new ElapsedTime();
public double frontLeftPower;
public double backLeftPower;
@@ -96,6 +107,11 @@ public class CompetitionRobotV1 extends Robot {
public double rawPidX;
public double rawPidY;
public double xVelocity;
public double yVelocity;
public double deltaTime;
//-------------------------------------------------------------------------------------------------------------- arm sequence variables:
PIDController pidController;
public double power;
@@ -211,6 +227,17 @@ public class CompetitionRobotV1 extends Robot {
// -------------------------------------------------------------------------------------------------------------------------- Functions:
public void velocityChecker(){
long startTime = System.currentTimeMillis();
double oldXpos = positionX;
double oldYpos = positionX;
xVelocity = (oldXpos - positionX) / deltaTime;
yVelocity = (oldYpos - positionY) / deltaTime;
deltaTime = startTime - System.currentTimeMillis();
}
public void OdometryLocalizer() { // ------------------------------------------------------------------------------- Odometry Localizer:
// update positions
@@ -266,6 +293,27 @@ public class CompetitionRobotV1 extends Robot {
double output = (error * Hp) + (derivative * Hd) + (headingIntegralSum * Hi);
return output;
}
public double XVeloPIDControl ( double reference, double current){
double error = (reference - current);
xVeloIntegralSum += error * xVeloTimer.seconds();
double derivative = (error - xVeloLastError) / xVeloTimer.seconds();
xTimer.reset();
double output = (error * xvp) + (derivative * xvd) + (xIntegralSum * xvi);
return output;
}
public double YVeloPIDControl ( double reference, double current){
double error = (reference - current);
yVeloIntegralSum += error * yVeloTimer.seconds();
double derivative = (error - yVeloLastError) / xTimer.seconds();
xTimer.reset();
double output = (error * yvp) + (derivative * yvd) + (yVeloIntegralSum * yvi);
return output;
}
public double XPIDControl ( double reference, double current){
double error = (reference - current);
@@ -322,6 +370,8 @@ public class CompetitionRobotV1 extends Robot {
public void DriveToCoordinates () {
// determine the powers needed for each direction
// this uses PID to adjust needed Power for robot to move to target
XVeloPIDControl(targetVelocityX, xVelocity);
XVeloPIDControl(targetVelocityY, yVelocity);
double heading = imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.RADIANS);
double rx = HeadingPIDControl(Math.toRadians(hTarget), heading);

View File

@@ -257,16 +257,6 @@ public class CompetitionTeleOpState extends CyberarmState {
}
}
if (Objects.equals(armPos, "passive")) {
if (robot.lift.getCurrentPosition() >= 20) {
robot.chinUpServo.setPosition(chinUpServoDown);
robot.lift.setPower(-0.6);
} else {
robot.shoulder.setPosition(robot.shoulderPassive);
target = 570;
}
}
if (Objects.equals(armPos, "lift up")) {
robot.shoulder.setPosition(robot.shoulderCollect);
robot.elbow.setPosition(robot.elbowDeposit);
@@ -303,8 +293,6 @@ public class CompetitionTeleOpState extends CyberarmState {
super.init();
pidController = new PIDController(p, i, d);
robot.imu.resetYaw();
robot.clawArm.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
robot.clawArm.setTargetPosition(0);
robot.clawArm.setPower(0);
robot.clawArm.setMode(DcMotor.RunMode.RUN_TO_POSITION);

View File

@@ -22,7 +22,7 @@ import dev.cyberarm.engine.V2.GamepadChecker;
public class SodiPizzaTeleOPState extends CyberarmState {
final private SodiPizzaMinibotObject robot;
private long lastMoveTime, lastDistRead /* <- last time Distance was read*/;
private long lastMoveTime, lastDistRead /* <- last time Distance was read*/, startingTime;
public double drivePower;
public final double minInput = 0.1 /* <- Minimum input from stick to send command */;
public double lastToldAngle /* <- The angle the bot was last told to stop at */, proportion, integral, derivative;
@@ -87,6 +87,7 @@ public class SodiPizzaTeleOPState extends CyberarmState {
lastMoveTime = System.currentTimeMillis();
lastDistRead = System.currentTimeMillis();
startingTime = System.currentTimeMillis();
robot.distSensor.getDistance(DistanceUnit.MM);
}
@@ -94,42 +95,27 @@ public class SodiPizzaTeleOPState extends CyberarmState {
@Override
public void exec() {
double y = -engine.gamepad1.left_stick_y; // Remember, this is reversed!
double x = engine.gamepad1.left_stick_x;
if(System.currentTimeMillis() - startingTime <= 2000) {
getApproxObjPos();
}
double y = -engine.gamepad1.left_stick_y; // Remember, Y stick value is reversed
double x = engine.gamepad1.left_stick_x * 1.1; // Counteract imperfect strafing
double rx = engine.gamepad1.right_stick_x;
double lbPower = (y - x + rx);
double rbPower = (y + x - rx);
double lfPower = (y + x + rx);
double rfPower = (y - x - rx);
// Denominator is the largest motor power (absolute value) or 1
// This ensures all the powers maintain the same ratio,
// but only if at least one is out of the range [-1, 1]
double denominator = Math.max(Math.abs(y) + Math.abs(x) + Math.abs(rx), 1);
double frontLeftPower = (y + x + rx) / denominator;
double backLeftPower = (y - x + rx) / denominator;
double frontRightPower = (y - x - rx) / denominator;
double backRightPower = (y + x - rx) / denominator;
robot.leftFront.setPower(lfPower * drivePower);
robot.leftBack.setPower(lbPower * drivePower);
robot.rightFront.setPower(rfPower * drivePower);
robot.rightBack.setPower(rbPower * drivePower);
/* For some reason, the robot reacts to both positive and negative direction from sticks as positive.
(It moves forward when I make it go forward, and forward when I make it go backward, as well as for strafing and turning.)*/
if (Math.abs(engine.gamepad1.left_stick_x) >= 0.1) {
drivePower = engine.gamepad1.left_stick_x;
// robot.leftFront.setPower(lfPower * drivePower);
// robot.leftBack.setPower(lbPower * drivePower);
// robot.rightFront.setPower(rfPower * drivePower);
// robot.rightBack.setPower(rbPower * drivePower);
}else if (Math.abs(engine.gamepad1.left_stick_y) >= 0.1) {
drivePower = engine.gamepad1.left_stick_y;
// robot.leftFront.setPower(lfPower * drivePower);
// robot.leftBack.setPower(lbPower * drivePower);
// robot.rightFront.setPower(rfPower * drivePower);
// robot.rightBack.setPower(rbPower * drivePower);
}else if (Math.abs(engine.gamepad1.right_stick_x) >= 0.1) {
drivePower = engine.gamepad1.right_stick_x;
// robot.leftFront.setPower(lfPower * drivePower);
// robot.leftBack.setPower(lbPower * drivePower);
// robot.rightFront.setPower(rfPower * drivePower);
// robot.rightBack.setPower(rbPower * drivePower);
}
robot.leftFront.setPower(frontLeftPower);
robot.leftBack.setPower(backLeftPower);
robot.rightFront.setPower(frontRightPower);
robot.rightBack.setPower(backRightPower);
if (engine.gamepad2.left_stick_button) {