/**right and left motor current limits */
public static final double EXTENDER_CURRENT_LIMITS = 40.0;
/**Current limits when calibrating */
- public static final double CALIBRATING_CURRENT_LIMITS = 30.0;
+ public static final double CALIBRATING_CURRENT_LIMITS = 10.0;
+ public static final double CALIBRATING_CURRENT_THRESHOLD = 9.0;
public static final double ROLLER_MOI_KG_M_SQ = 0.5 * 0.020 * 0.020; // 0.5kg roller, 20mm radius for now
public static final double ROLLER_GEARING = 2.0;
}));
// Calibration
- driver.get(PS5Button.OPTIONS).onTrue(new InstantCommand(()->{
+ driver.get(PS5Button.PS).onTrue(new InstantCommand(()->{
intake.calibrate();
})).onFalse(new InstantCommand(()->{
intake.stopCalibrating();
// CLIMB: High current for full-power climbing
public final static double CALIBRATION_CURRENT = 7.0;
public final static double CLIMB_CURRENT = 42.0;
+ public final static double CALIBRATION_CURRENT_THRESHOLD = 6.0;
// PID Constants
// TODO: what are the units? Inches? Meters?
import edu.wpi.first.math.MathUtil;
import edu.wpi.first.math.controller.PIDController;
+import edu.wpi.first.math.filter.Debouncer;
+import edu.wpi.first.math.filter.Debouncer.DebounceType;
import edu.wpi.first.math.util.Units;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import edu.wpi.first.wpilibj2.command.InstantCommand;
/** whether the subsysgtem is calibrating */
private boolean calibrating = false;
- // why not use the ClimbConstants directly?
- private double downPosition = ClimbConstants.BOTTOM_POSITION;
- private double upPosition = ClimbConstants.UP_POSITION;
- private double climbPosition = ClimbConstants.CLIMB_POSITION;
-
/** should the subsystem perform calibration automatically */
private boolean calibrateOnStartUp = false;
private double MAX_POWER = 0.2;
+ private Debouncer calibrationDebouncer = new Debouncer(0.5, DebounceType.kRising);
+
// logging information
private LinearClimbIOInputs inputs = new LinearClimbIOInputs();
- // TODO: what units?
private final PIDController pid = new PIDController(
ClimbConstants.PID_P,
ClimbConstants.PID_I,
power = MathUtil.clamp(power, -MAX_POWER, MAX_POWER);
} else{
power = ClimbConstants.CALIBRATION_POWER;
+ boolean atHardStop = Math.abs(motor.getStatorCurrent().getValueAsDouble()) >= ClimbConstants.CALIBRATION_CURRENT_THRESHOLD;
+ if(calibrationDebouncer.calculate(atHardStop)){
+ stopCalibrating();
+ }
}
motor.set(power);
* stops calibration and sets current limits to normal.
*/
public void stopCalibrating() {
- motor.setPosition((Units.radiansToRotations(downPosition / ClimbConstants.WHEEL_RADIUS)) * ClimbConstants.CLIMB_GEAR_RATIO);
+ motor.setPosition(metersToRotations(ClimbConstants.BOTTOM_POSITION));
calibrating = false;
setCurrentLimits(ClimbConstants.CLIMB_CURRENT);
- setSetpoint((Units.radiansToRotations(downPosition / ClimbConstants.WHEEL_RADIUS)) * ClimbConstants.CLIMB_GEAR_RATIO);
+ setSetpoint(metersToRotations(ClimbConstants.BOTTOM_POSITION));
}
@Override
import com.ctre.phoenix6.signals.InvertedValue;
import com.ctre.phoenix6.signals.NeutralModeValue;
+import edu.wpi.first.math.filter.Debouncer;
+import edu.wpi.first.math.filter.Debouncer.DebounceType;
import edu.wpi.first.math.system.plant.DCMotor;
import edu.wpi.first.math.system.plant.LinearSystemId;
import edu.wpi.first.math.util.Units;
private double setpointInches = 0.0;
private boolean calibrating = false;
+ private Debouncer calibrationDebouncer = new Debouncer(0.5, DebounceType.kRising);
private final IntakeIOInputsAutoLogged inputs = new IntakeIOInputsAutoLogged();
if(calibrating){
leftMotor.set(0.1);
rightMotor.set(-0.1);
+ boolean atHardStop = Math.abs((leftMotor.getStatorCurrent().getValueAsDouble() + rightMotor.getStatorCurrent().getValueAsDouble()) / 2) >= IntakeConstants.CALIBRATING_CURRENT_THRESHOLD;
+ if(calibrationDebouncer.calculate(atHardStop)){
+ stopCalibrating();
+ }
}
updateInputs();
*/
public void stopCalibrating(){
zeroMotors();
- leftMotor.set(0);
- rightMotor.set(0);
setCurrentLimits(IntakeConstants.EXTENDER_CURRENT_LIMITS);
calibrating = false;
retract();
if (calibrating){
motor.set(0.1);
+ boolean atZero = Math.abs(motor.getStatorCurrent().getValueAsDouble()) >= HoodConstants.CALIBRATION_CURRENT_THRESHOLD;
+ boolean calibrated = calibrateDebouncer.calculate(atZero);
+ if (calibrated){
+ stopCalibrating();
+ }
} else{
// Set control with feedforward
motor.setControl(mmVoltageRequest
public void calibrate(){
calibrating = true;
setCurrentLimits(HoodConstants.CALIBRATING_CURRENT_LIMIT);
- boolean atZero = Math.abs(motor.getStatorCurrent().getValueAsDouble()) >= HoodConstants.CALIBRATION_CURRENT_THRESHOLD;
- boolean calibrated = calibrateDebouncer.calculate(atZero);
- if (calibrated){
- calibrating = false;
- motor.setPosition(Units.degreesToRotations(HoodConstants.MAX_ANGLE) * HoodConstants.HOOD_GEAR_RATIO);
- setCurrentLimits(HoodConstants.NORMAL_CURRENT_LIMIT);
- }
+ }
+
+ public void stopCalibrating(){
+ motor.setPosition(Units.degreesToRotations(HoodConstants.MAX_ANGLE) * HoodConstants.HOOD_GEAR_RATIO);
+ goalAngle = new Rotation2d(Units.degreesToRadians(HoodConstants.MAX_ANGLE));
+ setCurrentLimits(HoodConstants.NORMAL_CURRENT_LIMIT);
+ calibrating = false;
}
/**
public static final double FEEDFORWARD_KV = 0.12;
public static final double NORMAL_CURRENT_LIMIT = 40.0; // A
- public static final double CALIBRATING_CURRENT_LIMIT = 30.0; //A
- public static final double CALIBRATION_CURRENT_THRESHOLD = 20.0; // A
+ public static final double CALIBRATING_CURRENT_LIMIT = 10.0; //A
+ public static final double CALIBRATION_CURRENT_THRESHOLD = 9.0; // A
}