From 77c103ecc2fa002688ba7bcddcb3dad4786dde1c Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Tue, 24 Jan 2023 21:03:50 -0600 Subject: [PATCH] Disable time de-bouncing from GamepadChecker (This already appears to be done for us), misc changes for CHIRON --- .idea/deploymentTargetDropDown.xml | 17 +++++++ .../cyberarm/engine/V2/GamepadChecker.java | 2 +- .../minibots/cyberarm/chiron/Robot.java | 35 ++++++++----- .../chiron/states/autonomous/Move.java | 49 +++++++++++-------- .../states/teleop/ArmDriverControl.java | 32 +++++++----- .../teleop/DrivetrainDriverControl.java | 2 + 6 files changed, 91 insertions(+), 46 deletions(-) create mode 100644 .idea/deploymentTargetDropDown.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..7fb6c55 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TeamCode/src/main/java/org/cyberarm/engine/V2/GamepadChecker.java b/TeamCode/src/main/java/org/cyberarm/engine/V2/GamepadChecker.java index e9b551c..704c077 100644 --- a/TeamCode/src/main/java/org/cyberarm/engine/V2/GamepadChecker.java +++ b/TeamCode/src/main/java/org/cyberarm/engine/V2/GamepadChecker.java @@ -13,7 +13,7 @@ public class GamepadChecker { private final Gamepad gamepad; private final HashMap buttons = new HashMap<>(); private final HashMap buttonsDebounceInterval = new HashMap<>(); - private final long debounceTime = 20L; // ms + private final long debounceTime = 0L; // ms public GamepadChecker(CyberarmEngine engine, Gamepad gamepad) { this.engine = engine; diff --git a/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/Robot.java b/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/Robot.java index ee9c218..c603ebf 100644 --- a/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/Robot.java +++ b/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/Robot.java @@ -7,6 +7,7 @@ import com.acmerobotics.roadrunner.geometry.Vector2d; import com.qualcomm.hardware.lynx.LynxModule; import com.qualcomm.hardware.rev.RevHubOrientationOnRobot; import com.qualcomm.robotcore.hardware.Blinker; +import com.qualcomm.robotcore.hardware.CRServoImplEx; import com.qualcomm.robotcore.hardware.ColorSensor; import com.qualcomm.robotcore.hardware.DcMotor; import com.qualcomm.robotcore.hardware.DcMotorEx; @@ -32,7 +33,8 @@ import java.util.concurrent.TimeUnit; public class Robot { private static final String TAG = "CHIRON | Robot"; public final DcMotorEx backLeftDrive, frontRightDrive, frontLeftDrive, backRightDrive, arm; - public final ServoImplEx gripper, wrist; + public final ServoImplEx gripper; + public final CRServoImplEx wrist; public final IMU imu; public final ColorSensor indicatorA, indicatorB; public LynxModule expansionHub; @@ -102,7 +104,7 @@ public class Robot { arm = engine.hardwareMap.get(DcMotorEx.class, "lift_drive"); // MOTOR PORT: ? gripper = engine.hardwareMap.get(ServoImplEx.class, "gripper"); // SERVO PORT: ? - wrist = engine.hardwareMap.get(ServoImplEx.class, "wrist"); // SERVO PORT: ? + wrist = engine.hardwareMap.get(CRServoImplEx.class, "wrist"); // SERVO PORT: ? indicatorA = engine.hardwareMap.colorSensor.get("indicator_A"); // I2C indicatorB = engine.hardwareMap.colorSensor.get("indicator_B"); // I2C @@ -141,17 +143,19 @@ public class Robot { arm.setZeroPowerBehavior(DcMotor.ZeroPowerBehavior.BRAKE); // MOTOR POWER - arm.setVelocity( - angleToTicks(tuningConfig("arm_velocity_in_degrees_per_second").value())); +// arm.setVelocity( +// angleToTicks(tuningConfig("arm_velocity_in_degrees_per_second").value())); + arm.setPower(0.75); // SERVOS (POSITIONAL) // Gripper gripper.setDirection(hardwareConfig("gripper_direction_forward").value() ? Servo.Direction.FORWARD : Servo.Direction.REVERSE); gripper.setPosition(tuningConfig("gripper_initial_position").value()); + // SERVOS (CONTINUOUS) // Wrist - wrist.setDirection(hardwareConfig("wrist_direction_forward").value() ? Servo.Direction.FORWARD : Servo.Direction.REVERSE); - wrist.setPosition(tuningConfig("wrist_initial_position").value()); + wrist.setDirection(hardwareConfig("wrist_direction_forward").value() ? DcMotorSimple.Direction.FORWARD : DcMotorSimple.Direction.REVERSE); + wrist.setPower(tuningConfig("wrist_up_power").value()); // SENSORS // COLOR SENSORS @@ -232,7 +236,7 @@ public class Robot { engine.telemetry.addLine(); - engine.telemetry.addData(" Arm", "%d (%8.2f in)", arm.getTargetPosition(), ticksToUnit(DistanceUnit.INCH, arm.getTargetPosition())); + engine.telemetry.addData(" Arm", "%d (%8.2f degrees)", arm.getTargetPosition(), ticksToAngle(arm.getTargetPosition())); // Motor Velocity engine.telemetry.addLine("Motor Velocity"); @@ -283,7 +287,7 @@ public class Robot { engine.telemetry.addData(" Gripper Enabled", gripper.isPwmEnabled()); engine.telemetry.addLine(); engine.telemetry.addData(" Wrist Direction", wrist.getDirection()); - engine.telemetry.addData(" Wrist Position", wrist.getPosition()); + engine.telemetry.addData(" Wrist Power", wrist.getPower()); engine.telemetry.addData(" Wrist Enabled", wrist.isPwmEnabled()); engine.telemetry.addLine(); @@ -293,6 +297,7 @@ public class Robot { engine.telemetry.addData(" Facing (Degrees)", facing()); engine.telemetry.addData(" Heading (Radians)", heading()); engine.telemetry.addData(" Turn Rate", turnRate()); + engine.telemetry.addData(" Angle Offset (Degrees)", imuAngleOffset); engine.telemetry.addLine(); @@ -566,7 +571,10 @@ public class Robot { double lastTiming = motorVelocityLastTiming.getOrDefault("Arm", time); double deltaTime = (time - lastTiming) * 0.001; - double error = targetVelocity - arm.getVelocity(); + double distanceToTarget = arm.getTargetPosition() - arm.getCurrentPosition(); + double adjustedTargetVelocity = Math.abs(distanceToTarget) < targetVelocity ? Math.abs(distanceToTarget) : targetVelocity; + + double error = adjustedTargetVelocity - arm.getVelocity(); double kp = 0.9; newTargetVelocity += error * kp * deltaTime; @@ -574,7 +582,9 @@ public class Robot { motorTargetVelocity.put("Arm", newTargetVelocity); motorVelocityLastTiming.put("Arm", time); - arm.setVelocity(newTargetVelocity); +// arm.setVelocity(newTargetVelocity); + + arm.setPower(0.75); } public double getVoltage() { @@ -584,11 +594,12 @@ public class Robot { public double facing() { double imuDegrees = -imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.DEGREES); - return (imuDegrees + imuAngleOffset + 360.0) % 360.0; + return (((imuDegrees + 360.0) % 360.0) + imuAngleOffset) % 360.0; } public double heading() { - return imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.RADIANS); + return AngleUnit.normalizeRadians(-facing() * Math.PI / 180.0); +// return imu.getRobotYawPitchRollAngles().getYaw(AngleUnit.RADIANS); } public double turnRate() { diff --git a/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/autonomous/Move.java b/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/autonomous/Move.java index 8dceebd..fda2ea3 100644 --- a/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/autonomous/Move.java +++ b/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/autonomous/Move.java @@ -8,7 +8,7 @@ public class Move extends CyberarmState { private final Robot robot; private final String groupName, actionName; - private final double positionXInInches, positionYInInches, toleranceInInches, facing, targetVelocity, timeInMS; + private final double targetDistance, tolerance, facing, targetVelocity, timeInMS; private final double maxVelocity; private double speed; @@ -21,11 +21,10 @@ public class Move extends CyberarmState { this.groupName = groupName; this.actionName = actionName; - positionXInInches = robot.getConfiguration().variable(groupName, actionName, "positionXInInches").value(); - positionYInInches = robot.getConfiguration().variable(groupName, actionName, "positionYInInches").value(); - toleranceInInches = robot.getConfiguration().variable(groupName, actionName, "toleranceInInches").value(); + targetDistance = robot.unitToTicks(DistanceUnit.INCH, robot.getConfiguration().variable(groupName, actionName, "targetDistanceInInches").value()); + tolerance = robot.unitToTicks(DistanceUnit.INCH, robot.getConfiguration().variable(groupName, actionName, "toleranceInInches").value()); facing = robot.getConfiguration().variable(groupName, actionName, "facing").value(); - targetVelocity = robot.unitToTicks(DistanceUnit.INCH, robot.getConfiguration().variable(groupName, actionName, "targetVelocity").value()); + targetVelocity = robot.unitToTicks(DistanceUnit.INCH, robot.getConfiguration().variable(groupName, actionName, "targetVelocityInInches").value()); timeInMS = robot.getConfiguration().variable(groupName, actionName, "timeInMS").value(); stateDisabled = !robot.getConfiguration().action(groupName, actionName).enabled; @@ -36,7 +35,7 @@ public class Move extends CyberarmState { @Override public void start() { // TODO: Use a dead wheel for this - distanceAlreadyTravelled = robot.frontLeftDrive.getCurrentPosition(); + distanceAlreadyTravelled = robot.frontRightDrive.getCurrentPosition(); } @Override @@ -55,23 +54,33 @@ public class Move extends CyberarmState { return; } - // TODO: Double check maths -// int travelledDistance = (robot.frontLeftDrive.getCurrentPosition() - distanceAlreadyTravelled); -// int targetDistance = robot.unitToTicks(DistanceUnit.INCH, distanceInInches); -// int tolerance = robot.unitToTicks(DistanceUnit.INCH, toleranceInInches); -// -// if (robot.isBetween(targetDistance, travelledDistance - tolerance, travelledDistance + tolerance)) { -// stop(); -// -// setHasFinished(true); -// -// return; -// } + int travelledDistance = -robot.frontRightDrive.getCurrentPosition() - distanceAlreadyTravelled; - move(); + if (robot.isBetween(travelledDistance, targetDistance - tolerance, targetDistance + tolerance)) { + stop(); + + setHasFinished(true); + + return; + } + + moveDirectional(travelledDistance); } - private void move() { + private void moveDirectional(double travelledDistance) { + // TODO: Ease-in-out velocity + double velocity = targetVelocity; + + if (targetDistance > travelledDistance) { + robot.frontRightDrive.setVelocity(-velocity); + robot.backLeftDrive.setVelocity(-velocity); + } else { + robot.frontRightDrive.setVelocity(velocity); + robot.backLeftDrive.setVelocity(velocity); + } + } + + private void moveOmni() { if (Math.abs(speed) > maxVelocity) { speed = speed < 0 ? -maxVelocity : maxVelocity; } diff --git a/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/teleop/ArmDriverControl.java b/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/teleop/ArmDriverControl.java index 9536ce7..937e852 100644 --- a/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/teleop/ArmDriverControl.java +++ b/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/teleop/ArmDriverControl.java @@ -78,18 +78,22 @@ public class ArmDriverControl extends CyberarmState { return; } - double stepInterval = robot.tuningConfig("wrist_manual_step_interval").value(); - double stepSize = robot.tuningConfig("wrist_manual_step_size").value(); + double stepPower = robot.tuningConfig("wrist_manual_step_power").value(); - if ((controller.dpad_left || controller.dpad_right) && runTime() - lastArmManualControlTime >= stepInterval) { - lastArmManualControlTime = runTime(); + if ((controller.dpad_left || controller.dpad_right)) { + robot.wristManuallyControlled = true; if (controller.dpad_left) { // Wrist Left - robot.wrist.setPosition(robot.wrist.getPosition() - stepSize); + robot.wrist.setPower(stepPower); - } else if (controller.dpad_right) { // Wrist Right - robot.wrist.setPosition(robot.wrist.getPosition() + stepSize); } + if (controller.dpad_right) { // Wrist Right + robot.wrist.setPower(-stepPower); + } + } + + if (!controller.dpad_left && !controller.dpad_right) { + robot.wrist.setPower(0); } } @@ -103,7 +107,7 @@ public class ArmDriverControl extends CyberarmState { private void automatics() { if (!robot.hardwareFault) { - automaticWrist(); +// automaticWrist(); automaticArmVelocity(); } @@ -118,9 +122,9 @@ public class ArmDriverControl extends CyberarmState { double angle = robot.tuningConfig("wrist_auto_rotate_angle").value(); if (robot.ticksToAngle(robot.arm.getCurrentPosition()) >= angle) { - robot.wrist.setPosition(robot.tuningConfig("wrist_deposit_position").value()); + robot.wrist.setPower(robot.tuningConfig("wrist_up_power").value()); } else { - robot.wrist.setPosition(robot.tuningConfig("wrist_collect_position").value()); + robot.wrist.setPower(robot.tuningConfig("wrist_down_power").value()); } } @@ -209,11 +213,13 @@ public class ArmDriverControl extends CyberarmState { if (button.equals("dpad_down")) { robot.wristManuallyControlled = false; - robot.wrist.setPosition(robot.tuningConfig("wrist_deposit_position").value()); - } else if (button.equals("dpad_up")) { + robot.wrist.setPower(robot.tuningConfig("wrist_up_power").value()); + } + + if (button.equals("dpad_up")) { robot.wristManuallyControlled = false; - robot.wrist.setPosition(robot.tuningConfig("wrist_collect_position").value()); + robot.wrist.setPower(robot.tuningConfig("wrist_down_power").value()); } // Automatic Arm Control diff --git a/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/teleop/DrivetrainDriverControl.java b/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/teleop/DrivetrainDriverControl.java index cd0ccf6..881643a 100644 --- a/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/teleop/DrivetrainDriverControl.java +++ b/TeamCode/src/main/java/org/timecrafters/minibots/cyberarm/chiron/states/teleop/DrivetrainDriverControl.java @@ -1,5 +1,6 @@ package org.timecrafters.minibots.cyberarm.chiron.states.teleop; +import com.acmerobotics.roadrunner.geometry.Vector2d; import com.qualcomm.robotcore.hardware.Gamepad; import org.cyberarm.engine.V2.CyberarmState; @@ -48,6 +49,7 @@ public class DrivetrainDriverControl extends CyberarmState { double y = invertRobotForward ? controller.left_stick_y : -controller.left_stick_y; double x = (invertRobotForward && !fieldCentricControl ? controller.left_stick_x : -controller.left_stick_x) * 1.1; // Counteract imperfect strafing + double rx = -controller.right_stick_x; double denominator = Math.max(Math.abs(y) + Math.abs(x) + Math.abs(rx), 1);