Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.42 KB | None | 0 0
  1. package org.igutech.autonomous.AutoPrograms;
  2.  
  3. import com.acmerobotics.dashboard.FtcDashboard;
  4. import com.acmerobotics.dashboard.config.Config;
  5. import com.acmerobotics.roadrunner.geometry.Pose2d;
  6. import com.acmerobotics.roadrunner.geometry.Vector2d;
  7. import com.acmerobotics.roadrunner.path.heading.LinearInterpolator;
  8. import com.acmerobotics.roadrunner.trajectory.Trajectory;
  9. import com.acmerobotics.roadrunner.trajectory.TrajectoryBuilder;
  10. import com.acmerobotics.roadrunner.trajectory.constraints.DriveConstraints;
  11. import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
  12. import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
  13.  
  14. import org.apache.commons.math3.util.FastMath;
  15. import org.firstinspires.ftc.robotcore.external.Telemetry;
  16. import org.igutech.autonomous.roadrunner.IguMecanumDriveBase;
  17. import org.igutech.autonomous.util.AutoCVUtil;
  18. import org.igutech.autonomous.util.AutoUtilManager;
  19. import org.igutech.utils.FTCMath;
  20. import org.igutech.utils.control.PIDController;
  21.  
  22. import kotlin.Unit;
  23.  
  24. import static org.igutech.autonomous.roadrunner.MecanumDriveBase.BASE_CONSTRAINTS;
  25.  
  26. @Config
  27. @Autonomous(name = "RedRoadRunnerDepot", group = "igutech")
  28. public class RedRoadRunnerDepot extends LinearOpMode {
  29.  
  30.     DriveConstraints slowConstraints = new DriveConstraints(
  31.             35, 30, BASE_CONSTRAINTS.maxJerk,
  32.             BASE_CONSTRAINTS.maxAngVel, BASE_CONSTRAINTS.maxAngAccel, BASE_CONSTRAINTS.maxAngJerk);
  33.     DriveConstraints Constraints = new DriveConstraints(
  34.             BASE_CONSTRAINTS.maxVel, BASE_CONSTRAINTS.maxAccel, BASE_CONSTRAINTS.maxJerk,
  35.             BASE_CONSTRAINTS.maxAngVel, BASE_CONSTRAINTS.maxAngAccel, BASE_CONSTRAINTS.maxAngJerk);
  36.  
  37.     FtcDashboard dashboard = FtcDashboard.getInstance();
  38.     Telemetry dashboardTelemetry = dashboard.getTelemetry();
  39.  
  40.     private PIDController elevatorController = new PIDController(0.02, 0.0, 0.0);
  41.     private int level = 0;
  42.     private final int TICK_PER_STONE = 120;
  43.  
  44.     private TrajectoryState state = TrajectoryState.PREPARE_TO_INTAKE;
  45.     AutoUtilManager manager = new AutoUtilManager(hardwareMap, "RedRoadRunnerDepot");
  46.     IguMecanumDriveBase drive = new IguMecanumDriveBase(manager);
  47.     Trajectory patternBPrepareToIntake = new TrajectoryBuilder(drive.getPoseEstimate(), Constraints)
  48.             .back(13.0)
  49.             .strafeRight(42.0)
  50.             .addMarker(() -> {
  51.                 changeState(TrajectoryState.INTAKE);
  52.                 return Unit.INSTANCE;
  53.             })
  54.             .build();
  55.  
  56.     @Override
  57.     public void runOpMode() throws InterruptedException {
  58.         manager.getDriveUtil().resetEncoders();
  59.         drive.setPoseEstimate(new Pose2d(50.0, -63.0, Math.toRadians(-180.0)));
  60.  
  61.  
  62.         manager.getHardware().getServos().get("FoundationServo_left").setPosition(0.1);
  63.         manager.getHardware().getServos().get("FoundationServo_right").setPosition(0.2);
  64.         manager.getHardware().getServos().get("TransferServo").setPosition(0.43);
  65.         manager.getHardware().getServos().get("GrabberServo").setPosition(0.1);
  66.         manager.getHardware().getServos().get("CapServo").setPosition(0.54);
  67.  
  68.  
  69.         manager.getCvUtil().activate();
  70.         AutoCVUtil.Pattern pattern = AutoCVUtil.Pattern.UNKNOWN;
  71.  
  72.         while (!opModeIsActive() && !isStopRequested()) {
  73.             AutoCVUtil.Pattern currentPattern = manager.getCvUtil().getPattern();
  74.             if (!currentPattern.equals(AutoCVUtil.Pattern.UNKNOWN))
  75.                 pattern = currentPattern;
  76.             telemetry.addData("status", "waiting for start command...");
  77.             telemetry.addData("pattern", pattern);
  78.             telemetry.addData("currentPattern", currentPattern);
  79.             telemetry.update();
  80.  
  81.         }
  82.  
  83.         if (isStopRequested()) return;
  84.         final AutoCVUtil.Pattern patternFinal = pattern;
  85.         telemetry.addData("Final Pattern", patternFinal);
  86.         telemetry.update();
  87.  
  88.         new Thread(() -> {
  89.             manager.getCvUtil().shutdown();
  90.         }).start();
  91.         while (!isStopRequested()) {
  92.             if (pattern == AutoCVUtil.Pattern.PATTERN_A) {
  93.  
  94.  
  95.             } else if (pattern == AutoCVUtil.Pattern.PATTERN_B) {
  96.                 changeState(TrajectoryState.PREPARE_TO_INTAKE);
  97.  
  98.             } else if (pattern == AutoCVUtil.Pattern.PATTERN_C) {
  99.  
  100.  
  101.             } else {
  102.  
  103.             }
  104.  
  105.             Pose2d currentPose = drive.getPoseEstimate();
  106.             dashboardTelemetry.addData("x", currentPose.getX());
  107.             dashboardTelemetry.addData("y", currentPose.getY());
  108.             dashboardTelemetry.addData("heading", currentPose.getHeading());
  109.             dashboardTelemetry.addData("x error", drive.getLastError().getX());
  110.             dashboardTelemetry.addData("y error", drive.getLastError().getY());
  111.             dashboardTelemetry.addData("heading error", drive.getLastError().getHeading());
  112.             dashboardTelemetry.update();
  113.             drive.update();
  114.         }
  115.  
  116.  
  117.     }
  118.  
  119.     public synchronized void changeState(TrajectoryState changeState) {
  120.         switch (changeState) {
  121.             case PREPARE_TO_INTAKE:
  122.                 drive.followTrajectory(patternBPrepareToIntake);
  123.                 break;
  124.             case INTAKE:
  125.                 Trajectory patternBIntake = new TrajectoryBuilder(patternBPrepareToIntake.end(), slowConstraints)
  126.                         .lineTo(new Vector2d(-28.0, -21.0), new LinearInterpolator(Math.toRadians(180.0), Math.toRadians(0.0)))
  127.                         //strafe right
  128.                         .lineTo(new Vector2d(-28.0, -40.0), new LinearInterpolator(Math.toRadians(180.0), Math.toRadians(0.0)))
  129.                         .addMarker(() -> {
  130.                             changeState(TrajectoryState.MOVE_FOUNDATION);
  131.                             return Unit.INSTANCE;
  132.                         })
  133.                         .build();
  134.                 drive.followTrajectory(patternBIntake);
  135.                 break;
  136.             case MOVE_TO_FOUNDATION:
  137.                 Trajectory patternBMoveToFoundation = new TrajectoryBuilder(drive.getFollower().getTrajectory().end(), Constraints)
  138.                         .lineTo(new Vector2d(30.0, -40.0), new LinearInterpolator(Math.toRadians(180.0), Math.toRadians(0.0)))
  139.                         //turns
  140.                         .lineTo(new Vector2d(50.0, -30.0), new LinearInterpolator(Math.toRadians(180.0), Math.toRadians(90.0)))
  141.                         .addMarker(() -> {
  142.                             changeState(TrajectoryState.MOVE_TO_SECOND_STONE);
  143.                             return Unit.INSTANCE;
  144.                         })
  145.                         .build();
  146.                 drive.followTrajectory(patternBMoveToFoundation);
  147.  
  148.             level=1;
  149.             int setPoint = level * TICK_PER_STONE;
  150.             elevatorController.updateSetpoint(setPoint);
  151.             if (Math.abs(setPoint - manager.getHardware().getMotors().get("stoneElevator").getCurrentPosition()) > 50) {
  152.                 elevatorController.reset(manager.getHardware().getMotors().get("stoneElevator").getCurrentPosition());
  153.             }
  154.             double power = elevatorController.update(manager.getHardware().getMotors().get("stoneElevator").getCurrentPosition());
  155.             power = FTCMath.clamp(-0.5, 0.5, power);
  156.            manager.getHardware().getMotors().get("stoneElevator").setPower(power);
  157.  
  158.                 break;
  159.             case MOVE_TO_SECOND_STONE:
  160.                 Trajectory patternBMoveToSecondStone = new TrajectoryBuilder(drive.getFollower().getTrajectory().end(), Constraints)
  161.                         .lineTo(new Vector2d(50.0, -40.0), new LinearInterpolator(Math.toRadians(-90.0), Math.toRadians(0.0)))
  162.                         //strafe right
  163.                         .lineTo(new Vector2d(-30.0, -40.0), new LinearInterpolator(Math.toRadians(-90.0), Math.toRadians(0.0)))
  164.                         //turn for second intake
  165.                         .lineTo(new Vector2d(-50.0, -21.0), new LinearInterpolator(Math.toRadians(-90.0), Math.toRadians(-90.0)))
  166.                         .addMarker(() -> {
  167.                             changeState(TrajectoryState.INTAKE_SECOND_STONE);
  168.                             return Unit.INSTANCE;
  169.                         })
  170.                         .build();
  171.  
  172.         }
  173.  
  174.     }
  175.  
  176.  
  177.     private enum TrajectoryState {
  178.         PREPARE_TO_INTAKE,
  179.         INTAKE,
  180.         MOVE_TO_FOUNDATION,
  181.         STACKING,
  182.         MOVE_TO_SECOND_STONE,
  183.         INTAKE_SECOND_STONE,
  184.         MOVE_FOUNDATION,
  185.         PARK
  186.     }
  187.  
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement