Java tutorial
/* Copyright (c) 2017 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.team4042.autos; import android.graphics.Bitmap; import com.qualcomm.robotcore.eventloop.opmode.Autonomous; import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode; import com.qualcomm.robotcore.hardware.HardwareMap; import com.qualcomm.robotcore.util.ElapsedTime; import com.vuforia.CameraDevice; import com.vuforia.Image; import com.vuforia.PIXEL_FORMAT; import com.vuforia.Vuforia; import org.firstinspires.ftc.robotcontroller.external.samples.ConceptVuforiaNavigation; import org.firstinspires.ftc.robotcore.external.ClassFactory; import org.firstinspires.ftc.robotcore.external.Telemetry; import org.firstinspires.ftc.robotcore.external.matrices.OpenGLMatrix; import org.firstinspires.ftc.robotcore.external.matrices.VectorF; import org.firstinspires.ftc.robotcore.external.navigation.AngleUnit; import org.firstinspires.ftc.robotcore.external.navigation.AxesOrder; import org.firstinspires.ftc.robotcore.external.navigation.AxesReference; import org.firstinspires.ftc.robotcore.external.navigation.Orientation; import org.firstinspires.ftc.robotcore.external.navigation.RelicRecoveryVuMark; import org.firstinspires.ftc.robotcore.external.navigation.VuMarkInstanceId; import org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer; import org.firstinspires.ftc.robotcore.external.navigation.VuforiaTrackable; import org.firstinspires.ftc.robotcore.external.navigation.VuforiaTrackableDefaultListener; import org.firstinspires.ftc.robotcore.external.navigation.VuforiaTrackables; import org.firstinspires.ftc.robotcore.internal.vuforia.VuforiaLocalizerImpl; import org.opencv.android.Utils; import org.opencv.core.CvType; import org.opencv.core.Mat; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; /** * This OpMode illustrates the basics of using the Vuforia engine to determine * the identity of Vuforia VuMarks encountered on the field. The code is structured as * a LinearOpMode. It shares much structure with {@link ConceptVuforiaNavigation}; we do not here * duplicate the core Vuforia documentation found there, but rather instead focus on the * differences between the use of Vuforia for navigation vs VuMark identification. * * @see ConceptVuforiaNavigation * @see VuforiaLocalizer * @see VuforiaTrackableDefaultListener * see ftc_app/doc/tutorial/FTC_FieldCoordinateSystemDefinition.pdf * * 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 in {@link ConceptVuforiaNavigation}. */ public class VuMarkIdentifier { public static final String TAG = "Vuforia VuMark Sample"; OpenGLMatrix lastLocation = null; /** * {@link #vuforia} is the variable we will use to store our instance of the Vuforia * localization engine. */ private VuforiaLocalizerImplSubclass vuforia; private VuforiaTrackable relicTemplate; private VuforiaTrackables relicTrackables; private Telemetry telemetry; private HardwareMap hardwareMap; public void initialize(Telemetry telemetry, HardwareMap hardwareMap) { this.telemetry = telemetry; this.hardwareMap = hardwareMap; try { //To start up Vuforia, tell it the view that we wish to use for camera monitor (on the RC phone); int cameraMonitorViewId = hardwareMap.appContext.getResources().getIdentifier("cameraMonitorViewId", "id", hardwareMap.appContext.getPackageName()); VuforiaLocalizer.Parameters parameters = new VuforiaLocalizer.Parameters(cameraMonitorViewId); parameters.vuforiaLicenseKey = new BufferedReader( new FileReader(new File(Auto.autoRoot, "vuforia_key.txt"))).readLine(); //We also indicate which camera on the RC that we wish to use. Here we chose the back (HiRes) camera. parameters.cameraDirection = VuforiaLocalizer.CameraDirection.BACK; this.vuforia = new VuforiaLocalizerImplSubclass(parameters, telemetry); } catch (Exception ex) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); telemetry.addData("error", sw.toString()); telemetry.update(); } } public RelicRecoveryVuMark getMark() { //Load the data set containing the VuMarks for Relic Recovery. relicTrackables = this.vuforia.loadTrackablesFromAsset("RelicVuMark"); relicTemplate = relicTrackables.get(0); //Turn on the flashlight to see the mark better CameraDevice.getInstance().setFlashTorchMode(true); //Can help in debugging; otherwise not necessary relicTemplate.setName("relicVuMarkTemplate"); relicTrackables.activate(); RelicRecoveryVuMark relicRecoveryVuMark; ElapsedTime timer = new ElapsedTime(); do { relicRecoveryVuMark = RelicRecoveryVuMark.from(relicTemplate); } while (relicRecoveryVuMark.equals(RelicRecoveryVuMark.UNKNOWN) && timer.seconds() < 3); if (relicRecoveryVuMark == RelicRecoveryVuMark.UNKNOWN) { relicRecoveryVuMark = RelicRecoveryVuMark.CENTER; } CameraDevice.getInstance().setFlashTorchMode(false); return relicRecoveryVuMark; } public void prepareMark() { relicTrackables = this.vuforia.loadTrackablesFromAsset("RelicVuMark"); relicTemplate = relicTrackables.get(0); CameraDevice.getInstance().setFlashTorchMode(true); relicTemplate.setName("relicVuMarkTemplate"); // can help in debugging; otherwise not necessary relicTrackables.activate(); } public RelicRecoveryVuMark getMarkInstant() { return RelicRecoveryVuMark.from(relicTemplate); } public Mat getFrame() { /*relicTrackables = this.vuforia.loadTrackablesFromAsset("RelicVuMark"); relicTemplate = relicTrackables.get(0); relicTemplate.setName("relicVuMarkTemplate"); // can help in debugging; otherwise not necessary relicTrackables.activate();*/ //ElapsedTime timeout = new ElapsedTime(); Bitmap bm = null; while (bm == null) { if (this.vuforia.rgb != null) { bm = Bitmap.createBitmap(this.vuforia.rgb.getWidth(), this.vuforia.rgb.getHeight(), Bitmap.Config.RGB_565); bm.copyPixelsFromBuffer(vuforia.rgb.getPixels()); } } //telemetry.log().add(bm.getWidth() + " x " + bm.getHeight()); Mat tmp = new Mat(bm.getWidth(), bm.getHeight(), CvType.CV_8UC4); Utils.bitmapToMat(bm, tmp); /* FileOutputStream out = null; try { out = new FileOutputStream(new File("./storage/emulated/0/DCIM/nicepic.png")); bm.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance // PNG is a lossless format, the compression factor (100) is ignored } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } */ return tmp; } }