Skip to content

Commit

Permalink
Merge pull request #2 from SciBorgs/elevator
Browse files Browse the repository at this point in the history
elevator
  • Loading branch information
etangent authored Jan 11, 2025
2 parents 313e871 + c5fb8d8 commit 6724e49
Show file tree
Hide file tree
Showing 14 changed files with 437 additions and 13 deletions.
9 changes: 3 additions & 6 deletions simgui-ds.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,6 @@
"visible": true
}
},
"System Joysticks": {
"window": {
"visible": false
}
},
"keyboardJoysticks": [
{
"axisConfig": [
Expand Down Expand Up @@ -106,7 +101,9 @@
}
],
"robotJoysticks": [
{},
{
"guid": "Keyboard1"
},
{
"guid": "Keyboard0"
}
Expand Down
61 changes: 57 additions & 4 deletions simgui.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
"NTProvider": {
"types": {
"/FMSInfo": "FMSInfo",
"/Faults/Active Faults": "Alerts",
"/Faults/Total Faults": "Alerts",
"/Robot/autos": "String Chooser",
"/Robot/drive/field2d": "Field2d",
"/Robot/drive/frontLeft/driveFeedback": "PIDController",
Expand All @@ -21,6 +23,10 @@
"/Robot/drive/rearRight/turnFeedback": "PIDController",
"/Robot/drive/rotationController": "PIDController",
"/Robot/drive/translationController": "ProfiledPIDController",
"/Robot/elevator/measurement/mech": "Mechanism2d",
"/Robot/elevator/pid": "ProfiledPIDController",
"/Robot/elevator/setpoint/mech": "Mechanism2d",
"/SmartDashboard/Alerts": "Alerts",
"/SmartDashboard/Scheduler": "Scheduler",
"/SmartDashboard/VisionSystemSim-main/Sim Field": "Field2d",
"/SmartDashboard/drive dynamic backward": "Command",
Expand Down Expand Up @@ -68,6 +74,16 @@
"window": {
"visible": true
}
},
"/Robot/elevator/measurement/mech": {
"window": {
"visible": true
}
},
"/Robot/elevator/setpoint/mech": {
"window": {
"visible": true
}
}
}
},
Expand All @@ -77,9 +93,6 @@
},
"transitory": {
"Robot": {
"autos": {
"open": true
},
"drive": {
"Pose2d##v_/Robot/drive/getPose": {
"Rotation2d##v_rotation": {
Expand Down Expand Up @@ -149,7 +162,9 @@
"open": true
},
"open": true
},
}
},
"elevator": {
"open": true
},
"open": true,
Expand All @@ -164,5 +179,43 @@
},
"NetworkTables Info": {
"visible": true
},
"Plot": {
"Plot <0>": {
"plots": [
{
"backgroundColor": [
0.0,
0.0,
0.0,
0.8500000238418579
],
"height": 278,
"series": [
{
"color": [
0.2980392277240753,
0.44705885648727417,
0.6901960968971252,
1.0
],
"id": "NT:/Robot/elevator/positionSetpoint"
},
{
"color": [
0.8666667342185974,
0.5176470875740051,
0.32156863808631897,
1.0
],
"id": "NT:/Robot/elevator/position"
}
]
}
],
"window": {
"name": "Elevator"
}
}
}
}
17 changes: 17 additions & 0 deletions src/main/java/org/sciborgs1155/robot/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,22 @@ public static boolean inField(Pose3d pose) {
&& pose.getY() > 0
&& pose.getY() < Field.WIDTH.in(Meters));
}

public enum Level {
L1(.3),
L2(.7),
L3(1),
L4(1.5);

public final double height;

Level(double height) {
this.height = height;
}

public double getHeight() {
return this.height;
}
}
}
}
5 changes: 5 additions & 0 deletions src/main/java/org/sciborgs1155/robot/Ports.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ public static final class Drive {
public static final int REAR_RIGHT_TURNING = 17;
}

public static final class Elevator {
public static final int LEADER = -1;
public static final int FOLLOWER = -1;
}

