1010import edu .wpi .first .math .geometry .Translation2d ;
1111import edu .wpi .first .math .kinematics .ChassisSpeeds ;
1212import edu .wpi .first .math .trajectory .TrapezoidProfile ;
13- import edu .wpi .first .util .CircularBuffer ;
14- import edu .wpi .first .wpilibj .AnalogInput ;
1513import frc .robot .constants .DriveConstants ;
16- import frc .robot .constants .RobotConstants ;
17- import frc .robot .subsystems .robotState .RobotStateSubsystem ;
1814import java .util .Set ;
1915import java .util .function .BooleanSupplier ;
2016import net .jafama .FastMath ;
21- import org .slf4j .Logger ;
17+ import org .littletonrobotics . junction .Logger ;
2218import org .slf4j .LoggerFactory ;
23- import org .strykeforce .swerve .SwerveModule ;
2419import org .strykeforce .telemetry .measurable .MeasurableSubsystem ;
2520import org .strykeforce .telemetry .measurable .Measure ;
2621
2722public 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