Added at
This commit is contained in:
@@ -0,0 +1,238 @@
|
||||
package org.firstinspires.ftc.teamcode.subsystems;
|
||||
|
||||
import com.acmerobotics.dashboard.telemetry.MultipleTelemetry;
|
||||
|
||||
import org.firstinspires.ftc.teamcode.utils.Robot;
|
||||
import org.firstinspires.ftc.teamcode.subsystems.Subsystem;
|
||||
import org.firstinspires.ftc.vision.VisionPortal;
|
||||
import org.firstinspires.ftc.vision.apriltag.AprilTagDetection;
|
||||
import org.firstinspires.ftc.vision.apriltag.AprilTagProcessor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class AprilTag implements Subsystem {
|
||||
|
||||
private AprilTagProcessor aprilTag;
|
||||
private VisionPortal visionPortal;
|
||||
|
||||
private MultipleTelemetry TELE;
|
||||
|
||||
private boolean teleOn = false;
|
||||
|
||||
private int detections = 0;
|
||||
|
||||
List<AprilTagDetection> currentDetections;
|
||||
|
||||
ArrayList<ArrayList<Double>> Data = new ArrayList<>();
|
||||
|
||||
|
||||
|
||||
public AprilTag(Robot robot, MultipleTelemetry tele) {
|
||||
|
||||
|
||||
|
||||
this.aprilTag = robot.aprilTagProcessor;
|
||||
|
||||
|
||||
this.TELE = tele;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
|
||||
currentDetections = aprilTag.getDetections();
|
||||
|
||||
UpdateData();
|
||||
|
||||
if(teleOn){
|
||||
tagTELE();
|
||||
initTelemetry();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void initTelemetry (){
|
||||
|
||||
TELE.addData("Camera Preview", "Check Driver Station for stream");
|
||||
TELE.addData("Status", "Initialized - Press START");
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void tagTELE () {
|
||||
|
||||
TELE.addData("# AprilTags Detected", detections);
|
||||
|
||||
// Display info for each detected tag
|
||||
for (ArrayList<Double> detection : Data) {
|
||||
if (detection.get(0) ==1) {
|
||||
// Known AprilTag with metadata
|
||||
TELE.addLine(String.format("\n==== (ID %d) %s ====",
|
||||
detection.get(1).intValue(), ""));
|
||||
|
||||
TELE.addLine(String.format("XYZ: %6.1f %6.1f %6.1f (inch)",
|
||||
detection.get(2),
|
||||
detection.get(3),
|
||||
detection.get(4)));
|
||||
|
||||
TELE.addData("Distance", getDistance(detection.get(1).intValue()));
|
||||
|
||||
TELE.addLine(String.format("PRY: %6.1f %6.1f %6.1f (deg)",
|
||||
detection.get(5),
|
||||
detection.get(6),
|
||||
detection.get(7)));
|
||||
|
||||
TELE.addLine(String.format("RBE: %6.1f %6.1f %6.1f (inch, deg, deg)",
|
||||
detection.get(8),
|
||||
detection.get(9),
|
||||
detection.get(10)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void turnTelemetryOn(boolean bool) {
|
||||
|
||||
teleOn = bool;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void UpdateData () {
|
||||
|
||||
Data.clear(); // <--- THIS FIXES YOUR ISSUE
|
||||
|
||||
|
||||
detections = currentDetections.size();
|
||||
|
||||
|
||||
for (AprilTagDetection detection : currentDetections) {
|
||||
|
||||
ArrayList<Double> detectionData = new ArrayList<Double>();
|
||||
|
||||
|
||||
|
||||
if (detection.metadata != null) {
|
||||
|
||||
detectionData.add(1.0);
|
||||
// Known AprilTag with metadata
|
||||
|
||||
detectionData.add( (double) detection.id);
|
||||
|
||||
|
||||
|
||||
detectionData.add(detection.ftcPose.x);
|
||||
detectionData.add(detection.ftcPose.y);
|
||||
detectionData.add(detection.ftcPose.z);
|
||||
|
||||
|
||||
|
||||
detectionData.add(detection.ftcPose.pitch);
|
||||
detectionData.add(detection.ftcPose.roll);
|
||||
detectionData.add(detection.ftcPose.yaw);
|
||||
|
||||
detectionData.add(detection.ftcPose.range);
|
||||
detectionData.add(detection.ftcPose.bearing);
|
||||
detectionData.add(detection.ftcPose.elevation);
|
||||
|
||||
} else {
|
||||
|
||||
detectionData.add(0, 0.0);
|
||||
|
||||
}
|
||||
|
||||
Data.add(detectionData);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public int getDetectionCount() {
|
||||
|
||||
return detections;
|
||||
|
||||
}
|
||||
|
||||
public boolean isDetected (int id){
|
||||
return (!filterID(Data, (double) id ).isEmpty());
|
||||
}
|
||||
|
||||
|
||||
|
||||
public double getDistance(int id) {
|
||||
ArrayList<Double> d = filterID(Data, (double) id);
|
||||
if (d.size() >= 5) {
|
||||
double x = d.get(2);
|
||||
double y = d.get(3);
|
||||
double z = d.get(4);
|
||||
return Math.sqrt(x*x + y*y + z*z);
|
||||
}
|
||||
return -1; // tag not found
|
||||
}
|
||||
|
||||
// Returns the position as [x, y, z]
|
||||
public List<Double> getPosition(int id) {
|
||||
ArrayList<Double> d = filterID(Data, (double) id);
|
||||
if (d.size() >= 5) {
|
||||
List<Double> pos = new ArrayList<>();
|
||||
pos.add(d.get(2));
|
||||
pos.add(d.get(3));
|
||||
pos.add(d.get(4));
|
||||
return pos;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// Returns orientation as [pitch, roll, yaw]
|
||||
public List<Double> getOrientation(int id) {
|
||||
ArrayList<Double> d = filterID(Data, (double) id);
|
||||
if (d.size() >= 8) {
|
||||
List<Double> ori = new ArrayList<>();
|
||||
ori.add(d.get(5));
|
||||
ori.add(d.get(6));
|
||||
ori.add(d.get(7));
|
||||
return ori;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// Returns range, bearing, elevation as [range, bearing, elevation]
|
||||
public List<Double> getRBE(int id) {
|
||||
ArrayList<Double> d = filterID(Data, (double) id);
|
||||
if (d.size() >= 11) {
|
||||
List<Double> rbe = new ArrayList<>();
|
||||
rbe.add(d.get(8));
|
||||
rbe.add(d.get(9));
|
||||
rbe.add(d.get(10));
|
||||
return rbe;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// Returns full raw data for debugging or custom processing
|
||||
public ArrayList<Double> getRawData(int id) {
|
||||
return filterID(Data, (double) id);
|
||||
}
|
||||
|
||||
public static ArrayList<Double> filterID(ArrayList<ArrayList<Double>> data, double x) {
|
||||
for (ArrayList<Double> innerList : data) {
|
||||
// Ensure it has a second element
|
||||
if (innerList.size() > 1 && Math.abs(innerList.get(1) - x) < 1e-9) {
|
||||
return innerList; // Return the first match
|
||||
}
|
||||
}
|
||||
// Return an empty ArrayList if no match found
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user