public static final class Scoral {
public static final int TOP_ROLLER = 21;
public static final int BOTTOM_ROLLER = 22;
Expand Down
11 changes: 9 additions & 2 deletions src/main/java/org/sciborgs1155/robot/Robot.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import static edu.wpi.first.units.Units.Second;
import static edu.wpi.first.units.Units.Seconds;
import static edu.wpi.first.wpilibj2.command.button.RobotModeTriggers.*;
import static org.sciborgs1155.robot.Constants.DEADBAND;
import static org.sciborgs1155.robot.Constants.PERIOD;
import static org.sciborgs1155.robot.Constants.*;
import static org.sciborgs1155.robot.Constants.Field.*;
import static org.sciborgs1155.robot.drive.DriveConstants.*;

import edu.wpi.first.wpilibj.DataLogManager;
Expand All @@ -32,6 +32,7 @@
import org.sciborgs1155.robot.Ports.OI;
import org.sciborgs1155.robot.commands.Autos;
import org.sciborgs1155.robot.drive.Drive;
import org.sciborgs1155.robot.elevator.Elevator;
import org.sciborgs1155.robot.vision.Vision;

/**
Expand All @@ -50,6 +51,7 @@ public class Robot extends CommandRobot implements Logged {
// SUBSYSTEMS
private final Drive drive = Drive.create();
private final Vision vision = Vision.create();
private final Elevator elevator = Elevator.create();

// COMMANDS
@Log.NT private final SendableChooser<Command> autos = Autos.configureAutos(drive);
Expand Down Expand Up @@ -94,6 +96,11 @@ private void configureGameBehavior() {

/** Configures trigger -> command bindings. */
private void configureBindings() {
operator.a().onTrue(elevator.scoreLevel(Level.L1));
operator.b().onTrue(elevator.scoreLevel(Level.L2));
operator.x().onTrue(elevator.scoreLevel(Level.L3));
operator.y().onTrue(elevator.scoreLevel(Level.L4));

// x and y are switched: we use joystick Y axis to control field x motion
InputStream x = InputStream.of(driver::getLeftY).negate();
InputStream y = InputStream.of(driver::getLeftX).negate();
Expand Down
113 changes: 113 additions & 0 deletions src/main/java/org/sciborgs1155/robot/elevator/Elevator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package org.sciborgs1155.robot.elevator;

import static edu.wpi.first.units.Units.Meters;
import static edu.wpi.first.units.Units.MetersPerSecond;
import static edu.wpi.first.units.Units.MetersPerSecondPerSecond;
import static org.sciborgs1155.robot.Constants.*;
import static org.sciborgs1155.robot.Constants.Field.*;
import static org.sciborgs1155.robot.elevator.ElevatorConstants.*;

import edu.wpi.first.math.MathUtil;
import edu.wpi.first.math.controller.ElevatorFeedforward;
import edu.wpi.first.math.controller.ProfiledPIDController;
import edu.wpi.first.math.trajectory.TrapezoidProfile;
import edu.wpi.first.wpilibj.util.Color8Bit;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase;
import monologue.Annotations.Log;
import monologue.Logged;
import org.sciborgs1155.robot.Constants.Field.Level;
import org.sciborgs1155.robot.Robot;

public class Elevator extends SubsystemBase implements Logged, AutoCloseable {
public static Elevator create() {
return Robot.isReal() ? new Elevator(new RealElevator()) : new Elevator(new SimElevator());
}

public static Elevator none() {
return new Elevator(new NoElevator());
}

private final ElevatorIO hardware;

// private final SysIdRoutine sysIdRoutine;

@Log.NT
private final ProfiledPIDController pid =
new ProfiledPIDController(
kP,
kI,
kD,
new TrapezoidProfile.Constraints(
MAX_VELOCITY.in(MetersPerSecond), MAX_ACCEL.in(MetersPerSecondPerSecond)));

@Log.NT private final ElevatorFeedforward ff = new ElevatorFeedforward(kS, kG, kV, kA);

@Log.NT
private final ElevatorVisualizer setpoint = new ElevatorVisualizer(new Color8Bit(0, 0, 255));

@Log.NT
private final ElevatorVisualizer measurement = new ElevatorVisualizer(new Color8Bit(255, 0, 0));

public Elevator(ElevatorIO hardware) {
this.hardware = hardware;
setDefaultCommand(retract());
// sysIdRoutine =
// new SysIdRoutine(
// new SysIdRoutine.Config(),
// new SysIdRoutine.Mechanism(v -> pivot.setVoltage(v.in(Volts)), null, this));
}

public Command extend() {
return run(() -> update(MAX_HEIGHT.in(Meters)));
}

public Command retract() {
return run(() -> update(MIN_HEIGHT.in(Meters)));
}

public Command scoreLevel(Level level) {
return run(() -> update(level.getHeight()));
}

@Log.NT
public double position() {
return hardware.position();
}

@Log.NT
public double velocity() {
return hardware.velocity();
}

@Log.NT
public double positionSetpoint() {
return pid.getSetpoint().position;
}

@Log.NT
public double velocitySetpoint() {
return pid.getSetpoint().velocity;
}

private void update(double position) {
position = MathUtil.clamp(position, MIN_HEIGHT.in(Meters), MAX_HEIGHT.in(Meters));

double lastVelocity = pid.getSetpoint().velocity;
double feedback = pid.calculate(hardware.position(), position);
double feedforward = ff.calculateWithVelocities(lastVelocity, pid.getSetpoint().velocity);

hardware.setVoltage(feedforward + feedback);
}

@Override
public void periodic() {
setpoint.setLength(positionSetpoint());
measurement.setLength(position());
}

@Override
public void close() throws Exception {
hardware.close();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.sciborgs1155.robot.elevator;

import static edu.wpi.first.units.Units.Inches;
import static edu.wpi.first.units.Units.Kilograms;
import static edu.wpi.first.units.Units.Meters;
import static edu.wpi.first.units.Units.MetersPerSecond;
import static edu.wpi.first.units.Units.MetersPerSecondPerSecond;

import edu.wpi.first.units.measure.Distance;
import edu.wpi.first.units.measure.LinearAcceleration;
import edu.wpi.first.units.measure.LinearVelocity;
import edu.wpi.first.units.measure.Mass;

public class ElevatorConstants {
public static final double kP = 10;
public static final double kI = 0;
public static final double kD = 10;
public static final double kS = .1;
public static final double kG = 1;
public static final double kV = 1;
public static final double kA = 0;

public static final Distance MIN_HEIGHT = Meters.of(.2);
public static final Distance MAX_HEIGHT = Meters.of(2);

public static final LinearVelocity MAX_VELOCITY = MetersPerSecond.of(1);
public static final LinearAcceleration MAX_ACCEL = MetersPerSecondPerSecond.of(1);

public static final Mass WEIGHT = Kilograms.of(20);
public static final Distance DRUM_RADIUS = Meters.of(.1);
public static final double GEARING = 20 / 1;
public static final Distance SPROCKET_RADIUS = Inches.of(1);
public static final Distance SPROCKET_CIRCUMFRENCE = SPROCKET_RADIUS.times(2 * Math.PI);
public static final double CONVERSION_FACTOR = SPROCKET_CIRCUMFRENCE.in(Meters) * 2 / GEARING;
}
9 changes: 9 additions & 0 deletions src/main/java/org/sciborgs1155/robot/elevator/ElevatorIO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.sciborgs1155.robot.elevator;

public interface ElevatorIO extends AutoCloseable {
public void setVoltage(double voltage);

public double position();

public double velocity();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.sciborgs1155.robot.elevator;

import static edu.wpi.first.units.Units.Meters;
import static org.sciborgs1155.robot.elevator.ElevatorConstants.MIN_HEIGHT;

import edu.wpi.first.wpilibj.smartdashboard.Mechanism2d;
import edu.wpi.first.wpilibj.smartdashboard.MechanismLigament2d;
import edu.wpi.first.wpilibj.smartdashboard.MechanismRoot2d;
import edu.wpi.first.wpilibj.util.Color8Bit;
import monologue.Annotations.Log;
import monologue.Logged;

public class ElevatorVisualizer implements Logged {
@Log.NT private final Mechanism2d mech;
private final MechanismLigament2d elevator;

public ElevatorVisualizer(Color8Bit color) {
mech = new Mechanism2d(50, 50);
MechanismRoot2d chassis = mech.getRoot("chassis", 25, 10);
elevator =
chassis.append(
new MechanismLigament2d("elevator", MIN_HEIGHT.in(Meters) * 10, 90, 3, color));
}

public void setLength(double length) {
elevator.setLength(length * 10);
}
}
Loading

0 comments on commit 6724e49

Please sign in to comment.