Skip to content

Commit 73c2e4d

Browse files
committed
Merge branch 'auton' of github.com:strykeforce/reefscape into auton
2 parents abf7a7c + 8177fb4 commit 73c2e4d

File tree

10 files changed

+355
-115
lines changed

10 files changed

+355
-115
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,5 @@
5757
"edu.wpi.first.math.**.proto.*",
5858
"edu.wpi.first.math.**.struct.*",
5959
],
60-
"java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable"
60+
"java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx4G -Xms100m -Xlog:disable"
6161
}

src/main/java/frc/robot/commands/drive/DriveAutonCommand.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -53,32 +53,35 @@ public void reassignAlliance() {
5353

5454
@Override
5555
public void initialize() {
56-
Pose2d initialPose = new Pose2d();
57-
if (trajectory.getInitialPose(mirrorTrajectory) != null) {
56+
if (isTherePath) {
57+
driveSubsystem.setAutoDebugMsg("Initialize " + trajectoryName);
58+
Pose2d initialPose = new Pose2d();
5859
initialPose = trajectory.getInitialPose(mirrorTrajectory).get();
60+
if (resetOdometry) {
61+
driveSubsystem.resetOdometry(initialPose);
62+
}
63+
driveSubsystem.setEnableHolo(true);
64+
// driveSubsystem.recordAutoTrajectory(trajectory);
65+
driveSubsystem.resetHolonomicController();
66+
driveSubsystem.grapherTrajectoryActive(true);
67+
timer.reset();
68+
logger.info("Begin Trajectory: {}", trajectoryName);
69+
SwerveSample desiredState = trajectory.sampleAt(timer.get(), mirrorTrajectory).get();
70+
driveSubsystem.calculateController(desiredState);
5971
}
60-
if (resetOdometry && trajectory.getInitialPose(mirrorTrajectory) != null) {
61-
driveSubsystem.resetOdometry(initialPose);
62-
}
63-
driveSubsystem.setEnableHolo(true);
64-
// driveSubsystem.recordAutoTrajectory(trajectory);
65-
driveSubsystem.resetHolonomicController();
66-
driveSubsystem.grapherTrajectoryActive(true);
67-
timer.reset();
68-
logger.info("Begin Trajectory: {}", trajectoryName);
69-
SwerveSample desiredState = trajectory.sampleAt(timer.get(), mirrorTrajectory).get();
70-
driveSubsystem.calculateController(desiredState);
7172
}
7273

7374
@Override
7475
public void execute() {
75-
SwerveSample desiredState = trajectory.sampleAt(timer.get(), mirrorTrajectory).get();
76-
driveSubsystem.calculateController(desiredState);
76+
if (isTherePath) {
77+
SwerveSample desiredState = trajectory.sampleAt(timer.get(), mirrorTrajectory).get();
78+
driveSubsystem.calculateController(desiredState);
79+
}
7780
}
7881

7982
@Override
8083
public boolean isFinished() {
81-
if (isTherePath) {
84+
if (!isTherePath) {
8285
return false;
8386
}
8487
return timer.hasElapsed(trajectory.getTotalTime());
@@ -98,5 +101,6 @@ public void end(boolean interrupted) {
98101

99102
driveSubsystem.grapherTrajectoryActive(false);
100103
logger.info("End Trajectory {}: {}", trajectoryName, timer.get());
104+
driveSubsystem.setAutoDebugMsg("End " + trajectoryName);
101105
}
102106
}

src/main/java/frc/robot/constants/DriveConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class DriveConstants {
1818
public static final double kMaxSpeedMetersPerSecond = 12.0;
1919
public static final double kSpeedStillThreshold = 0.1; // meters per second
2020
public static final double kGyroRateStillThreshold = 10.0; // 25 5 degrees per second
21+
public static final double kGyroDifferentThreshold = 5.0; // 5 degrees
22+
public static final int kGyroDifferentCount = 3;
2123

2224
public static final double kRobotLength = 22.0;
2325
public static final double kRobotWidth = 22.0;

src/main/java/frc/robot/constants/RobotConstants.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@
22

33
public class RobotConstants {
44
public static final int kTalonConfigTimeout = 10; // ms
5-
public static final int kBreakerTempChannel = 0;
65
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
package frc.robot.constants;
22

3-
public class RobotStateConstants {}
3+
public class RobotStateConstants {
4+
public static final double[] kNodeAngles = {0.0, 60.0, 120.0, 180.0, -120.0, -60.0};
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package frc.robot.constants;
2+
3+
public class TagServoingConstants {
4+
public static final double kAngleCloseEnough = 3.0;
5+
}

src/main/java/frc/robot/subsystems/drive/DriveSubsystem.java

Lines changed: 61 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,20 @@
1010
import edu.wpi.first.math.geometry.Translation2d;
1111
import edu.wpi.first.math.kinematics.ChassisSpeeds;
1212
import edu.wpi.first.math.trajectory.TrapezoidProfile;
13-
import edu.wpi.first.util.CircularBuffer;
14-
import edu.wpi.first.wpilibj.AnalogInput;
1513
import frc.robot.constants.DriveConstants;
16-
import frc.robot.constants.RobotConstants;
17-
import frc.robot.subsystems.robotState.RobotStateSubsystem;
1814
import java.util.Set;
1915
import java.util.function.BooleanSupplier;
2016
import net.jafama.FastMath;
21-
import org.slf4j.Logger;
17+
import org.littletonrobotics.junction.Logger;
2218
import org.slf4j.LoggerFactory;
23-
import org.strykeforce.swerve.SwerveModule;
2419
import org.strykeforce.telemetry.measurable.MeasurableSubsystem;
2520
import org.strykeforce.telemetry.measurable.Measure;
2621

2722
public class DriveSubsystem extends MeasurableSubsystem {
28-
private static final Logger logger = LoggerFactory.getLogger(DriveSubsystem.class);
23+
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(DriveSubsystem.class);
2924
private final SwerveIO io;
3025
private SwerveIOInputsAutoLogged inputs = new SwerveIOInputsAutoLogged();
3126
private final HolonomicDriveController holonomicController;
32-
private RobotStateSubsystem robotStateSubsystem;
33-
private double avgTemp = 0.0;
34-
private CircularBuffer<Integer> temps = new CircularBuffer<Integer>(DriveConstants.kTempAvgCount);
35-
private AnalogInput breakerTemp;
3627

3728
private final ProfiledPIDController omegaController;
3829
private final PIDController xController;
@@ -46,13 +37,13 @@ public class DriveSubsystem extends MeasurableSubsystem {
4637
private Trajectory<SwerveSample> autoTrajectory;
4738
private double trajectoryActive = 0.0;
4839

40+
private int gyroDifferentCount = 0;
41+
4942
public DriveSubsystem(SwerveIO io) {
5043
org.littletonrobotics.junction.Logger.recordOutput("Swerve/YVelSpeed", 0.0);
5144
org.littletonrobotics.junction.Logger.recordOutput("Swerve/UsingDeadEye", false);
5245
org.littletonrobotics.junction.Logger.recordOutput("Swerve/Auto Drive Info", "Nothing");
5346

54-
this.breakerTemp = new AnalogInput(RobotConstants.kBreakerTempChannel);
55-
5647
this.io = io;
5748
// Setup Holonomic Controller
5849
omegaController =
@@ -124,6 +115,28 @@ public void calculateController(SwerveSample desiredState) {
124115
false);
125116
}
126117

118+
// Choreo Holonomic Controller
119+
public void calculateControllerServo(SwerveSample desiredState, double desiredRobotRelvY) {
120+
holoContInput = desiredState;
121+
double xFF = desiredState.vx;
122+
double rotationFF = desiredState.heading;
123+
124+
Pose2d pose = inputs.poseMeters;
125+
double xFeedback = xController.calculate(pose.getX(), desiredState.x);
126+
double rotationFeedback =
127+
omegaController.calculate(pose.getRotation().getRadians(), desiredState.heading);
128+
129+
holoContOutput.vxMetersPerSecond = xFF + xFeedback;
130+
holoContOutput.vyMetersPerSecond = desiredRobotRelvY;
131+
holoContOutput.omegaRadiansPerSecond = rotationFF + rotationFeedback;
132+
133+
io.move(
134+
holoContOutput.vxMetersPerSecond,
135+
holoContOutput.vyMetersPerSecond,
136+
holoContOutput.omegaRadiansPerSecond,
137+
false);
138+
}
139+
127140
public void resetOdometry(Pose2d pose) {
128141
io.resetOdometry(pose);
129142
logger.info("reset odometry with: {}", pose);
@@ -133,6 +146,18 @@ public void recordAutoTrajectory(Trajectory<SwerveSample> traj) {
133146
autoTrajectory = traj;
134147
}
135148

149+
public void setAutoDebugMsg(String msg) {
150+
org.littletonrobotics.junction.Logger.recordOutput("Swerve/Auto Drive Info", msg);
151+
}
152+
153+
public Trajectory<SwerveSample> getAutoTrajectory() {
154+
if (autoTrajectory != null) {
155+
return autoTrajectory;
156+
} else {
157+
return null;
158+
}
159+
}
160+
136161
public void resetHolonomicController(double yaw) {
137162
xController.reset();
138163
yController.reset();
@@ -163,11 +188,7 @@ public Rotation2d getGyroRotation2d() {
163188
}
164189

165190
public ChassisSpeeds getFieldRelSpeed() {
166-
return io.getFieldRelSpeed();
167-
}
168-
169-
public ChassisSpeeds getRobotRelSpeed() {
170-
return io.getRobotRelSpeed();
191+
return inputs.fieldRelSpeed;
171192
}
172193

173194
public void setDriveState(DriveStates state) {
@@ -182,7 +203,7 @@ public boolean isDriveStill() {
182203
// logger.info(
183204
// "Timestamp Before FieldRel: {}",
184205
// org.littletonrobotics.junction.Logger.getRealTimestamp() / 1000);
185-
ChassisSpeeds cs = getFieldRelSpeed();
206+
ChassisSpeeds cs = inputs.fieldRelSpeed;
186207
double vX = cs.vxMetersPerSecond;
187208
double vY = cs.vyMetersPerSecond;
188209
// logger.info(
@@ -192,32 +213,30 @@ public boolean isDriveStill() {
192213
// Take fieldRel Speed and get the magnitude of the vector
193214
double wheelSpeed = FastMath.hypot(vX, vY);
194215

195-
double gyroRate = inputs.gyroRate;
196-
197216
boolean velStill = Math.abs(wheelSpeed) <= DriveConstants.kSpeedStillThreshold;
198-
boolean gyroStill = Math.abs(gyroRate) <= DriveConstants.kGyroRateStillThreshold;
217+
boolean gyroStill = isGyroStill();
199218

200219
return velStill && gyroStill;
201220
}
202221

222+
public boolean isGyroStill() {
223+
return Math.abs(inputs.gyroRate) <= DriveConstants.kGyroRateStillThreshold;
224+
}
225+
203226
public void setGyroOffset(Rotation2d rotation) {
204-
io.setGyroOffset(apply(rotation));
227+
io.setBothGyroOffset(apply(rotation));
205228
}
206229

207230
public void setEnableHolo(boolean enabled) {
208231
holonomicController.setEnabled(enabled);
209232
logger.info("Holonomic Controller Enabled: {}", enabled);
210233
}
211234

212-
public void setRobotStateSubsystem(RobotStateSubsystem robotStateSubsystem) {
213-
this.robotStateSubsystem = robotStateSubsystem;
214-
}
215-
216235
public void teleResetGyro() {
217236
logger.info("Driver Joystick: Reset Gyro");
218237
// double gyroResetDegs = robotStateSubsystem.getAllianceColor() == Alliance.Blue ? 0.0 : 180.0;
219238
double gyroResetDegs = 0.0; // TODO change this to the above once we have RobotStateSubsystem
220-
io.setGyroOffset(Rotation2d.fromDegrees(gyroResetDegs));
239+
io.setBothGyroOffset(Rotation2d.fromDegrees(gyroResetDegs));
221240
io.resetGyro();
222241
io.resetOdometry(
223242
new Pose2d(inputs.poseMeters.getTranslation(), Rotation2d.fromDegrees(gyroResetDegs)));
@@ -271,10 +290,8 @@ public double apply(double x) {
271290

272291
// Control Methods
273292
public void lockZero() {
274-
SwerveModule[] swerveModules = io.getSwerveModules();
275-
for (int i = 0; i < 4; i++) {
276-
swerveModules[i].setAzimuthRotation2d(Rotation2d.fromDegrees(0.0));
277-
}
293+
Rotation2d rot = Rotation2d.fromDegrees(0.0);
294+
io.setSwerveModuleAngles(rot, rot, rot, rot);
278295
}
279296

280297
public void toSafeHold() {
@@ -287,10 +304,6 @@ public void toIdle() {
287304
io.configDriveCurrents(DriveConstants.getNormDriveLimits());
288305
}
289306

290-
public double getTemp() {
291-
return avgTemp;
292-
}
293-
294307
public PIDController getxController() {
295308
return xController;
296309
}
@@ -310,28 +323,22 @@ public PIDController getomegaControllerNonProfiled() {
310323

311324
public void periodic() {
312325
io.updateInputs(inputs);
313-
int temp = breakerTemp.getValue();
314-
temps.addFirst(temp);
315-
double avg = 0;
316-
if (temps.size() == DriveConstants.kTempAvgCount)
317-
for (int i = 0; i < DriveConstants.kTempAvgCount; ++i) avg += temps.get(i);
318-
319-
avg /= DriveConstants.kTempAvgCount;
320-
321-
avgTemp = avg;
326+
Logger.processInputs(getName(), inputs);
327+
if (Math.abs(inputs.gyroRotation2d.getDegrees() - inputs.navxRotation2d.getDegrees())
328+
> DriveConstants.kGyroDifferentThreshold) {
329+
gyroDifferentCount++;
330+
} else {
331+
gyroDifferentCount = 0;
332+
}
333+
if (gyroDifferentCount > DriveConstants.kGyroDifferentCount && isDriveStill()) {
334+
io.setPigeonGyroOffset(inputs.navxRotation2d);
335+
gyroDifferentCount = 0;
336+
}
322337

323338
switch (currDriveState) {
324339
case IDLE:
325-
if (avg > DriveConstants.kTripTemp) {
326-
io.configDriveCurrents(DriveConstants.getSafeDriveLimits());
327-
setDriveState(DriveStates.SAFE);
328-
}
329340
break;
330341
case SAFE:
331-
if (avg < DriveConstants.kRecoverTemp) {
332-
io.configDriveCurrents(DriveConstants.getNormDriveLimits());
333-
setDriveState(DriveStates.IDLE);
334-
}
335342
break;
336343
case SAFE_HOLD:
337344
break;
@@ -372,14 +379,6 @@ public Set<Measure> getMeasures() {
372379
new Measure(
373380
"Holo Controller Omega Setpoint",
374381
() -> holonomicController.getThetaController().getSetpoint().position),
375-
new Measure("Trajectory Active", () -> trajectoryActive),
376-
new Measure("Wheel 0 Angle", () -> io.getSwerveModuleStates()[0].angle.getDegrees()),
377-
new Measure("Wheel 0 Speed", () -> io.getSwerveModuleStates()[0].speedMetersPerSecond),
378-
new Measure("Wheel 1 Angle", () -> io.getSwerveModuleStates()[1].angle.getDegrees()),
379-
new Measure("Wheel 1 Speed", () -> io.getSwerveModuleStates()[1].speedMetersPerSecond),
380-
new Measure("Wheel 2 Angle", () -> io.getSwerveModuleStates()[2].angle.getDegrees()),
381-
new Measure("Wheel 2 Speed", () -> io.getSwerveModuleStates()[2].speedMetersPerSecond),
382-
new Measure("Wheel 3 Angle", () -> io.getSwerveModuleStates()[3].angle.getDegrees()),
383-
new Measure("Wheel 3 Speed", () -> io.getSwerveModuleStates()[3].speedMetersPerSecond));
382+
new Measure("Trajectory Active", () -> trajectoryActive));
384383
}
385384
}

0 commit comments

Comments
 (0)