Skip to content

Commit

Permalink
Add choreo; change approach to organizing and selecting auto modes (#5)
Browse files Browse the repository at this point in the history
* add choreo, move auton and alliance switches to util subsystems

* alliance, auto selectors publish booleanEvents when changed

* add javadoc
  • Loading branch information
nlaverdure authored Oct 19, 2024
1 parent 3a03f52 commit 6644b9a
Show file tree
Hide file tree
Showing 12 changed files with 464 additions and 309 deletions.
72 changes: 72 additions & 0 deletions src/main/java/frc/lib/AllianceSelector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package frc.lib;

import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
import edu.wpi.first.wpilibj.event.BooleanEvent;
import edu.wpi.first.wpilibj.event.EventLoop;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import java.util.Optional;

public class AllianceSelector {

private Alliance m_currentColor;
private DigitalInput m_allianceSelectionSwitch;
private EventLoop m_loop;

/**
* Constructs an alliance color selector switch
*
* @param port DIO port for reading the alliance color input
*/
public AllianceSelector(int port) {
this.m_allianceSelectionSwitch = new DigitalInput(port);
}

private Alliance getAllianceFromSwitch() {
return m_allianceSelectionSwitch.get() ? Alliance.Red : Alliance.Blue;
}

private boolean updateAlliance() {
Alliance m_newColor = getAllianceFromSwitch();

if (m_newColor.equals(m_currentColor)) return false;
else {
m_currentColor = m_newColor;
return true;
}
}

public BooleanEvent changedAlliance = new BooleanEvent(m_loop, () -> updateAlliance());

private boolean agreementInAllianceInputs() {
Optional<Alliance> allianceFromFMS = DriverStation.getAlliance();
Alliance allianceFromSwitch = getAllianceFromSwitch();

if (allianceFromFMS.isPresent()) {
return allianceFromSwitch.equals(allianceFromFMS.get());
} else return false;
}

public BooleanEvent agreementInAllianceInputs =
new BooleanEvent(m_loop, () -> agreementInAllianceInputs());

/**
* @return Whether the field is rotated from the driver's perspective
*/
public boolean fieldRotated() {
return m_currentColor.equals(Alliance.Red);
}

/**
* @return The current alliance
*/
public Alliance getAllianceColor() {
return m_currentColor;
}

public void disabledPeriodic() {
m_loop.poll();
SmartDashboard.putString("Alliance Color", getAllianceColor().name());
}
}
56 changes: 56 additions & 0 deletions src/main/java/frc/lib/AutoOption.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package frc.lib;

import edu.wpi.first.wpilibj.DriverStation.Alliance;
import frc.robot.autos.ChoreoAuto;

public class AutoOption {
private Alliance m_color;
private int m_option;
private ChoreoAuto m_auto;

/**
* Constructs a selectable autonomous mode option
*
* @param color Alliance for which the option is valid
* @param option Selector switch index for which the option is valid
* @param auto Command which runs the autonomous mode
*/
public AutoOption(Alliance color, int option, ChoreoAuto auto) {
this.m_color = color;
this.m_option = option;
this.m_auto = auto;
}

/**
* Constructs a null autonomous mode option
*
* @param color Alliance for which the option is valid
* @param option Selector switch index for which the option is valid
*/
public AutoOption(Alliance color, int option) {
this.m_color = color;
this.m_option = option;
this.m_auto = null;
}

/**
* @return Alliance for which the option is valid
*/
public Alliance getColor() {
return this.m_color;
}

/**
* @return Selector switch index for which the option is valid
*/
public int getOption() {
return this.m_option;
}

/**
* @return The command which runs the selected autonomous mode
*/
public ChoreoAuto getChoreoAuto() {
return this.m_auto;
}
}
91 changes: 91 additions & 0 deletions src/main/java/frc/lib/AutoSelector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package frc.lib;

import edu.wpi.first.wpilibj.DigitalInput;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
import edu.wpi.first.wpilibj.event.BooleanEvent;
import edu.wpi.first.wpilibj.event.EventLoop;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import frc.robot.autos.ChoreoAuto;
import java.util.List;
import java.util.function.Supplier;

public class AutoSelector {

private ChoreoAuto m_currentAuto;
private DigitalInput[] m_switchPositions;
private Supplier<Alliance> m_allianceColorSupplier;
private List<AutoOption> m_autoOptions;
private EventLoop m_loop;

/**
* Constructs an autonomous selector switch
*
* @param ports An array of DIO ports for selecting an autonomous mode
* @param allianceColorSupplier A method that supplies the current alliance color
* @param autoOptions An array of autonomous mode options
*/
public AutoSelector(
int[] ports, Supplier<Alliance> allianceColorSupplier, List<AutoOption> autoOptions) {
this.m_allianceColorSupplier = allianceColorSupplier;
this.m_autoOptions = autoOptions;

m_switchPositions = new DigitalInput[ports.length];

for (int i = 0; i < ports.length; i++) {
m_switchPositions[i] = new DigitalInput(ports[i]);
}
}

private int getSwitchPosition() {
for (int i = 0; i < m_switchPositions.length; i++) {
if (!m_switchPositions[i].get()) {
return i + 1;
}
}
return 0; // failure of the physical switch
}

private ChoreoAuto findMatchingOption() {
int switchPosition = getSwitchPosition();
Alliance color = m_allianceColorSupplier.get();

for (int i = 0; i < m_autoOptions.size(); i++) {
if (m_autoOptions.get(i).getColor() == color)
if (m_autoOptions.get(i).getOption() == switchPosition) {
return m_autoOptions.get(i).getChoreoAuto();
}
}
return null;
}

private boolean updateAuto() {
ChoreoAuto m_newAuto = findMatchingOption();
if (m_newAuto.equals(m_currentAuto)) return false;
else {
m_currentAuto = m_newAuto;
return true;
}
}

public BooleanEvent changedAuto = new BooleanEvent(m_loop, () -> updateAuto());

/** Schedules the command corresponding to the selected autonomous mode */
public void scheduleAuto() {
if (m_currentAuto != null) m_currentAuto.schedule();
}

/** Deschedules the command corresponding to the selected autonomous mode */
public void cancelAuto() {
if (m_currentAuto != null) m_currentAuto.cancel();
}

public void disabledPeriodic() {
m_loop.poll();

if (m_currentAuto != null) {
SmartDashboard.putString("Auto", m_currentAuto.getName());
} else {
SmartDashboard.putString("Auto", "Null");
}
}
}
34 changes: 23 additions & 11 deletions src/main/java/frc/robot/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import static edu.wpi.first.units.Units.*;

import com.pathplanner.lib.util.PIDConstants;
import edu.wpi.first.math.geometry.Translation2d;
import edu.wpi.first.math.kinematics.SwerveDriveKinematics;
import edu.wpi.first.units.measure.AngularVelocity;
Expand Down Expand Up @@ -74,14 +73,18 @@ public static final class ModuleConstants {
public static final int kDriveMotorCurrentLimit = 80;
public static final int kTurningMotorCurrentLimit = 80;

public static final double kDriveP = 0.1; // 2023 Competition Robot
public static final double kDriveI = 0.0; // 2023 Competition Robot
public static final double kDriveD = 0.0; // 2023 Competition Robot
public static final double kDriveFF = 0.255; // 2023 Competition Robot
public static final class DriveControllerGains {
public static final double kP = 0.1; // 2023 Competition Robot
public static final double kI = 0.0; // 2023 Competition Robot
public static final double kD = 0.0; // 2023 Competition Robot
public static final double kFF = 0.255; // 2023 Competition Robot
}

public static final double kTurningP = 10.0; // 1.5;
public static final double kTurningI = 0.0; // 2023 Competition Robot
public static final double kTurningD = 0.0; // 2023 Competition Robot
public static final class TurningControllerGains {
public static final double kP = 10.0; // 1.5;
public static final double kI = 0.0; // 2023 Competition Robot
public static final double kD = 0.0; // 2023 Competition Robot
}

// Not adjusted
// public static final double kMaxModuleAngularSpeedRadiansPerSecond = 0.05 * Math.PI;
Expand Down Expand Up @@ -162,16 +165,25 @@ public static final class XBox {
public static final class AutoConstants {
public static final int kAllianceColorSelectorPort = 10;

// length is 8
// max length is 8
public static final int[] kAutonomousModeSelectorPorts = {11, 12, 13, 18, 19};

// public static final double kMaxSpeedMetersPerSecond = 3.0;
// public static final double kMaxAccelerationMetersPerSecondSquared = 3.0;
// public static final double kMaxAngularSpeedRadiansPerSecond = Math.PI;
// public static final double kMaxAngularSpeedRadiansPerSecondSquared = Math.PI;

public static final PIDConstants kTranslationControllerGains = new PIDConstants(1.0, 0.0, 0.0);
public static final PIDConstants kRotationControllerGains = new PIDConstants(7.0, 0.0, 0.0);
public static final class TranslationControllerGains {
public static final double kP = 1.0;
public static final double kI = 0.0;
public static final double kD = 0.0;
}

public static final class RotationControllerGains {
public static final double kP = 7.0;
public static final double kI = 0.0;
public static final double kD = 0.0;
}

// Constraint for the motion profilied robot angle controller
// public static final TrapezoidProfile.Constraints kThetaControllerConstraints =
Expand Down
Loading

0 comments on commit 6644b9a

Please sign in to comment.