Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
5385141
made elevator
noamgreen12 Sep 1, 2025
d8d27d7
im stupid
noamgreen12 Sep 1, 2025
978d1b3
added reverse limit switch constants
noamgreen12 Sep 2, 2025
0e7ed66
Merge branch 'main' into elevator
noamgreen12 Sep 2, 2025
2959e64
fixed minor changes
noamgreen12 Sep 2, 2025
6146f3a
added poses and did sysid
noamgreen12 Sep 3, 2025
6e05c54
stuff
noamgreen12 Sep 4, 2025
aef54d8
limit switch incostent fixed
noamgreen12 Sep 4, 2025
c0afce9
Merge branch 'main' into elevator
noamgreen12 Sep 4, 2025
cf4f03d
Changed trigon to lib
noamgreen12 Sep 4, 2025
32ad205
Update ElevatorConstants.java
noamgreen12 Sep 4, 2025
64b2087
added proper visualization origin points
ShmayaR Sep 5, 2025
8c9a5dc
Merge branch 'main' into elevator
ShmayaR Sep 5, 2025
249b0a4
Merge branch 'main' into elevator
ShmayaR Sep 5, 2025
f025518
Update ElevatorCommands.java
ShmayaR Sep 5, 2025
bfae858
Merge branch 'elevator' of https://github.com/Programming-TRIGON/Robo…
noamgreen12 Sep 7, 2025
341a63e
Tuned elevator.
noamgreen12 Sep 7, 2025
47752cf
blar blar
noamgreen12 Sep 8, 2025
9c7420b
The last commit name is: fixed poses calculation
noamgreen12 Sep 8, 2025
d809559
Fixed constants minor issues and in Elevator fixed readability.
noamgreen12 Sep 8, 2025
981b8a4
Removed redundant function.
noamgreen12 Sep 9, 2025
4254ae0
fixed a mixup
noamgreen12 Sep 9, 2025
66f0269
Merge branch 'main' into elevator
noamgreen12 Sep 9, 2025
8d3984c
Fixed pose logic and recalibrated pid.
noamgreen12 Sep 9, 2025
2d60740
Merge branch 'main' into elevator
ShmayaR Sep 10, 2025
7cea435
Changed names of things.
noamgreen12 Sep 10, 2025
4051c7f
Merge branch 'elevator' of https://github.com/Programming-TRIGON/Robo…
noamgreen12 Sep 10, 2025
bb6b511
Changed name issue.
noamgreen12 Sep 10, 2025
222216c
Changed name to be accurate.
noamgreen12 Sep 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/main/java/frc/trigon/robot/RobotContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
import frc.trigon.robot.poseestimation.poseestimator.PoseEstimator;
import frc.trigon.robot.subsystems.MotorSubsystem;

