Merge branch 'main' of https://git.demerso.net/pls5618/2024/robot
This commit is contained in:
780
src/main/java/frc/robot/LimelightHelpers.java
Normal file
780
src/main/java/frc/robot/LimelightHelpers.java
Normal file
@ -0,0 +1,780 @@
|
||||
//LimelightHelpers v1.2.1 (March 1, 2023)
|
||||
|
||||
package frc.robot;
|
||||
|
||||
import edu.wpi.first.networktables.NetworkTable;
|
||||
import edu.wpi.first.networktables.NetworkTableEntry;
|
||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
||||
import edu.wpi.first.math.geometry.Pose2d;
|
||||
import edu.wpi.first.math.geometry.Pose3d;
|
||||
import edu.wpi.first.math.geometry.Rotation2d;
|
||||
import edu.wpi.first.math.geometry.Translation3d;
|
||||
import edu.wpi.first.math.util.Units;
|
||||
import edu.wpi.first.math.geometry.Rotation3d;
|
||||
import edu.wpi.first.math.geometry.Translation2d;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
public class LimelightHelpers {
|
||||
|
||||
public static class LimelightTarget_Retro {
|
||||
|
||||
@JsonProperty("t6c_ts")
|
||||
private double[] cameraPose_TargetSpace;
|
||||
|
||||
@JsonProperty("t6r_fs")
|
||||
private double[] robotPose_FieldSpace;
|
||||
|
||||
@JsonProperty("t6r_ts")
|
||||
private double[] robotPose_TargetSpace;
|
||||
|
||||
@JsonProperty("t6t_cs")
|
||||
private double[] targetPose_CameraSpace;
|
||||
|
||||
@JsonProperty("t6t_rs")
|
||||
private double[] targetPose_RobotSpace;
|
||||
|
||||
public Pose3d getCameraPose_TargetSpace()
|
||||
{
|
||||
return toPose3D(cameraPose_TargetSpace);
|
||||
}
|
||||
public Pose3d getRobotPose_FieldSpace()
|
||||
{
|
||||
return toPose3D(robotPose_FieldSpace);
|
||||
}
|
||||
public Pose3d getRobotPose_TargetSpace()
|
||||
{
|
||||
return toPose3D(robotPose_TargetSpace);
|
||||
}
|
||||
public Pose3d getTargetPose_CameraSpace()
|
||||
{
|
||||
return toPose3D(targetPose_CameraSpace);
|
||||
}
|
||||
public Pose3d getTargetPose_RobotSpace()
|
||||
{
|
||||
return toPose3D(targetPose_RobotSpace);
|
||||
}
|
||||
|
||||
public Pose2d getCameraPose_TargetSpace2D()
|
||||
{
|
||||
return toPose2D(cameraPose_TargetSpace);
|
||||
}
|
||||
public Pose2d getRobotPose_FieldSpace2D()
|
||||
{
|
||||
return toPose2D(robotPose_FieldSpace);
|
||||
}
|
||||
public Pose2d getRobotPose_TargetSpace2D()
|
||||
{
|
||||
return toPose2D(robotPose_TargetSpace);
|
||||
}
|
||||
public Pose2d getTargetPose_CameraSpace2D()
|
||||
{
|
||||
return toPose2D(targetPose_CameraSpace);
|
||||
}
|
||||
public Pose2d getTargetPose_RobotSpace2D()
|
||||
{
|
||||
return toPose2D(targetPose_RobotSpace);
|
||||
}
|
||||
|
||||
@JsonProperty("ta")
|
||||
public double ta;
|
||||
|
||||
@JsonProperty("tx")
|
||||
public double tx;
|
||||
|
||||
@JsonProperty("txp")
|
||||
public double tx_pixels;
|
||||
|
||||
@JsonProperty("ty")
|
||||
public double ty;
|
||||
|
||||
@JsonProperty("typ")
|
||||
public double ty_pixels;
|
||||
|
||||
@JsonProperty("ts")
|
||||
public double ts;
|
||||
|
||||
public LimelightTarget_Retro() {
|
||||
cameraPose_TargetSpace = new double[6];
|
||||
robotPose_FieldSpace = new double[6];
|
||||
robotPose_TargetSpace = new double[6];
|
||||
targetPose_CameraSpace = new double[6];
|
||||
targetPose_RobotSpace = new double[6];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class LimelightTarget_Fiducial {
|
||||
|
||||
@JsonProperty("fID")
|
||||
public double fiducialID;
|
||||
|
||||
@JsonProperty("fam")
|
||||
public String fiducialFamily;
|
||||
|
||||
@JsonProperty("t6c_ts")
|
||||
private double[] cameraPose_TargetSpace;
|
||||
|
||||
@JsonProperty("t6r_fs")
|
||||
private double[] robotPose_FieldSpace;
|
||||
|
||||
@JsonProperty("t6r_ts")
|
||||
private double[] robotPose_TargetSpace;
|
||||
|
||||
@JsonProperty("t6t_cs")
|
||||
private double[] targetPose_CameraSpace;
|
||||
|
||||
@JsonProperty("t6t_rs")
|
||||
private double[] targetPose_RobotSpace;
|
||||
|
||||
public Pose3d getCameraPose_TargetSpace()
|
||||
{
|
||||
return toPose3D(cameraPose_TargetSpace);
|
||||
}
|
||||
public Pose3d getRobotPose_FieldSpace()
|
||||
{
|
||||
return toPose3D(robotPose_FieldSpace);
|
||||
}
|
||||
public Pose3d getRobotPose_TargetSpace()
|
||||
{
|
||||
return toPose3D(robotPose_TargetSpace);
|
||||
}
|
||||
public Pose3d getTargetPose_CameraSpace()
|
||||
{
|
||||
return toPose3D(targetPose_CameraSpace);
|
||||
}
|
||||
public Pose3d getTargetPose_RobotSpace()
|
||||
{
|
||||
return toPose3D(targetPose_RobotSpace);
|
||||
}
|
||||
|
||||
public Pose2d getCameraPose_TargetSpace2D()
|
||||
{
|
||||
return toPose2D(cameraPose_TargetSpace);
|
||||
}
|
||||
public Pose2d getRobotPose_FieldSpace2D()
|
||||
{
|
||||
return toPose2D(robotPose_FieldSpace);
|
||||
}
|
||||
public Pose2d getRobotPose_TargetSpace2D()
|
||||
{
|
||||
return toPose2D(robotPose_TargetSpace);
|
||||
}
|
||||
public Pose2d getTargetPose_CameraSpace2D()
|
||||
{
|
||||
return toPose2D(targetPose_CameraSpace);
|
||||
}
|
||||
public Pose2d getTargetPose_RobotSpace2D()
|
||||
{
|
||||
return toPose2D(targetPose_RobotSpace);
|
||||
}
|
||||
|
||||
@JsonProperty("ta")
|
||||
public double ta;
|
||||
|
||||
@JsonProperty("tx")
|
||||
public double tx;
|
||||
|
||||
@JsonProperty("txp")
|
||||
public double tx_pixels;
|
||||
|
||||
@JsonProperty("ty")
|
||||
public double ty;
|
||||
|
||||
@JsonProperty("typ")
|
||||
public double ty_pixels;
|
||||
|
||||
@JsonProperty("ts")
|
||||
public double ts;
|
||||
|
||||
public LimelightTarget_Fiducial() {
|
||||
cameraPose_TargetSpace = new double[6];
|
||||
robotPose_FieldSpace = new double[6];
|
||||
robotPose_TargetSpace = new double[6];
|
||||
targetPose_CameraSpace = new double[6];
|
||||
targetPose_RobotSpace = new double[6];
|
||||
}
|
||||
}
|
||||
|
||||
public static class LimelightTarget_Barcode {
|
||||
|
||||
}
|
||||
|
||||
public static class LimelightTarget_Classifier {
|
||||
|
||||
@JsonProperty("class")
|
||||
public String className;
|
||||
|
||||
@JsonProperty("classID")
|
||||
public double classID;
|
||||
|
||||
@JsonProperty("conf")
|
||||
public double confidence;
|
||||
|
||||
@JsonProperty("zone")
|
||||
public double zone;
|
||||
|
||||
@JsonProperty("tx")
|
||||
public double tx;
|
||||
|
||||
@JsonProperty("txp")
|
||||
public double tx_pixels;
|
||||
|
||||
@JsonProperty("ty")
|
||||
public double ty;
|
||||
|
||||
@JsonProperty("typ")
|
||||
public double ty_pixels;
|
||||
|
||||
public LimelightTarget_Classifier() {
|
||||
}
|
||||
}
|
||||
|
||||
public static class LimelightTarget_Detector {
|
||||
|
||||
@JsonProperty("class")
|
||||
public String className;
|
||||
|
||||
@JsonProperty("classID")
|
||||
public double classID;
|
||||
|
||||
@JsonProperty("conf")
|
||||
public double confidence;
|
||||
|
||||
@JsonProperty("ta")
|
||||
public double ta;
|
||||
|
||||
@JsonProperty("tx")
|
||||
public double tx;
|
||||
|
||||
@JsonProperty("txp")
|
||||
public double tx_pixels;
|
||||
|
||||
@JsonProperty("ty")
|
||||
public double ty;
|
||||
|
||||
@JsonProperty("typ")
|
||||
public double ty_pixels;
|
||||
|
||||
public LimelightTarget_Detector() {
|
||||
}
|
||||
}
|
||||
|
||||
public static class Results {
|
||||
|
||||
@JsonProperty("pID")
|
||||
public double pipelineID;
|
||||
|
||||
@JsonProperty("tl")
|
||||
public double latency_pipeline;
|
||||
|
||||
@JsonProperty("cl")
|
||||
public double latency_capture;
|
||||
|
||||
public double latency_jsonParse;
|
||||
|
||||
@JsonProperty("ts")
|
||||
public double timestamp_LIMELIGHT_publish;
|
||||
|
||||
@JsonProperty("ts_rio")
|
||||
public double timestamp_RIOFPGA_capture;
|
||||
|
||||
@JsonProperty("v")
|
||||
@JsonFormat(shape = Shape.NUMBER)
|
||||
public boolean valid;
|
||||
|
||||
@JsonProperty("botpose")
|
||||
public double[] botpose;
|
||||
|
||||
@JsonProperty("botpose_wpired")
|
||||
public double[] botpose_wpired;
|
||||
|
||||
@JsonProperty("botpose_wpiblue")
|
||||
public double[] botpose_wpiblue;
|
||||
|
||||
@JsonProperty("t6c_rs")
|
||||
public double[] camerapose_robotspace;
|
||||
|
||||
public Pose3d getBotPose3d() {
|
||||
return toPose3D(botpose);
|
||||
}
|
||||
|
||||
public Pose3d getBotPose3d_wpiRed() {
|
||||
return toPose3D(botpose_wpired);
|
||||
}
|
||||
|
||||
public Pose3d getBotPose3d_wpiBlue() {
|
||||
return toPose3D(botpose_wpiblue);
|
||||
}
|
||||
|
||||
public Pose2d getBotPose2d() {
|
||||
return toPose2D(botpose);
|
||||
}
|
||||
|
||||
public Pose2d getBotPose2d_wpiRed() {
|
||||
return toPose2D(botpose_wpired);
|
||||
}
|
||||
|
||||
public Pose2d getBotPose2d_wpiBlue() {
|
||||
return toPose2D(botpose_wpiblue);
|
||||
}
|
||||
|
||||
@JsonProperty("Retro")
|
||||
public LimelightTarget_Retro[] targets_Retro;
|
||||
|
||||
@JsonProperty("Fiducial")
|
||||
public LimelightTarget_Fiducial[] targets_Fiducials;
|
||||
|
||||
@JsonProperty("Classifier")
|
||||
public LimelightTarget_Classifier[] targets_Classifier;
|
||||
|
||||
@JsonProperty("Detector")
|
||||
public LimelightTarget_Detector[] targets_Detector;
|
||||
|
||||
@JsonProperty("Barcode")
|
||||
public LimelightTarget_Barcode[] targets_Barcode;
|
||||
|
||||
public Results() {
|
||||
botpose = new double[6];
|
||||
botpose_wpired = new double[6];
|
||||
botpose_wpiblue = new double[6];
|
||||
camerapose_robotspace = new double[6];
|
||||
targets_Retro = new LimelightTarget_Retro[0];
|
||||
targets_Fiducials = new LimelightTarget_Fiducial[0];
|
||||
targets_Classifier = new LimelightTarget_Classifier[0];
|
||||
targets_Detector = new LimelightTarget_Detector[0];
|
||||
targets_Barcode = new LimelightTarget_Barcode[0];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static class LimelightResults {
|
||||
@JsonProperty("Results")
|
||||
public Results targetingResults;
|
||||
|
||||
public LimelightResults() {
|
||||
targetingResults = new Results();
|
||||
}
|
||||
}
|
||||
|
||||
private static ObjectMapper mapper;
|
||||
|
||||
/**
|
||||
* Print JSON Parse time to the console in milliseconds
|
||||
*/
|
||||
static boolean profileJSON = false;
|
||||
|
||||
static final String sanitizeName(String name) {
|
||||
if (name == "" || name == null) {
|
||||
return "limelight";
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
private static Pose3d toPose3D(double[] inData){
|
||||
if(inData.length < 6)
|
||||
{
|
||||
System.err.println("Bad LL 3D Pose Data!");
|
||||
return new Pose3d();
|
||||
}
|
||||
return new Pose3d(
|
||||
new Translation3d(inData[0], inData[1], inData[2]),
|
||||
new Rotation3d(Units.degreesToRadians(inData[3]), Units.degreesToRadians(inData[4]),
|
||||
Units.degreesToRadians(inData[5])));
|
||||
}
|
||||
|
||||
private static Pose2d toPose2D(double[] inData){
|
||||
if(inData.length < 6)
|
||||
{
|
||||
System.err.println("Bad LL 2D Pose Data!");
|
||||
return new Pose2d();
|
||||
}
|
||||
Translation2d tran2d = new Translation2d(inData[0], inData[1]);
|
||||
Rotation2d r2d = new Rotation2d(Units.degreesToRadians(inData[5]));
|
||||
return new Pose2d(tran2d, r2d);
|
||||
}
|
||||
|
||||
public static NetworkTable getLimelightNTTable(String tableName) {
|
||||
return NetworkTableInstance.getDefault().getTable(sanitizeName(tableName));
|
||||
}
|
||||
|
||||
public static NetworkTableEntry getLimelightNTTableEntry(String tableName, String entryName) {
|
||||
return getLimelightNTTable(tableName).getEntry(entryName);
|
||||
}
|
||||
|
||||
public static double getLimelightNTDouble(String tableName, String entryName) {
|
||||
return getLimelightNTTableEntry(tableName, entryName).getDouble(0.0);
|
||||
}
|
||||
|
||||
public static void setLimelightNTDouble(String tableName, String entryName, double val) {
|
||||
getLimelightNTTableEntry(tableName, entryName).setDouble(val);
|
||||
}
|
||||
|
||||
public static void setLimelightNTDoubleArray(String tableName, String entryName, double[] val) {
|
||||
getLimelightNTTableEntry(tableName, entryName).setDoubleArray(val);
|
||||
}
|
||||
|
||||
public static double[] getLimelightNTDoubleArray(String tableName, String entryName) {
|
||||
return getLimelightNTTableEntry(tableName, entryName).getDoubleArray(new double[0]);
|
||||
}
|
||||
|
||||
public static String getLimelightNTString(String tableName, String entryName) {
|
||||
return getLimelightNTTableEntry(tableName, entryName).getString("");
|
||||
}
|
||||
|
||||
public static URL getLimelightURLString(String tableName, String request) {
|
||||
String urlString = "http://" + sanitizeName(tableName) + ".local:5807/" + request;
|
||||
URL url;
|
||||
try {
|
||||
url = new URL(urlString);
|
||||
return url;
|
||||
} catch (MalformedURLException e) {
|
||||
System.err.println("bad LL URL");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/////
|
||||
/////
|
||||
|
||||
public static double getTX(String limelightName) {
|
||||
return getLimelightNTDouble(limelightName, "tx");
|
||||
}
|
||||
|
||||
public static double getTY(String limelightName) {
|
||||
return getLimelightNTDouble(limelightName, "ty");
|
||||
}
|
||||
|
||||
public static double getTA(String limelightName) {
|
||||
return getLimelightNTDouble(limelightName, "ta");
|
||||
}
|
||||
|
||||
public static double getLatency_Pipeline(String limelightName) {
|
||||
return getLimelightNTDouble(limelightName, "tl");
|
||||
}
|
||||
|
||||
public static double getLatency_Capture(String limelightName) {
|
||||
return getLimelightNTDouble(limelightName, "cl");
|
||||
}
|
||||
|
||||
public static double getCurrentPipelineIndex(String limelightName) {
|
||||
return getLimelightNTDouble(limelightName, "getpipe");
|
||||
}
|
||||
|
||||
public static String getJSONDump(String limelightName) {
|
||||
return getLimelightNTString(limelightName, "json");
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch to getBotPose
|
||||
*
|
||||
* @param limelightName
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
public static double[] getBotpose(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "botpose");
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch to getBotPose_wpiRed
|
||||
*
|
||||
* @param limelightName
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
public static double[] getBotpose_wpiRed(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "botpose_wpired");
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch to getBotPose_wpiBlue
|
||||
*
|
||||
* @param limelightName
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
public static double[] getBotpose_wpiBlue(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "botpose_wpiblue");
|
||||
}
|
||||
|
||||
public static double[] getBotPose(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "botpose");
|
||||
}
|
||||
|
||||
public static double[] getBotPose_wpiRed(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "botpose_wpired");
|
||||
}
|
||||
|
||||
public static double[] getBotPose_wpiBlue(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "botpose_wpiblue");
|
||||
}
|
||||
|
||||
public static double[] getBotPose_TargetSpace(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "botpose_targetspace");
|
||||
}
|
||||
|
||||
public static double[] getCameraPose_TargetSpace(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "camerapose_targetspace");
|
||||
}
|
||||
|
||||
public static double[] getTargetPose_CameraSpace(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "targetpose_cameraspace");
|
||||
}
|
||||
|
||||
public static double[] getTargetPose_RobotSpace(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "targetpose_robotspace");
|
||||
}
|
||||
|
||||
public static double[] getTargetColor(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "tc");
|
||||
}
|
||||
|
||||
public static double getFiducialID(String limelightName) {
|
||||
return getLimelightNTDouble(limelightName, "tid");
|
||||
}
|
||||
|
||||
public static double getNeuralClassID(String limelightName) {
|
||||
return getLimelightNTDouble(limelightName, "tclass");
|
||||
}
|
||||
|
||||
/////
|
||||
/////
|
||||
|
||||
public static Pose3d getBotPose3d(String limelightName) {
|
||||
double[] poseArray = getLimelightNTDoubleArray(limelightName, "botpose");
|
||||
return toPose3D(poseArray);
|
||||
}
|
||||
|
||||
public static Pose3d getBotPose3d_wpiRed(String limelightName) {
|
||||
double[] poseArray = getLimelightNTDoubleArray(limelightName, "botpose_wpired");
|
||||
return toPose3D(poseArray);
|
||||
}
|
||||
|
||||
public static Pose3d getBotPose3d_wpiBlue(String limelightName) {
|
||||
double[] poseArray = getLimelightNTDoubleArray(limelightName, "botpose_wpiblue");
|
||||
return toPose3D(poseArray);
|
||||
}
|
||||
|
||||
public static Pose3d getBotPose3d_TargetSpace(String limelightName) {
|
||||
double[] poseArray = getLimelightNTDoubleArray(limelightName, "botpose_targetspace");
|
||||
return toPose3D(poseArray);
|
||||
}
|
||||
|
||||
public static Pose3d getCameraPose3d_TargetSpace(String limelightName) {
|
||||
double[] poseArray = getLimelightNTDoubleArray(limelightName, "camerapose_targetspace");
|
||||
return toPose3D(poseArray);
|
||||
}
|
||||
|
||||
public static Pose3d getTargetPose3d_CameraSpace(String limelightName) {
|
||||
double[] poseArray = getLimelightNTDoubleArray(limelightName, "targetpose_cameraspace");
|
||||
return toPose3D(poseArray);
|
||||
}
|
||||
|
||||
public static Pose3d getTargetPose3d_RobotSpace(String limelightName) {
|
||||
double[] poseArray = getLimelightNTDoubleArray(limelightName, "targetpose_robotspace");
|
||||
return toPose3D(poseArray);
|
||||
}
|
||||
|
||||
public static Pose3d getCameraPose3d_RobotSpace(String limelightName) {
|
||||
double[] poseArray = getLimelightNTDoubleArray(limelightName, "camerapose_robotspace");
|
||||
return toPose3D(poseArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Pose2d for easy use with Odometry vision pose estimator
|
||||
* (addVisionMeasurement)
|
||||
*
|
||||
* @param limelightName
|
||||
* @return
|
||||
*/
|
||||
public static Pose2d getBotPose2d_wpiBlue(String limelightName) {
|
||||
|
||||
double[] result = getBotPose_wpiBlue(limelightName);
|
||||
return toPose2D(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Pose2d for easy use with Odometry vision pose estimator
|
||||
* (addVisionMeasurement)
|
||||
*
|
||||
* @param limelightName
|
||||
* @return
|
||||
*/
|
||||
public static Pose2d getBotPose2d_wpiRed(String limelightName) {
|
||||
|
||||
double[] result = getBotPose_wpiRed(limelightName);
|
||||
return toPose2D(result);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Pose2d for easy use with Odometry vision pose estimator
|
||||
* (addVisionMeasurement)
|
||||
*
|
||||
* @param limelightName
|
||||
* @return
|
||||
*/
|
||||
public static Pose2d getBotPose2d(String limelightName) {
|
||||
|
||||
double[] result = getBotPose(limelightName);
|
||||
return toPose2D(result);
|
||||
|
||||
}
|
||||
|
||||
public static boolean getTV(String limelightName) {
|
||||
return 1.0 == getLimelightNTDouble(limelightName, "tv");
|
||||
}
|
||||
|
||||
/////
|
||||
/////
|
||||
|
||||
public static void setPipelineIndex(String limelightName, int pipelineIndex) {
|
||||
setLimelightNTDouble(limelightName, "pipeline", pipelineIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* The LEDs will be controlled by Limelight pipeline settings, and not by robot
|
||||
* code.
|
||||
*/
|
||||
public static void setLEDMode_PipelineControl(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "ledMode", 0);
|
||||
}
|
||||
|
||||
public static void setLEDMode_ForceOff(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "ledMode", 1);
|
||||
}
|
||||
|
||||
public static void setLEDMode_ForceBlink(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "ledMode", 2);
|
||||
}
|
||||
|
||||
public static void setLEDMode_ForceOn(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "ledMode", 3);
|
||||
}
|
||||
|
||||
public static void setStreamMode_Standard(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "stream", 0);
|
||||
}
|
||||
|
||||
public static void setStreamMode_PiPMain(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "stream", 1);
|
||||
}
|
||||
|
||||
public static void setStreamMode_PiPSecondary(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "stream", 2);
|
||||
}
|
||||
|
||||
public static void setCameraMode_Processor(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "camMode", 0);
|
||||
}
|
||||
public static void setCameraMode_Driver(String limelightName) {
|
||||
setLimelightNTDouble(limelightName, "camMode", 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets the crop window. The crop window in the UI must be completely open for
|
||||
* dynamic cropping to work.
|
||||
*/
|
||||
public static void setCropWindow(String limelightName, double cropXMin, double cropXMax, double cropYMin, double cropYMax) {
|
||||
double[] entries = new double[4];
|
||||
entries[0] = cropXMin;
|
||||
entries[1] = cropXMax;
|
||||
entries[2] = cropYMin;
|
||||
entries[3] = cropYMax;
|
||||
setLimelightNTDoubleArray(limelightName, "crop", entries);
|
||||
}
|
||||
|
||||
public static void setCameraPose_RobotSpace(String limelightName, double forward, double side, double up, double roll, double pitch, double yaw) {
|
||||
double[] entries = new double[6];
|
||||
entries[0] = forward;
|
||||
entries[1] = side;
|
||||
entries[2] = up;
|
||||
entries[3] = roll;
|
||||
entries[4] = pitch;
|
||||
entries[5] = yaw;
|
||||
setLimelightNTDoubleArray(limelightName, "camerapose_robotspace_set", entries);
|
||||
}
|
||||
|
||||
/////
|
||||
/////
|
||||
|
||||
public static void setPythonScriptData(String limelightName, double[] outgoingPythonData) {
|
||||
setLimelightNTDoubleArray(limelightName, "llrobot", outgoingPythonData);
|
||||
}
|
||||
|
||||
public static double[] getPythonScriptData(String limelightName) {
|
||||
return getLimelightNTDoubleArray(limelightName, "llpython");
|
||||
}
|
||||
|
||||
/////
|
||||
/////
|
||||
|
||||
/**
|
||||
* Asynchronously take snapshot.
|
||||
*/
|
||||
public static CompletableFuture<Boolean> takeSnapshot(String tableName, String snapshotName) {
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
return SYNCH_TAKESNAPSHOT(tableName, snapshotName);
|
||||
});
|
||||
}
|
||||
|
||||
private static boolean SYNCH_TAKESNAPSHOT(String tableName, String snapshotName) {
|
||||
URL url = getLimelightURLString(tableName, "capturesnapshot");
|
||||
try {
|
||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setRequestMethod("GET");
|
||||
if (snapshotName != null && snapshotName != "") {
|
||||
connection.setRequestProperty("snapname", snapshotName);
|
||||
}
|
||||
|
||||
int responseCode = connection.getResponseCode();
|
||||
if (responseCode == 200) {
|
||||
return true;
|
||||
} else {
|
||||
System.err.println("Bad LL Request");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
System.err.println(e.getMessage());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses Limelight's JSON results dump into a LimelightResults Object
|
||||
*/
|
||||
public static LimelightResults getLatestResults(String limelightName) {
|
||||
|
||||
long start = System.nanoTime();
|
||||
LimelightHelpers.LimelightResults results = new LimelightHelpers.LimelightResults();
|
||||
if (mapper == null) {
|
||||
mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
}
|
||||
|
||||
try {
|
||||
results = mapper.readValue(getJSONDump(limelightName), LimelightResults.class);
|
||||
} catch (JsonProcessingException e) {
|
||||
System.err.println("lljson error: " + e.getMessage());
|
||||
}
|
||||
|
||||
long end = System.nanoTime();
|
||||
double millis = (end - start) * .000001;
|
||||
results.targetingResults.latency_jsonParse = millis;
|
||||
if (profileJSON) {
|
||||
System.out.printf("lljson: %.2f\r\n", millis);
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
@ -45,7 +45,11 @@ public class RobotContainer {
|
||||
},drive));
|
||||
}
|
||||
|
||||
private void configureBindings() {}
|
||||
private void configureBindings() {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public Command getAutonomousCommand() {
|
||||
return Commands.print("No autonomous command configured");
|
||||
|
@ -13,11 +13,9 @@ public class Balayer extends Command {
|
||||
private Accumulateur accumulateur;
|
||||
/** Creates a new Balayer. */
|
||||
public Balayer(Balayeuse balayeuse, Accumulateur accumulateur) {
|
||||
this.balayeuse = balayeuse;
|
||||
addRequirements(balayeuse, accumulateur);
|
||||
this.balayeuse = balayeuse;
|
||||
addRequirements(balayeuse, accumulateur);}
|
||||
// Use addRequirements() here to declare subsystem dependencies.
|
||||
}
|
||||
|
||||
// Called when the command is initially scheduled.
|
||||
@Override
|
||||
public void initialize() {}
|
||||
@ -25,16 +23,26 @@ public class Balayer extends Command {
|
||||
// Called every time the scheduler runs while the command is scheduled.
|
||||
@Override
|
||||
public void execute() {
|
||||
|
||||
if(accumulateur.limitswitch()){
|
||||
balayeuse.balaye(0);
|
||||
accumulateur.Accumuler(0);
|
||||
}
|
||||
else{
|
||||
balayeuse.balaye(0.6);
|
||||
accumulateur.Accumuler(0.6);
|
||||
}
|
||||
}
|
||||
|
||||
// Called once the command ends or is interrupted.
|
||||
@Override
|
||||
public void end(boolean interrupted) {}
|
||||
public void end(boolean interrupted) {
|
||||
balayeuse.balaye(0);
|
||||
accumulateur.Accumuler(0);
|
||||
}
|
||||
|
||||
// Returns true when the command should end.
|
||||
@Override
|
||||
public boolean isFinished() {
|
||||
return false;
|
||||
return accumulateur.limitswitch()==true;
|
||||
}
|
||||
}
|
||||
|
40
src/main/java/frc/robot/command/Deaccumuler.java
Normal file
40
src/main/java/frc/robot/command/Deaccumuler.java
Normal file
@ -0,0 +1,40 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
package frc.robot.command;
|
||||
|
||||
import edu.wpi.first.wpilibj2.command.Command;
|
||||
import frc.robot.subsystem.Accumulateur;
|
||||
|
||||
public class Deaccumuler extends Command {
|
||||
private Accumulateur accumulateur;
|
||||
/** Creates a new Deaccumuler. */
|
||||
public Deaccumuler(Accumulateur accumulateur) {
|
||||
// Use addRequirements() here to declare subsystem dependencies.
|
||||
this.accumulateur = accumulateur;
|
||||
addRequirements(accumulateur);
|
||||
}
|
||||
|
||||
// Called when the command is initially scheduled.
|
||||
@Override
|
||||
public void initialize() {}
|
||||
|
||||
// Called every time the scheduler runs while the command is scheduled.
|
||||
@Override
|
||||
public void execute() {
|
||||
accumulateur.Accumuler(0.5);
|
||||
}
|
||||
|
||||
// Called once the command ends or is interrupted.
|
||||
@Override
|
||||
public void end(boolean interrupted) {
|
||||
accumulateur.Accumuler(0);
|
||||
}
|
||||
|
||||
// Returns true when the command should end.
|
||||
@Override
|
||||
public boolean isFinished() {
|
||||
return false;
|
||||
}
|
||||
}
|
42
src/main/java/frc/robot/command/Debalayer.java
Normal file
42
src/main/java/frc/robot/command/Debalayer.java
Normal file
@ -0,0 +1,42 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
package frc.robot.command;
|
||||
|
||||
import edu.wpi.first.wpilibj2.command.Command;
|
||||
import frc.robot.subsystem.Accumulateur;
|
||||
import frc.robot.subsystem.Balayeuse;
|
||||
|
||||
public class Debalayer extends Command {
|
||||
private Balayeuse balayeuse;
|
||||
private Accumulateur accumulateur;
|
||||
/** Creates a new Balayer. */
|
||||
public Debalayer(Balayeuse balayeuse, Accumulateur accumulateur) {
|
||||
this.balayeuse = balayeuse;
|
||||
addRequirements(balayeuse, accumulateur);}
|
||||
// Use addRequirements() here to declare subsystem dependencies.
|
||||
// Called when the command is initially scheduled.
|
||||
@Override
|
||||
public void initialize() {}
|
||||
|
||||
// Called every time the scheduler runs while the command is scheduled.
|
||||
@Override
|
||||
public void execute() {
|
||||
balayeuse.balaye(-0.6);
|
||||
accumulateur.Accumuler(-0.6);
|
||||
}
|
||||
|
||||
// Called once the command ends or is interrupted.
|
||||
@Override
|
||||
public void end(boolean interrupted) {
|
||||
balayeuse.balaye(0);
|
||||
accumulateur.Accumuler(0);
|
||||
}
|
||||
|
||||
// Returns true when the command should end.
|
||||
@Override
|
||||
public boolean isFinished() {
|
||||
return false;
|
||||
}
|
||||
}
|
@ -4,12 +4,22 @@
|
||||
|
||||
package frc.robot.command;
|
||||
|
||||
import com.revrobotics.CANSparkMax;
|
||||
|
||||
import edu.wpi.first.wpilibj2.command.Command;
|
||||
import frc.robot.subsystem.Accumulateur;
|
||||
import frc.robot.subsystem.Lanceur;
|
||||
|
||||
public class Lancer extends Command {
|
||||
/** Creates a new Lanceur. */
|
||||
|
||||
private Lanceur lancer;
|
||||
private Lanceur lancer2;
|
||||
private Lanceur lancer3;
|
||||
private Lanceur lancer4;
|
||||
public Lancer() {
|
||||
// Use addRequirements() here to declare subsystem dependencies.
|
||||
addRequirements(lancer,lancer2,lancer3,lancer4);
|
||||
}
|
||||
|
||||
// Called when the command is initially scheduled.
|
||||
@ -18,11 +28,15 @@ public class Lancer extends Command {
|
||||
|
||||
// Called every time the scheduler runs while the command is scheduled.
|
||||
@Override
|
||||
public void execute() {}
|
||||
public void execute() {
|
||||
lancer.lancer(0.3);
|
||||
}
|
||||
|
||||
// Called once the command ends or is interrupted.
|
||||
@Override
|
||||
public void end(boolean interrupted) {}
|
||||
public void end(boolean interrupted) {
|
||||
lancer.lancer(0);
|
||||
}
|
||||
|
||||
// Returns true when the command should end.
|
||||
@Override
|
||||
|
@ -9,22 +9,35 @@ import com.ctre.phoenix.motorcontrol.can.WPI_TalonSRX;
|
||||
import edu.wpi.first.wpilibj.DigitalInput;
|
||||
import edu.wpi.first.wpilibj2.command.SubsystemBase;
|
||||
import frc.robot.Constants;
|
||||
import edu.wpi.first.wpilibj.shuffleboard.Shuffleboard;import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardTab;
|
||||
import edu.wpi.first.wpilibj.shuffleboard.BuiltInLayouts;
|
||||
import edu.wpi.first.wpilibj.shuffleboard.ShuffleboardLayout;
|
||||
|
||||
public class Accumulateur extends SubsystemBase {
|
||||
/** Creates a new Accumulateur. */
|
||||
|
||||
|
||||
ShuffleboardTab dashboard = Shuffleboard.getTab("dashboard");
|
||||
final WPI_TalonSRX Moteuracc2 = new WPI_TalonSRX(Constants.Moteuracc2);
|
||||
final WPI_TalonSRX Moteuracc = new WPI_TalonSRX(Constants.Moteuracc);
|
||||
final DigitalInput limitacc = new DigitalInput(Constants.limitacc);
|
||||
final DigitalInput limitacc2 = new DigitalInput(Constants.limitacc2);
|
||||
public void Deaccumuler(double vitesse){Moteuracc2.set(vitesse);}
|
||||
public void moteuraccfollow(){Moteuracc.follow(Moteuracc2); Moteuracc.setInverted(true);}
|
||||
public boolean limitswitch1(){return limitacc.get();}
|
||||
public boolean limitswitch2(){return limitacc2.get();}
|
||||
public Accumulateur() {}
|
||||
public void Accumuler(double vitesse){Moteuracc.set(vitesse);}
|
||||
public void Accumuler2(double vitesse){Moteuracc2.set(vitesse);}
|
||||
final DigitalInput limitacc = new DigitalInput(Constants.limitacc);
|
||||
|
||||
public void Deaccumuler(double vitesse){
|
||||
Moteuracc2.set(vitesse);
|
||||
}
|
||||
public void moteuraccfollow(){
|
||||
Moteuracc.follow(Moteuracc2);
|
||||
Moteuracc.setInverted(true);
|
||||
}
|
||||
public boolean limitswitch(){
|
||||
return limitacc.get();
|
||||
}
|
||||
public Accumulateur() {
|
||||
dashboard.addBoolean("limitacc", this::limitswitch);
|
||||
}
|
||||
public void Accumuler(double vitesse){
|
||||
Moteuracc.set(vitesse);
|
||||
Moteuracc2.set(vitesse);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void periodic() {
|
||||
|
@ -15,10 +15,19 @@ public class Balayeuse extends SubsystemBase {
|
||||
|
||||
public Balayeuse() {}
|
||||
final WPI_TalonSRX roue = new WPI_TalonSRX(Constants.roue);
|
||||
final TalonSRX etoile = new TalonSRX(Constants.etoile);
|
||||
final WPI_TalonSRX etoile = new WPI_TalonSRX(Constants.etoile);
|
||||
|
||||
public void Accumulation(double vitesse){roue.set(vitesse);}
|
||||
public void balayeuse(){etoile.follow(roue); etoile.setInverted(true);}
|
||||
public void Accumulation(double vitesse){
|
||||
roue.set(vitesse);
|
||||
}
|
||||
public void balayeuse(){
|
||||
etoile.follow(roue);
|
||||
etoile.setInverted(true);
|
||||
}
|
||||
public void balaye(double vitesse){
|
||||
roue.set(vitesse);
|
||||
etoile.set(vitesse);
|
||||
}
|
||||
@Override
|
||||
public void periodic() {
|
||||
// This method will be called once per scheduler run
|
||||
|
@ -18,13 +18,13 @@ public class Lanceur extends SubsystemBase {
|
||||
public Lanceur() {}
|
||||
final CANSparkMax lancer = new CANSparkMax(Constants.lanceur, MotorType.kBrushless);
|
||||
final CANSparkMax lancer2 = new CANSparkMax(Constants.lancer2, MotorType.kBrushless);
|
||||
final CANSparkMax lancer3 = new CANSparkMax(Constants.lanceur, MotorType.kBrushless);
|
||||
final CANSparkMax lancer4 = new CANSparkMax(Constants.lancer2, MotorType.kBrushless);
|
||||
final CANSparkMax lancer3 = new CANSparkMax(Constants.lancer3, MotorType.kBrushless);
|
||||
final CANSparkMax lancer4 = new CANSparkMax(Constants.lancer4, MotorType.kBrushless);
|
||||
|
||||
public void lancer(double vitesse){
|
||||
lancer.set(vitesse);
|
||||
public void lancer(double vitesse){
|
||||
lancer.set(vitesse);
|
||||
}
|
||||
public void lanceur(){
|
||||
public void lanceur(){
|
||||
lancer2.follow(lancer);
|
||||
lancer3.follow(lancer);
|
||||
lancer4.follow(lancer);
|
||||
|
@ -4,13 +4,21 @@
|
||||
|
||||
package frc.robot.subsystem;
|
||||
|
||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
||||
import edu.wpi.first.wpilibj2.command.SubsystemBase;
|
||||
import frc.robot.LimelightHelpers;
|
||||
|
||||
|
||||
public class Limelight extends SubsystemBase {
|
||||
/** Creates a new Limelight. */
|
||||
public Limelight() {
|
||||
|
||||
}
|
||||
|
||||
boolean tv = LimelightHelpers.getTV("No_name");
|
||||
|
||||
double tx = LimelightHelpers.getTX("No_name");
|
||||
double ty = LimelightHelpers.getTY("No_name");
|
||||
double ta = LimelightHelpers.getTA("No_name");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
|
Reference in New Issue
Block a user