20
20
* A command class to assist in the intaking of a game piece.
21
21
*/
22
22
public class IntakeAssistCommand extends ParallelCommandGroup {
23
- private static final ProfiledPIDController
23
+ static final ProfiledPIDController
24
24
X_PID_CONTROLLER = RobotHardwareStats .isSimulation () ?
25
25
new ProfiledPIDController (0.5 , 0 , 0 , new TrapezoidProfile .Constraints (2.8 , 5 )) :
26
26
new ProfiledPIDController (2.4 , 0 , 0 , new TrapezoidProfile .Constraints (2.65 , 5.5 )),
@@ -42,7 +42,7 @@ public IntakeAssistCommand(AssistMode assistMode) {
42
42
getTrackGamePieceCommand (),
43
43
GeneralCommands .getContinuousConditionalCommand (
44
44
GeneralCommands .getFieldRelativeDriveCommand (),
45
- getAssistIntakeCommand (assistMode , () -> distanceFromTrackedGamePiece ),
45
+ getAssistIntakeCommand (assistMode , () -> distanceFromTrackedGamePiece , OperatorConstants . INTAKE_ASSIST_SCALAR ),
46
46
() -> RobotContainer .CORAL_POSE_ESTIMATOR .getClosestObjectToRobot () == null || distanceFromTrackedGamePiece == null
47
47
)
48
48
);
@@ -57,50 +57,62 @@ public IntakeAssistCommand(AssistMode assistMode) {
57
57
* @param distanceFromTrackedGamePiece the position of the game piece relative to the robot
58
58
* @return the command
59
59
*/
60
- public static Command getAssistIntakeCommand (AssistMode assistMode , Supplier <Translation2d > distanceFromTrackedGamePiece ) {
60
+ public static Command getAssistIntakeCommand (AssistMode assistMode , Supplier <Translation2d > distanceFromTrackedGamePiece , double intakeAssistScalar ) {
61
61
return new SequentialCommandGroup (
62
62
new InstantCommand (() -> resetPIDControllers (distanceFromTrackedGamePiece .get ())),
63
63
SwerveCommands .getClosedLoopSelfRelativeDriveCommand (
64
- () -> calculateTranslationPower (assistMode , distanceFromTrackedGamePiece .get ()).getX (),
65
- () -> calculateTranslationPower (assistMode , distanceFromTrackedGamePiece .get ()).getY (),
66
- () -> calculateThetaPower (assistMode , distanceFromTrackedGamePiece .get ())
64
+ () -> calculateTranslationPower (assistMode , distanceFromTrackedGamePiece .get (), intakeAssistScalar ).getX (),
65
+ () -> calculateTranslationPower (assistMode , distanceFromTrackedGamePiece .get (), intakeAssistScalar ).getY (),
66
+ () -> calculateThetaPower (assistMode , distanceFromTrackedGamePiece .get (), intakeAssistScalar )
67
67
)
68
68
);
69
69
}
70
70
71
71
private Command getTrackGamePieceCommand () {
72
72
return new RunCommand (() -> {
73
73
if (RobotContainer .CORAL_POSE_ESTIMATOR .getClosestObjectToRobot () != null )
74
- distanceFromTrackedGamePiece = calculateDistanceFromTrackedCGamePiece ();
74
+ distanceFromTrackedGamePiece = calculateDistanceFromTrackedGamePiece ();
75
75
});
76
76
}
77
77
78
- private static Translation2d calculateDistanceFromTrackedCGamePiece () {
78
+ public static Translation2d calculateDistanceFromTrackedGamePiece () {
79
79
final Pose2d robotPose = RobotContainer .ROBOT_POSE_ESTIMATOR .getEstimatedRobotPose ();
80
80
final Translation2d trackedObjectPositionOnField = RobotContainer .CORAL_POSE_ESTIMATOR .getClosestObjectToRobot ();
81
81
if (trackedObjectPositionOnField == null )
82
82
return null ;
83
83
84
84
final Translation2d difference = robotPose .getTranslation ().minus (trackedObjectPositionOnField );
85
- final Translation2d robotToTrackedGamepieceDistance = difference .rotateBy (robotPose .getRotation ().unaryMinus ());
86
- Logger .recordOutput ("IntakeAssist/TrackedGamePieceDistance" , robotToTrackedGamepieceDistance );
87
- return robotToTrackedGamepieceDistance ;
85
+ final Translation2d robotToTrackedGamePieceDistance = difference .rotateBy (robotPose .getRotation ().unaryMinus ());
86
+ Logger .recordOutput ("IntakeAssist/TrackedGamePieceDistance" , robotToTrackedGamePieceDistance );
87
+ return robotToTrackedGamePieceDistance ;
88
88
}
89
89
90
- private static Translation2d calculateTranslationPower (AssistMode assistMode , Translation2d distanceFromTrackedGamepiece ) {
90
+ private static Translation2d calculateTranslationPower (AssistMode assistMode , Translation2d distanceFromTrackedGamePiece , double intakeAssistScalar ) {
91
+ if (distanceFromTrackedGamePiece == null )
92
+ return new Translation2d (0 , 0 );
91
93
final Translation2d joystickPower = new Translation2d (OperatorConstants .DRIVER_CONTROLLER .getLeftY (), OperatorConstants .DRIVER_CONTROLLER .getLeftX ());
92
94
final Translation2d selfRelativeJoystickPower = joystickPower .rotateBy (RobotContainer .SWERVE .getDriveRelativeAngle ().unaryMinus ());
93
95
94
- final double xPIDOutput = clampToOutputRange (X_PID_CONTROLLER .calculate (distanceFromTrackedGamepiece .getX ()));
95
- final double yPIDOutput = clampToOutputRange (Y_PID_CONTROLLER .calculate (distanceFromTrackedGamepiece .getY ()));
96
+ final double xPIDOutput = clampToOutputRange (X_PID_CONTROLLER .calculate (distanceFromTrackedGamePiece .getX ()));
97
+ final double yPIDOutput = clampToOutputRange (Y_PID_CONTROLLER .calculate (distanceFromTrackedGamePiece .getY ()));
96
98
97
99
if (assistMode .equals (AssistMode .ALTERNATE_ASSIST ))
98
100
return calculateAlternateAssistTranslationPower (selfRelativeJoystickPower , xPIDOutput , yPIDOutput );
99
- return calculateNormalAssistTranslationPower (assistMode , selfRelativeJoystickPower , xPIDOutput , yPIDOutput );
101
+ return calculateNormalAssistTranslationPower (assistMode , selfRelativeJoystickPower , xPIDOutput , yPIDOutput , intakeAssistScalar );
100
102
}
101
103
102
- private static double calculateThetaPower (AssistMode assistMode , Translation2d distanceFromTrackedGamepiece ) {
103
- return calculateThetaAssistPower (assistMode , distanceFromTrackedGamepiece .getAngle ().plus (Rotation2d .k180deg ).unaryMinus ());
104
+ private static double calculateThetaPower (AssistMode assistMode , Translation2d distanceFromTrackedGamePiece , double intakeAssistScalar ) {
105
+ if (distanceFromTrackedGamePiece == null || !assistMode .shouldAssistTheta )
106
+ return 0 ;
107
+ Rotation2d distanceAngle = distanceFromTrackedGamePiece .getAngle ().plus (Rotation2d .k180deg ).unaryMinus ();
108
+ Rotation2d robotAngle = RobotContainer .ROBOT_POSE_ESTIMATOR .getEstimatedRobotPose ().getRotation ();
109
+ Rotation2d diff = robotAngle .minus (distanceAngle );
110
+ Logger .recordOutput ("IntakeAssist/difference" , diff );
111
+ Logger .recordOutput ("IntakeAssist/robotAngle" , robotAngle );
112
+ Logger .recordOutput ("IntakeAssist/distanceAngle" , distanceAngle );
113
+ var pow = calculateThetaAssistPower (assistMode , distanceAngle , intakeAssistScalar );
114
+ Logger .recordOutput ("IntakeAssist/pow" , pow );
115
+ return pow ;
104
116
}
105
117
106
118
private static Translation2d calculateAlternateAssistTranslationPower (Translation2d joystickValue , double xPIDOutput , double yPIDOutput ) {
@@ -115,25 +127,25 @@ private static Translation2d calculateAlternateAssistTranslationPower(Translatio
115
127
return new Translation2d (xPower , yPower );
116
128
}
117
129
118
- private static Translation2d calculateNormalAssistTranslationPower (AssistMode assistMode , Translation2d joystickValue , double xPIDOutput , double yPIDOutput ) {
130
+ private static Translation2d calculateNormalAssistTranslationPower (AssistMode assistMode , Translation2d joystickValue , double xPIDOutput , double yPIDOutput , double intakeAssistScalar ) {
119
131
final double
120
132
xJoystickPower = joystickValue .getX (),
121
133
yJoystickPower = joystickValue .getY ();
122
134
final double
123
- xPower = assistMode .shouldAssistX ? calculateNormalAssistPower (xPIDOutput , xJoystickPower ) : xJoystickPower ,
124
- yPower = assistMode .shouldAssistY ? calculateNormalAssistPower (yPIDOutput , yJoystickPower ) : yJoystickPower ;
135
+ xPower = assistMode .shouldAssistX ? calculateNormalAssistPower (xPIDOutput , xJoystickPower , intakeAssistScalar ) : xJoystickPower ,
136
+ yPower = assistMode .shouldAssistY ? calculateNormalAssistPower (yPIDOutput , yJoystickPower , intakeAssistScalar ) : yJoystickPower ;
125
137
126
138
return new Translation2d (xPower , yPower );
127
139
}
128
140
129
- private static double calculateThetaAssistPower (AssistMode assistMode , Rotation2d thetaOffset ) {
141
+ private static double calculateThetaAssistPower (AssistMode assistMode , Rotation2d thetaOffset , double intakeAssistScalar ) {
130
142
final double
131
143
pidOutput = clampToOutputRange (THETA_PID_CONTROLLER .calculate (thetaOffset .getRadians ())),
132
144
joystickValue = OperatorConstants .DRIVER_CONTROLLER .getRightX ();
133
145
134
146
if (assistMode .equals (AssistMode .ALTERNATE_ASSIST ))
135
147
return calculateAlternateAssistPower (pidOutput , joystickValue , joystickValue );
136
- return calculateNormalAssistPower (pidOutput , joystickValue );
148
+ return calculateNormalAssistPower (pidOutput , joystickValue , intakeAssistScalar );
137
149
}
138
150
139
151
private static double clampToOutputRange (double value ) {
@@ -144,15 +156,14 @@ private static double calculateAlternateAssistPower(double pidOutput, double pid
144
156
return pidOutput * (1 - Math .abs (pidScalar )) + joystickPower ;
145
157
}
146
158
147
- private static double calculateNormalAssistPower (double pidOutput , double joystickPower ) {
148
- final double intakeAssistScalar = OperatorConstants .INTAKE_ASSIST_SCALAR ;
149
- return (pidOutput * intakeAssistScalar ) + (joystickPower * (1 - intakeAssistScalar ));
159
+ private static double calculateNormalAssistPower (double pidOutput , double joystickPower , double scalar ) {
160
+ return (pidOutput * scalar ) + (joystickPower * (1 - scalar ));
150
161
}
151
162
152
163
private static void resetPIDControllers (Translation2d distanceFromTrackedGamePiece ) {
153
164
X_PID_CONTROLLER .reset (distanceFromTrackedGamePiece .getX (), RobotContainer .SWERVE .getSelfRelativeVelocity ().vxMetersPerSecond );
154
165
Y_PID_CONTROLLER .reset (distanceFromTrackedGamePiece .getY (), RobotContainer .SWERVE .getSelfRelativeVelocity ().vyMetersPerSecond );
155
- THETA_PID_CONTROLLER .reset (distanceFromTrackedGamePiece .getAngle ().getRadians (), RobotContainer .SWERVE .getSelfRelativeVelocity ().omegaRadiansPerSecond );
166
+ THETA_PID_CONTROLLER .reset (distanceFromTrackedGamePiece .getAngle ().plus ( Rotation2d . k180deg ). unaryMinus (). getRadians (), RobotContainer .SWERVE .getSelfRelativeVelocity ().omegaRadiansPerSecond );
156
167
}
157
168
158
169
/**
@@ -164,15 +175,15 @@ public enum AssistMode {
164
175
*/
165
176
ALTERNATE_ASSIST (true , true , true ),
166
177
/**
167
- * Applies pid values to autonomously drive to the game piece, scaled by {@link OperatorConstants#INTAKE_ASSIST_SCALAR} in addition to the driver's inputs
178
+ * Applies pid values to autonomously drive to the game piece, scaled by the intake assist scalar in addition to the driver's inputs
168
179
*/
169
180
FULL_ASSIST (true , true , true ),
170
181
/**
171
- * Applies pid values to align to the game piece, scaled by {@link OperatorConstants#INTAKE_ASSIST_SCALAR} in addition to the driver's inputs
182
+ * Applies pid values to align to the game piece, scaled by the intake assist scalar in addition to the driver's inputs
172
183
*/
173
184
ALIGN_ASSIST (false , true , true ),
174
185
/**
175
- * Applies pid values to face the game piece, scaled by {@link OperatorConstants#INTAKE_ASSIST_SCALAR} in addition to the driver's inputs
186
+ * Applies pid values to face the game piece, scaled by the intake assist scalar in addition to the driver's inputs
176
187
*/
177
188
ASSIST_ROTATION (false , false , true );
178
189
0 commit comments