@@ -36,30 +36,32 @@ public class Robot extends TimedRobot {
36
36
private boolean stage1 ; // auto staging
37
37
38
38
// CONSTANTS
39
- private static final double WHEEL_DIAMETER = 6 ; // inches
40
- //NEED TO FIGURE OUT ENCODER MODEL- changes CPR for drive
41
- private static final double cpr = 360 ; //if am-3132
42
- //private static final double cpr = 7/4; //if am-2861a
43
- // private static final double cpr = 5; //if am-3314a
44
- // private static final double cpr = 1024; //if am-3445
45
- // private static final double cpr = 64; //if am-4027
46
- private static final double drive_dpp = (Math .PI *WHEEL_DIAMETER /cpr ); // Gives in inches per rev FOR DRIVETRAIN WHEELS ONLY
39
+ // private static final double WHEEL_DIAMETER = 6; // inches
40
+ // // NEED TO FIGURE OUT ENCODER MODEL- changes CPR for drive
41
+ // private static final double cpr = 360; //if am-3132
42
+ // // private static final double cpr = 7/4; //if am-2861a
43
+ // // private static final double cpr = 5; //if am-3314a
44
+ // // private static final double cpr = 1024; //if am-3445
45
+ // // private static final double cpr = 64; //if am-4027
46
+ // private static final double drive_dpp = (Math.PI*WHEEL_DIAMETER/cpr); // Gives in inches per rev FOR DRIVETRAIN WHEELS ONLY
47
47
48
48
// TODO: Check what motors should be inverted (.setInverted(false))
49
49
// MOTOR VARIABLES
50
- private WPI_TalonFX leftSlave , rightSlave , leftMaster , rightMaster , climbRotation , climbExtension , shooterFly , wrist ; //Falcon 500s
51
- private TalonSRX rollers , hood ; // 775s or BAG motors
50
+ private WPI_TalonFX leftSlave , rightSlave , leftMaster , rightMaster , climbExtension , shooterFly , wrist ; //Falcon 500s
51
+ //private WPI_TalonFX climbRotation
52
+ private TalonSRX rollers
53
+ //private TalonSRX hood; // 775s or BAG motors
52
54
53
55
//CONTROLLERS
54
56
private Joystick leftJoy , rightJoy ; //Used for tank drive
55
57
private XboxController controller ; // Used for button man mechanism controls
56
58
57
59
// SENSORS
58
- private AHRS gyro ; //9-axis-> used mainly to orient shooter hood using roll
60
+ // private AHRS gyro; //9-axis-> used mainly to orient shooter hood using roll
59
61
60
- private Encoder rightEncoder , leftEncoder ; // Drivetrain encoders (might just use integrated Falcon stuff who knows)
61
- private DigitalInput lowerShooterLimit , upperShooterLimit ; // Limit switch to reset hood to its default position
62
- private DigitalInput intakeLimit ; // Limit switch to know if intake is ready to kickup
62
+ // private Encoder rightEncoder, leftEncoder; // Drivetrain encoders (might just use integrated Falcon stuff who knows)
63
+ // private DigitalInput lowerShooterLimit, upperShooterLimit; // Limit switch to reset hood to its default position
64
+ // private DigitalInput intakeLimit; // Limit switch to know if intake is ready to kickup
63
65
64
66
// MISCELLANEOUS
65
67
private double nonZeroLimelightHorAng ; // Used to orient bot
@@ -86,16 +88,16 @@ public void robotInit() {
86
88
SmartDashboard .putData ("Auto choices" , m_chooser );
87
89
88
90
// SENSOR INITIALIZATIONS
89
- gyro = new AHRS (SerialPort .Port .kMXP ); //SUBJECT TO CHANGE FROM ELECTRICAL COULD BE SOURCE OF ERROR
91
+ // gyro = new AHRS(SerialPort.Port.kMXP); //SUBJECT TO CHANGE FROM ELECTRICAL COULD BE SOURCE OF ERROR
90
92
// ALL Ports subject to change from Electrical
91
- leftEncoder = new Encoder (0 , 1 );
92
- leftEncoder .setDistancePerPulse (drive_dpp );
93
- rightEncoder = new Encoder (2 , 3 );
94
- rightEncoder .setDistancePerPulse (drive_dpp );
95
- // Limit switches- CHANGE PORTS BASED ON ELECTRICAL
96
- lowerShooterLimit = new DigitalInput (4 );
97
- upperShooterLimit = new DigitalInput (5 );
98
- intakeLimit = new DigitalInput (6 );
93
+ // leftEncoder = new Encoder(0, 1);
94
+ // leftEncoder.setDistancePerPulse(drive_dpp);
95
+ // rightEncoder = new Encoder(2, 3);
96
+ // rightEncoder.setDistancePerPulse(drive_dpp);
97
+ // // Limit switches- CHANGE PORTS BASED ON ELECTRICAL
98
+ // lowerShooterLimit = new DigitalInput(4);
99
+ // upperShooterLimit = new DigitalInput(5);
100
+ // intakeLimit = new DigitalInput(6);
99
101
100
102
// MOTORS
101
103
//Drivetrain motors and configuration
@@ -106,19 +108,19 @@ public void robotInit() {
106
108
leftSlave = new WPI_TalonFX (RobotMap .DRIVETRAIN_BACKLEFT );
107
109
leftSlave .follow (leftMaster );
108
110
// Set integrated sensor position to 0 for encoder use
109
- leftMaster .getSensorCollection ().setIntegratedSensorPosition (0 , 10 );
110
- rightMaster .getSensorCollection ().setIntegratedSensorPosition (0 , 10 );
111
+ // leftMaster.getSensorCollection().setIntegratedSensorPosition(0, 10);
112
+ // rightMaster.getSensorCollection().setIntegratedSensorPosition(0, 10);
111
113
112
114
//Climb Motors
113
- climbRotation = new WPI_TalonFX (RobotMap .CLIMBROTATION );
115
+ // climbRotation = new WPI_TalonFX(RobotMap.CLIMBROTATION);
114
116
climbExtension = new WPI_TalonFX (RobotMap .CLIMBEXTENSION );
115
117
116
118
//Intake Motors
117
119
wrist = new WPI_TalonFX (RobotMap .INTAKE_WRIST );
118
120
rollers = new TalonSRX (RobotMap .INTAKE_ROLLERS );
119
121
120
122
//Hood Motor
121
- hood = new TalonSRX (RobotMap .SHOOTER_HOOD );
123
+ // hood = new TalonSRX(RobotMap.SHOOTER_HOOD);
122
124
123
125
//Shooter Motors
124
126
shooterFly = new WPI_TalonFX (RobotMap .SHOOTER_FLY );
@@ -130,18 +132,18 @@ public void robotInit() {
130
132
shooterFly .setInverted (false );
131
133
shooterFly .setSensorPhase (false );
132
134
// config P,I,D,F values- start by doubling F, then P, then D, then I (middle values) then increase/decrease over time
133
- shooterFly .config_kF (0 , 0.007 , 1 ); // (F) Feed Forward Term
134
- shooterFly .config_kP (0 , 0.8192 , 1 ); // (P) Proportional Term
135
- shooterFly .config_kI (0 , 0.0008 , 1 ); // (I) Integral term
136
- shooterFly .config_kD (0 , 0.0256 , 1 ); // (D) Differentiable Term
135
+ // shooterFly.config_kF(0, 0.007, 1); // (F) Feed Forward Term
136
+ // shooterFly.config_kP(0, 0.8192, 1); // (P) Proportional Term
137
+ // shooterFly.config_kI(0, 0.0008, 1); // (I) Integral term
138
+ // shooterFly.config_kD(0, 0.0256, 1); // (D) Differentiable Term
137
139
138
140
// Used for tank and arcade drive respectively
139
141
drive = new DifferentialDrive (leftMaster , rightMaster );
140
142
141
143
// TODO- make this choose from sendable chooser to set alliance color
142
144
NetworkTableInstance .getDefault ().getTable ("limelight" ).getEntry ("pipeline" ).setNumber (0 ); //Sets the pipeline to 0
143
145
NetworkTableInstance .getDefault ().getTable ("limelight" ).getEntry ("camMode" ).setNumber (0 ); //Sets the Limelight as a Vision Proccesor
144
- NetworkTableInstance .getDefault ().getTable ("TalonPi" ).getEntry ("alliance" ).setString ("red" );
146
+ // NetworkTableInstance.getDefault().getTable("TalonPi").getEntry("alliance").setString("red");
145
147
}
146
148
147
149
/** This function is called once when test mode is enabled. */
@@ -216,35 +218,52 @@ public void autonomousPeriodic() {
216
218
SmartDashboard .putNumber ("Current Angle" , gyro .getRoll ());
217
219
}
218
220
219
- // Resets hood to position 0 and uses that as the 0-angle.
220
- if (!lowerShooterLimit .get ()) {
221
- hood .set (ControlMode .PercentOutput , -0.1 );
222
- }
223
- gyro .reset (); //sets gyro value to 0
221
+ if (shooterCalculations [0 ][0 ] < 2.3 ) { // Counter
222
+ drive .tankDrive (-0.1 , -0.1 );
223
+ ready = false ;
224
+ } else {
225
+ drive .tankDrive (0 ,0 );
226
+ ready = true ;
227
+ // Spin flywheel to speed
228
+ // Intake ball using wrist
229
+ // PRAY()
224
230
225
- if ((Math .abs (shooterCalculations [0 ][0 ]) < 1.5 )) {
226
- drive .tankDrive (-0.8 , -0.8 ); // backs up until 1.5 meters away
227
- }
228
- if ((Math .abs (shooterCalculations [0 ][0 ]) >= 1.5 ) && (Math .abs (shooterCalculations [1 ][0 ]) > 1 )) { // TODO: adjust to reduce bouncing
229
- centerAim ("top_hub" ); // fires a shot into the hub
230
- }
231
- if (Math .abs (shooterCalculations [1 ][0 ]) < 1 && (Math .abs (shooterCalculations [0 ][0 ]) >= 1.5 ) && stage1 ) {
232
- if (counter < 1000 ) { // TODO: adjust based on how long it takes to shoot a ball
233
- fire (); // shoots ball-> changes stage1 to false after having shot a ball
234
- counter ++;
235
- }
236
- else if (counter >= 1000 ) {
237
- stage1 = false ;
238
- }
239
231
}
240
- if (!stage1 && !ballSeen ()) { // Locates ball if it can't see after shooting one
241
- centerAim ("ball_tracking" );
242
- rollers .set (ControlMode .PercentOutput , 0 );
243
- }
244
- if (!stage1 && ballSeen ()) { // Drives forward if it sees the ball
245
- drive .tankDrive (0.8 , 0.8 );
246
- rollers .set (ControlMode .PercentOutput , 1 );
232
+
233
+ if (ready ) {
234
+ // Push ball into flywheel
235
+ // flywheel should be running at speed
247
236
}
237
+
238
+ // // Resets hood to position 0 and uses that as the 0-angle.
239
+ // // if (!lowerShooterLimit.get()) {
240
+ // // hood.set(ControlMode.PercentOutput, -0.1);
241
+ // // }
242
+ // gyro.reset(); //sets gyro value to 0
243
+
244
+ // if ((Math.abs(shooterCalculations[0][0]) < 1.5)) {
245
+ // drive.tankDrive(-0.8, -0.8); // backs up until 1.5 meters away
246
+ // }
247
+ // if ((Math.abs(shooterCalculations[0][0]) >= 1.5) && (Math.abs(shooterCalculations[1][0]) > 1)) { // TODO: adjust to reduce bouncing
248
+ // centerAim("top_hub"); // fires a shot into the hub
249
+ // }
250
+ // if (Math.abs(shooterCalculations[1][0]) < 1 && (Math.abs(shooterCalculations[0][0]) >= 1.5) && stage1) {
251
+ // if (counter < 1000) { // TODO: adjust based on how long it takes to shoot a ball
252
+ // fire(); // shoots ball-> changes stage1 to false after having shot a ball
253
+ // counter++;
254
+ // }
255
+ // else if (counter >= 1000) {
256
+ // stage1 = false;
257
+ // }
258
+ // }
259
+ // if (!stage1 && !ballSeen()) { // Locates ball if it can't see after shooting one
260
+ // centerAim("ball_tracking");
261
+ // rollers.set(ControlMode.PercentOutput, 0);
262
+ // }
263
+ // if (!stage1 && ballSeen()) { // Drives forward if it sees the ball
264
+ // drive.tankDrive(0.8, 0.8);
265
+ // rollers.set(ControlMode.PercentOutput, 1);
266
+ // }
248
267
}
249
268
250
269
/**
@@ -268,9 +287,9 @@ public void teleopPeriodic() {
268
287
if (leftJoy .getTrigger ()) { //center robot on top hub (retro reflector)
269
288
centerAim ("top_hub" );
270
289
}
271
- if (rightJoy .getTrigger ()) { //center robot on ball from Raspberry Pi Data
272
- centerAim ("ball_tracking" );
273
- }
290
+ // if(rightJoy.getTrigger()) { //center robot on ball from Raspberry Pi Data
291
+ // centerAim("ball_tracking");
292
+ // }
274
293
275
294
// DRIVE CALL
276
295
if ((Math .abs (rightJoy .getY ()) > 0.2 ) || Math .abs (leftJoy .getY ()) > 0.2 ) drive .tankDrive (-rightJoy .getY (), -leftJoy .getY ());// TODO: adjust deadzones
@@ -292,10 +311,10 @@ public void teleopPeriodic() {
292
311
293
312
public double [][] getLimelightData () {
294
313
NetworkTable table = NetworkTableInstance .getDefault ().getTable ("limelight" );
295
- double heightDifference = ((72 /39.37 )-(17 /39.37 )); //13.0 (photo room)
296
- // double heightDifference = ((104/39.37)-(24.025 /39.37)); //14.0 https://www.desmos.com/calculator/zmzfln2j6v
297
- double fixedLLANGLE = 14.7734450937 ; //13.0 Angle
298
- // double fixedLLANGLE = 40; //14.0 Angle https://www.desmos.com/calculator/zmzfln2j6v
314
+ // double heightDifference = ((72/39.37)-(17/39.37)); //13.0 (photo room)
315
+ double heightDifference = ((104 /39.37 )-(22.76 /39.37 )); //14.0 https://www.desmos.com/calculator/zmzfln2j6v
316
+ // double fixedLLANGLE = 14.7734450937; //13.0 Angle
317
+ double fixedLLANGLE = 40 ; //14.0 Angle https://www.desmos.com/calculator/zmzfln2j6v
299
318
300
319
double [][] LimelightInfo = {{0 ,0 ,0 },{0 ,0 ,0 }};
301
320
@@ -353,40 +372,43 @@ public void centerAim(String target) {
353
372
}
354
373
}
355
374
356
- private boolean ballSeen () {// TODO: Sriman/Ayush code this so we know if there's a ball
357
- return true ;
358
- }
359
-
360
- public void fire () {
361
- double transferPercent = 0.35 ;
362
- double [][] limelightData = getLimelightData ();
363
- double idealAngle = limelightData [0 ][1 ];
364
- double idealVelocity = limelightData [0 ][2 ]; // flywheel diameter in meters
365
-
366
- double rpm = getRPM (idealVelocity , transferPercent );
367
- if (!intakeLimit .get ()) {
368
- wrist .set (ControlMode .PercentOutput , 0.75 );
369
- }
370
- shooterFly .set (ControlMode .Velocity , 4 *rpm *2048 ); //TODO: Gear ratio multiplier MIGHT HAVE TO MULTIPLY BY 2048- will test later
371
- if ((gyro .getRoll () > idealAngle + 5 ) && !upperShooterLimit .get ()) { // TODO: Adjust degrees of freedom +- 5
372
- hood .set (ControlMode .PercentOutput , 0.1 );
373
- ready = false ;
374
- }
375
- else if ((gyro .getRoll () < idealAngle -5 ) && !lowerShooterLimit .get ()) {
376
- hood .set (ControlMode .PercentOutput , -0.1 );
377
- ready = false ;
378
- }
379
- else {
380
- ready = true ;
381
- }
382
- if (ready ) {
383
- rollers .set (ControlMode .PercentOutput , 1 );
384
- }
385
- //adjust to fine tuning
386
- // double OneRPM = (60*idealVelocity)/(8*Math.PI); //RPM required if 100% of speed from flywheel is transferred to the ball
387
- // double actualRPM = 10*OneRPM; //RPM needed bearing 10% of velocity is transferred from flywheel to ball
388
- // double flywheelMotor = actualRPM/the maximum rpm of the motor; //The motor output in percentage of the flywheel motor
389
- }
375
+ // private boolean ballSeen() {// TODO: Sriman/Ayush code this so we know if there's a ball
376
+ // return true;
377
+ // }
378
+
379
+ // public void fire() {
380
+ // double transferPercent = 0.35;
381
+ // double[][] limelightData = getLimelightData();
382
+ // double idealAngle = limelightData[0][1];
383
+ // double idealVelocity = limelightData[0][2]; // flywheel diameter in meters
384
+
385
+ // double rpm = getRPM(idealVelocity, transferPercent);
386
+ // if (!intakeLimit.get()) {
387
+ // wrist.set(ControlMode.PercentOutput, 0.75);
388
+ // }
389
+ // shooterFly.set(ControlMode.Velocity, 4*rpm*2048); //TODO: Gear ratio multiplier MIGHT HAVE TO MULTIPLY BY 2048- will test later
390
+ // if ((gyro.getRoll() > idealAngle + 5) && !upperShooterLimit.get()) { // TODO: Adjust degrees of freedom +- 5
391
+ // hood.set(ControlMode.PercentOutput, 0.1);
392
+ // ready = false;
393
+ // }
394
+ // else if ((gyro.getRoll() < idealAngle-5) && !lowerShooterLimit.get()) {
395
+ // hood.set(ControlMode.PercentOutput, -0.1);
396
+ // ready = false;
397
+ // }
398
+ // else {
399
+ // ready = true;
400
+ // }
401
+ // if (ready) {
402
+ // rollers.set(ControlMode.PercentOutput, 1);
403
+ // }
404
+ // else {
405
+ // climbRotation.set(ControlMode.PercentOutput, 0);
406
+ // }
407
+ // //adjust to fine tuning
408
+ // // double OneRPM = (60*idealVelocity)/(8*Math.PI); //RPM required if 100% of speed from flywheel is transferred to the ball
409
+ // // double actualRPM = 10*OneRPM; //RPM needed bearing 10% of velocity is transferred from flywheel to ball
410
+ // // double flywheelMotor = actualRPM/the maximum rpm of the motor; //The motor output in percentage of the flywheel motor
411
+ // }
390
412
391
413
//TODO: Determines the RPM to set flywheel based on what RPM corresponds to what ball velocity
392
414
public double getRPM (double idealVelocity , double transferPercent ) {
@@ -422,9 +444,9 @@ else if (controller.getYButton()) {
422
444
//Wrist for intake, no encoder (for teleop)
423
445
public void wrist () {
424
446
if (controller .getBButton ()) { //sets intake in position to feed ball into flywheel
425
- wrist .set (ControlMode .PercentOutput , 0.75 );
447
+ wrist .set (ControlMode .PercentOutput , 0.2 );
426
448
} else if (controller .getXButton ()) { //sets intake in position to pick balls off field
427
- wrist .set (ControlMode .PercentOutput , -0.4 );
449
+ wrist .set (ControlMode .PercentOutput , -0.2 );
428
450
} else {
429
451
wrist .set (ControlMode .PercentOutput , 0 );
430
452
}
0 commit comments