This repository has been archived by the owner on Oct 27, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #261 from FIRST-Tech-Challenge/20200824-090813-rel…
…ease-candidate SkyStone v5.5
- Loading branch information
Showing
425 changed files
with
791 additions
and
163,780 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,11 @@ | ||
dependencies { | ||
implementation (name:'Inspection-release', ext: 'aar') | ||
implementation (name:'Blocks-release', ext: 'aar') | ||
implementation (name:'RobotCore-release', ext: 'aar') | ||
implementation (name:'RobotServer-release', ext: 'aar') | ||
implementation (name:'OnBotJava-release', ext: 'aar') | ||
implementation (name:'Hardware-release', ext: 'aar') | ||
implementation (name:'FtcCommon-release', ext: 'aar') | ||
implementation 'org.firstinspires.ftc:Inspection:5.5' | ||
implementation 'org.firstinspires.ftc:Blocks:5.5' | ||
implementation 'org.firstinspires.ftc:RobotCore:5.5' | ||
implementation 'org.firstinspires.ftc:RobotServer:5.5' | ||
implementation 'org.firstinspires.ftc:OnBotJava:5.5' | ||
implementation 'org.firstinspires.ftc:Hardware:5.5' | ||
implementation 'org.firstinspires.ftc:FtcCommon:5.5' | ||
implementation (name:'WirelessP2p-release', ext:'aar') | ||
implementation 'com.android.support:support-compat:28.0.0' | ||
implementation 'androidx.appcompat:appcompat:1.2.0' | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
199 changes: 199 additions & 0 deletions
199
...c/robotcontroller/external/samples/ConceptTensorFlowObjectDetectionSwitchableCameras.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,199 @@ | ||
/* Copyright (c) 2020 FIRST. All rights reserved. | ||
* | ||
* Redistribution and use in source and binary forms, with or without modification, | ||
* are permitted (subject to the limitations in the disclaimer below) provided that | ||
* the following conditions are met: | ||
* | ||
* Redistributions of source code must retain the above copyright notice, this list | ||
* of conditions and the following disclaimer. | ||
* | ||
* Redistributions in binary form must reproduce the above copyright notice, this | ||
* list of conditions and the following disclaimer in the documentation and/or | ||
* other materials provided with the distribution. | ||
* | ||
* Neither the name of FIRST nor the names of its contributors may be used to endorse or | ||
* promote products derived from this software without specific prior written permission. | ||
* | ||
* NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS | ||
* LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | ||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE | ||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
*/ | ||
|
||
package org.firstinspires.ftc.robotcontroller.external.samples; | ||
|
||
import com.qualcomm.robotcore.eventloop.opmode.Disabled; | ||
import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; | ||
import com.qualcomm.robotcore.eventloop.opmode.TeleOp; | ||
import java.util.List; | ||
import org.firstinspires.ftc.robotcore.external.ClassFactory; | ||
import org.firstinspires.ftc.robotcore.external.hardware.camera.SwitchableCamera; | ||
import org.firstinspires.ftc.robotcore.external.hardware.camera.WebcamName; | ||
import org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer; | ||
import org.firstinspires.ftc.robotcore.external.tfod.TFObjectDetector; | ||
import org.firstinspires.ftc.robotcore.external.tfod.Recognition; | ||
|
||
/** | ||
* This 2019-2020 OpMode illustrates the basics of using the TensorFlow Object Detection API to | ||
* determine the position of the Skystone game elements. | ||
* | ||
* Use Android Studio to Copy this Class, and Paste it into your team's code folder with a new name. | ||
* Remove or comment out the @Disabled line to add this opmode to the Driver Station OpMode list. | ||
* | ||
* IMPORTANT: In order to use this OpMode, you need to obtain your own Vuforia license key as | ||
* is explained below. | ||
*/ | ||
@TeleOp(name = "Concept: TensorFlow Object Detection Switchable Cameras", group = "Concept") | ||
@Disabled | ||
public class ConceptTensorFlowObjectDetectionSwitchableCameras extends LinearOpMode { | ||
private static final String TFOD_MODEL_ASSET = "Skystone.tflite"; | ||
private static final String LABEL_FIRST_ELEMENT = "Stone"; | ||
private static final String LABEL_SECOND_ELEMENT = "Skystone"; | ||
|
||
/* | ||
* IMPORTANT: You need to obtain your own license key to use Vuforia. The string below with which | ||
* 'parameters.vuforiaLicenseKey' is initialized is for illustration only, and will not function. | ||
* A Vuforia 'Development' license key, can be obtained free of charge from the Vuforia developer | ||
* web site at https://developer.vuforia.com/license-manager. | ||
* | ||
* Vuforia license keys are always 380 characters long, and look as if they contain mostly | ||
* random data. As an example, here is a example of a fragment of a valid key: | ||
* ... yIgIzTqZ4mWjk9wd3cZO9T1axEqzuhxoGlfOOI2dRzKS4T0hQ8kT ... | ||
* Once you've obtained a license key, copy the string from the Vuforia web site | ||
* and paste it in to your code on the next line, between the double quotes. | ||
*/ | ||
private static final String VUFORIA_KEY = | ||
" -- YOUR NEW VUFORIA KEY GOES HERE --- "; | ||
|
||
/** | ||
* {@link #vuforia} is the variable we will use to store our instance of the Vuforia | ||
* localization engine. | ||
*/ | ||
private VuforiaLocalizer vuforia; | ||
|
||
/** | ||
* Variables used for switching cameras. | ||
*/ | ||
private WebcamName webcam1, webcam2; | ||
private SwitchableCamera switchableCamera; | ||
private boolean oldLeftBumper; | ||
private boolean oldRightBumper; | ||
|
||
/** | ||
* {@link #tfod} is the variable we will use to store our instance of the TensorFlow Object | ||
* Detection engine. | ||
*/ | ||
private TFObjectDetector tfod; | ||
|
||
@Override | ||
public void runOpMode() { | ||
// The TFObjectDetector uses the camera frames from the VuforiaLocalizer, so we create that | ||
// first. | ||
initVuforia(); | ||
initTfod(); | ||
|
||
/** | ||
* Activate TensorFlow Object Detection before we wait for the start command. | ||
* Do it here so that the Camera Stream window will have the TensorFlow annotations visible. | ||
**/ | ||
if (tfod != null) { | ||
tfod.activate(); | ||
} | ||
|
||
/** Wait for the game to begin */ | ||
telemetry.addData(">", "Press Play to start op mode"); | ||
telemetry.update(); | ||
waitForStart(); | ||
|
||
if (opModeIsActive()) { | ||
while (opModeIsActive()) { | ||
if (tfod != null) { | ||
doCameraSwitching(); | ||
List<Recognition> recognitions = tfod.getRecognitions(); | ||
telemetry.addData("# Object Detected", recognitions.size()); | ||
// step through the list of recognitions and display boundary info. | ||
int i = 0; | ||
for (Recognition recognition : recognitions) { | ||
telemetry.addData(String.format("label (%d)", i), recognition.getLabel()); | ||
telemetry.addData(String.format(" left,top (%d)", i), "%.03f , %.03f", | ||
recognition.getLeft(), recognition.getTop()); | ||
telemetry.addData(String.format(" right,bottom (%d)", i), "%.03f , %.03f", | ||
recognition.getRight(), recognition.getBottom()); | ||
} | ||
telemetry.update(); | ||
} | ||
} | ||
} | ||
|
||
if (tfod != null) { | ||
tfod.shutdown(); | ||
} | ||
} | ||
|
||
/** | ||
* Initialize the Vuforia localization engine. | ||
*/ | ||
private void initVuforia() { | ||
/* | ||
* Configure Vuforia by creating a Parameter object, and passing it to the Vuforia engine. | ||
*/ | ||
VuforiaLocalizer.Parameters parameters = new VuforiaLocalizer.Parameters(); | ||
|
||
parameters.vuforiaLicenseKey = VUFORIA_KEY; | ||
|
||
// Indicate that we wish to be able to switch cameras. | ||
webcam1 = hardwareMap.get(WebcamName.class, "Webcam 1"); | ||
webcam2 = hardwareMap.get(WebcamName.class, "Webcam 2"); | ||
parameters.cameraName = ClassFactory.getInstance().getCameraManager().nameForSwitchableCamera(webcam1, webcam2); | ||
|
||
// Instantiate the Vuforia engine | ||
vuforia = ClassFactory.getInstance().createVuforia(parameters); | ||
|
||
// Set the active camera to Webcam 1. | ||
switchableCamera = (SwitchableCamera) vuforia.getCamera(); | ||
switchableCamera.setActiveCamera(webcam1); | ||
|
||
// Loading trackables is not necessary for the TensorFlow Object Detection engine. | ||
} | ||
|
||
/** | ||
* Initialize the TensorFlow Object Detection engine. | ||
*/ | ||
private void initTfod() { | ||
int tfodMonitorViewId = hardwareMap.appContext.getResources().getIdentifier( | ||
"tfodMonitorViewId", "id", hardwareMap.appContext.getPackageName()); | ||
TFObjectDetector.Parameters tfodParameters = new TFObjectDetector.Parameters(tfodMonitorViewId); | ||
tfodParameters.minResultConfidence = 0.8f; | ||
tfod = ClassFactory.getInstance().createTFObjectDetector(tfodParameters, vuforia); | ||
tfod.loadModelFromAsset(TFOD_MODEL_ASSET, LABEL_FIRST_ELEMENT, LABEL_SECOND_ELEMENT); | ||
} | ||
|
||
private void doCameraSwitching() { | ||
// If the left bumper is pressed, use Webcam 1. | ||
// If the right bumper is pressed, use Webcam 2. | ||
boolean newLeftBumper = gamepad1.left_bumper; | ||
boolean newRightBumper = gamepad1.right_bumper; | ||
if (newLeftBumper && !oldLeftBumper) { | ||
switchableCamera.setActiveCamera(webcam1); | ||
} else if (newRightBumper && !oldRightBumper) { | ||
switchableCamera.setActiveCamera(webcam2); | ||
} | ||
oldLeftBumper = newLeftBumper; | ||
oldRightBumper = newRightBumper; | ||
|
||
if (switchableCamera.getActiveCamera().equals(webcam1)) { | ||
telemetry.addData("activeCamera", "Webcam 1"); | ||
telemetry.addData("Press RightBumper", "to switch to Webcam 2"); | ||
} else { | ||
telemetry.addData("activeCamera", "Webcam 2"); | ||
telemetry.addData("Press LeftBumper", "to switch to Webcam 1"); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.