-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathAlignCommand.java
101 lines (87 loc) · 3.47 KB
/
AlignCommand.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package frc.robot.commands.actions;
import java.util.Map;
import edu.wpi.first.wpilibj2.command.CommandBase;
import frc.robot.Constants;
import frc.robot.Constants.DriveConstants;
import frc.robot.RobotState.States;
import frc.robot.RobotContainer;
import frc.robot.subsystems.DriveTrainSubsystem;
import frc.robot.subsystems.DriveTrainSubsystem.DriveModes;
import frc.robot.utils.LimeLight;
import frc.robot.utils.PIDFController;
public class AlignCommand extends CommandBase {
private DriveTrainSubsystem m_drive;
private PIDFController angleController = new PIDFController("Angle", Constants.VisionConstants.kP,
Constants.VisionConstants.kI, Constants.VisionConstants.kD, 0);
/**
* Creates a new AlignCommand.
*/
public AlignCommand(DriveTrainSubsystem drive) {
// Use addRequirements() here to declare subsystem dependencies.
m_drive = drive;
addRequirements(m_drive);
angleController.setTolerance(1, 1);
}
// Called when the command is initially scheduled.
@Override
public void initialize() {
LimeLight.getInstance().turnLightOn();
m_drive.setDriveMode(DriveTrainSubsystem.DriveModes.AUTO);
System.out.println("STARTING ALIGN COMMAND");
if (LimeLight.getInstance().getPipeIndex() == 0) {
angleController.setPID(Constants.VisionConstants.kP, Constants.VisionConstants.kI,
Constants.VisionConstants.kD);
} else {
angleController.setPID(Constants.VisionConstants.kP_far, Constants.VisionConstants.kI_far,
Constants.VisionConstants.kD_far);
}
}
// Called every time the scheduler runs while the command is scheduled.
@Override
public void execute() {
Constants.m_RobotState.setState(States.ALIGNING);
if (m_drive.getDriveMode() == DriveTrainSubsystem.DriveModes.AUTO && LimeLight.getInstance().hasValidTarget()) {
double angle = -angleController.calculate(LimeLight.getInstance().getXAngle());
double output = Constants.DriveConstants.ksVolts + angle;
m_drive.tankDriveVolts(output, -output);
m_drive.feedMotorSafety();
} else if (!LimeLight.getInstance().hasValidTarget()) {
m_drive.drive(0, -0.6, true);
} else {
m_drive.feedMotorSafety();
m_drive.stop();
}
Map<String, Double> sticks = RobotContainer.getController().getSticks();
if (Math.abs(sticks.get("LSX")) > .2 || Math.abs(sticks.get("LSY")) > .2 || Math.abs(sticks.get("RSX")) > .2
|| Math.abs(sticks.get("RSY")) > .2) {
m_drive.setDriveMode(DriveModes.MANUAL);
}
}
// Called once the command ends or is interrupted.
@Override
public void end(boolean interrupted) {
m_drive.stop();
angleController.reset();
m_drive.setDriveMode(DriveModes.MANUAL);
Constants.m_RobotState.setState(States.ALIGNED);
}
// Returns true when the command should end.
@Override
public boolean isFinished() {
if (m_drive.getDriveMode() == DriveModes.MANUAL) {
System.out.println("ENDED BC MANUAL");
return true;
} else if (angleController.atSetpoint() && LimeLight.getInstance().hasValidTarget()) {
System.out.println("ENDED BC AT ANGLE");
return true;
} else {
return false;
}
}
}