import frc.trigon.robot.subsystems.elevator.Elevator;
import frc.trigon.robot.subsystems.elevator.ElevatorCommands;
import frc.trigon.robot.subsystems.elevator.ElevatorConstants;
import frc.trigon.robot.subsystems.arm.Arm;
import frc.trigon.robot.subsystems.arm.ArmCommands;
import frc.trigon.robot.subsystems.arm.ArmConstants;
Expand Down Expand Up @@ -50,6 +53,7 @@ public class RobotContainer {
public static final Swerve SWERVE = new Swerve();
public static final Arm ARM = new Arm();
public static final Climber CLIMBER = new Climber();
public static final Elevator ELEVATOR = new Elevator();
public static final Intake INTAKE = new Intake();
public static final Transporter TRANSPORTER = new Transporter();

Expand Down Expand Up @@ -77,6 +81,7 @@ private void bindDefaultCommands() {
SWERVE.setDefaultCommand(GeneralCommands.getFieldRelativeDriveCommand());
ARM.setDefaultCommand(ArmCommands.getSetTargetStateCommand(ArmConstants.ArmState.REST));
CLIMBER.setDefaultCommand(ClimberCommands.getSetTargetStateCommand(ClimberConstants.ClimberState.REST));
ELEVATOR.setDefaultCommand(ElevatorCommands.getSetTargetStateCommand(ElevatorConstants.ElevatorState.REST));
INTAKE.setDefaultCommand(IntakeCommands.getSetTargetStateCommand(IntakeConstants.IntakeState.REST));
TRANSPORTER.setDefaultCommand(TransporterCommands.getSetTargetStateCommand(TransporterConstants.TransporterState.REST));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class ClimberConstants {
GROUNDED_PID_SLOT = 0,
ON_CAGE_PID_SLOT = 1;
private static final double GEAR_RATIO = 37.5;
private static final double REVERSE_LIMIT_SENSOR_RESET_POSITION = 0;
private static final double REVERSE_LIMIT_RESET_POSITION_ROTATIONS = 0;
private static final double FORWARD_SOFT_LIMIT_POSITION_ROTATIONS = 3;
static final boolean FOC_ENABLED = true;

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

config.SoftwareLimitSwitch.ReverseSoftLimitEnable = true;
config.SoftwareLimitSwitch.ReverseSoftLimitThreshold = REVERSE_LIMIT_SENSOR_RESET_POSITION;
config.SoftwareLimitSwitch.ReverseSoftLimitThreshold = REVERSE_LIMIT_RESET_POSITION_ROTATIONS;

config.Feedback.SensorToMechanismRatio = GEAR_RATIO;

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

private static void configureReverseLimitSensor() {
REVERSE_LIMIT_SENSOR.setSimulationSupplier(REVERSE_LIMIT_SENSORS_SIMULATION_SUPPLIER);
REVERSE_LIMIT_SENSOR_BOOLEAN_EVENT.ifHigh(() -> MOTOR.setPosition(REVERSE_LIMIT_SENSOR_RESET_POSITION));
REVERSE_LIMIT_SENSOR_BOOLEAN_EVENT.ifHigh(() -> MOTOR.setPosition(REVERSE_LIMIT_RESET_POSITION_ROTATIONS));
}

public enum ClimberState {
Expand Down
135 changes: 135 additions & 0 deletions src/main/java/frc/trigon/robot/subsystems/elevator/Elevator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package frc.trigon.robot.subsystems.elevator;

import com.ctre.phoenix6.controls.DynamicMotionMagicVoltage;
import com.ctre.phoenix6.controls.VoltageOut;
import edu.wpi.first.math.geometry.Pose3d;
import edu.wpi.first.math.geometry.Rotation3d;
import edu.wpi.first.math.geometry.Transform3d;
import edu.wpi.first.math.geometry.Translation3d;
import edu.wpi.first.units.Units;
import edu.wpi.first.wpilibj.sysid.SysIdRoutineLog;
import edu.wpi.first.wpilibj2.command.sysid.SysIdRoutine;
import frc.trigon.robot.subsystems.MotorSubsystem;
import org.littletonrobotics.junction.Logger;
import lib.hardware.phoenix6.talonfx.TalonFXMotor;
import lib.hardware.phoenix6.talonfx.TalonFXSignal;
import lib.utilities.Conversions;

public class Elevator extends MotorSubsystem {
private final TalonFXMotor masterMotor = ElevatorConstants.MASTER_MOTOR;
private final VoltageOut voltageRequest = new VoltageOut(0).withEnableFOC(ElevatorConstants.FOC_ENABLED);
private final DynamicMotionMagicVoltage positionRequest = new DynamicMotionMagicVoltage(
0,
ElevatorConstants.DEFAULT_MAXIMUM_VELOCITY,
ElevatorConstants.DEFAULT_MAXIMUM_ACCELERATION,
ElevatorConstants.DEFAULT_MAXIMUM_ACCELERATION * 10
).withEnableFOC(ElevatorConstants.FOC_ENABLED);
private ElevatorConstants.ElevatorState targetState = ElevatorConstants.ElevatorState.REST;

public Elevator() {
setName("Elevator");
}

@Override
public SysIdRoutine.Config getSysIDConfig() {
return ElevatorConstants.SYSID_CONFIG;
}

@Override
public void setBrake(boolean brake) {
masterMotor.setBrake(brake);
}

@Override
public void stop() {
masterMotor.stopMotor();
}

@Override
public void updateLog(SysIdRoutineLog log) {
log.motor("Elevator")
.linearPosition(Units.Meters.of(getPositionRotations()))
.linearVelocity(Units.MetersPerSecond.of(masterMotor.getSignal(TalonFXSignal.VELOCITY)))
.voltage(Units.Volts.of(masterMotor.getSignal(TalonFXSignal.MOTOR_VOLTAGE)));
}

@Override
public void sysIDDrive(double targetVoltage) {
masterMotor.setControl(voltageRequest.withOutput(targetVoltage));
}

@Override
public void updateMechanism() {
ElevatorConstants.MECHANISM.update(
getPositionMeters(),
rotationsToMeters(masterMotor.getSignal(TalonFXSignal.CLOSED_LOOP_REFERENCE))
);

Logger.recordOutput("Poses/Components/ElevatorFirstPose", getFirstStageComponentPose());
Logger.recordOutput("Poses/Components/ElevatorSecondPose", getSecondStageComponentPose());
}

@Override
public void updatePeriodically() {
masterMotor.update();
Logger.recordOutput("Elevator/CurrentPositionMeters", getPositionMeters());
}

void setTargetState(ElevatorConstants.ElevatorState targetState) {
this.targetState = targetState;
scalePositionRequestSpeed(targetState.speedScalar);
setTargetPositionRotations(metersToRotations(targetState.targetPositionMeters));
}

void setTargetPositionRotations(double targetPositionRotations) {
masterMotor.setControl(positionRequest.withPosition(targetPositionRotations));
}

private Pose3d getFirstStageComponentPose() {
return calculateComponentPose(ElevatorConstants.ELEVATOR_FIRST_STAGE_VISUALIZATION_ORIGIN_POINT, getFirstStageComponentPoseHeight());
}

private Pose3d getSecondStageComponentPose() {
return calculateComponentPose(ElevatorConstants.ELEVATOR_SECOND_STAGE_VISUALIZATION_ORIGIN_POINT, getPositionMeters());
}

private double getFirstStageComponentPoseHeight() {
if (isSecondStageComponentLimitReached())
return getPositionMeters() - ElevatorConstants.SECOND_ELEVATOR_COMPONENT_EXTENDED_LENGTH_METERS;
return 0;
}

private boolean isSecondStageComponentLimitReached() {
return getPositionMeters() > ElevatorConstants.SECOND_ELEVATOR_COMPONENT_EXTENDED_LENGTH_METERS;
}

private Pose3d calculateComponentPose(Pose3d originPoint, double currentHeight) {
final Transform3d elevatorTransform = new Transform3d(
new Translation3d(0, 0, currentHeight),
new Rotation3d()
);
return originPoint.transformBy(elevatorTransform);
}

private void scalePositionRequestSpeed(double speedScalar) {
positionRequest.Velocity = ElevatorConstants.DEFAULT_MAXIMUM_VELOCITY * speedScalar;
positionRequest.Acceleration = ElevatorConstants.DEFAULT_MAXIMUM_ACCELERATION * speedScalar;
positionRequest.Jerk = positionRequest.Acceleration * 10;
}

private double getPositionMeters() {
return rotationsToMeters(getPositionRotations());
}

private double rotationsToMeters(double positionsRotations) {
return Conversions.rotationsToDistance(positionsRotations, ElevatorConstants.DRUM_DIAMETER_METERS);
}

private double metersToRotations(double positionsMeters) {
return Conversions.distanceToRotations(positionsMeters, ElevatorConstants.DRUM_DIAMETER_METERS);
}

private double getPositionRotations() {
return masterMotor.getSignal(TalonFXSignal.POSITION);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package frc.trigon.robot.subsystems.elevator;

import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.StartEndCommand;
import frc.trigon.robot.RobotContainer;
import lib.commands.NetworkTablesCommand;

import java.util.Set;

public class ElevatorCommands {
public static Command getDebbugingCommand() {
return new NetworkTablesCommand(
RobotContainer.ELEVATOR::setTargetPositionRotations,
false,
Set.of(RobotContainer.ELEVATOR),
"Debugging/ElevatorTargetPositionRotations"
);
}

public static Command getSetTargetStateCommand(ElevatorConstants.ElevatorState targetState) {
return new StartEndCommand(
() -> RobotContainer.ELEVATOR.setTargetState(targetState),
RobotContainer.ELEVATOR::stop,
RobotContainer.ELEVATOR
);
}

public static Command getSetTargetStateCommand(double targetPositionRotations) {
return new StartEndCommand(
() -> RobotContainer.ELEVATOR.setTargetPositionRotations(targetPositionRotations),
RobotContainer.ELEVATOR::stop,
RobotContainer.ELEVATOR
);
}
}
Loading
Loading