Skip to content

Commit fe6e04a

Browse files
authored
Merge pull request #59 from DeepBlueRobotics/manual-climb
add manual climb
2 parents 1843961 + 78d7772 commit fe6e04a

3 files changed

Lines changed: 113 additions & 14 deletions

File tree

Robot2019/src/main/java/frc/robot/OI.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import frc.robot.commands.Climb;
1616
import frc.robot.commands.EjectCargo;
1717
import frc.robot.commands.IntakeOnlyCargo;
18+
import frc.robot.commands.ManualClimb;
1819
import frc.robot.commands.NormalDrive;
1920
import frc.robot.commands.ResetWobble;
2021
import frc.robot.commands.SetArcadeOrTank;
@@ -42,7 +43,8 @@ public class OI {
4243
JoystickButton toggleHatchBtn;
4344
JoystickButton cargoIntakeBtn, cargoEjectBtn;
4445
JoystickButton climberRailBtn;
45-
JoystickButton climbBtn;
46+
JoystickButton autoClimbBtn;
47+
JoystickButton manualClimbBtn;
4648
JoystickButton toggleCameraBtn;
4749
JoystickButton wobbleDriveBtn;
4850
JoystickButton cycleLightBtn;
@@ -66,19 +68,22 @@ public class OI {
6668
normDriveBtn = new JoystickButton(leftJoy, 3);
6769
normDriveBtn.whileHeld(new NormalDrive());
6870

69-
toggleHatchBtn = new JoystickButton(manipulator, Manip.X); // TODO: set ports to correct values
71+
toggleHatchBtn = new JoystickButton(manipulator, Manip.X);
7072
toggleHatchBtn.whenPressed(new ToggleHatch(hp));
7173

72-
cargoIntakeBtn = new JoystickButton(manipulator, Manip.A); // TODO: set ports to correct values
74+
cargoIntakeBtn = new JoystickButton(manipulator, Manip.A);
7375
cargoIntakeBtn.whenPressed(new IntakeOnlyCargo(cargo, hp, dt));
74-
cargoEjectBtn = new JoystickButton(manipulator, Manip.B); // TODO: set ports to correct values
76+
cargoEjectBtn = new JoystickButton(manipulator, Manip.B);
7577
cargoEjectBtn.whenPressed(new EjectCargo(cargo));
7678

77-
climberRailBtn = new JoystickButton(manipulator, Manip.LB_lShoulder); // TODO: confirm button number
79+
climberRailBtn = new JoystickButton(manipulator, Manip.LB_lShoulder);
7880
climberRailBtn.whenPressed(new ActuateClimberRails(climber));
7981

80-
climbBtn = new JoystickButton(manipulator, Manip.Y); // TODO: confirm button number
81-
climbBtn.whenPressed(new Climb(climber, dt, leftJoy));
82+
autoClimbBtn = new JoystickButton(manipulator, Manip.RT_rTrigger);
83+
autoClimbBtn.toggleWhenPressed(new Climb(climber, dt, leftJoy));
84+
85+
manualClimbBtn = new JoystickButton(manipulator, Manip.LT_lTrigger);
86+
manualClimbBtn.toggleWhenPressed(new ManualClimb(climber, dt, leftJoy, rightJoy));
8287

8388
toggleCameraBtn = new JoystickButton(leftJoy, 2);
8489
toggleCameraBtn.whenPressed(new ToggleCamera(driveCamera, hatchCamera, cameraServer));
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/*----------------------------------------------------------------------------*/
2+
/* Copyright (c) 2018 FIRST. All Rights Reserved. */
3+
/* Open Source Software - may be modified and shared by FRC teams. The code */
4+
/* must be accompanied by the FIRST BSD license file in the root directory of */
5+
/* the project. */
6+
/*----------------------------------------------------------------------------*/
7+
8+
package frc.robot.commands;
9+
10+
import edu.wpi.first.wpilibj.Joystick;
11+
import edu.wpi.first.wpilibj.command.Command;
12+
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
13+
import frc.robot.subsystems.Climber;
14+
import frc.robot.subsystems.Drivetrain;
15+
16+
public class ManualClimb extends Command {
17+
private Climber climber;
18+
private Drivetrain dt;
19+
private Joystick leftJoy, rightJoy;
20+
21+
final private double retractDist = 0;
22+
final private double climbDist = 24.46; // In inches
23+
24+
public ManualClimb(Climber climber, Drivetrain dt, Joystick leftJoy, Joystick rightJoy) {
25+
// Use requires() here to declare subsystem dependencies
26+
// eg. requires(chassis);
27+
requires(climber);
28+
requires(dt);
29+
30+
this.climber = climber;
31+
this.dt = dt;
32+
this.leftJoy = leftJoy;
33+
this.rightJoy = rightJoy;
34+
}
35+
36+
// Called just before this Command runs the first time
37+
@Override
38+
protected void initialize() {
39+
SmartDashboard.putNumber("Current Angle", 0);
40+
SmartDashboard.putNumber("Max Angle", 0);
41+
SmartDashboard.putNumber("Min Angle", 0);
42+
}
43+
44+
// Called repeatedly when this Command is scheduled to run
45+
@Override
46+
protected void execute() {
47+
double climbSpeed = -leftJoy.getY();
48+
double driveSpeed = -rightJoy.getY();
49+
50+
if (climbSpeed > 0 && climber.getEncDistance() >= climbDist) {
51+
climbSpeed = 0;
52+
} else if (climbSpeed < 0 && climber.getEncDistance() <= retractDist) {
53+
climbSpeed = 0;
54+
}
55+
climber.runClimber(climbSpeed);
56+
dt.drive(driveSpeed, driveSpeed);
57+
58+
double angle = climber.getAngle();
59+
SmartDashboard.putNumber("Current Angle", angle);
60+
if (angle > SmartDashboard.getNumber("Max Angle", 0)) {
61+
SmartDashboard.putNumber("Max Angle", angle);
62+
}
63+
if (angle < SmartDashboard.getNumber("Min Angle", 0)) {
64+
SmartDashboard.putNumber("Min Angle", angle);
65+
}
66+
}
67+
68+
// Make this return true when this Command no longer needs to run execute()
69+
@Override
70+
protected boolean isFinished() {
71+
return false;
72+
}
73+
74+
// Called once after isFinished returns true
75+
@Override
76+
protected void end() {
77+
climber.stopClimber();
78+
dt.stop();
79+
}
80+
81+
// Called when another command which requires one or more of the same
82+
// subsystems is scheduled to run
83+
@Override
84+
protected void interrupted() {
85+
}
86+
}

Robot2019/src/main/java/frc/robot/subsystems/Climber.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public Climber(VictorSP motor, Encoder enc, AHRS ahrs, DoubleSolenoid pistons) {
3636
double pulseFraction = 1.0 / 256;
3737
double pitchDiameter = 1.790; // https://www.vexrobotics.com/35-sprockets.html#Drawing
3838
enc.setDistancePerPulse(pulseFraction * Math.PI * pitchDiameter);
39+
enc.setReverseDirection(true);
3940
enc.reset();
4041
}
4142

@@ -51,17 +52,24 @@ public void stopClimber() {
5152
motor.stopMotor();
5253
}
5354

54-
// We are erring on the side of changing directions too much
55+
public double getAngle() {
56+
double rawAngle = Math.atan2(ahrs.getRawAccelZ(), ahrs.getRawAccelX());
57+
double angle;
58+
if (rawAngle > 0) {
59+
angle = rawAngle - Math.PI;
60+
} else {
61+
angle = rawAngle + Math.PI;
62+
}
63+
return angle * 180 / Math.PI;
64+
}
65+
66+
//We are erring on the side of changing directions too much
5567
public boolean needToClimb() {
56-
double angle = Math.atan2(ahrs.getRawAccelZ(), ahrs.getRawAccelX());
57-
angle *= 180 / Math.PI;
58-
return angle < maxTilt && enc.getDistance() < maxDist;
68+
return getAngle() < maxTilt && enc.getDistance() < maxDist;
5969
}
6070

6171
public boolean canDrop() {
62-
double angle = Math.atan2(ahrs.getRawAccelZ(), ahrs.getRawAccelX());
63-
angle *= 180 / Math.PI;
64-
return angle > minTilt && enc.getDistance() > minDist;
72+
return getAngle() > minTilt && enc.getDistance() > minDist;
6573
}
6674

6775
public double getEncDistance() {

0 commit comments

Comments
 (0)