Skip to content

Commit b211f49

Browse files
committed
(12/28/25) Elevator Visualization
Added working visualization for the elevator. Not sure if I integrated it with IO layer correctly. Turns out Mechanism2d is not the way?
1 parent 33e492a commit b211f49

4 files changed

Lines changed: 87 additions & 29 deletions

File tree

src/main/java/frc/robot/RobotContainer.java

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
import edu.wpi.first.math.geometry.Pose2d;
1818
import edu.wpi.first.math.geometry.Pose3d;
1919
import edu.wpi.first.math.geometry.Rotation2d;
20-
import edu.wpi.first.wpilibj.GenericHID;
21-
import edu.wpi.first.wpilibj.XboxController;
2220
import edu.wpi.first.wpilibj2.command.Command;
21+
import edu.wpi.first.wpilibj2.command.Commands;
2322
import edu.wpi.first.wpilibj2.command.button.CommandPS5Controller;
2423
import frc.robot.Constants.DriveConstants;
2524
import frc.robot.generated.TunerConstants;
@@ -34,6 +33,7 @@
3433
import frc.robot.subsystems.rollers.RollersIOSim;
3534
import frc.robot.subsystems.rollers.RollersIOSparkMax;
3635
import frc.robot.util.PoseUtils;
36+
import frc.robot.util.RobotState;
3737
import frc.robot.util.simulation.MapleSimSwerveDrivetrain;
3838
import org.ironmaple.simulation.SimulatedArena;
3939
import org.ironmaple.simulation.drivesims.SwerveDriveSimulation;
@@ -107,12 +107,6 @@ public RobotContainer() {
107107
configureButtonBindings();
108108
}
109109

110-
/**
111-
* Use this method to define your button->command mappings. Buttons can be created by
112-
* instantiating a {@link GenericHID} or one of its subclasses ({@link
113-
* edu.wpi.first.wpilibj.Joystick} or {@link XboxController}), and then passing it to a {@link
114-
* edu.wpi.first.wpilibj2.command.button.JoystickButton}.
115-
*/
116110
private void configureButtonBindings() {
117111
// Default command, normal field-relative drive
118112
drivetrain.setDefaultCommand(drivetrain.driveJoystickInputCommand());
@@ -144,6 +138,54 @@ private void configureButtonBindings() {
144138
// zeros gyro
145139
driverController.touchpad().onTrue(drivetrain.zeroGyroCommand());
146140

141+
// L1 Manual
142+
operatorController
143+
.cross()
144+
.and(operatorController.L2().negate())
145+
.whileTrue(arm.holdState(RobotState.L1))
146+
.onFalse(
147+
elevator
148+
.setState(RobotState.L1)
149+
.alongWith(elevator.setTargetState(RobotState.L1))
150+
.alongWith(arm.holdState(RobotState.L1)));
151+
152+
// L2 Manual
153+
operatorController
154+
.square()
155+
.and(operatorController.L2().negate())
156+
.whileTrue(arm.holdState(RobotState.L2))
157+
.onFalse(
158+
elevator
159+
.setState(RobotState.L2)
160+
.alongWith(elevator.setTargetState(RobotState.L2))
161+
.alongWith(arm.holdState(RobotState.L2)));
162+
163+
// L3 Manual
164+
operatorController
165+
.triangle()
166+
.and(operatorController.L2().negate())
167+
.whileTrue((arm.holdState(RobotState.L3)))
168+
.onFalse(
169+
elevator
170+
.setState(RobotState.L3)
171+
.alongWith(elevator.setTargetState(RobotState.L3))
172+
.alongWith(arm.holdState(RobotState.L3)));
173+
174+
operatorController
175+
.touchpad()
176+
.onTrue(
177+
Commands.runOnce(
178+
() -> {
179+
arm.setDefaultCommand(arm.joystickControlCommand());
180+
}));
181+
182+
// L4 Manual
183+
operatorController
184+
.circle()
185+
.and(operatorController.L2().negate())
186+
.whileTrue(arm.holdState(RobotState.L4).alongWith(elevator.setState(RobotState.L3)))
187+
.onFalse(elevator.setState(RobotState.L4).alongWith(arm.holdState(RobotState.L4)));
188+
147189
drivetrain.registerTelemetry(logger::telemeterize);
148190
}
149191

@@ -188,7 +230,5 @@ public void displaySimFieldToAdvantageScope() {
188230
"FieldSimulation/Coral", SimulatedArena.getInstance().getGamePiecesArrayByType("Coral"));
189231
Logger.recordOutput(
190232
"FieldSimulation/Algae", SimulatedArena.getInstance().getGamePiecesArrayByType("Algae"));
191-
// Logger.recordOutput(
192-
// "FieldSimulation/Staged Algae", AlgaeHandler.getInstance().periodic());
193233
}
194234
}

