Skip to content

Commit

Permalink
Added teleop for airplane launcher using the gamepad 1 with the right…
Browse files Browse the repository at this point in the history
… bumper.
  • Loading branch information
Nishk04 committed Nov 2, 2023
1 parent 950a207 commit f0251b2
Show file tree
Hide file tree
Showing 4 changed files with 183 additions and 3 deletions.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
public class RobotAutoDriveToAprilTagOmni extends LinearOpMode
{
// Adjust these numbers to suit your robot.
final double DESIRED_DISTANCE = 12.0; // this is how close the camera should get to the target (inches)
final double DESIRED_DISTANCE = 1.0; // this is how close the camera should get to the target (inches)

// Set the GAIN constants to control the relationship between the measured position error, and how much power is
// applied to the drive motors to correct the error.
Expand Down
30 changes: 28 additions & 2 deletions TeamCode/src/main/java/org/firstinspires/ftc/teamcode/TeleOp.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.firstinspires.ftc.teamcode;

import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.util.ElapsedTime;

import org.firstinspires.ftc.teamcode.abstractions.Claw;
Expand All @@ -15,7 +16,8 @@
public class TeleOp extends LinearOpMode {
/**
* Returns the maximum of all the arguments
* @param a the first argument
*
* @param a the first argument
* @param others the other arguments
* @return the maximum of all the arguments
*/
Expand All @@ -36,6 +38,12 @@ private double max(double a, double... others) {
}
return max;
}
public double OdoToInches (double ticks){
double ticksPerRotation = 8192;
double radius_inches = 0.69;
double num_wheel_rotations = ticks/8192;
return (num_wheel_rotations * 2 * Math.PI * radius_inches);
}

@Override
public void runOpMode() {
Expand All @@ -50,6 +58,9 @@ public void runOpMode() {
// set up the claw
Claw claw = new Claw(scheduler, robot.clawGrab(), robot.clawRotate(), robot.getClawLock());

//Reset odometry pods
driveMotors.frontLeft.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
driveMotors.backRight.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);

This comment has been minimized.

Copy link
@penguinencounter

penguinencounter Nov 2, 2023

Member

you need to set the motors back to RUN_WITHOUT_ENCODER for them to work :P


waitForStart();
int targetLeft = 0;
Expand All @@ -71,6 +82,11 @@ public void runOpMode() {
balBL /= balanceDen;
balBR /= balanceDen;

// Creates Drone motor instance
DcMotor drone = hardwareMap.get(DcMotor.class, "drone");
DcMotor intake = hardwareMap.get(DcMotor.class, "intake");
intake.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);

ElapsedTime timer1 = new ElapsedTime();
while (opModeIsActive()) {
scheduler.tick();
Expand Down Expand Up @@ -145,7 +161,17 @@ public void runOpMode() {

// TODO: really should make this based on deltaTime
// make time between refreshes longer to avoid spamming motors with commands
sleep(5);

// Makes drone launcher motor go zoom when the right bumper is pressed on game pad 1
if (gamepad1.right_bumper) {
drone.setPower(1);
} else {
drone.setPower(0);
}
//Updates the average distance traveled forward: positive is right or forward; negative is backward or left
telemetry.addData("Distance Driven Forward:", OdoToInches((driveMotors.backRight.getCurrentPosition() + driveMotors.frontLeft.getCurrentPosition())/2));
telemetry.addData("Inches Strafed: ", OdoToInches(intake.getCurrentPosition()));
telemetry.update();
}

// panic() cleans up 'resources' (Claw, drive motors, etc)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
package org.firstinspires.ftc.teamcode.utility;

import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.eventloop.opmode.Disabled;
import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
import org.firstinspires.ftc.robotcore.external.hardware.camera.BuiltinCameraDirection;
import org.firstinspires.ftc.robotcore.external.hardware.camera.WebcamName;
import org.firstinspires.ftc.robotcore.external.tfod.Recognition;
import org.firstinspires.ftc.vision.VisionPortal;
import org.firstinspires.ftc.vision.tfod.TfodProcessor;

import java.util.List;
@Autonomous
public class TFODObjectDetectionSpikes extends LinearOpMode {

private static final boolean USE_WEBCAM = true; // true for webcam, false for phone camera

// TFOD_MODEL_FILE points to a model file stored onboard the Robot Controller's storage,
// this is used when uploading models directly to the RC using the model upload interface.
private static final String TFOD_MODEL_ASSET = "model_20231021_184041.tflite";
// Define the labels recognized in the model for TFOD (must be in training order!)
private static final String[] LABELS = {
"ShampooBottle",
};

/**
* The variable to store our instance of the TensorFlow Object Detection processor.
*/
private TfodProcessor tfod;
private VisionPortal visionPortal;

@Override
public void runOpMode() {

initTfod();

// Wait for the DS start button to be touched.
telemetry.addData("DS preview on/off", "3 dots, Camera Stream");
telemetry.addData(">", "Touch Play to start OpMode");
telemetry.update();
waitForStart();

if (opModeIsActive()) {
while (opModeIsActive()) {

telemetryTfod();

// Push telemetry to the Driver Station.
telemetry.update();

// Save CPU resources; can resume streaming when needed.
if (gamepad1.dpad_down) {
visionPortal.stopStreaming();
} else if (gamepad1.dpad_up) {
visionPortal.resumeStreaming();
}

// Share the CPU.
sleep(20);
}
}

// Save more CPU resources when camera is no longer needed.
visionPortal.close();

} // end runOpMode()

/**
* Initialize the TensorFlow Object Detection processor.
*/
private void initTfod() {

// Create the TensorFlow processor by using a builder.
tfod = new TfodProcessor.Builder()

// With the following lines commented out, the default TfodProcessor Builder
// will load the default model for the season. To define a custom model to load,
// choose one of the following:
// Use setModelAssetName() if the custom TF Model is built in as an asset (AS only).
// Use setModelFileName() if you have downloaded a custom team model to the Robot Controller.
.setModelAssetName(TFOD_MODEL_ASSET)
//.setModelFileName(TFOD_MODEL_FILE)

// The following default settings are available to un-comment and edit as needed to
// set parameters for custom models.
.setModelLabels(LABELS)
//.setIsModelTensorFlow2(true)
//.setIsModelQuantized(true)
//.setModelInputSize(300)
//.setModelAspectRatio(16.0 / 9.0)

.build();

// Create the vision portal by using a builder.
VisionPortal.Builder builder = new VisionPortal.Builder();

// Set the camera (webcam vs. built-in RC phone camera).
if (USE_WEBCAM) {
builder.setCamera(hardwareMap.get(WebcamName.class, "Webcam 1"));
} else {
builder.setCamera(BuiltinCameraDirection.BACK);
}

// Choose a camera resolution. Not all cameras support all resolutions.
//builder.setCameraResolution(new Size(640, 480));

// Enable the RC preview (LiveView). Set "false" to omit camera monitoring.
//builder.enableLiveView(true);

// Set the stream format; MJPEG uses less bandwidth than default YUY2.
//builder.setStreamFormat(VisionPortal.StreamFormat.YUY2);

// Choose whether or not LiveView stops if no processors are enabled.
// If set "true", monitor shows solid orange screen if no processors enabled.
// If set "false", monitor shows camera view without annotations.
//builder.setAutoStopLiveView(false);

// Set and enable the processor.
builder.addProcessor(tfod);

// Build the Vision Portal, using the above settings.
visionPortal = builder.build();

// Set confidence threshold for TFOD recognitions, at any time.
//tfod.setMinResultConfidence(0.75f);

// Disable or re-enable the TFOD processor at any time.
//visionPortal.setProcessorEnabled(tfod, true);

} // end method initTfod()

/**
* Add telemetry about TensorFlow Object Detection (TFOD) recognitions.
*/
private void telemetryTfod() {

List<Recognition> currentRecognitions = tfod.getRecognitions();
telemetry.addData("# Objects Detected", currentRecognitions.size());

// Step through the list of recognitions and display info for each one.
for (Recognition recognition : currentRecognitions) {
double x = (recognition.getLeft() + recognition.getRight()) / 2 ;
double y = (recognition.getTop() + recognition.getBottom()) / 2 ;

telemetry.addData(""," ");
telemetry.addData("Image", "%s (%.0f %% Conf.)", recognition.getLabel(), recognition.getConfidence() * 100);
telemetry.addData("- Position", "%.0f,%.0f", x, y);
telemetry.addData("- Size", "%.0f x %.0f", recognition.getWidth(), recognition.getHeight());
} // end for() loop

} // end method telemetryTfod()

} // end class

0 comments on commit f0251b2

Please sign in to comment.