Skip to content

Commit faa4410

Browse files
noamgreen12ShmayaR
andauthored
Elevator (#6)
* made elevator * im stupid * added reverse limit switch constants * fixed minor changes * added poses and did sysid * stuff * limit switch incostent fixed * Changed trigon to lib nahum is mean * Update ElevatorConstants.java * added proper visualization origin points * Update ElevatorCommands.java * Tuned elevator. * blar blar * The last commit name is: fixed poses calculation * Fixed constants minor issues and in Elevator fixed readability. * Removed redundant function. * fixed a mixup * Fixed pose logic and recalibrated pid. * Changed names of things. * Changed name issue. * Changed name to be accurate. --------- Co-authored-by: ShmayaR <[email protected]>
1 parent afcd013 commit faa4410

File tree

5 files changed

+362
-3
lines changed

5 files changed

+362
-3
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
import frc.trigon.robot.poseestimation.poseestimator.PoseEstimator;
2222
import frc.trigon.robot.subsystems.MotorSubsystem;
2323

24+
import frc.trigon.robot.subsystems.elevator.Elevator;
25+
import frc.trigon.robot.subsystems.elevator.ElevatorCommands;
26+
import frc.trigon.robot.subsystems.elevator.ElevatorConstants;
2427
import frc.trigon.robot.subsystems.arm.Arm;
2528
import frc.trigon.robot.subsystems.arm.ArmCommands;
2629
import frc.trigon.robot.subsystems.arm.ArmConstants;
@@ -50,6 +53,7 @@ public class RobotContainer {
5053
public static final Swerve SWERVE = new Swerve();
5154
public static final Arm ARM = new Arm();
5255
public static final Climber CLIMBER = new Climber();
56+
public static final Elevator ELEVATOR = new Elevator();
5357
public static final Intake INTAKE = new Intake();
5458
public static final Transporter TRANSPORTER = new Transporter();
5559

@@ -77,6 +81,7 @@ private void bindDefaultCommands() {
7781
SWERVE.setDefaultCommand(GeneralCommands.getFieldRelativeDriveCommand());
7882
ARM.setDefaultCommand(ArmCommands.getSetTargetStateCommand(ArmConstants.ArmState.REST));
7983
CLIMBER.setDefaultCommand(ClimberCommands.getSetTargetStateCommand(ClimberConstants.ClimberState.REST));
84+
ELEVATOR.setDefaultCommand(ElevatorCommands.getSetTargetStateCommand(ElevatorConstants.ElevatorState.REST));
8085
INTAKE.setDefaultCommand(IntakeCommands.getSetTargetStateCommand(IntakeConstants.IntakeState.REST));
8186
TRANSPORTER.setDefaultCommand(TransporterCommands.getSetTargetStateCommand(TransporterConstants.TransporterState.REST));
8287
}

src/main/java/frc/trigon/robot/subsystems/climber/ClimberConstants.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class ClimberConstants {
4848
GROUNDED_PID_SLOT = 0,
4949
ON_CAGE_PID_SLOT = 1;
5050
private static final double GEAR_RATIO = 37.5;
51-
private static final double REVERSE_LIMIT_SENSOR_RESET_POSITION = 0;
51+
private static final double REVERSE_LIMIT_RESET_POSITION_ROTATIONS = 0;
5252
private static final double FORWARD_SOFT_LIMIT_POSITION_ROTATIONS = 3;
5353
static final boolean FOC_ENABLED = true;
5454

@@ -129,7 +129,7 @@ private static void configureMotor() {
129129
config.SoftwareLimitSwitch.ForwardSoftLimitThreshold = FORWARD_SOFT_LIMIT_POSITION_ROTATIONS;
130130

131131
config.SoftwareLimitSwitch.ReverseSoftLimitEnable = true;
132-
config.SoftwareLimitSwitch.ReverseSoftLimitThreshold = REVERSE_LIMIT_SENSOR_RESET_POSITION;
132+
config.SoftwareLimitSwitch.ReverseSoftLimitThreshold = REVERSE_LIMIT_RESET_POSITION_ROTATIONS;
133133

134134
config.Feedback.SensorToMechanismRatio = GEAR_RATIO;
135135

@@ -147,7 +147,7 @@ private static void configureMotor() {
147147

148148
private static void configureReverseLimitSensor() {
149149
REVERSE_LIMIT_SENSOR.setSimulationSupplier(REVERSE_LIMIT_SENSORS_SIMULATION_SUPPLIER);
150-
REVERSE_LIMIT_SENSOR_BOOLEAN_EVENT.ifHigh(() -> MOTOR.setPosition(REVERSE_LIMIT_SENSOR_RESET_POSITION));
150+
REVERSE_LIMIT_SENSOR_BOOLEAN_EVENT.ifHigh(() -> MOTOR.setPosition(REVERSE_LIMIT_RESET_POSITION_ROTATIONS));
151151
}
152152

153153
public enum ClimberState {
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package frc.trigon.robot.subsystems.elevator;
2+
3+
import com.ctre.phoenix6.controls.DynamicMotionMagicVoltage;
4+
import com.ctre.phoenix6.controls.VoltageOut;
5+
import edu.wpi.first.math.geometry.Pose3d;
6+
import edu.wpi.first.math.geometry.Rotation3d;
7+
import edu.wpi.first.math.geometry.Transform3d;
8+
import edu.wpi.first.math.geometry.Translation3d;
9+
import edu.wpi.first.units.Units;
10+
import edu.wpi.first.wpilibj.sysid.SysIdRoutineLog;
11+
import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine;
12+
import frc.trigon.robot.subsystems.MotorSubsystem;
13+
import org.littletonrobotics.junction.Logger;
14+
import lib.hardware.phoenix6.talonfx.TalonFXMotor;
15+
import lib.hardware.phoenix6.talonfx.TalonFXSignal;
16+
import lib.utilities.Conversions;
17+
18+
public class Elevator extends MotorSubsystem {
19+
private final TalonFXMotor masterMotor = ElevatorConstants.MASTER_MOTOR;
20+
private final VoltageOut voltageRequest = new VoltageOut(0).withEnableFOC(ElevatorConstants.FOC_ENABLED);
21+
private final DynamicMotionMagicVoltage positionRequest = new DynamicMotionMagicVoltage(
22+
0,
23+
ElevatorConstants.DEFAULT_MAXIMUM_VELOCITY,
24+
ElevatorConstants.DEFAULT_MAXIMUM_ACCELERATION,
25+
ElevatorConstants.DEFAULT_MAXIMUM_ACCELERATION * 10
26+
).withEnableFOC(ElevatorConstants.FOC_ENABLED);
27+
private ElevatorConstants.ElevatorState targetState = ElevatorConstants.ElevatorState.REST;
28+
29+
public Elevator() {
30+
setName("Elevator");
31+
}
32+
33+
@Override
34+
public SysIdRoutine.Config getSysIDConfig() {
35+
return ElevatorConstants.SYSID_CONFIG;
36+
}
37+
38+
@Override
39+
public void setBrake(boolean brake) {
40+
masterMotor.setBrake(brake);
41+
}
42+
43+
@Override
44+
public void stop() {
45+
masterMotor.stopMotor();
46+
}
47+
48+
@Override
49+
public void updateLog(SysIdRoutineLog log) {
50+
log.motor("Elevator")
51+
.linearPosition(Units.Meters.of(getPositionRotations()))
52+
.linearVelocity(Units.MetersPerSecond.of(masterMotor.getSignal(TalonFXSignal.VELOCITY)))
53+
.voltage(Units.Volts.of(masterMotor.getSignal(TalonFXSignal.MOTOR_VOLTAGE)));
54+
}
55+
56+
@Override
57+
public void sysIDDrive(double targetVoltage) {
58+
masterMotor.setControl(voltageRequest.withOutput(targetVoltage));
59+
}
60+
61+
@Override
62+
public void updateMechanism() {
63+
ElevatorConstants.MECHANISM.update(
64+
getPositionMeters(),
65+
rotationsToMeters(masterMotor.getSignal(TalonFXSignal.CLOSED_LOOP_REFERENCE))
66+
);
67+
68+
Logger.recordOutput("Poses/Components/ElevatorFirstPose", getFirstStageComponentPose());
69+
Logger.recordOutput("Poses/Components/ElevatorSecondPose", getSecondStageComponentPose());
70+
}
71+
72+
@Override
73+
public void updatePeriodically() {
74+
masterMotor.update();
75+
Logger.recordOutput("Elevator/CurrentPositionMeters", getPositionMeters());
76+
}
77+
78+
void setTargetState(ElevatorConstants.ElevatorState targetState) {
79+
this.targetState = targetState;
80+
scalePositionRequestSpeed(targetState.speedScalar);
81+
setTargetPositionRotations(metersToRotations(targetState.targetPositionMeters));
82+
}
83+
84+
void setTargetPositionRotations(double targetPositionRotations) {
85+
masterMotor.setControl(positionRequest.withPosition(targetPositionRotations));
86+
}
87+
88+
private Pose3d getFirstStageComponentPose() {
89+
return calculateComponentPose(ElevatorConstants.ELEVATOR_FIRST_STAGE_VISUALIZATION_ORIGIN_POINT, getFirstStageComponentPoseHeight());
90+
}
91+
92+
private Pose3d getSecondStageComponentPose() {
93+
return calculateComponentPose(ElevatorConstants.ELEVATOR_SECOND_STAGE_VISUALIZATION_ORIGIN_POINT, getPositionMeters());
94+
}
95+
96+
private double getFirstStageComponentPoseHeight() {
97+
if (isSecondStageComponentLimitReached())
98+
return getPositionMeters() - ElevatorConstants.SECOND_ELEVATOR_COMPONENT_EXTENDED_LENGTH_METERS;
99+
return 0;
100+
}
101+
102+
private boolean isSecondStageComponentLimitReached() {
103+
return getPositionMeters() > ElevatorConstants.SECOND_ELEVATOR_COMPONENT_EXTENDED_LENGTH_METERS;
104+
}
105+
106+
private Pose3d calculateComponentPose(Pose3d originPoint, double currentHeight) {
107+
final Transform3d elevatorTransform = new Transform3d(
108+
new Translation3d(0, 0, currentHeight),
109+
new Rotation3d()
110+
);
111+
return originPoint.transformBy(elevatorTransform);
112+
}
113+
114+
private void scalePositionRequestSpeed(double speedScalar) {
115+
positionRequest.Velocity = ElevatorConstants.DEFAULT_MAXIMUM_VELOCITY * speedScalar;
116+
positionRequest.Acceleration = ElevatorConstants.DEFAULT_MAXIMUM_ACCELERATION * speedScalar;
117+
positionRequest.Jerk = positionRequest.Acceleration * 10;
118+
}
119+
120+
private double getPositionMeters() {
121+
return rotationsToMeters(getPositionRotations());
122+
}
123+
124+
private double rotationsToMeters(double positionsRotations) {
125+
return Conversions.rotationsToDistance(positionsRotations, ElevatorConstants.DRUM_DIAMETER_METERS);
126+
}
127+
128+
private double metersToRotations(double positionsMeters) {
129+
return Conversions.distanceToRotations(positionsMeters, ElevatorConstants.DRUM_DIAMETER_METERS);
130+
}
131+
132+
private double getPositionRotations() {
133+
return masterMotor.getSignal(TalonFXSignal.POSITION);
134+
}
135+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package frc.trigon.robot.subsystems.elevator;
2+
3+
import edu.wpi.first.wpilibj2.command.Command;
4+
import edu.wpi.first.wpilibj2.command.StartEndCommand;
5+
import frc.trigon.robot.RobotContainer;
6+
import lib.commands.NetworkTablesCommand;
7+
8+
import java.util.Set;
9+
10+
public class ElevatorCommands {
11+
public static Command getDebbugingCommand() {
12+
return new NetworkTablesCommand(
13+
RobotContainer.ELEVATOR::setTargetPositionRotations,
14+
false,
15+
Set.of(RobotContainer.ELEVATOR),
16+
"Debugging/ElevatorTargetPositionRotations"
17+
);
18+
}
19+
20+
public static Command getSetTargetStateCommand(ElevatorConstants.ElevatorState targetState) {
21+
return new StartEndCommand(
22+
() -> RobotContainer.ELEVATOR.setTargetState(targetState),
23+
RobotContainer.ELEVATOR::stop,
24+
RobotContainer.ELEVATOR
25+
);
26+
}
27+
28+
public static Command getSetTargetStateCommand(double targetPositionRotations) {
29+
return new StartEndCommand(
30+
() -> RobotContainer.ELEVATOR.setTargetPositionRotations(targetPositionRotations),
31+
RobotContainer.ELEVATOR::stop,
32+
RobotContainer.ELEVATOR
33+
);
34+
}
35+
}

0 commit comments

Comments
 (0)