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 cf2d4ea..ee9c218 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 @@ -46,6 +46,7 @@ public class Robot { private final CopyOnWriteArrayList reportedStatuses = new CopyOnWriteArrayList<>(); private final ConcurrentHashMap motorVelocityError = new ConcurrentHashMap<>(); private final ConcurrentHashMap motorVelocityLastTiming = new ConcurrentHashMap<>(); + private final ConcurrentHashMap motorTargetVelocity = new ConcurrentHashMap<>(); public enum ArmPosition { COLLECT, @@ -558,6 +559,24 @@ public class Robot { ", targetVelocity: " + targetVelocity + " ticks, new Target Velocity: " + newTargetVelocity + " ticks, + motorVelocity: " + motor.getVelocity() + " ticks."); } + @SuppressLint("NewApi") + public void controlArmMotor(double targetVelocity) { + double time = System.currentTimeMillis(); + double newTargetVelocity = motorTargetVelocity.getOrDefault("Arm", targetVelocity); + double lastTiming = motorVelocityLastTiming.getOrDefault("Arm", time); + double deltaTime = (time - lastTiming) * 0.001; + + double error = targetVelocity - arm.getVelocity(); + double kp = 0.9; + + newTargetVelocity += error * kp * deltaTime; + + motorTargetVelocity.put("Arm", newTargetVelocity); + motorVelocityLastTiming.put("Arm", time); + + arm.setVelocity(newTargetVelocity); + } + public double getVoltage() { return engine.hardwareMap.voltageSensor.iterator().next().getVoltage(); } 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 be5aca9..9536ce7 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 @@ -127,11 +127,15 @@ public class ArmDriverControl extends CyberarmState { private void automaticArmVelocity() { robot.arm.setMode(DcMotor.RunMode.RUN_TO_POSITION); - robot.controlMotorPIDF( - robot.arm, - "Arm", - robot.angleToTicks(robot.tuningConfig("arm_velocity_in_degrees_per_second").value()), - 12.0 / robot.getVoltage()); + // robot.controlMotorPIDF( + // robot.arm, + // "Arm", + // robot.angleToTicks(robot.tuningConfig("arm_velocity_in_degrees_per_second").value()), + // 12.0 / robot.getVoltage()); + + robot.controlArmMotor( + robot.angleToTicks(robot.tuningConfig("arm_velocity_in_degrees_per_second").value()) + ); } private void automaticHardwareMonitor() {