src/main/java/frc/robot/subsystems/elevator/Elevator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class Elevator extends SubsystemBase {
2121
// are simulating or not
2222
private final ElevatorIOInputsAutoLogged inputs =
2323
new ElevatorIOInputsAutoLogged(); // inputs, auto logged
24+
private ElevatorVisualization visualizer;
2425

2526
private double setpoint = 0; // keeps track of setpoint
2627

@@ -29,13 +30,16 @@ public class Elevator extends SubsystemBase {
2930

3031
public Elevator(ElevatorIO io) {
3132
this.io = io;
33+
this.visualizer = new ElevatorVisualization();
3234
setDefaultCommand(Commands.run(this::joystickControl, this));
3335
}
3436

3537
@Override
3638
public void periodic() {
3739
io.updateInputs(inputs);
3840
Logger.processInputs("Elevator", inputs);
41+
visualizer.update(inputs);
42+
visualizer.log();
3943
}
4044

4145
/**

src/main/java/frc/robot/subsystems/elevator/ElevatorIOSim.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
import edu.wpi.first.math.trajectory.TrapezoidProfile.Constraints;
99
import edu.wpi.first.wpilibj.Timer;
1010
import edu.wpi.first.wpilibj.simulation.ElevatorSim;
11-
import edu.wpi.first.wpilibj.smartdashboard.Mechanism2d;
12-
import edu.wpi.first.wpilibj.smartdashboard.MechanismLigament2d;
13-
import edu.wpi.first.wpilibj.smartdashboard.MechanismRoot2d;
1411
import frc.robot.Constants.ElevatorConstants;
1512

1613
public class ElevatorIOSim implements ElevatorIO {
@@ -31,11 +28,6 @@ public class ElevatorIOSim implements ElevatorIO {
3128
private ProfiledPIDController pidController;
3229
public ElevatorFeedforward elevatorFeedforward;
3330

34-
// Visualization
35-
private Mechanism2d mechanism;
36-
private MechanismRoot2d rootMechanism;
37-
private MechanismLigament2d elevatorMechanism;
38-
3931
// for modeling elevator movement
4032
private ElevatorSim sim =
4133
new ElevatorSim(
@@ -66,13 +58,6 @@ public ElevatorIOSim() {
6658
0,
6759
0.068398,
6860
new Constraints(ElevatorConstants.MAX_VELOCITY_RPS, ElevatorConstants.MAX_ACCEL_RPS));
69-
70-
// Visualization
71-
mechanism = new Mechanism2d(4, 4);
72-
rootMechanism = mechanism.getRoot("ElevatorBottom", 2, 0);
73-
elevatorMechanism =
74-
rootMechanism.append(
75-
new MechanismLigament2d("Elevator", ElevatorConstants.STARTING_HEIGHT, 90));
7661
}
7762

7863
@Override
@@ -99,20 +84,16 @@ public void setPosition(double rotations) {
9984
pidController.calculate(
10085
sim.getPositionMeters() * ElevatorConstants.ROTATIONS_PER_METER, goalRotations);
10186

102-
// for calculating FF
10387
double accel =
10488
(pidController.getSetpoint().velocity * ElevatorConstants.METERS_PER_ROTATION
10589
- lastVelocity)
10690
/ (Timer.getFPGATimestamp() - lastTime);
10791

108-
// Updates values for calculating accel
10992
lastTime = Timer.getFPGATimestamp();
11093
lastVelocity = sim.getVelocityMetersPerSecond();
11194

112-
// FF
11395
double ffVoltage = elevatorFeedforward.calculate(pidController.getSetpoint().velocity, accel);
11496

115-
// Adds FF + PID voltages
11697
double outputVoltage = MathUtil.clamp(pidOutputVoltage + ffVoltage, -12, 12);
11798

11899
appliedVoltage = outputVoltage; // logs voltage
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package frc.robot.subsystems.elevator;
2+
3+
import edu.wpi.first.math.geometry.Pose3d;
4+
import edu.wpi.first.math.geometry.Rotation3d;
5+
import frc.robot.Constants.ElevatorConstants;
6+
import frc.robot.subsystems.elevator.ElevatorIO.ElevatorIOInputs;
7+
import org.littletonrobotics.junction.Logger;
8+
9+
public class ElevatorVisualization {
10+
11+
private Pose3d stage2Pose;
12+
private Pose3d stage3Pose;
13+
14+
public void update(ElevatorIOInputs inputs) {
15+
stage2Pose =
16+
new Pose3d(
17+
-0.103,
18+
0,
19+
0.14
20+
+ Math.max(
21+
0,
22+
inputs.extensionMeters
23+
+ ElevatorConstants.STARTING_HEIGHT
24+
- ElevatorConstants.STAGE2_MAX_HEIGHT),
25+
Rotation3d.kZero);
26+
stage3Pose = new Pose3d(-0.103, 0, 0.165 + inputs.extensionMeters, Rotation3d.kZero);
27+
}
28+
29+
public void log() {
30+
Logger.recordOutput("Elevator/Stage2Pose", stage2Pose);
31+
Logger.recordOutput("Elevator/Stage3Pose", stage3Pose);
32+
}
33+
}

0 commit comments

Comments
 (0)