From 0baf96168000ccc1988104738fa432155917c537 Mon Sep 17 00:00:00 2001 From: Carlos Date: Tue, 26 Mar 2024 15:52:51 -0700 Subject: [PATCH] Adding sample files --- .../ftc/teamcode/CometBotsCameraTest.java | 78 +++++++++++++++++++ .../ftc/teamcode/CometBotsIMUTest.java | 72 +++++++++++++++++ .../ftc/teamcode/CometBotsOpenCVTest.java | 44 +++++++++++ .../org/firstinspires/ftc/teamcode/notes.md | 4 + 4 files changed, 198 insertions(+) create mode 100644 TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsCameraTest.java create mode 100644 TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsIMUTest.java create mode 100644 TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsOpenCVTest.java create mode 100644 TeamCode/src/main/java/org/firstinspires/ftc/teamcode/notes.md diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsCameraTest.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsCameraTest.java new file mode 100644 index 000000000..8f1fc8498 --- /dev/null +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsCameraTest.java @@ -0,0 +1,78 @@ +package org.firstinspires.ftc.teamcode; + +import android.util.Size; + +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.vision.VisionPortal; + +import java.util.Locale; + +@TeleOp(name = "DevApp - Camera Test (HDMI)", group = "SCDS Development") +public class CometBotsCameraTest extends LinearOpMode { + + final boolean USING_WEBCAM = true; + final BuiltinCameraDirection INTERNAL_CAM_DIR = BuiltinCameraDirection.FRONT; + final int RESOLUTION_WIDTH = 640; + final int RESOLUTION_HEIGHT = 480; + + // Internal state + boolean lastX; + int frameCount; + long capReqTime; + + @Override + public void runOpMode() throws InterruptedException { + + telemetry.speak("Development - Camera Test"); + + VisionPortal portal; + + if (USING_WEBCAM) + { + portal = new VisionPortal.Builder() + .setCamera(hardwareMap.get(WebcamName.class, "Webcam 1")) + .setCameraResolution(new Size(RESOLUTION_WIDTH, RESOLUTION_HEIGHT)) + .build(); + } + else + { + portal = new VisionPortal.Builder() + .setCamera(INTERNAL_CAM_DIR) + .setCameraResolution(new Size(RESOLUTION_WIDTH, RESOLUTION_HEIGHT)) + .build(); + } + + while (!isStopRequested()) + { + boolean x = gamepad1.x; + + if (x && !lastX) + { + portal.saveNextFrameRaw(String.format(Locale.US, "CameraFrameCapture-%06d", frameCount++)); + capReqTime = System.currentTimeMillis(); + } + + lastX = x; + + telemetry.addLine("######## Camera Capture Utility ########"); + telemetry.addLine(String.format(Locale.US, " > Resolution: %dx%d", RESOLUTION_WIDTH, RESOLUTION_HEIGHT)); + telemetry.addLine(" > Press X (or Square) to capture a frame"); + telemetry.addData(" > Camera Status", portal.getCameraState()); + + if (capReqTime != 0) + { + telemetry.addLine("\nCaptured Frame!"); + } + + if (capReqTime != 0 && System.currentTimeMillis() - capReqTime > 1000) + { + capReqTime = 0; + } + telemetry.update(); + } + } +} diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsIMUTest.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsIMUTest.java new file mode 100644 index 000000000..dbb69f2f8 --- /dev/null +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsIMUTest.java @@ -0,0 +1,72 @@ +package org.firstinspires.ftc.teamcode; + +import com.qualcomm.hardware.rev.RevHubOrientationOnRobot; +import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; +import com.qualcomm.robotcore.eventloop.opmode.TeleOp; +import com.qualcomm.robotcore.hardware.IMU; + +import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit; +import org.firstinspires.ftc.robotcore.external.navigation.AngularVelocity; +import org.firstinspires.ftc.robotcore.external.navigation.YawPitchRollAngles; + +@TeleOp(name = "DevApp - IMU Test", group = "SCDS Development") +public class CometBotsIMUTest extends LinearOpMode { + + IMU imu; + + @Override + public void runOpMode() throws InterruptedException { + + // Retrieve and initialize the IMU. + // This sample expects the IMU to be in a REV Hub and named "imu". + imu = hardwareMap.get(IMU.class, "imu"); + + /* Define how the hub is mounted on the robot to get the correct Yaw, Pitch and Roll values. + * + * Two input parameters are required to fully specify the Orientation. + * The first parameter specifies the direction the printed logo on the Hub is pointing. + * The second parameter specifies the direction the USB connector on the Hub is pointing. + * All directions are relative to the robot, and left/right is as-viewed from behind the robot. + */ + + /* The next two lines define Hub orientation. + * The Default Orientation (shown) is when a hub is mounted horizontally with the printed logo pointing UP and the USB port pointing FORWARD. + * + * To Do: EDIT these two lines to match YOUR mounting configuration. + */ + RevHubOrientationOnRobot.LogoFacingDirection logoDirection = RevHubOrientationOnRobot.LogoFacingDirection.UP; + RevHubOrientationOnRobot.UsbFacingDirection usbDirection = RevHubOrientationOnRobot.UsbFacingDirection.FORWARD; + + RevHubOrientationOnRobot orientationOnRobot = new RevHubOrientationOnRobot(logoDirection, usbDirection); + + // Now initialize the IMU with this mounting orientation + // Note: if you choose two conflicting directions, this initialization will cause a code exception. + imu.initialize(new IMU.Parameters(orientationOnRobot)); + + // Loop and update the dashboard + while (!isStopRequested()) { + + telemetry.addData("Hub orientation", "Logo=%s USB=%s\n ", logoDirection, usbDirection); + + // Check to see if heading reset is requested + if (gamepad1.y) { + telemetry.addData("Yaw", "Resetting\n"); + imu.resetYaw(); + } else { + telemetry.addData("Yaw", "Press Y (triangle) on Gamepad to reset\n"); + } + + // Retrieve Rotational Angles and Velocities + YawPitchRollAngles orientation = imu.getRobotYawPitchRollAngles(); + AngularVelocity angularVelocity = imu.getRobotAngularVelocity(AngleUnit.DEGREES); + + telemetry.addData("Yaw (Z)", "%.2f Deg. (Heading)", orientation.getYaw(AngleUnit.DEGREES)); + telemetry.addData("Pitch (X)", "%.2f Deg.", orientation.getPitch(AngleUnit.DEGREES)); + telemetry.addData("Roll (Y)", "%.2f Deg.\n", orientation.getRoll(AngleUnit.DEGREES)); + telemetry.addData("Yaw (Z) velocity", "%.2f Deg/Sec", angularVelocity.zRotationRate); + telemetry.addData("Pitch (X) velocity", "%.2f Deg/Sec", angularVelocity.xRotationRate); + telemetry.addData("Roll (Y) velocity", "%.2f Deg/Sec", angularVelocity.yRotationRate); + telemetry.update(); + } + } +} diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsOpenCVTest.java b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsOpenCVTest.java new file mode 100644 index 000000000..6730d98ef --- /dev/null +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/CometBotsOpenCVTest.java @@ -0,0 +1,44 @@ +package org.firstinspires.ftc.teamcode; + +import com.qualcomm.robotcore.eventloop.opmode.Autonomous; +import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; + +import org.firstinspires.ftc.robotcore.external.hardware.camera.WebcamName; +import org.openftc.easyopencv.OpenCvCamera; +import org.openftc.easyopencv.OpenCvCameraFactory; +import org.openftc.easyopencv.OpenCvCameraRotation; + +@Autonomous(name="DevApp - OpenCV Test", group="SCDS Development") +public class CometBotsOpenCVTest extends LinearOpMode { + + private OpenCvCamera controlHubCam; // Use OpenCvCamera class from FTC SDK + private static final int CAMERA_WIDTH = 1280; // width of wanted camera resolution + private static final int CAMERA_HEIGHT = 720; // height of wanted camera resolution + + // Calculate the distance using the formula + public static final double objectWidthInRealWorldUnits = 3.75; // Replace with the actual width of the object in real-world units + public static final double focalLength = 728; // Replace with the focal length of the camera in pixels + + private void initOpenCV() { + + // Create an instance of the camera + int cameraMonitorViewId = hardwareMap.appContext.getResources().getIdentifier( + "cameraMonitorViewId", "id", hardwareMap.appContext.getPackageName()); + + // Use OpenCvCameraFactory class from FTC SDK to create camera instance + controlHubCam = OpenCvCameraFactory.getInstance().createWebcam( + hardwareMap.get(WebcamName.class, "Webcam 1"), cameraMonitorViewId); + + controlHubCam.setPipeline(new YellowBlobDetectionPipeline()); + + controlHubCam.openCameraDevice(); + controlHubCam.startStreaming(CAMERA_WIDTH, CAMERA_HEIGHT, OpenCvCameraRotation.UPRIGHT); + } + + @Override + public void runOpMode() throws InterruptedException { + + + + } +} diff --git a/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/notes.md b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/notes.md new file mode 100644 index 000000000..09fe864a5 --- /dev/null +++ b/TeamCode/src/main/java/org/firstinspires/ftc/teamcode/notes.md @@ -0,0 +1,4 @@ +https://www.youtube.com/watch?v=aeMWWvteF2U + +https://www.youtube.com/watch?v=1xdo8QP6_mI +