mirror of
https://github.com/PhotonVision/photonvision
synced 2026-06-19 00:41:41 +00:00
Update to match new WPILib organization
This commit is contained in:
10
build.gradle
10
build.gradle
@@ -1,13 +1,13 @@
|
|||||||
import edu.wpi.first.toolchain.*
|
import org.wpilib.toolchain.*
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id "cpp"
|
id "cpp"
|
||||||
id "com.diffplug.spotless" version "8.1.0"
|
id "com.diffplug.spotless" version "8.1.0"
|
||||||
id "edu.wpi.first.wpilib.repositories.WPILibRepositoriesPlugin" version "2025.0"
|
id "org.wpilib.WPILibRepositoriesPlugin" version "2027.0.0"
|
||||||
id "edu.wpi.first.GradleRIO2027" version "2027.0.0-alpha-2"
|
id "org.wpilib.GradleRIO" version "2027.0.0-alpha-2"
|
||||||
id 'org.photonvision.tools.WpilibTools' version '2.4.1-photon'
|
id 'org.photonvision.tools.WpilibTools' version '2.4.1-photon'
|
||||||
id 'com.google.protobuf' version '0.9.3' apply false
|
id 'com.google.protobuf' version '0.9.3' apply false
|
||||||
id 'edu.wpi.first.GradleJni' version '1.1.0'
|
id 'org.wpilib.GradleJni' version '2027.0.0'
|
||||||
id "org.ysb33r.doxygen" version "2.0.0" apply false
|
id "org.ysb33r.doxygen" version "2.0.0" apply false
|
||||||
id 'com.gradleup.shadow' version '8.3.4' apply false
|
id 'com.gradleup.shadow' version '8.3.4' apply false
|
||||||
id "com.github.node-gradle.node" version "7.0.1" apply false
|
id "com.github.node-gradle.node" version "7.0.1" apply false
|
||||||
@@ -33,7 +33,7 @@ ext.allOutputsFolder = file("$project.buildDir/outputs")
|
|||||||
apply from: "versioningHelper.gradle"
|
apply from: "versioningHelper.gradle"
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
wpilibVersion = "2027.0.0-alpha-2"
|
wpilibVersion = "2027.0.0-alpha-3-203-g0001ddc7e"
|
||||||
wpimathVersion = wpilibVersion
|
wpimathVersion = wpilibVersion
|
||||||
openCVYear = "2025"
|
openCVYear = "2025"
|
||||||
openCVversion = "4.10.0-3"
|
openCVversion = "4.10.0-3"
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ This multi-target pose estimate can be accessed using PhotonLib. We suggest usin
|
|||||||
{
|
{
|
||||||
auto multiTagResult = result.MultiTagResult();
|
auto multiTagResult = result.MultiTagResult();
|
||||||
if (multiTagResult.has_value()) {
|
if (multiTagResult.has_value()) {
|
||||||
frc::Transform3d fieldToCamera = multiTagResult->estimatedPose.best;
|
wpi::math::Transform3d fieldToCamera = multiTagResult->estimatedPose.best;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ You can also get the pipeline latency from a pipeline result using the `getLaten
|
|||||||
.. code-block:: c++
|
.. code-block:: c++
|
||||||
|
|
||||||
// Get the pipeline latency.
|
// Get the pipeline latency.
|
||||||
units::second_t latency = result.GetLatency();
|
wpi::units::second_t latency = result.GetLatency();
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ You can get a list of tracked targets using the `getTargets()`/`GetTargets()` (J
|
|||||||
.. code-block:: c++
|
.. code-block:: c++
|
||||||
|
|
||||||
// Get a list of currently tracked targets.
|
// Get a list of currently tracked targets.
|
||||||
wpi::ArrayRef<photonlib::PhotonTrackedTarget> targets = result.GetTargets();
|
std::span<photonlib::PhotonTrackedTarget> targets = result.GetTargets();
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@@ -166,8 +166,8 @@ You can get the {ref}`best target <docs/reflectiveAndShape/contour-filtering:Con
|
|||||||
double pitch = target.GetPitch();
|
double pitch = target.GetPitch();
|
||||||
double area = target.GetArea();
|
double area = target.GetArea();
|
||||||
double skew = target.GetSkew();
|
double skew = target.GetSkew();
|
||||||
frc::Transform2d pose = target.GetCameraToTarget();
|
wpi::math::Transform2d pose = target.GetCameraToTarget();
|
||||||
wpi::SmallVector<std::pair<double, double>, 4> corners = target.GetCorners();
|
wpi::util::SmallVector<std::pair<double, double>, 4> corners = target.GetCorners();
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@@ -206,8 +206,8 @@ All of the data above (**except skew**) is available when using AprilTags.
|
|||||||
// Get information from target.
|
// Get information from target.
|
||||||
int targetID = target.GetFiducialId();
|
int targetID = target.GetFiducialId();
|
||||||
double poseAmbiguity = target.GetPoseAmbiguity();
|
double poseAmbiguity = target.GetPoseAmbiguity();
|
||||||
frc::Transform3d bestCameraToTarget = target.getBestCameraToTarget();
|
wpi::math::Transform3d bestCameraToTarget = target.getBestCameraToTarget();
|
||||||
frc::Transform3d alternateCameraToTarget = target.getAlternateCameraToTarget();
|
wpi::math::Transform3d alternateCameraToTarget = target.getAlternateCameraToTarget();
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ You can get your robot's `Pose2D` on the field using various camera data, target
|
|||||||
.. code-block:: c++
|
.. code-block:: c++
|
||||||
|
|
||||||
// Calculate robot's field relative pose
|
// Calculate robot's field relative pose
|
||||||
frc::Pose2D robotPose = photonlib::EstimateFieldToRobot(
|
wpi::math::Pose2d robotPose = photonlib::EstimateFieldToRobot(
|
||||||
kCameraHeight, kTargetHeight, kCameraPitch, kTargetPitch, frc::Rotation2d(units::degree_t(-target.GetYaw())), frc::Rotation2d(units::degree_t(gyro.GetRotation2d)), targetPose, cameraToRobot);
|
kCameraHeight, kTargetHeight, kCameraPitch, kTargetPitch, wpi::math::Rotation2d(wpi::units::degree_t(-target.GetYaw())), wpi::math::Rotation2d(wpi::units::degree_t(gyro.GetRotation2d)), targetPose, cameraToRobot);
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
@@ -106,8 +106,8 @@ You can get a [translation](https://docs.wpilib.org/en/latest/docs/software/adva
|
|||||||
.. code-block:: c++
|
.. code-block:: c++
|
||||||
|
|
||||||
// Calculate a translation from the camera to the target.
|
// Calculate a translation from the camera to the target.
|
||||||
frc::Translation2d translation = photonlib::PhotonUtils::EstimateCameraToTargetTranslation(
|
wpi::math::Translation2d translation = photonlib::PhotonUtils::EstimateCameraToTargetTranslation(
|
||||||
distance, frc::Rotation2d(units::degree_t(-target.GetYaw())));
|
distance, wpi::math::Rotation2d(wpi::units::degree_t(-target.GetYaw())));
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ If you would like to access your Ethernet-connected vision device from a compute
|
|||||||
|
|
||||||
.. code-block:: c++
|
.. code-block:: c++
|
||||||
|
|
||||||
wpi::PortForwarder::GetInstance().Add(5800, "photonvision.local", 5800);
|
wpi::net::PortForwarder::GetInstance().Add(5800, "photonvision.local", 5800);
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ package org.photonvision.common.configuration;
|
|||||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import edu.wpi.first.cscore.UsbCameraInfo;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -35,6 +34,7 @@ import org.photonvision.vision.camera.QuirkyCamera;
|
|||||||
import org.photonvision.vision.pipeline.CVPipelineSettings;
|
import org.photonvision.vision.pipeline.CVPipelineSettings;
|
||||||
import org.photonvision.vision.pipeline.DriverModePipelineSettings;
|
import org.photonvision.vision.pipeline.DriverModePipelineSettings;
|
||||||
import org.photonvision.vision.processes.PipelineManager;
|
import org.photonvision.vision.processes.PipelineManager;
|
||||||
|
import org.wpilib.vision.camera.UsbCameraInfo;
|
||||||
|
|
||||||
public class CameraConfiguration {
|
public class CameraConfiguration {
|
||||||
private static final Logger logger = new Logger(CameraConfiguration.class, LogGroup.Camera);
|
private static final Logger logger = new Logger(CameraConfiguration.class, LogGroup.Camera);
|
||||||
|
|||||||
@@ -18,8 +18,6 @@
|
|||||||
package org.photonvision.common.configuration;
|
package org.photonvision.common.configuration;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFields;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UncheckedIOException;
|
import java.io.UncheckedIOException;
|
||||||
@@ -40,6 +38,8 @@ import org.photonvision.common.util.file.JacksonUtils;
|
|||||||
import org.photonvision.vision.pipeline.CVPipelineSettings;
|
import org.photonvision.vision.pipeline.CVPipelineSettings;
|
||||||
import org.photonvision.vision.pipeline.DriverModePipelineSettings;
|
import org.photonvision.vision.pipeline.DriverModePipelineSettings;
|
||||||
import org.photonvision.vision.processes.VisionSource;
|
import org.photonvision.vision.processes.VisionSource;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFields;
|
||||||
import org.zeroturnaround.zip.ZipUtil;
|
import org.zeroturnaround.zip.ZipUtil;
|
||||||
|
|
||||||
class LegacyConfigProvider extends ConfigProvider {
|
class LegacyConfigProvider extends ConfigProvider {
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
|
|
||||||
package org.photonvision.common.configuration;
|
package org.photonvision.common.configuration;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.photonvision.vision.processes.VisionSource;
|
import org.photonvision.vision.processes.VisionSource;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
|
||||||
public class PhotonConfiguration {
|
public class PhotonConfiguration {
|
||||||
private final HardwareConfig hardwareConfig;
|
private final HardwareConfig hardwareConfig;
|
||||||
|
|||||||
@@ -17,9 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.common.configuration;
|
package org.photonvision.common.configuration;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFields;
|
|
||||||
import edu.wpi.first.cscore.UsbCameraInfo;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UncheckedIOException;
|
import java.io.UncheckedIOException;
|
||||||
@@ -40,6 +37,9 @@ import org.photonvision.common.logging.Logger;
|
|||||||
import org.photonvision.common.util.file.JacksonUtils;
|
import org.photonvision.common.util.file.JacksonUtils;
|
||||||
import org.photonvision.vision.pipeline.CVPipelineSettings;
|
import org.photonvision.vision.pipeline.CVPipelineSettings;
|
||||||
import org.photonvision.vision.pipeline.DriverModePipelineSettings;
|
import org.photonvision.vision.pipeline.DriverModePipelineSettings;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFields;
|
||||||
|
import org.wpilib.vision.camera.UsbCameraInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves settings in a SQLite database file (called photon.sqlite).
|
* Saves settings in a SQLite database file (called photon.sqlite).
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
|
|
||||||
package org.photonvision.common.dataflow.networktables;
|
package org.photonvision.common.dataflow.networktables;
|
||||||
|
|
||||||
import edu.wpi.first.networktables.NetworkTableEvent;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
|
||||||
import edu.wpi.first.networktables.Subscriber;
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import org.wpilib.networktables.NetworkTableEvent;
|
||||||
|
import org.wpilib.networktables.NetworkTableInstance;
|
||||||
|
import org.wpilib.networktables.Subscriber;
|
||||||
|
|
||||||
public class NTDataChangeListener {
|
public class NTDataChangeListener {
|
||||||
private final NetworkTableInstance instance;
|
private final NetworkTableInstance instance;
|
||||||
|
|||||||
@@ -17,10 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.common.dataflow.networktables;
|
package org.photonvision.common.dataflow.networktables;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.networktables.NetworkTable;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableEvent;
|
|
||||||
import edu.wpi.first.networktables.NetworkTablesJNI;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.BooleanSupplier;
|
import java.util.function.BooleanSupplier;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -35,6 +31,10 @@ import org.photonvision.targeting.PhotonPipelineResult;
|
|||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.pipeline.result.CalibrationPipelineResult;
|
import org.photonvision.vision.pipeline.result.CalibrationPipelineResult;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.networktables.NetworkTable;
|
||||||
|
import org.wpilib.networktables.NetworkTableEvent;
|
||||||
|
import org.wpilib.networktables.NetworkTablesJNI;
|
||||||
|
|
||||||
public class NTDataPublisher implements CVPipelineResultConsumer {
|
public class NTDataPublisher implements CVPipelineResultConsumer {
|
||||||
private final Logger logger = new Logger(NTDataPublisher.class, LogGroup.General);
|
private final Logger logger = new Logger(NTDataPublisher.class, LogGroup.General);
|
||||||
@@ -177,7 +177,8 @@ public class NTDataPublisher implements CVPipelineResultConsumer {
|
|||||||
|
|
||||||
var offset = NetworkTablesManager.getInstance().getOffset();
|
var offset = NetworkTablesManager.getInstance().getOffset();
|
||||||
|
|
||||||
// Transform the metadata timestamps from the local nt::Now timebase to the Time Sync Server's
|
// Transform the metadata timestamps from the local wpi::nt::Now timebase to the Time Sync
|
||||||
|
// Server's
|
||||||
// timebase
|
// timebase
|
||||||
var simplified =
|
var simplified =
|
||||||
new PhotonPipelineResult(
|
new PhotonPipelineResult(
|
||||||
|
|||||||
@@ -17,15 +17,15 @@
|
|||||||
|
|
||||||
package org.photonvision.common.dataflow.networktables;
|
package org.photonvision.common.dataflow.networktables;
|
||||||
|
|
||||||
import edu.wpi.first.networktables.BooleanSubscriber;
|
|
||||||
import edu.wpi.first.networktables.IntegerSubscriber;
|
|
||||||
import edu.wpi.first.networktables.NetworkTable;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableEvent.Kind;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
|
||||||
import edu.wpi.first.networktables.StringSubscriber;
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import org.photonvision.common.logging.LogGroup;
|
import org.photonvision.common.logging.LogGroup;
|
||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
|
import org.wpilib.networktables.BooleanSubscriber;
|
||||||
|
import org.wpilib.networktables.IntegerSubscriber;
|
||||||
|
import org.wpilib.networktables.NetworkTable;
|
||||||
|
import org.wpilib.networktables.NetworkTableEvent.Kind;
|
||||||
|
import org.wpilib.networktables.NetworkTableInstance;
|
||||||
|
import org.wpilib.networktables.StringSubscriber;
|
||||||
|
|
||||||
// Helper to print when the robot transitions modes
|
// Helper to print when the robot transitions modes
|
||||||
public class NTDriverStation {
|
public class NTDriverStation {
|
||||||
@@ -125,7 +125,7 @@ public class NTDriverStation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Copied from
|
// Copied from
|
||||||
// https://github.com/wpilibsuite/allwpilib/blob/07192285f65321a2f7363227a2216f09b715252d/hal/src/main/java/edu/wpi/first/hal/DriverStationJNI.java#L123C1-L140C4
|
// https://github.com/wpilibsuite/allwpilib/blob/07192285f65321a2f7363227a2216f09b715252d/hal/src/main/java/org/wpilib/hardware/hal/DriverStationJNI.java#L123C1-L140C4
|
||||||
// TODO: upstream!
|
// TODO: upstream!
|
||||||
/**
|
/**
|
||||||
* Gets the current control word of the driver station.
|
* Gets the current control word of the driver station.
|
||||||
|
|||||||
@@ -17,18 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.common.dataflow.networktables;
|
package org.photonvision.common.dataflow.networktables;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
|
||||||
import edu.wpi.first.cscore.CameraServerJNI;
|
|
||||||
import edu.wpi.first.networktables.LogMessage;
|
|
||||||
import edu.wpi.first.networktables.MultiSubscriber;
|
|
||||||
import edu.wpi.first.networktables.NetworkTable;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableEvent;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableEvent.Kind;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
|
||||||
import edu.wpi.first.networktables.StringSubscriber;
|
|
||||||
import edu.wpi.first.wpilibj.Alert;
|
|
||||||
import edu.wpi.first.wpilibj.Alert.AlertType;
|
|
||||||
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
@@ -47,6 +35,18 @@ import org.photonvision.common.logging.Logger;
|
|||||||
import org.photonvision.common.networking.NetworkUtils;
|
import org.photonvision.common.networking.NetworkUtils;
|
||||||
import org.photonvision.common.util.TimedTaskManager;
|
import org.photonvision.common.util.TimedTaskManager;
|
||||||
import org.photonvision.common.util.file.JacksonUtils;
|
import org.photonvision.common.util.file.JacksonUtils;
|
||||||
|
import org.wpilib.networktables.LogMessage;
|
||||||
|
import org.wpilib.networktables.MultiSubscriber;
|
||||||
|
import org.wpilib.networktables.NetworkTable;
|
||||||
|
import org.wpilib.networktables.NetworkTableEvent;
|
||||||
|
import org.wpilib.networktables.NetworkTableEvent.Kind;
|
||||||
|
import org.wpilib.networktables.NetworkTableInstance;
|
||||||
|
import org.wpilib.networktables.StringSubscriber;
|
||||||
|
import org.wpilib.smartdashboard.SmartDashboard;
|
||||||
|
import org.wpilib.util.Alert;
|
||||||
|
import org.wpilib.util.Alert.AlertType;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
import org.wpilib.vision.camera.CameraServerJNI;
|
||||||
|
|
||||||
public class NetworkTablesManager {
|
public class NetworkTablesManager {
|
||||||
private static final Logger logger =
|
private static final Logger logger =
|
||||||
|
|||||||
@@ -17,16 +17,16 @@
|
|||||||
|
|
||||||
package org.photonvision.common.dataflow.networktables;
|
package org.photonvision.common.dataflow.networktables;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.CameraServerJNI;
|
|
||||||
import edu.wpi.first.networktables.IntegerPublisher;
|
|
||||||
import edu.wpi.first.networktables.NetworkTable;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
|
||||||
import org.photonvision.common.configuration.NetworkConfig;
|
import org.photonvision.common.configuration.NetworkConfig;
|
||||||
import org.photonvision.common.logging.LogGroup;
|
import org.photonvision.common.logging.LogGroup;
|
||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
import org.photonvision.common.util.TimedTaskManager;
|
import org.photonvision.common.util.TimedTaskManager;
|
||||||
import org.photonvision.jni.TimeSyncClient;
|
import org.photonvision.jni.TimeSyncClient;
|
||||||
import org.photonvision.jni.TimeSyncServer;
|
import org.photonvision.jni.TimeSyncServer;
|
||||||
|
import org.wpilib.networktables.IntegerPublisher;
|
||||||
|
import org.wpilib.networktables.NetworkTable;
|
||||||
|
import org.wpilib.networktables.NetworkTableInstance;
|
||||||
|
import org.wpilib.vision.camera.CameraServerJNI;
|
||||||
|
|
||||||
public class TimeSyncManager {
|
public class TimeSyncManager {
|
||||||
private static final Logger logger = new Logger(TimeSyncManager.class, LogGroup.NetworkTables);
|
private static final Logger logger = new Logger(TimeSyncManager.class, LogGroup.NetworkTables);
|
||||||
@@ -66,7 +66,7 @@ public class TimeSyncManager {
|
|||||||
public synchronized long getOffset() {
|
public synchronized long getOffset() {
|
||||||
// if we're a client, return the offset to server time
|
// if we're a client, return the offset to server time
|
||||||
if (m_client != null) return m_client.getOffset();
|
if (m_client != null) return m_client.getOffset();
|
||||||
// if we're a server, our time (nt::Now) is the same as network time
|
// if we're a server, our time (wpi::nt::Now) is the same as network time
|
||||||
if (m_server != null) return 0;
|
if (m_server != null) return 0;
|
||||||
|
|
||||||
// ????? should never hit
|
// ????? should never hit
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
package org.photonvision.common.dataflow.websocket;
|
package org.photonvision.common.dataflow.websocket;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
|
||||||
public class UIProgramSettings {
|
public class UIProgramSettings {
|
||||||
public UIProgramSettings(
|
public UIProgramSettings(
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ import com.diozero.api.DeviceMode;
|
|||||||
import com.diozero.internal.spi.NativeDeviceFactoryInterface;
|
import com.diozero.internal.spi.NativeDeviceFactoryInterface;
|
||||||
import com.diozero.sbc.BoardPinInfo;
|
import com.diozero.sbc.BoardPinInfo;
|
||||||
import com.diozero.sbc.DeviceFactoryHelper;
|
import com.diozero.sbc.DeviceFactoryHelper;
|
||||||
import edu.wpi.first.networktables.IntegerPublisher;
|
|
||||||
import edu.wpi.first.networktables.IntegerSubscriber;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -38,6 +36,9 @@ import org.photonvision.common.hardware.gpio.CustomDeviceFactory;
|
|||||||
import org.photonvision.common.logging.LogGroup;
|
import org.photonvision.common.logging.LogGroup;
|
||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
import org.photonvision.common.util.ShellExec;
|
import org.photonvision.common.util.ShellExec;
|
||||||
|
import org.photonvision.common.util.TimedTaskManager;
|
||||||
|
import org.wpilib.networktables.IntegerPublisher;
|
||||||
|
import org.wpilib.networktables.IntegerSubscriber;
|
||||||
|
|
||||||
public class HardwareManager {
|
public class HardwareManager {
|
||||||
private static HardwareManager instance;
|
private static HardwareManager instance;
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import com.diozero.devices.LED;
|
|||||||
import com.diozero.devices.PwmLed;
|
import com.diozero.devices.PwmLed;
|
||||||
import com.diozero.internal.spi.NativeDeviceFactoryInterface;
|
import com.diozero.internal.spi.NativeDeviceFactoryInterface;
|
||||||
import com.diozero.sbc.BoardPinInfo;
|
import com.diozero.sbc.BoardPinInfo;
|
||||||
import edu.wpi.first.networktables.NetworkTableEvent;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
@@ -31,6 +30,7 @@ import org.photonvision.common.logging.LogGroup;
|
|||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
import org.photonvision.common.util.TimedTaskManager;
|
import org.photonvision.common.util.TimedTaskManager;
|
||||||
import org.photonvision.common.util.math.MathUtils;
|
import org.photonvision.common.util.math.MathUtils;
|
||||||
|
import org.wpilib.networktables.NetworkTableEvent;
|
||||||
|
|
||||||
public class VisionLED implements AutoCloseable {
|
public class VisionLED implements AutoCloseable {
|
||||||
private static final Logger logger = new Logger(VisionLED.class, LogGroup.VisionModule);
|
private static final Logger logger = new Logger(VisionLED.class, LogGroup.VisionModule);
|
||||||
|
|||||||
@@ -17,9 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.common.hardware.metrics;
|
package org.photonvision.common.hardware.metrics;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.CameraServerJNI;
|
|
||||||
import edu.wpi.first.networktables.NetworkTable;
|
|
||||||
import edu.wpi.first.networktables.ProtobufPublisher;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.FileStore;
|
import java.nio.file.FileStore;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@@ -37,6 +34,9 @@ import org.photonvision.common.logging.Logger;
|
|||||||
import org.photonvision.common.networking.NetworkUtils;
|
import org.photonvision.common.networking.NetworkUtils;
|
||||||
import org.photonvision.common.util.TimedTaskManager;
|
import org.photonvision.common.util.TimedTaskManager;
|
||||||
import org.photonvision.common.util.file.ProgramDirectoryUtilities;
|
import org.photonvision.common.util.file.ProgramDirectoryUtilities;
|
||||||
|
import org.wpilib.networktables.NetworkTable;
|
||||||
|
import org.wpilib.networktables.ProtobufPublisher;
|
||||||
|
import org.wpilib.vision.camera.CameraServerJNI;
|
||||||
import oshi.SystemInfo;
|
import oshi.SystemInfo;
|
||||||
import oshi.hardware.CentralProcessor;
|
import oshi.hardware.CentralProcessor;
|
||||||
import oshi.hardware.CentralProcessor.PhysicalProcessor;
|
import oshi.hardware.CentralProcessor.PhysicalProcessor;
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
package org.photonvision.common.hardware.metrics.proto;
|
package org.photonvision.common.hardware.metrics.proto;
|
||||||
|
|
||||||
import edu.wpi.first.util.protobuf.Protobuf;
|
|
||||||
import org.photonvision.common.hardware.metrics.DeviceMetrics;
|
import org.photonvision.common.hardware.metrics.DeviceMetrics;
|
||||||
import org.photonvision.proto.Photon.ProtobufDeviceMetrics;
|
import org.photonvision.proto.Photon.ProtobufDeviceMetrics;
|
||||||
|
import org.wpilib.util.protobuf.Protobuf;
|
||||||
import us.hebi.quickbuf.Descriptors.Descriptor;
|
import us.hebi.quickbuf.Descriptors.Descriptor;
|
||||||
|
|
||||||
public class DeviceMetricsProto implements Protobuf<DeviceMetrics, ProtobufDeviceMetrics> {
|
public class DeviceMetricsProto implements Protobuf<DeviceMetrics, ProtobufDeviceMetrics> {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.common.logging;
|
package org.photonvision.common.logging;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
@@ -28,6 +27,7 @@ import org.photonvision.common.configuration.PathManager;
|
|||||||
import org.photonvision.common.dataflow.DataChangeService;
|
import org.photonvision.common.dataflow.DataChangeService;
|
||||||
import org.photonvision.common.dataflow.events.OutgoingUIEvent;
|
import org.photonvision.common.dataflow.events.OutgoingUIEvent;
|
||||||
import org.photonvision.common.util.TimedTaskManager;
|
import org.photonvision.common.util.TimedTaskManager;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
/** TODO: get rid of static {} blocks and refactor to singleton pattern */
|
/** TODO: get rid of static {} blocks and refactor to singleton pattern */
|
||||||
public class Logger {
|
public class Logger {
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package org.photonvision.common.logging;
|
package org.photonvision.common.logging;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.CameraServerJNI;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import org.wpilib.vision.camera.CameraServerJNI;
|
||||||
|
|
||||||
/** Redirect cscore logs to our logger */
|
/** Redirect cscore logs to our logger */
|
||||||
public class PvCSCoreLogger {
|
public class PvCSCoreLogger {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.common.networking;
|
package org.photonvision.common.networking;
|
||||||
|
|
||||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.NetworkInterface;
|
import java.net.NetworkInterface;
|
||||||
@@ -30,6 +29,7 @@ import org.photonvision.common.hardware.Platform;
|
|||||||
import org.photonvision.common.logging.LogGroup;
|
import org.photonvision.common.logging.LogGroup;
|
||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
import org.photonvision.common.util.ShellExec;
|
import org.photonvision.common.util.ShellExec;
|
||||||
|
import org.wpilib.networktables.NetworkTableInstance;
|
||||||
|
|
||||||
public class NetworkUtils {
|
public class NetworkUtils {
|
||||||
private static final Logger logger = new Logger(NetworkUtils.class, LogGroup.General);
|
private static final Logger logger = new Logger(NetworkUtils.class, LogGroup.General);
|
||||||
|
|||||||
@@ -17,10 +17,10 @@
|
|||||||
|
|
||||||
package org.photonvision.common.util;
|
package org.photonvision.common.util;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import org.photonvision.common.logging.LogGroup;
|
import org.photonvision.common.logging.LogGroup;
|
||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
|
||||||
public final class SerializationUtils {
|
public final class SerializationUtils {
|
||||||
private static final Logger logger = new Logger(SerializationUtils.class, LogGroup.General);
|
private static final Logger logger = new Logger(SerializationUtils.class, LogGroup.General);
|
||||||
|
|||||||
@@ -18,9 +18,6 @@
|
|||||||
package org.photonvision.common.util;
|
package org.photonvision.common.util;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import edu.wpi.first.math.geometry.Rotation2d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation2d;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import java.awt.HeadlessException;
|
import java.awt.HeadlessException;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -31,6 +28,8 @@ import org.opencv.highgui.HighGui;
|
|||||||
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.geometry.Translation2d;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
|
||||||
public class TestUtils {
|
public class TestUtils {
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
|
|||||||
@@ -17,19 +17,19 @@
|
|||||||
|
|
||||||
package org.photonvision.common.util.math;
|
package org.photonvision.common.util.math;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimate;
|
|
||||||
import edu.wpi.first.math.VecBuilder;
|
|
||||||
import edu.wpi.first.math.geometry.CoordinateSystem;
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import edu.wpi.first.math.geometry.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import edu.wpi.first.networktables.NetworkTablesJNI;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.core.Core;
|
import org.opencv.core.Core;
|
||||||
import org.opencv.core.Mat;
|
import org.opencv.core.Mat;
|
||||||
|
import org.wpilib.math.geometry.CoordinateSystem;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
import org.wpilib.math.linalg.VecBuilder;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
import org.wpilib.networktables.NetworkTablesJNI;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimate;
|
||||||
|
|
||||||
public class MathUtils {
|
public class MathUtils {
|
||||||
MathUtils() {}
|
MathUtils() {}
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ import com.fasterxml.jackson.annotation.JsonCreator;
|
|||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -31,10 +29,7 @@ import org.opencv.core.Core;
|
|||||||
import org.opencv.core.Mat;
|
import org.opencv.core.Mat;
|
||||||
import org.opencv.core.Point;
|
import org.opencv.core.Point;
|
||||||
import org.opencv.core.Point3;
|
import org.opencv.core.Point3;
|
||||||
import org.opencv.core.Scalar;
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
import org.opencv.imgcodecs.Imgcodecs;
|
|
||||||
import org.opencv.imgproc.Imgproc;
|
|
||||||
import org.photonvision.common.util.ColorHelper;
|
|
||||||
|
|
||||||
// Ignore the previous calibration data that was stored in the json file.
|
// Ignore the previous calibration data that was stored in the json file.
|
||||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
|||||||
@@ -19,14 +19,14 @@ package org.photonvision.vision.calibration;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import edu.wpi.first.math.Matrix;
|
|
||||||
import edu.wpi.first.math.Num;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import org.ejml.simple.SimpleMatrix;
|
import org.ejml.simple.SimpleMatrix;
|
||||||
import org.opencv.core.CvType;
|
import org.opencv.core.CvType;
|
||||||
import org.opencv.core.Mat;
|
import org.opencv.core.Mat;
|
||||||
import org.opencv.core.MatOfDouble;
|
import org.opencv.core.MatOfDouble;
|
||||||
import org.photonvision.vision.opencv.Releasable;
|
import org.photonvision.vision.opencv.Releasable;
|
||||||
|
import org.wpilib.math.linalg.Matrix;
|
||||||
|
import org.wpilib.math.util.Num;
|
||||||
|
|
||||||
/** JSON-serializable image. Data is stored as a raw JSON array. */
|
/** JSON-serializable image. Data is stored as a raw JSON array. */
|
||||||
public class JsonMatOfDouble implements Releasable {
|
public class JsonMatOfDouble implements Releasable {
|
||||||
|
|||||||
@@ -17,9 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera;
|
package org.photonvision.vision.camera;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCameraInfo;
|
|
||||||
import edu.wpi.first.cscore.VideoMode;
|
|
||||||
import edu.wpi.first.util.PixelFormat;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
@@ -28,6 +25,9 @@ import org.photonvision.vision.frame.FrameStaticProperties;
|
|||||||
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
||||||
import org.photonvision.vision.processes.VisionSource;
|
import org.photonvision.vision.processes.VisionSource;
|
||||||
import org.photonvision.vision.processes.VisionSourceSettables;
|
import org.photonvision.vision.processes.VisionSourceSettables;
|
||||||
|
import org.wpilib.util.PixelFormat;
|
||||||
|
import org.wpilib.vision.camera.UsbCameraInfo;
|
||||||
|
import org.wpilib.vision.camera.VideoMode;
|
||||||
|
|
||||||
public class FileVisionSource extends VisionSource {
|
public class FileVisionSource extends VisionSource {
|
||||||
private final FileFrameProvider frameProvider;
|
private final FileFrameProvider frameProvider;
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
|||||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||||
import com.fasterxml.jackson.annotation.JsonTypeName;
|
import com.fasterxml.jackson.annotation.JsonTypeName;
|
||||||
import edu.wpi.first.cscore.UsbCameraInfo;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import org.wpilib.vision.camera.UsbCameraInfo;
|
||||||
|
|
||||||
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
|
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
|
||||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This class holds the non-windows camera quirks for the Arducam OV2311. This version supports auto-exposure, while windows does not.
|
* This class holds the non-windows camera quirks for the Arducam OV2311. This version supports auto-exposure, while windows does not.
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import edu.wpi.first.cscore.VideoException;
|
|
||||||
import edu.wpi.first.math.MathUtil;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
import org.wpilib.vision.camera.VideoException;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This class holds the windows specific camera quirks for the Arducam ov2311. A windows version is needed because windows doesn't expose the auto exposure properties of the arducam.
|
* This class holds the windows specific camera quirks for the Arducam ov2311. A windows version is needed because windows doesn't expose the auto exposure properties of the arducam.
|
||||||
@@ -50,7 +49,7 @@ public class ArduOV2311WindowsCameraSettables extends GenericUSBCameraSettables
|
|||||||
public void setExposureRaw(double exposureRaw) {
|
public void setExposureRaw(double exposureRaw) {
|
||||||
if (exposureRaw >= 0.0) {
|
if (exposureRaw >= 0.0) {
|
||||||
try {
|
try {
|
||||||
int propVal = (int) MathUtil.clamp(exposureRaw, minExposure, maxExposure);
|
int propVal = (int) Math.clamp(exposureRaw, minExposure, maxExposure);
|
||||||
camera.setExposureManual(propVal);
|
camera.setExposureManual(propVal);
|
||||||
this.lastExposureRaw = exposureRaw;
|
this.lastExposureRaw = exposureRaw;
|
||||||
} catch (VideoException e) {
|
} catch (VideoException e) {
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
|
||||||
public class ArduOV9281CameraSettables extends GenericUSBCameraSettables {
|
public class ArduOV9281CameraSettables extends GenericUSBCameraSettables {
|
||||||
public ArduOV9281CameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
public ArduOV9281CameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
|
||||||
public class ArduOV9782CameraSettables extends GenericUSBCameraSettables {
|
public class ArduOV9782CameraSettables extends GenericUSBCameraSettables {
|
||||||
public ArduOV9782CameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
public ArduOV9782CameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
||||||
|
|||||||
@@ -17,12 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import edu.wpi.first.cscore.VideoException;
|
|
||||||
import edu.wpi.first.cscore.VideoMode;
|
|
||||||
import edu.wpi.first.cscore.VideoProperty;
|
|
||||||
import edu.wpi.first.math.MathUtil;
|
|
||||||
import edu.wpi.first.util.PixelFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -33,6 +27,11 @@ import java.util.stream.Collectors;
|
|||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
import org.photonvision.vision.camera.CameraQuirk;
|
import org.photonvision.vision.camera.CameraQuirk;
|
||||||
import org.photonvision.vision.processes.VisionSourceSettables;
|
import org.photonvision.vision.processes.VisionSourceSettables;
|
||||||
|
import org.wpilib.util.PixelFormat;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
import org.wpilib.vision.camera.VideoException;
|
||||||
|
import org.wpilib.vision.camera.VideoMode;
|
||||||
|
import org.wpilib.vision.camera.VideoProperty;
|
||||||
|
|
||||||
public class GenericUSBCameraSettables extends VisionSourceSettables {
|
public class GenericUSBCameraSettables extends VisionSourceSettables {
|
||||||
// We need to remember the last exposure set when exiting
|
// We need to remember the last exposure set when exiting
|
||||||
@@ -131,7 +130,7 @@ public class GenericUSBCameraSettables extends VisionSourceSettables {
|
|||||||
|
|
||||||
softSet("white_balance_automatic", 0);
|
softSet("white_balance_automatic", 0);
|
||||||
|
|
||||||
int propVal = (int) MathUtil.clamp(temp, minWhiteBalanceTemp, maxWhiteBalanceTemp);
|
int propVal = (int) Math.clamp(temp, minWhiteBalanceTemp, maxWhiteBalanceTemp);
|
||||||
|
|
||||||
logger.debug(
|
logger.debug(
|
||||||
"Setting property "
|
"Setting property "
|
||||||
@@ -230,7 +229,7 @@ public class GenericUSBCameraSettables extends VisionSourceSettables {
|
|||||||
try {
|
try {
|
||||||
if (autoExposureProp != null) autoExposureProp.set(PROP_AUTO_EXPOSURE_DISABLED);
|
if (autoExposureProp != null) autoExposureProp.set(PROP_AUTO_EXPOSURE_DISABLED);
|
||||||
|
|
||||||
int propVal = (int) MathUtil.clamp(exposureRaw, minExposure, maxExposure);
|
int propVal = (int) Math.clamp(exposureRaw, minExposure, maxExposure);
|
||||||
|
|
||||||
logger.debug(
|
logger.debug(
|
||||||
"Setting property "
|
"Setting property "
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
|
||||||
public class InnoOV9281CameraSettables extends GenericUSBCameraSettables {
|
public class InnoOV9281CameraSettables extends GenericUSBCameraSettables {
|
||||||
public InnoOV9281CameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
public InnoOV9281CameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
||||||
|
|||||||
@@ -17,11 +17,10 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import edu.wpi.first.cscore.VideoException;
|
|
||||||
import edu.wpi.first.math.MathUtil;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
import org.photonvision.common.util.math.MathUtils;
|
import org.photonvision.common.util.math.MathUtils;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
import org.wpilib.vision.camera.VideoException;
|
||||||
|
|
||||||
public class LifeCam3kCameraSettables extends GenericUSBCameraSettables {
|
public class LifeCam3kCameraSettables extends GenericUSBCameraSettables {
|
||||||
// Lifecam only allows specific exposures. Pulled this list from
|
// Lifecam only allows specific exposures. Pulled this list from
|
||||||
@@ -45,7 +44,7 @@ public class LifeCam3kCameraSettables extends GenericUSBCameraSettables {
|
|||||||
public void setExposureRaw(double exposureRaw) {
|
public void setExposureRaw(double exposureRaw) {
|
||||||
if (exposureRaw >= 0.0) {
|
if (exposureRaw >= 0.0) {
|
||||||
try {
|
try {
|
||||||
int propVal = (int) MathUtil.clamp(exposureRaw, minExposure, maxExposure);
|
int propVal = (int) Math.clamp(exposureRaw, minExposure, maxExposure);
|
||||||
|
|
||||||
propVal = MathUtils.quantize(propVal, allowableExposures);
|
propVal = MathUtils.quantize(propVal, allowableExposures);
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,9 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import edu.wpi.first.cscore.VideoException;
|
|
||||||
import edu.wpi.first.math.MathUtil;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
import org.wpilib.vision.camera.VideoException;
|
||||||
|
|
||||||
public class LifeCam3kWindowsCameraSettables extends GenericUSBCameraSettables {
|
public class LifeCam3kWindowsCameraSettables extends GenericUSBCameraSettables {
|
||||||
public LifeCam3kWindowsCameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
public LifeCam3kWindowsCameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
||||||
@@ -41,7 +40,7 @@ public class LifeCam3kWindowsCameraSettables extends GenericUSBCameraSettables {
|
|||||||
public void setExposureRaw(double exposureRaw) {
|
public void setExposureRaw(double exposureRaw) {
|
||||||
if (exposureRaw >= 0.0) {
|
if (exposureRaw >= 0.0) {
|
||||||
try {
|
try {
|
||||||
int propVal = (int) MathUtil.clamp(exposureRaw, minExposure, maxExposure);
|
int propVal = (int) Math.clamp(exposureRaw, minExposure, maxExposure);
|
||||||
|
|
||||||
// exposureAbsProp.set(propVal);
|
// exposureAbsProp.set(propVal);
|
||||||
camera.setExposureManual(propVal);
|
camera.setExposureManual(propVal);
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
|
||||||
public class PsEyeCameraSettables extends GenericUSBCameraSettables {
|
public class PsEyeCameraSettables extends GenericUSBCameraSettables {
|
||||||
public PsEyeCameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
public PsEyeCameraSettables(CameraConfiguration configuration, UsbCamera camera) {
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This class holds the camera quirks for the See3Cam 24UGS.
|
* This class holds the camera quirks for the See3Cam 24UGS.
|
||||||
|
|||||||
@@ -17,10 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.USBCameras;
|
package org.photonvision.vision.camera.USBCameras;
|
||||||
|
|
||||||
import edu.wpi.first.cameraserver.CameraServer;
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import edu.wpi.first.cscore.VideoException;
|
|
||||||
import edu.wpi.first.cscore.VideoProperty;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
import org.photonvision.common.hardware.Platform;
|
import org.photonvision.common.hardware.Platform;
|
||||||
@@ -33,6 +29,10 @@ import org.photonvision.vision.frame.FrameProvider;
|
|||||||
import org.photonvision.vision.frame.provider.USBFrameProvider;
|
import org.photonvision.vision.frame.provider.USBFrameProvider;
|
||||||
import org.photonvision.vision.processes.VisionSource;
|
import org.photonvision.vision.processes.VisionSource;
|
||||||
import org.photonvision.vision.processes.VisionSourceSettables;
|
import org.photonvision.vision.processes.VisionSourceSettables;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
import org.wpilib.vision.camera.VideoException;
|
||||||
|
import org.wpilib.vision.camera.VideoProperty;
|
||||||
|
import org.wpilib.vision.stream.CameraServer;
|
||||||
|
|
||||||
public class USBCameraSource extends VisionSource {
|
public class USBCameraSource extends VisionSource {
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
|
|||||||
@@ -17,10 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.csi;
|
package org.photonvision.vision.camera.csi;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.VideoMode;
|
|
||||||
import edu.wpi.first.math.MathUtil;
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import edu.wpi.first.util.PixelFormat;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
import org.photonvision.common.util.math.MathUtils;
|
import org.photonvision.common.util.math.MathUtils;
|
||||||
@@ -28,6 +24,9 @@ import org.photonvision.raspi.LibCameraJNI;
|
|||||||
import org.photonvision.vision.camera.csi.LibcameraGpuSource.FPSRatedVideoMode;
|
import org.photonvision.vision.camera.csi.LibcameraGpuSource.FPSRatedVideoMode;
|
||||||
import org.photonvision.vision.opencv.ImageRotationMode;
|
import org.photonvision.vision.opencv.ImageRotationMode;
|
||||||
import org.photonvision.vision.processes.VisionSourceSettables;
|
import org.photonvision.vision.processes.VisionSourceSettables;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
import org.wpilib.util.PixelFormat;
|
||||||
|
import org.wpilib.vision.camera.VideoMode;
|
||||||
|
|
||||||
public class LibcameraGpuSettables extends VisionSourceSettables {
|
public class LibcameraGpuSettables extends VisionSourceSettables {
|
||||||
private FPSRatedVideoMode currentVideoMode;
|
private FPSRatedVideoMode currentVideoMode;
|
||||||
@@ -142,7 +141,7 @@ public class LibcameraGpuSettables extends VisionSourceSettables {
|
|||||||
|
|
||||||
// 80,000 uS seems like an exposure value that will be greater than ever needed while giving
|
// 80,000 uS seems like an exposure value that will be greater than ever needed while giving
|
||||||
// enough control over exposure.
|
// enough control over exposure.
|
||||||
exposureRaw = MathUtil.clamp(exposureRaw, minExposure, maxExposure);
|
exposureRaw = Math.clamp(exposureRaw, minExposure, maxExposure);
|
||||||
|
|
||||||
var success = LibCameraJNI.setExposure(r_ptr, (int) exposureRaw);
|
var success = LibCameraJNI.setExposure(r_ptr, (int) exposureRaw);
|
||||||
if (!success) LibcameraGpuSource.logger.warn("Couldn't set Pi Camera exposure");
|
if (!success) LibcameraGpuSource.logger.warn("Couldn't set Pi Camera exposure");
|
||||||
@@ -164,7 +163,7 @@ public class LibcameraGpuSettables extends VisionSourceSettables {
|
|||||||
// than ever needed) from 0 to 100 (UI values).
|
// than ever needed) from 0 to 100 (UI values).
|
||||||
var success =
|
var success =
|
||||||
LibCameraJNI.setAnalogGain(
|
LibCameraJNI.setAnalogGain(
|
||||||
r_ptr, MathUtil.clamp(MathUtils.map(gain, 0.0, 100.0, 1.0, 10.0), 1.0, 10.0));
|
r_ptr, Math.clamp(MathUtils.map(gain, 0.0, 100.0, 1.0, 10.0), 1.0, 10.0));
|
||||||
if (!success) LibcameraGpuSource.logger.warn("Couldn't set Pi Camera gain");
|
if (!success) LibcameraGpuSource.logger.warn("Couldn't set Pi Camera gain");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.camera.csi;
|
package org.photonvision.vision.camera.csi;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.VideoMode;
|
|
||||||
import edu.wpi.first.util.PixelFormat;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
import org.photonvision.common.configuration.ConfigManager;
|
import org.photonvision.common.configuration.ConfigManager;
|
||||||
import org.photonvision.common.logging.LogGroup;
|
import org.photonvision.common.logging.LogGroup;
|
||||||
@@ -29,6 +27,8 @@ import org.photonvision.vision.frame.FrameProvider;
|
|||||||
import org.photonvision.vision.frame.provider.LibcameraGpuFrameProvider;
|
import org.photonvision.vision.frame.provider.LibcameraGpuFrameProvider;
|
||||||
import org.photonvision.vision.processes.VisionSource;
|
import org.photonvision.vision.processes.VisionSource;
|
||||||
import org.photonvision.vision.processes.VisionSourceSettables;
|
import org.photonvision.vision.processes.VisionSourceSettables;
|
||||||
|
import org.wpilib.util.PixelFormat;
|
||||||
|
import org.wpilib.vision.camera.VideoMode;
|
||||||
|
|
||||||
public class LibcameraGpuSource extends VisionSource {
|
public class LibcameraGpuSource extends VisionSource {
|
||||||
static final Logger logger = new Logger(LibcameraGpuSource.class, LogGroup.Camera);
|
static final Logger logger = new Logger(LibcameraGpuSource.class, LogGroup.Camera);
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.frame;
|
package org.photonvision.vision.frame;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.VideoMode;
|
|
||||||
import org.opencv.core.Point;
|
import org.opencv.core.Point;
|
||||||
import org.photonvision.common.util.numbers.DoubleCouple;
|
import org.photonvision.common.util.numbers.DoubleCouple;
|
||||||
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
||||||
import org.photonvision.vision.opencv.ImageRotationMode;
|
import org.photonvision.vision.opencv.ImageRotationMode;
|
||||||
|
import org.wpilib.vision.camera.VideoMode;
|
||||||
|
|
||||||
/** Represents the properties of a frame. */
|
/** Represents the properties of a frame. */
|
||||||
public class FrameStaticProperties {
|
public class FrameStaticProperties {
|
||||||
|
|||||||
@@ -17,11 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.frame.consumer;
|
package org.photonvision.vision.frame.consumer;
|
||||||
|
|
||||||
import edu.wpi.first.networktables.IntegerEntry;
|
|
||||||
import edu.wpi.first.networktables.IntegerSubscriber;
|
|
||||||
import edu.wpi.first.networktables.NetworkTable;
|
|
||||||
import edu.wpi.first.networktables.StringSubscriber;
|
|
||||||
import edu.wpi.first.wpilibj.DriverStation.MatchType;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
@@ -34,6 +29,11 @@ import org.photonvision.common.logging.LogGroup;
|
|||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
import org.photonvision.vision.frame.StaticFrames;
|
import org.photonvision.vision.frame.StaticFrames;
|
||||||
import org.photonvision.vision.opencv.CVMat;
|
import org.photonvision.vision.opencv.CVMat;
|
||||||
|
import org.wpilib.driverstation.DriverStation.MatchType;
|
||||||
|
import org.wpilib.networktables.IntegerEntry;
|
||||||
|
import org.wpilib.networktables.IntegerSubscriber;
|
||||||
|
import org.wpilib.networktables.NetworkTable;
|
||||||
|
import org.wpilib.networktables.StringSubscriber;
|
||||||
|
|
||||||
public class FileSaveFrameConsumer implements Consumer<CVMat> {
|
public class FileSaveFrameConsumer implements Consumer<CVMat> {
|
||||||
private final Logger logger = new Logger(FileSaveFrameConsumer.class, LogGroup.General);
|
private final Logger logger = new Logger(FileSaveFrameConsumer.class, LogGroup.General);
|
||||||
|
|||||||
@@ -17,12 +17,12 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.frame.consumer;
|
package org.photonvision.vision.frame.consumer;
|
||||||
|
|
||||||
import edu.wpi.first.cameraserver.CameraServer;
|
|
||||||
import edu.wpi.first.cscore.*;
|
|
||||||
import edu.wpi.first.util.PixelFormat;
|
|
||||||
import org.photonvision.common.util.math.MathUtils;
|
import org.photonvision.common.util.math.MathUtils;
|
||||||
import org.photonvision.vision.frame.StaticFrames;
|
import org.photonvision.vision.frame.StaticFrames;
|
||||||
import org.photonvision.vision.opencv.CVMat;
|
import org.photonvision.vision.opencv.CVMat;
|
||||||
|
import org.wpilib.util.PixelFormat;
|
||||||
|
import org.wpilib.vision.camera.*;
|
||||||
|
import org.wpilib.vision.stream.CameraServer;
|
||||||
|
|
||||||
public class MJPGFrameConsumer implements AutoCloseable {
|
public class MJPGFrameConsumer implements AutoCloseable {
|
||||||
private static final double MAX_FRAMERATE = -1;
|
private static final double MAX_FRAMERATE = -1;
|
||||||
|
|||||||
@@ -17,17 +17,18 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.frame.provider;
|
package org.photonvision.vision.frame.provider;
|
||||||
|
|
||||||
import edu.wpi.first.cameraserver.CameraServer;
|
|
||||||
import edu.wpi.first.cscore.CvSink;
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import edu.wpi.first.util.PixelFormat;
|
|
||||||
import edu.wpi.first.util.RawFrame;
|
|
||||||
import org.opencv.core.Mat;
|
import org.opencv.core.Mat;
|
||||||
import org.photonvision.common.logging.LogGroup;
|
import org.photonvision.common.logging.LogGroup;
|
||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
import org.photonvision.jni.CscoreExtras;
|
import org.photonvision.jni.CscoreExtras;
|
||||||
import org.photonvision.vision.opencv.CVMat;
|
import org.photonvision.vision.opencv.CVMat;
|
||||||
import org.photonvision.vision.processes.VisionSourceSettables;
|
import org.photonvision.vision.processes.VisionSourceSettables;
|
||||||
|
import org.wpilib.networktables.BooleanSubscriber;
|
||||||
|
import org.wpilib.util.PixelFormat;
|
||||||
|
import org.wpilib.util.RawFrame;
|
||||||
|
import org.wpilib.vision.camera.CvSink;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
import org.wpilib.vision.stream.CameraServer;
|
||||||
|
|
||||||
public class USBFrameProvider extends CpuImageProcessor {
|
public class USBFrameProvider extends CpuImageProcessor {
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
@@ -80,7 +81,7 @@ public class USBFrameProvider extends CpuImageProcessor {
|
|||||||
if (m_blockForFrames) {
|
if (m_blockForFrames) {
|
||||||
// We allocate memory so we don't fill a Mat in use by another thread (memory model is easier)
|
// We allocate memory so we don't fill a Mat in use by another thread (memory model is easier)
|
||||||
var mat = new CVMat();
|
var mat = new CVMat();
|
||||||
// This is from wpi::Now, or WPIUtilJNI.now(). The epoch from grabFrame is uS since
|
// This is from wpi::util::Now, or WPIUtilJNI.now(). The epoch from grabFrame is uS since
|
||||||
// Hal::initialize was called
|
// Hal::initialize was called
|
||||||
// TODO - under the hood, this incurs an extra copy. We should avoid this, if we
|
// TODO - under the hood, this incurs an extra copy. We should avoid this, if we
|
||||||
// can.
|
// can.
|
||||||
@@ -105,7 +106,7 @@ public class USBFrameProvider extends CpuImageProcessor {
|
|||||||
cameraMode.width * 3,
|
cameraMode.width * 3,
|
||||||
PixelFormat.kBGR);
|
PixelFormat.kBGR);
|
||||||
|
|
||||||
// This is from wpi::Now, or WPIUtilJNI.now(). The epoch from grabFrame is uS since
|
// This is from wpi::util::Now, or WPIUtilJNI.now(). The epoch from grabFrame is uS since
|
||||||
// Hal::initialize was called
|
// Hal::initialize was called
|
||||||
long captureTimeUs =
|
long captureTimeUs =
|
||||||
CscoreExtras.grabRawSinkFrameTimeoutLastTime(
|
CscoreExtras.grabRawSinkFrameTimeoutLastTime(
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.opencv;
|
package org.photonvision.vision.opencv;
|
||||||
|
|
||||||
import edu.wpi.first.util.RawFrame;
|
|
||||||
import java.lang.ref.PhantomReference;
|
import java.lang.ref.PhantomReference;
|
||||||
import java.lang.ref.ReferenceQueue;
|
import java.lang.ref.ReferenceQueue;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -27,6 +26,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
import org.opencv.core.Mat;
|
import org.opencv.core.Mat;
|
||||||
import org.photonvision.common.logging.LogGroup;
|
import org.photonvision.common.logging.LogGroup;
|
||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
|
import org.wpilib.util.RawFrame;
|
||||||
|
|
||||||
public class CVMat implements Releasable {
|
public class CVMat implements Releasable {
|
||||||
private static final Logger logger = new Logger(CVMat.class, LogGroup.General);
|
private static final Logger logger = new Logger(CVMat.class, LogGroup.General);
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.opencv;
|
package org.photonvision.vision.opencv;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Pose2d;
|
|
||||||
import edu.wpi.first.math.geometry.Rotation2d;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import org.opencv.core.Core;
|
import org.opencv.core.Core;
|
||||||
import org.opencv.core.Point;
|
import org.opencv.core.Point;
|
||||||
|
import org.wpilib.math.geometry.Pose2d;
|
||||||
|
import org.wpilib.math.geometry.Rotation2d;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An image rotation about the camera's +Z axis, which points out of the camera towards the world.
|
* An image rotation about the camera's +Z axis, which points out of the camera towards the world.
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagDetection;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagDetector;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.photonvision.vision.apriltag.AprilTagFamily;
|
import org.photonvision.vision.apriltag.AprilTagFamily;
|
||||||
import org.photonvision.vision.opencv.CVMat;
|
import org.photonvision.vision.opencv.CVMat;
|
||||||
import org.photonvision.vision.opencv.Releasable;
|
import org.photonvision.vision.opencv.Releasable;
|
||||||
import org.photonvision.vision.pipe.CVPipe;
|
import org.photonvision.vision.pipe.CVPipe;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagDetection;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagDetector;
|
||||||
|
|
||||||
public class AprilTagDetectionPipe
|
public class AprilTagDetectionPipe
|
||||||
extends CVPipe<
|
extends CVPipe<
|
||||||
|
|||||||
@@ -17,16 +17,16 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagDetection;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimate;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimator;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimator.Config;
|
|
||||||
import org.opencv.calib3d.Calib3d;
|
import org.opencv.calib3d.Calib3d;
|
||||||
import org.opencv.core.MatOfPoint2f;
|
import org.opencv.core.MatOfPoint2f;
|
||||||
import org.opencv.core.Point;
|
import org.opencv.core.Point;
|
||||||
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
||||||
import org.photonvision.vision.opencv.Releasable;
|
import org.photonvision.vision.opencv.Releasable;
|
||||||
import org.photonvision.vision.pipe.CVPipe;
|
import org.photonvision.vision.pipe.CVPipe;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagDetection;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimate;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimator;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimator.Config;
|
||||||
|
|
||||||
public class AprilTagPoseEstimatorPipe
|
public class AprilTagPoseEstimatorPipe
|
||||||
extends CVPipe<
|
extends CVPipe<
|
||||||
|
|||||||
@@ -17,11 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimate;
|
|
||||||
import edu.wpi.first.math.VecBuilder;
|
|
||||||
import edu.wpi.first.math.geometry.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.calib3d.Calib3d;
|
import org.opencv.calib3d.Calib3d;
|
||||||
@@ -34,6 +29,11 @@ import org.photonvision.vision.aruco.ArucoDetectionResult;
|
|||||||
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
||||||
import org.photonvision.vision.opencv.Releasable;
|
import org.photonvision.vision.opencv.Releasable;
|
||||||
import org.photonvision.vision.pipe.CVPipe;
|
import org.photonvision.vision.pipe.CVPipe;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
import org.wpilib.math.linalg.VecBuilder;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimate;
|
||||||
|
|
||||||
public class ArucoPoseEstimatorPipe
|
public class ArucoPoseEstimatorPipe
|
||||||
extends CVPipe<
|
extends CVPipe<
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.math.filter.LinearFilter;
|
|
||||||
import edu.wpi.first.wpilibj.Timer;
|
|
||||||
import org.photonvision.vision.pipe.CVPipe;
|
import org.photonvision.vision.pipe.CVPipe;
|
||||||
|
import org.wpilib.math.filter.LinearFilter;
|
||||||
|
import org.wpilib.system.Timer;
|
||||||
|
|
||||||
public class CalculateFPSPipe
|
public class CalculateFPSPipe
|
||||||
extends CVPipe<Void, Integer, CalculateFPSPipe.CalculateFPSPipeParams> {
|
extends CVPipe<Void, Integer, CalculateFPSPipe.CalculateFPSPipeParams> {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.core.Mat;
|
import org.opencv.core.Mat;
|
||||||
@@ -32,6 +31,7 @@ import org.photonvision.vision.pipe.MutatingPipe;
|
|||||||
import org.photonvision.vision.target.RobotOffsetPointMode;
|
import org.photonvision.vision.target.RobotOffsetPointMode;
|
||||||
import org.photonvision.vision.target.TargetCalculations;
|
import org.photonvision.vision.target.TargetCalculations;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
public class Draw2dCrosshairPipe
|
public class Draw2dCrosshairPipe
|
||||||
extends MutatingPipe<
|
extends MutatingPipe<
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.core.*;
|
import org.opencv.core.*;
|
||||||
@@ -31,6 +30,7 @@ import org.photonvision.vision.opencv.CVShape;
|
|||||||
import org.photonvision.vision.opencv.ContourShape;
|
import org.photonvision.vision.opencv.ContourShape;
|
||||||
import org.photonvision.vision.pipe.MutatingPipe;
|
import org.photonvision.vision.pipe.MutatingPipe;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
public class Draw2dTargetsPipe
|
public class Draw2dTargetsPipe
|
||||||
extends MutatingPipe<Pair<Mat, List<TrackedTarget>>, Draw2dTargetsPipe.Draw2dTargetsParams> {
|
extends MutatingPipe<Pair<Mat, List<TrackedTarget>>, Draw2dTargetsPipe.Draw2dTargetsParams> {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.calib3d.Calib3d;
|
import org.opencv.calib3d.Calib3d;
|
||||||
@@ -33,6 +32,7 @@ import org.photonvision.vision.frame.FrameDivisor;
|
|||||||
import org.photonvision.vision.pipe.MutatingPipe;
|
import org.photonvision.vision.pipe.MutatingPipe;
|
||||||
import org.photonvision.vision.target.TargetModel;
|
import org.photonvision.vision.target.TargetModel;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
public class Draw3dTargetsPipe
|
public class Draw3dTargetsPipe
|
||||||
extends MutatingPipe<Pair<Mat, List<TrackedTarget>>, Draw3dTargetsPipe.Draw3dContoursParams> {
|
extends MutatingPipe<Pair<Mat, List<TrackedTarget>>, Draw3dTargetsPipe.Draw3dContoursParams> {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.core.Mat;
|
import org.opencv.core.Mat;
|
||||||
@@ -28,6 +27,7 @@ import org.photonvision.common.util.ColorHelper;
|
|||||||
import org.photonvision.vision.frame.FrameDivisor;
|
import org.photonvision.vision.frame.FrameDivisor;
|
||||||
import org.photonvision.vision.pipe.MutatingPipe;
|
import org.photonvision.vision.pipe.MutatingPipe;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
public class DrawCalibrationPipe
|
public class DrawCalibrationPipe
|
||||||
extends MutatingPipe<
|
extends MutatingPipe<
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -33,6 +32,7 @@ import org.photonvision.vision.frame.FrameDivisor;
|
|||||||
import org.photonvision.vision.opencv.Releasable;
|
import org.photonvision.vision.opencv.Releasable;
|
||||||
import org.photonvision.vision.pipe.CVPipe;
|
import org.photonvision.vision.pipe.CVPipe;
|
||||||
import org.photonvision.vision.pipeline.UICalibrationData;
|
import org.photonvision.vision.pipeline.UICalibrationData;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
public class FindBoardCornersPipe
|
public class FindBoardCornersPipe
|
||||||
extends CVPipe<
|
extends CVPipe<
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.core.Mat;
|
import org.opencv.core.Mat;
|
||||||
@@ -27,6 +26,7 @@ import org.opencv.imgproc.Moments;
|
|||||||
import org.photonvision.vision.opencv.CVShape;
|
import org.photonvision.vision.opencv.CVShape;
|
||||||
import org.photonvision.vision.opencv.Contour;
|
import org.photonvision.vision.opencv.Contour;
|
||||||
import org.photonvision.vision.pipe.CVPipe;
|
import org.photonvision.vision.pipe.CVPipe;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
public class FindCirclesPipe
|
public class FindCirclesPipe
|
||||||
extends CVPipe<Pair<Mat, List<Contour>>, List<CVShape>, FindCirclesPipe.FindCirclePipeParams> {
|
extends CVPipe<Pair<Mat, List<Contour>>, List<CVShape>, FindCirclesPipe.FindCirclePipeParams> {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -29,6 +28,7 @@ import org.photonvision.targeting.MultiTargetPNPResult;
|
|||||||
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
||||||
import org.photonvision.vision.pipe.CVPipe;
|
import org.photonvision.vision.pipe.CVPipe;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
|
||||||
/** Estimate the camera pose given multiple Apriltag observations */
|
/** Estimate the camera pose given multiple Apriltag observations */
|
||||||
public class MultiTargetPNPPipe
|
public class MultiTargetPNPPipe
|
||||||
|
|||||||
@@ -17,10 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipe.impl;
|
package org.photonvision.vision.pipe.impl;
|
||||||
|
|
||||||
import edu.wpi.first.math.VecBuilder;
|
|
||||||
import edu.wpi.first.math.geometry.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.calib3d.Calib3d;
|
import org.opencv.calib3d.Calib3d;
|
||||||
import org.opencv.core.Core;
|
import org.opencv.core.Core;
|
||||||
@@ -33,6 +29,10 @@ import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
|||||||
import org.photonvision.vision.pipe.CVPipe;
|
import org.photonvision.vision.pipe.CVPipe;
|
||||||
import org.photonvision.vision.target.TargetModel;
|
import org.photonvision.vision.target.TargetModel;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
import org.wpilib.math.linalg.VecBuilder;
|
||||||
|
|
||||||
public class SolvePNPPipe
|
public class SolvePNPPipe
|
||||||
extends CVPipe<List<TrackedTarget>, List<TrackedTarget>, SolvePNPPipe.SolvePNPPipeParams> {
|
extends CVPipe<List<TrackedTarget>, List<TrackedTarget>, SolvePNPPipe.SolvePNPPipeParams> {
|
||||||
|
|||||||
@@ -17,15 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipeline;
|
package org.photonvision.vision.pipeline;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagDetection;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagDetector;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimate;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimator.Config;
|
|
||||||
import edu.wpi.first.math.geometry.CoordinateSystem;
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import edu.wpi.first.math.geometry.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -50,6 +41,15 @@ import org.photonvision.vision.pipe.impl.MultiTargetPNPPipe.MultiTargetPNPPipePa
|
|||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
import org.photonvision.vision.target.TrackedTarget.TargetCalculationParameters;
|
import org.photonvision.vision.target.TrackedTarget.TargetCalculationParameters;
|
||||||
|
import org.wpilib.math.geometry.CoordinateSystem;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagDetection;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagDetector;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimate;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimator.Config;
|
||||||
|
|
||||||
public class AprilTagPipeline extends CVPipeline<CVPipelineResult, AprilTagPipelineSettings> {
|
public class AprilTagPipeline extends CVPipeline<CVPipelineResult, AprilTagPipelineSettings> {
|
||||||
private static final Logger logger = new Logger(AprilTagPipeline.class, LogGroup.VisionModule);
|
private static final Logger logger = new Logger(AprilTagPipeline.class, LogGroup.VisionModule);
|
||||||
|
|||||||
@@ -17,11 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipeline;
|
package org.photonvision.vision.pipeline;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimate;
|
|
||||||
import edu.wpi.first.math.geometry.CoordinateSystem;
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -45,6 +40,11 @@ import org.photonvision.vision.pipe.impl.MultiTargetPNPPipe.MultiTargetPNPPipePa
|
|||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
import org.photonvision.vision.target.TrackedTarget.TargetCalculationParameters;
|
import org.photonvision.vision.target.TrackedTarget.TargetCalculationParameters;
|
||||||
|
import org.wpilib.math.geometry.CoordinateSystem;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimate;
|
||||||
|
|
||||||
public class ArucoPipeline extends CVPipeline<CVPipelineResult, ArucoPipelineSettings> {
|
public class ArucoPipeline extends CVPipeline<CVPipelineResult, ArucoPipelineSettings> {
|
||||||
private static final Logger logger = new Logger(ArucoPipeline.class, LogGroup.VisionModule);
|
private static final Logger logger = new Logger(ArucoPipeline.class, LogGroup.VisionModule);
|
||||||
|
|||||||
@@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipeline;
|
package org.photonvision.vision.pipeline;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -43,6 +41,8 @@ import org.photonvision.vision.pipe.impl.FindBoardCornersPipe;
|
|||||||
import org.photonvision.vision.pipe.impl.FindBoardCornersPipe.FindBoardCornersPipeResult;
|
import org.photonvision.vision.pipe.impl.FindBoardCornersPipe.FindBoardCornersPipeResult;
|
||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.pipeline.result.CalibrationPipelineResult;
|
import org.photonvision.vision.pipeline.result.CalibrationPipelineResult;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
|
||||||
public class Calibrate3dPipeline
|
public class Calibrate3dPipeline
|
||||||
extends CVPipeline<CVPipelineResult, Calibration3dPipelineSettings> {
|
extends CVPipeline<CVPipelineResult, Calibration3dPipelineSettings> {
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipeline;
|
package org.photonvision.vision.pipeline;
|
||||||
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import org.opencv.core.Size;
|
import org.opencv.core.Size;
|
||||||
import org.photonvision.vision.frame.FrameDivisor;
|
import org.photonvision.vision.frame.FrameDivisor;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
|
||||||
public class Calibration3dPipelineSettings extends AdvancedPipelineSettings {
|
public class Calibration3dPipelineSettings extends AdvancedPipelineSettings {
|
||||||
public int boardHeight = 8;
|
public int boardHeight = 8;
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipeline;
|
package org.photonvision.vision.pipeline;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.core.Point;
|
import org.opencv.core.Point;
|
||||||
@@ -32,6 +31,7 @@ import org.photonvision.vision.pipe.impl.*;
|
|||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.PotentialTarget;
|
import org.photonvision.vision.target.PotentialTarget;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
public class ColoredShapePipeline
|
public class ColoredShapePipeline
|
||||||
extends CVPipeline<CVPipelineResult, ColoredShapePipelineSettings> {
|
extends CVPipeline<CVPipelineResult, ColoredShapePipelineSettings> {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipeline;
|
package org.photonvision.vision.pipeline;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.photonvision.common.util.math.MathUtils;
|
import org.photonvision.common.util.math.MathUtils;
|
||||||
import org.photonvision.vision.frame.Frame;
|
import org.photonvision.vision.frame.Frame;
|
||||||
@@ -26,6 +25,7 @@ import org.photonvision.vision.pipe.impl.CalculateFPSPipe;
|
|||||||
import org.photonvision.vision.pipe.impl.Draw2dCrosshairPipe;
|
import org.photonvision.vision.pipe.impl.Draw2dCrosshairPipe;
|
||||||
import org.photonvision.vision.pipe.impl.ResizeImagePipe;
|
import org.photonvision.vision.pipe.impl.ResizeImagePipe;
|
||||||
import org.photonvision.vision.pipeline.result.DriverModePipelineResult;
|
import org.photonvision.vision.pipeline.result.DriverModePipelineResult;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
public class DriverModePipeline
|
public class DriverModePipeline
|
||||||
extends CVPipeline<DriverModePipelineResult, DriverModePipelineSettings> {
|
extends CVPipeline<DriverModePipelineResult, DriverModePipelineSettings> {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.pipeline;
|
package org.photonvision.vision.pipeline;
|
||||||
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.photonvision.vision.frame.Frame;
|
import org.photonvision.vision.frame.Frame;
|
||||||
import org.photonvision.vision.frame.FrameStaticProperties;
|
import org.photonvision.vision.frame.FrameStaticProperties;
|
||||||
@@ -25,6 +24,7 @@ import org.photonvision.vision.opencv.DualOffsetValues;
|
|||||||
import org.photonvision.vision.pipe.impl.*;
|
import org.photonvision.vision.pipe.impl.*;
|
||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a "fake" pipeline that is just used to move identical pipe sets out of real pipelines. It
|
* This is a "fake" pipeline that is just used to move identical pipe sets out of real pipelines. It
|
||||||
|
|||||||
@@ -104,9 +104,9 @@ public class CVPipelineResult implements Releasable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the latency between now (wpi::Now) and the time at which the image was captured. FOOTGUN:
|
* Get the latency between now (wpi::util::Now) and the time at which the image was captured.
|
||||||
* the latency is relative to the time at which this method is called. Waiting to call this method
|
* FOOTGUN: the latency is relative to the time at which this method is called. Waiting to call
|
||||||
* will change the latency this method returns.
|
* this method will change the latency this method returns.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public double getLatencyMillis() {
|
public double getLatencyMillis() {
|
||||||
|
|||||||
@@ -17,9 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.processes;
|
package org.photonvision.vision.processes;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.CameraServerJNI;
|
|
||||||
import edu.wpi.first.cscore.VideoException;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import io.javalin.websocket.WsContext;
|
import io.javalin.websocket.WsContext;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -57,6 +54,9 @@ import org.photonvision.vision.pipeline.UICalibrationData;
|
|||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.TargetModel;
|
import org.photonvision.vision.target.TargetModel;
|
||||||
import org.photonvision.vision.target.TrackedTarget;
|
import org.photonvision.vision.target.TrackedTarget;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
import org.wpilib.vision.camera.CameraServerJNI;
|
||||||
|
import org.wpilib.vision.camera.VideoException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the God Class
|
* This is the God Class
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
package org.photonvision.vision.processes;
|
package org.photonvision.vision.processes;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -39,6 +38,7 @@ import org.photonvision.vision.pipeline.AdvancedPipelineSettings;
|
|||||||
import org.photonvision.vision.pipeline.PipelineType;
|
import org.photonvision.vision.pipeline.PipelineType;
|
||||||
import org.photonvision.vision.pipeline.UICalibrationData;
|
import org.photonvision.vision.pipeline.UICalibrationData;
|
||||||
import org.photonvision.vision.target.RobotOffsetPointOperation;
|
import org.photonvision.vision.target.RobotOffsetPointOperation;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class VisionModuleChangeSubscriber extends DataChangeSubscriber {
|
public class VisionModuleChangeSubscriber extends DataChangeSubscriber {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.processes;
|
package org.photonvision.vision.processes;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -47,6 +46,7 @@ import org.photonvision.vision.camera.FileVisionSource;
|
|||||||
import org.photonvision.vision.camera.PVCameraInfo;
|
import org.photonvision.vision.camera.PVCameraInfo;
|
||||||
import org.photonvision.vision.camera.USBCameras.USBCameraSource;
|
import org.photonvision.vision.camera.USBCameras.USBCameraSource;
|
||||||
import org.photonvision.vision.camera.csi.LibcameraGpuSource;
|
import org.photonvision.vision.camera.csi.LibcameraGpuSource;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class manages starting up VisionModules for serialized devices ({@link
|
* This class manages starting up VisionModules for serialized devices ({@link
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.processes;
|
package org.photonvision.vision.processes;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.VideoMode;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import org.opencv.core.Size;
|
import org.opencv.core.Size;
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
@@ -25,6 +24,7 @@ import org.photonvision.common.logging.LogGroup;
|
|||||||
import org.photonvision.common.logging.Logger;
|
import org.photonvision.common.logging.Logger;
|
||||||
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
|
||||||
import org.photonvision.vision.frame.FrameStaticProperties;
|
import org.photonvision.vision.frame.FrameStaticProperties;
|
||||||
|
import org.wpilib.vision.camera.VideoMode;
|
||||||
|
|
||||||
public abstract class VisionSourceSettables {
|
public abstract class VisionSourceSettables {
|
||||||
protected Logger logger;
|
protected Logger logger;
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import com.fasterxml.jackson.annotation.JsonAlias;
|
|||||||
import com.fasterxml.jackson.annotation.JsonCreator;
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.opencv.core.MatOfPoint3f;
|
import org.opencv.core.MatOfPoint3f;
|
||||||
@@ -29,6 +28,7 @@ import org.opencv.core.Point3;
|
|||||||
import org.photonvision.vision.opencv.Releasable;
|
import org.photonvision.vision.opencv.Releasable;
|
||||||
import org.photonvision.vision.pipe.impl.CornerDetectionPipe;
|
import org.photonvision.vision.pipe.impl.CornerDetectionPipe;
|
||||||
import org.photonvision.vision.pipe.impl.SolvePNPPipe;
|
import org.photonvision.vision.pipe.impl.SolvePNPPipe;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A model representing the vertices of targets with known shapes. The vertices are in the EDN
|
* A model representing the vertices of targets with known shapes. The vertices are in the EDN
|
||||||
|
|||||||
@@ -17,9 +17,6 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.target;
|
package org.photonvision.vision.target;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagDetection;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagPoseEstimate;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -40,6 +37,9 @@ import org.photonvision.vision.opencv.CVShape;
|
|||||||
import org.photonvision.vision.opencv.Contour;
|
import org.photonvision.vision.opencv.Contour;
|
||||||
import org.photonvision.vision.opencv.DualOffsetValues;
|
import org.photonvision.vision.opencv.DualOffsetValues;
|
||||||
import org.photonvision.vision.opencv.Releasable;
|
import org.photonvision.vision.opencv.Releasable;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagDetection;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagPoseEstimate;
|
||||||
|
|
||||||
public class TrackedTarget implements Releasable {
|
public class TrackedTarget implements Releasable {
|
||||||
public final Contour m_mainContour;
|
public final Contour m_mainContour;
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import edu.wpi.first.cscore.UsbCameraInfo;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -43,6 +42,7 @@ import org.photonvision.vision.pipeline.ColoredShapePipelineSettings;
|
|||||||
import org.photonvision.vision.pipeline.ObjectDetectionPipelineSettings;
|
import org.photonvision.vision.pipeline.ObjectDetectionPipelineSettings;
|
||||||
import org.photonvision.vision.pipeline.PipelineType;
|
import org.photonvision.vision.pipeline.PipelineType;
|
||||||
import org.photonvision.vision.pipeline.ReflectivePipelineSettings;
|
import org.photonvision.vision.pipeline.ReflectivePipelineSettings;
|
||||||
|
import org.wpilib.vision.camera.UsbCameraInfo;
|
||||||
|
|
||||||
public class SQLConfigTest {
|
public class SQLConfigTest {
|
||||||
@TempDir private Path tmpDir;
|
@TempDir private Path tmpDir;
|
||||||
|
|||||||
@@ -19,14 +19,14 @@ package org.photonvision.common.util;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import edu.wpi.first.math.VecBuilder;
|
|
||||||
import edu.wpi.first.math.geometry.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.photonvision.common.LoadJNI;
|
import org.photonvision.common.LoadJNI;
|
||||||
import org.photonvision.common.util.math.MathUtils;
|
import org.photonvision.common.util.math.MathUtils;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
import org.wpilib.math.linalg.VecBuilder;
|
||||||
|
|
||||||
public class CoordinateConversionTest {
|
public class CoordinateConversionTest {
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
|
|||||||
@@ -22,13 +22,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
import edu.wpi.first.hal.HAL;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
|
||||||
import edu.wpi.first.wpilibj.DriverStation;
|
|
||||||
import edu.wpi.first.wpilibj.DriverStation.MatchType;
|
|
||||||
import edu.wpi.first.wpilibj.simulation.DriverStationSim;
|
|
||||||
import edu.wpi.first.wpilibj.simulation.SimHooks;
|
|
||||||
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -43,6 +36,13 @@ import org.photonvision.common.dataflow.networktables.NetworkTablesManager;
|
|||||||
import org.photonvision.common.util.TestUtils;
|
import org.photonvision.common.util.TestUtils;
|
||||||
import org.photonvision.jni.LibraryLoader;
|
import org.photonvision.jni.LibraryLoader;
|
||||||
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
||||||
|
import org.wpilib.driverstation.DriverStation;
|
||||||
|
import org.wpilib.driverstation.DriverStation.MatchType;
|
||||||
|
import org.wpilib.hardware.hal.HAL;
|
||||||
|
import org.wpilib.networktables.NetworkTableInstance;
|
||||||
|
import org.wpilib.simulation.DriverStationSim;
|
||||||
|
import org.wpilib.simulation.SimHooks;
|
||||||
|
import org.wpilib.smartdashboard.SmartDashboard;
|
||||||
|
|
||||||
public class FileSaveFrameConsumerTest {
|
public class FileSaveFrameConsumerTest {
|
||||||
NetworkTableInstance inst = null;
|
NetworkTableInstance inst = null;
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ package org.photonvision.vision.pipeline;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.photonvision.common.LoadJNI;
|
import org.photonvision.common.LoadJNI;
|
||||||
@@ -30,6 +29,7 @@ import org.photonvision.vision.camera.QuirkyCamera;
|
|||||||
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.TargetModel;
|
import org.photonvision.vision.target.TargetModel;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
|
||||||
public class AprilTagTest {
|
public class AprilTagTest {
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ package org.photonvision.vision.pipeline;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.photonvision.common.LoadJNI;
|
import org.photonvision.common.LoadJNI;
|
||||||
@@ -30,6 +29,7 @@ import org.photonvision.vision.camera.QuirkyCamera;
|
|||||||
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.TargetModel;
|
import org.photonvision.vision.target.TargetModel;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
|
||||||
public class ArucoPipelineTest {
|
public class ArucoPipelineTest {
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ package org.photonvision.vision.pipeline;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@@ -47,6 +46,7 @@ import org.photonvision.vision.frame.FrameThresholdType;
|
|||||||
import org.photonvision.vision.opencv.CVMat;
|
import org.photonvision.vision.opencv.CVMat;
|
||||||
import org.photonvision.vision.pipeline.UICalibrationData.BoardType;
|
import org.photonvision.vision.pipeline.UICalibrationData.BoardType;
|
||||||
import org.photonvision.vision.pipeline.UICalibrationData.TagFamily;
|
import org.photonvision.vision.pipeline.UICalibrationData.TagFamily;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
|
||||||
public class Calibrate3dPipeTest {
|
public class Calibrate3dPipeTest {
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
|
|||||||
@@ -21,9 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.photonvision.common.LoadJNI;
|
import org.photonvision.common.LoadJNI;
|
||||||
@@ -38,6 +35,9 @@ import org.photonvision.vision.opencv.ContourIntersectionDirection;
|
|||||||
import org.photonvision.vision.pipe.impl.HSVPipe;
|
import org.photonvision.vision.pipe.impl.HSVPipe;
|
||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
import org.photonvision.vision.target.TargetModel;
|
import org.photonvision.vision.target.TargetModel;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
|
||||||
public class SolvePNPTest {
|
public class SolvePNPTest {
|
||||||
private static final String LIFECAM_240P_CAL_FILE = "lifecam240p.json";
|
private static final String LIFECAM_240P_CAL_FILE = "lifecam240p.json";
|
||||||
|
|||||||
@@ -17,14 +17,14 @@
|
|||||||
|
|
||||||
package org.photonvision.vision.processes;
|
package org.photonvision.vision.processes;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCamera;
|
|
||||||
import edu.wpi.first.cscore.VideoMode;
|
|
||||||
import org.photonvision.common.configuration.CameraConfiguration;
|
import org.photonvision.common.configuration.CameraConfiguration;
|
||||||
import org.photonvision.common.util.TestUtils;
|
import org.photonvision.common.util.TestUtils;
|
||||||
import org.photonvision.vision.camera.QuirkyCamera;
|
import org.photonvision.vision.camera.QuirkyCamera;
|
||||||
import org.photonvision.vision.camera.USBCameras.GenericUSBCameraSettables;
|
import org.photonvision.vision.camera.USBCameras.GenericUSBCameraSettables;
|
||||||
import org.photonvision.vision.camera.USBCameras.USBCameraSource;
|
import org.photonvision.vision.camera.USBCameras.USBCameraSource;
|
||||||
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
||||||
|
import org.wpilib.vision.camera.UsbCamera;
|
||||||
|
import org.wpilib.vision.camera.VideoMode;
|
||||||
|
|
||||||
public class MockUsbCameraSource extends USBCameraSource {
|
public class MockUsbCameraSource extends USBCameraSource {
|
||||||
/** Used for unit tests to better simulate a usb camera without a camera being present. */
|
/** Used for unit tests to better simulate a usb camera without a camera being present. */
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.VideoMode;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -40,6 +39,7 @@ import org.photonvision.vision.frame.FrameProvider;
|
|||||||
import org.photonvision.vision.frame.FrameStaticProperties;
|
import org.photonvision.vision.frame.FrameStaticProperties;
|
||||||
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
import org.photonvision.vision.frame.provider.FileFrameProvider;
|
||||||
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
import org.photonvision.vision.pipeline.result.CVPipelineResult;
|
||||||
|
import org.wpilib.vision.camera.VideoMode;
|
||||||
|
|
||||||
public class VisionModuleManagerTest {
|
public class VisionModuleManagerTest {
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
import edu.wpi.first.cscore.UsbCameraInfo;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -35,6 +34,7 @@ import org.photonvision.common.configuration.ConfigManager;
|
|||||||
import org.photonvision.common.util.TestUtils;
|
import org.photonvision.common.util.TestUtils;
|
||||||
import org.photonvision.common.util.file.JacksonUtils;
|
import org.photonvision.common.util.file.JacksonUtils;
|
||||||
import org.photonvision.vision.camera.PVCameraInfo;
|
import org.photonvision.vision.camera.PVCameraInfo;
|
||||||
|
import org.wpilib.vision.camera.UsbCameraInfo;
|
||||||
|
|
||||||
public class VisionSourceManagerTest {
|
public class VisionSourceManagerTest {
|
||||||
// Test harness that overrides getConnectedCameras, but uses USB cameras for
|
// Test harness that overrides getConnectedCameras, but uses USB cameras for
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ package org.photonvision.vision.target;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
@@ -39,6 +37,8 @@ import org.photonvision.vision.calibration.CameraLensModel;
|
|||||||
import org.photonvision.vision.calibration.JsonMatOfDouble;
|
import org.photonvision.vision.calibration.JsonMatOfDouble;
|
||||||
import org.photonvision.vision.frame.FrameStaticProperties;
|
import org.photonvision.vision.frame.FrameStaticProperties;
|
||||||
import org.photonvision.vision.opencv.DualOffsetValues;
|
import org.photonvision.vision.opencv.DualOffsetValues;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
|
||||||
public class TargetCalculationsTest {
|
public class TargetCalculationsTest {
|
||||||
private static Size imageSize = new Size(1280, 720);
|
private static Size imageSize = new Size(1280, 720);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ ext {
|
|||||||
|
|
||||||
apply plugin: 'cpp'
|
apply plugin: 'cpp'
|
||||||
apply plugin: 'google-test-test-suite'
|
apply plugin: 'google-test-test-suite'
|
||||||
apply plugin: 'edu.wpi.first.NativeUtils'
|
apply plugin: 'org.wpilib.NativeUtils'
|
||||||
|
|
||||||
apply from: "${rootDir}/shared/config.gradle"
|
apply from: "${rootDir}/shared/config.gradle"
|
||||||
apply from: "${rootDir}/shared/javacommon.gradle"
|
apply from: "${rootDir}/shared/javacommon.gradle"
|
||||||
@@ -93,7 +93,7 @@ model {
|
|||||||
nativeUtils.useRequiredLibrary(it, "datalog_shared")
|
nativeUtils.useRequiredLibrary(it, "datalog_shared")
|
||||||
nativeUtils.useRequiredLibrary(it, "cscore_shared")
|
nativeUtils.useRequiredLibrary(it, "cscore_shared")
|
||||||
nativeUtils.useRequiredLibrary(it, "cameraserver_shared")
|
nativeUtils.useRequiredLibrary(it, "cameraserver_shared")
|
||||||
nativeUtils.useRequiredLibrary(it, "wpilib_executable_shared")
|
nativeUtils.useRequiredLibrary(it, "wpilib_shared")
|
||||||
nativeUtils.useRequiredLibrary(it, "googletest_static")
|
nativeUtils.useRequiredLibrary(it, "googletest_static")
|
||||||
nativeUtils.useRequiredLibrary(it, "apriltag_shared")
|
nativeUtils.useRequiredLibrary(it, "apriltag_shared")
|
||||||
nativeUtils.useRequiredLibrary(it, "opencv_shared")
|
nativeUtils.useRequiredLibrary(it, "opencv_shared")
|
||||||
|
|||||||
@@ -24,10 +24,10 @@
|
|||||||
|
|
||||||
package org.photonvision;
|
package org.photonvision;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.photonvision.PhotonPoseEstimator.PoseStrategy;
|
import org.photonvision.PhotonPoseEstimator.PoseStrategy;
|
||||||
import org.photonvision.targeting.PhotonTrackedTarget;
|
import org.photonvision.targeting.PhotonTrackedTarget;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
|
||||||
/** An estimated pose based on pipeline result */
|
/** An estimated pose based on pipeline result */
|
||||||
public class EstimatedRobotPose {
|
public class EstimatedRobotPose {
|
||||||
|
|||||||
@@ -24,26 +24,6 @@
|
|||||||
|
|
||||||
package org.photonvision;
|
package org.photonvision;
|
||||||
|
|
||||||
import edu.wpi.first.hal.HAL;
|
|
||||||
import edu.wpi.first.math.MatBuilder;
|
|
||||||
import edu.wpi.first.math.Matrix;
|
|
||||||
import edu.wpi.first.math.Nat;
|
|
||||||
import edu.wpi.first.math.numbers.*;
|
|
||||||
import edu.wpi.first.networktables.BooleanPublisher;
|
|
||||||
import edu.wpi.first.networktables.BooleanSubscriber;
|
|
||||||
import edu.wpi.first.networktables.DoubleArraySubscriber;
|
|
||||||
import edu.wpi.first.networktables.IntegerEntry;
|
|
||||||
import edu.wpi.first.networktables.IntegerPublisher;
|
|
||||||
import edu.wpi.first.networktables.IntegerSubscriber;
|
|
||||||
import edu.wpi.first.networktables.MultiSubscriber;
|
|
||||||
import edu.wpi.first.networktables.NetworkTable;
|
|
||||||
import edu.wpi.first.networktables.NetworkTableInstance;
|
|
||||||
import edu.wpi.first.networktables.PubSubOption;
|
|
||||||
import edu.wpi.first.networktables.StringSubscriber;
|
|
||||||
import edu.wpi.first.wpilibj.Alert;
|
|
||||||
import edu.wpi.first.wpilibj.Alert.AlertType;
|
|
||||||
import edu.wpi.first.wpilibj.DriverStation;
|
|
||||||
import edu.wpi.first.wpilibj.Timer;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -53,6 +33,26 @@ import org.photonvision.common.hardware.VisionLEDMode;
|
|||||||
import org.photonvision.common.networktables.PacketSubscriber;
|
import org.photonvision.common.networktables.PacketSubscriber;
|
||||||
import org.photonvision.targeting.PhotonPipelineResult;
|
import org.photonvision.targeting.PhotonPipelineResult;
|
||||||
import org.photonvision.timesync.TimeSyncSingleton;
|
import org.photonvision.timesync.TimeSyncSingleton;
|
||||||
|
import org.wpilib.driverstation.DriverStation;
|
||||||
|
import org.wpilib.hardware.hal.HAL;
|
||||||
|
import org.wpilib.math.linalg.MatBuilder;
|
||||||
|
import org.wpilib.math.linalg.Matrix;
|
||||||
|
import org.wpilib.math.numbers.*;
|
||||||
|
import org.wpilib.math.util.Nat;
|
||||||
|
import org.wpilib.networktables.BooleanPublisher;
|
||||||
|
import org.wpilib.networktables.BooleanSubscriber;
|
||||||
|
import org.wpilib.networktables.DoubleArraySubscriber;
|
||||||
|
import org.wpilib.networktables.IntegerEntry;
|
||||||
|
import org.wpilib.networktables.IntegerPublisher;
|
||||||
|
import org.wpilib.networktables.IntegerSubscriber;
|
||||||
|
import org.wpilib.networktables.MultiSubscriber;
|
||||||
|
import org.wpilib.networktables.NetworkTable;
|
||||||
|
import org.wpilib.networktables.NetworkTableInstance;
|
||||||
|
import org.wpilib.networktables.PubSubOption;
|
||||||
|
import org.wpilib.networktables.StringSubscriber;
|
||||||
|
import org.wpilib.system.Timer;
|
||||||
|
import org.wpilib.util.Alert;
|
||||||
|
import org.wpilib.util.Alert.AlertType;
|
||||||
|
|
||||||
/** Represents a camera that is connected to PhotonVision. */
|
/** Represents a camera that is connected to PhotonVision. */
|
||||||
public class PhotonCamera implements AutoCloseable {
|
public class PhotonCamera implements AutoCloseable {
|
||||||
|
|||||||
@@ -24,28 +24,28 @@
|
|||||||
|
|
||||||
package org.photonvision;
|
package org.photonvision;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
|
||||||
import edu.wpi.first.cscore.OpenCvLoader;
|
|
||||||
import edu.wpi.first.hal.HAL;
|
|
||||||
import edu.wpi.first.math.Matrix;
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
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.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation2d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import edu.wpi.first.math.interpolation.TimeInterpolatableBuffer;
|
|
||||||
import edu.wpi.first.math.numbers.N1;
|
|
||||||
import edu.wpi.first.math.numbers.N3;
|
|
||||||
import edu.wpi.first.math.numbers.N8;
|
|
||||||
import edu.wpi.first.wpilibj.DriverStation;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import org.photonvision.estimation.TargetModel;
|
import org.photonvision.estimation.TargetModel;
|
||||||
import org.photonvision.estimation.VisionEstimation;
|
import org.photonvision.estimation.VisionEstimation;
|
||||||
import org.photonvision.targeting.PhotonPipelineResult;
|
import org.photonvision.targeting.PhotonPipelineResult;
|
||||||
import org.photonvision.targeting.PhotonTrackedTarget;
|
import org.photonvision.targeting.PhotonTrackedTarget;
|
||||||
|
import org.wpilib.driverstation.DriverStation;
|
||||||
|
import org.wpilib.hardware.hal.HAL;
|
||||||
|
import org.wpilib.math.geometry.Pose2d;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Rotation2d;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.geometry.Translation2d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
import org.wpilib.math.interpolation.TimeInterpolatableBuffer;
|
||||||
|
import org.wpilib.math.linalg.Matrix;
|
||||||
|
import org.wpilib.math.numbers.N1;
|
||||||
|
import org.wpilib.math.numbers.N3;
|
||||||
|
import org.wpilib.math.numbers.N8;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
import org.wpilib.vision.camera.OpenCvLoader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The PhotonPoseEstimator class filters or combines readings from all the AprilTags visible at a
|
* The PhotonPoseEstimator class filters or combines readings from all the AprilTags visible at a
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
package org.photonvision;
|
package org.photonvision;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.*;
|
import org.wpilib.math.geometry.*;
|
||||||
|
|
||||||
public final class PhotonUtils {
|
public final class PhotonUtils {
|
||||||
private PhotonUtils() {
|
private PhotonUtils() {
|
||||||
@@ -39,7 +39,7 @@ public final class PhotonUtils {
|
|||||||
* for there to exist a height differential between goal and camera. The larger this differential,
|
* for there to exist a height differential between goal and camera. The larger this differential,
|
||||||
* the more accurate the distance estimate will be.
|
* the more accurate the distance estimate will be.
|
||||||
*
|
*
|
||||||
* <p>Units can be converted using the {@link edu.wpi.first.math.util.Units} class.
|
* <p>Units can be converted using the {@link org.wpilib.math.util.Units} class.
|
||||||
*
|
*
|
||||||
* @param cameraHeightMeters The physical height of the camera off the floor in meters.
|
* @param cameraHeightMeters The physical height of the camera off the floor in meters.
|
||||||
* @param targetHeightMeters The physical height of the target off the floor in meters. This
|
* @param targetHeightMeters The physical height of the target off the floor in meters. This
|
||||||
|
|||||||
@@ -24,19 +24,6 @@
|
|||||||
|
|
||||||
package org.photonvision.simulation;
|
package org.photonvision.simulation;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFields;
|
|
||||||
import edu.wpi.first.cameraserver.CameraServer;
|
|
||||||
import edu.wpi.first.cscore.CvSource;
|
|
||||||
import edu.wpi.first.cscore.OpenCvLoader;
|
|
||||||
import edu.wpi.first.cscore.VideoSource.ConnectionStrategy;
|
|
||||||
import edu.wpi.first.math.MathUtil;
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.util.PixelFormat;
|
|
||||||
import edu.wpi.first.util.WPIUtilJNI;
|
|
||||||
import edu.wpi.first.wpilibj.RobotController;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -60,6 +47,18 @@ import org.photonvision.targeting.MultiTargetPNPResult;
|
|||||||
import org.photonvision.targeting.PhotonPipelineResult;
|
import org.photonvision.targeting.PhotonPipelineResult;
|
||||||
import org.photonvision.targeting.PhotonTrackedTarget;
|
import org.photonvision.targeting.PhotonTrackedTarget;
|
||||||
import org.photonvision.targeting.PnpResult;
|
import org.photonvision.targeting.PnpResult;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
import org.wpilib.system.RobotController;
|
||||||
|
import org.wpilib.util.PixelFormat;
|
||||||
|
import org.wpilib.util.WPIUtilJNI;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFields;
|
||||||
|
import org.wpilib.vision.camera.CvSource;
|
||||||
|
import org.wpilib.vision.camera.OpenCvLoader;
|
||||||
|
import org.wpilib.vision.camera.VideoSource.ConnectionStrategy;
|
||||||
|
import org.wpilib.vision.stream.CameraServer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A handle for simulating {@link PhotonCamera} values. Processing simulated targets through this
|
* A handle for simulating {@link PhotonCamera} values. Processing simulated targets through this
|
||||||
@@ -295,8 +294,8 @@ public class PhotonCameraSim implements AutoCloseable {
|
|||||||
*/
|
*/
|
||||||
public boolean canSeeCorners(Point[] points) {
|
public boolean canSeeCorners(Point[] points) {
|
||||||
for (var point : points) {
|
for (var point : points) {
|
||||||
if (MathUtil.clamp(point.x, 0, prop.getResWidth()) != point.x
|
if (Math.clamp(point.x, 0, prop.getResWidth()) != point.x
|
||||||
|| MathUtil.clamp(point.y, 0, prop.getResHeight()) != point.y) {
|
|| Math.clamp(point.y, 0, prop.getResHeight()) != point.y) {
|
||||||
return false; // point is outside of resolution
|
return false; // point is outside of resolution
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,19 +25,6 @@
|
|||||||
package org.photonvision.simulation;
|
package org.photonvision.simulation;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import edu.wpi.first.math.MatBuilder;
|
|
||||||
import edu.wpi.first.math.MathUtil;
|
|
||||||
import edu.wpi.first.math.Matrix;
|
|
||||||
import edu.wpi.first.math.Nat;
|
|
||||||
import edu.wpi.first.math.Pair;
|
|
||||||
import edu.wpi.first.math.VecBuilder;
|
|
||||||
import edu.wpi.first.math.Vector;
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import edu.wpi.first.math.geometry.Rotation2d;
|
|
||||||
import edu.wpi.first.math.geometry.Rotation3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import edu.wpi.first.math.numbers.*;
|
|
||||||
import edu.wpi.first.wpilibj.DriverStation;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -51,6 +38,18 @@ import org.opencv.core.Point;
|
|||||||
import org.opencv.imgproc.Imgproc;
|
import org.opencv.imgproc.Imgproc;
|
||||||
import org.photonvision.estimation.OpenCVHelp;
|
import org.photonvision.estimation.OpenCVHelp;
|
||||||
import org.photonvision.estimation.RotTrlTransform3d;
|
import org.photonvision.estimation.RotTrlTransform3d;
|
||||||
|
import org.wpilib.driverstation.DriverStation;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Rotation2d;
|
||||||
|
import org.wpilib.math.geometry.Rotation3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
import org.wpilib.math.linalg.MatBuilder;
|
||||||
|
import org.wpilib.math.linalg.Matrix;
|
||||||
|
import org.wpilib.math.linalg.VecBuilder;
|
||||||
|
import org.wpilib.math.linalg.Vector;
|
||||||
|
import org.wpilib.math.numbers.*;
|
||||||
|
import org.wpilib.math.util.Nat;
|
||||||
|
import org.wpilib.math.util.Pair;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calibration and performance values for this camera.
|
* Calibration and performance values for this camera.
|
||||||
@@ -167,7 +166,7 @@ public class SimCameraProperties {
|
|||||||
|
|
||||||
public SimCameraProperties setCalibration(int resWidth, int resHeight, Rotation2d fovDiag) {
|
public SimCameraProperties setCalibration(int resWidth, int resHeight, Rotation2d fovDiag) {
|
||||||
if (fovDiag.getDegrees() < 1 || fovDiag.getDegrees() > 179) {
|
if (fovDiag.getDegrees() < 1 || fovDiag.getDegrees() > 179) {
|
||||||
fovDiag = Rotation2d.fromDegrees(MathUtil.clamp(fovDiag.getDegrees(), 1, 179));
|
fovDiag = Rotation2d.fromDegrees(Math.clamp(fovDiag.getDegrees(), 1, 179));
|
||||||
DriverStation.reportError(
|
DriverStation.reportError(
|
||||||
"Requested invalid FOV! Clamping between (1, 179) degrees...", false);
|
"Requested invalid FOV! Clamping between (1, 179) degrees...", false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,13 +24,6 @@
|
|||||||
|
|
||||||
package org.photonvision.simulation;
|
package org.photonvision.simulation;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTag;
|
|
||||||
import edu.wpi.first.cscore.CvSource;
|
|
||||||
import edu.wpi.first.cscore.OpenCvLoader;
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import edu.wpi.first.math.util.Units;
|
|
||||||
import edu.wpi.first.util.RawFrame;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -48,6 +41,13 @@ import org.opencv.core.Size;
|
|||||||
import org.opencv.imgproc.Imgproc;
|
import org.opencv.imgproc.Imgproc;
|
||||||
import org.photonvision.estimation.OpenCVHelp;
|
import org.photonvision.estimation.OpenCVHelp;
|
||||||
import org.photonvision.estimation.RotTrlTransform3d;
|
import org.photonvision.estimation.RotTrlTransform3d;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
import org.wpilib.math.util.Units;
|
||||||
|
import org.wpilib.util.RawFrame;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTag;
|
||||||
|
import org.wpilib.vision.camera.CvSource;
|
||||||
|
import org.wpilib.vision.camera.OpenCvLoader;
|
||||||
|
|
||||||
public class VideoSimUtil {
|
public class VideoSimUtil {
|
||||||
// Tag IDs start at 0, this should be set to 1 greater than the maximum tag ID required
|
// Tag IDs start at 0, this should be set to 1 greater than the maximum tag ID required
|
||||||
|
|||||||
@@ -24,15 +24,6 @@
|
|||||||
|
|
||||||
package org.photonvision.simulation;
|
package org.photonvision.simulation;
|
||||||
|
|
||||||
import edu.wpi.first.apriltag.AprilTag;
|
|
||||||
import edu.wpi.first.apriltag.AprilTagFieldLayout;
|
|
||||||
import edu.wpi.first.math.geometry.Pose2d;
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import edu.wpi.first.math.geometry.Transform3d;
|
|
||||||
import edu.wpi.first.math.interpolation.TimeInterpolatableBuffer;
|
|
||||||
import edu.wpi.first.wpilibj.Timer;
|
|
||||||
import edu.wpi.first.wpilibj.smartdashboard.Field2d;
|
|
||||||
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -43,6 +34,15 @@ import java.util.Optional;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.photonvision.PhotonCamera;
|
import org.photonvision.PhotonCamera;
|
||||||
import org.photonvision.estimation.TargetModel;
|
import org.photonvision.estimation.TargetModel;
|
||||||
|
import org.wpilib.math.geometry.Pose2d;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Transform3d;
|
||||||
|
import org.wpilib.math.interpolation.TimeInterpolatableBuffer;
|
||||||
|
import org.wpilib.smartdashboard.Field2d;
|
||||||
|
import org.wpilib.smartdashboard.SmartDashboard;
|
||||||
|
import org.wpilib.system.Timer;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTag;
|
||||||
|
import org.wpilib.vision.apriltag.AprilTagFieldLayout;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simulated vision system involving a camera(s) and coprocessor(s) mounted on a mobile robot
|
* A simulated vision system involving a camera(s) and coprocessor(s) mounted on a mobile robot
|
||||||
|
|||||||
@@ -24,10 +24,10 @@
|
|||||||
|
|
||||||
package org.photonvision.simulation;
|
package org.photonvision.simulation;
|
||||||
|
|
||||||
import edu.wpi.first.math.geometry.Pose3d;
|
|
||||||
import edu.wpi.first.math.geometry.Translation3d;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.photonvision.estimation.TargetModel;
|
import org.photonvision.estimation.TargetModel;
|
||||||
|
import org.wpilib.math.geometry.Pose3d;
|
||||||
|
import org.wpilib.math.geometry.Translation3d;
|
||||||
|
|
||||||
/** Describes a vision target located somewhere on the field that your vision system can detect. */
|
/** Describes a vision target located somewhere on the field that your vision system can detect. */
|
||||||
public class VisionTargetSim {
|
public class VisionTargetSim {
|
||||||
|
|||||||
@@ -24,9 +24,9 @@
|
|||||||
|
|
||||||
package org.photonvision.timesync;
|
package org.photonvision.timesync;
|
||||||
|
|
||||||
import edu.wpi.first.util.RuntimeLoader;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import org.photonvision.jni.TimeSyncServer;
|
import org.photonvision.jni.TimeSyncServer;
|
||||||
|
import org.wpilib.util.runtime.RuntimeLoader;
|
||||||
|
|
||||||
/** Helper to hold a single TimeSyncServer instance with some default config */
|
/** Helper to hold a single TimeSyncServer instance with some default config */
|
||||||
public class TimeSyncSingleton {
|
public class TimeSyncSingleton {
|
||||||
|
|||||||
@@ -29,20 +29,21 @@
|
|||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <frc/Errors.h>
|
#include <wpi/hal/UsageReporting.h>
|
||||||
#include <frc/RobotController.h>
|
|
||||||
#include <frc/Timer.h>
|
|
||||||
#include <hal/FRCUsageReporting.h>
|
|
||||||
#include <net/TimeSyncServer.h>
|
#include <net/TimeSyncServer.h>
|
||||||
#include <opencv2/core.hpp>
|
#include <opencv2/core.hpp>
|
||||||
#include <opencv2/core/utility.hpp>
|
#include <opencv2/core/utility.hpp>
|
||||||
#include <wpi/json.h>
|
#include <wpi/system/Errors.hpp>
|
||||||
|
#include <wpi/system/RobotController.hpp>
|
||||||
|
#include <wpi/system/Timer.hpp>
|
||||||
|
#include <wpi/system/WPILibVersion.hpp>
|
||||||
|
#include <wpi/util/json.hpp>
|
||||||
|
|
||||||
#include "PhotonVersion.h"
|
#include "PhotonVersion.h"
|
||||||
#include "photon/dataflow/structures/Packet.h"
|
#include "photon/dataflow/structures/Packet.h"
|
||||||
|
|
||||||
static constexpr units::second_t WARN_DEBOUNCE_SEC = 5_s;
|
static constexpr wpi::units::second_t WARN_DEBOUNCE_SEC = 5_s;
|
||||||
static constexpr units::second_t HEARTBEAT_DEBOUNCE_SEC = 500_ms;
|
static constexpr wpi::units::second_t HEARTBEAT_DEBOUNCE_SEC = 500_ms;
|
||||||
|
|
||||||
inline void verifyDependencies() {
|
inline void verifyDependencies() {
|
||||||
if (!(std::string_view{cv::getVersionString()} ==
|
if (!(std::string_view{cv::getVersionString()} ==
|
||||||
@@ -83,8 +84,8 @@ inline void verifyDependencies() {
|
|||||||
">>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
|
">>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
|
||||||
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n";
|
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n";
|
||||||
|
|
||||||
FRC_ReportWarning(bfw);
|
WPILIB_ReportWarning(bfw);
|
||||||
FRC_ReportError(frc::err::Error, bfw);
|
WPILIB_ReportError(wpi::err::Error, bfw);
|
||||||
throw new std::runtime_error(std::string{bfw});
|
throw new std::runtime_error(std::string{bfw});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -107,7 +108,7 @@ static void InitTspServer() {
|
|||||||
|
|
||||||
namespace photon {
|
namespace photon {
|
||||||
|
|
||||||
constexpr const units::second_t VERSION_CHECK_INTERVAL = 5_s;
|
constexpr const wpi::units::second_t VERSION_CHECK_INTERVAL = 5_s;
|
||||||
static const std::vector<std::string_view> PHOTON_PREFIX = {"/photonvision/"};
|
static const std::vector<std::string_view> PHOTON_PREFIX = {"/photonvision/"};
|
||||||
static const std::string PHOTON_ALERT_GROUP{"PhotonAlerts"};
|
static const std::string PHOTON_ALERT_GROUP{"PhotonAlerts"};
|
||||||
bool PhotonCamera::VERSION_CHECK_ENABLED = true;
|
bool PhotonCamera::VERSION_CHECK_ENABLED = true;
|
||||||
@@ -120,7 +121,7 @@ static const std::string TYPE_STRING =
|
|||||||
std::string{"photonstruct:PhotonPipelineResult:"} +
|
std::string{"photonstruct:PhotonPipelineResult:"} +
|
||||||
std::string{SerdeType<PhotonPipelineResult>::GetSchemaHash()};
|
std::string{SerdeType<PhotonPipelineResult>::GetSchemaHash()};
|
||||||
|
|
||||||
PhotonCamera::PhotonCamera(nt::NetworkTableInstance instance,
|
PhotonCamera::PhotonCamera(wpi::nt::NetworkTableInstance instance,
|
||||||
const std::string_view cameraName)
|
const std::string_view cameraName)
|
||||||
: mainTable(instance.GetTable("photonvision")),
|
: mainTable(instance.GetTable("photonvision")),
|
||||||
rootTable(mainTable->GetSubTable(cameraName)),
|
rootTable(mainTable->GetSubTable(cameraName)),
|
||||||
@@ -163,20 +164,20 @@ PhotonCamera::PhotonCamera(nt::NetworkTableInstance instance,
|
|||||||
disconnectAlert(PHOTON_ALERT_GROUP,
|
disconnectAlert(PHOTON_ALERT_GROUP,
|
||||||
std::string{"PhotonCamera '"} + std::string{cameraName} +
|
std::string{"PhotonCamera '"} + std::string{cameraName} +
|
||||||
"' is disconnected.",
|
"' is disconnected.",
|
||||||
frc::Alert::AlertType::kWarning),
|
wpi::Alert::AlertType::kWarning),
|
||||||
timesyncAlert(PHOTON_ALERT_GROUP, "", frc::Alert::AlertType::kWarning) {
|
timesyncAlert(PHOTON_ALERT_GROUP, "", wpi::Alert::AlertType::kWarning) {
|
||||||
verifyDependencies();
|
verifyDependencies();
|
||||||
InstanceCount++;
|
InstanceCount++;
|
||||||
HAL_ReportUsage("PhotonVision/PhotonCamera", InstanceCount, "");
|
HAL_ReportUsage("PhotonVision/PhotonCamera", InstanceCount, "");
|
||||||
|
|
||||||
// The Robot class is actually created here:
|
// The Robot class is actually created here:
|
||||||
// https://github.com/wpilibsuite/allwpilib/blob/811b1309683e930a1ce69fae818f943ff161b7a5/wpilibc/src/main/native/include/frc/RobotBase.h#L33
|
// https://github.com/wpilibsuite/allwpilib/blob/811b1309683e930a1ce69fae818f943ff161b7a5/wpilibc/src/main/native/include/wpi/opmode/RobotBase.hpp#L33
|
||||||
// so we should be fine to call this from the ctor
|
// so we should be fine to call this from the ctor
|
||||||
InitTspServer();
|
InitTspServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
PhotonCamera::PhotonCamera(const std::string_view cameraName)
|
PhotonCamera::PhotonCamera(const std::string_view cameraName)
|
||||||
: PhotonCamera(nt::NetworkTableInstance::GetDefault(), cameraName) {}
|
: PhotonCamera(wpi::nt::NetworkTableInstance::GetDefault(), cameraName) {}
|
||||||
|
|
||||||
PhotonPipelineResult PhotonCamera::GetLatestResult() {
|
PhotonPipelineResult PhotonCamera::GetLatestResult() {
|
||||||
if (test) {
|
if (test) {
|
||||||
@@ -190,8 +191,8 @@ PhotonPipelineResult PhotonCamera::GetLatestResult() {
|
|||||||
VerifyVersion();
|
VerifyVersion();
|
||||||
|
|
||||||
// Fill the packet with latest data and populate result.
|
// Fill the packet with latest data and populate result.
|
||||||
units::microsecond_t now =
|
wpi::units::microsecond_t now =
|
||||||
units::microsecond_t(frc::RobotController::GetFPGATime());
|
wpi::units::microsecond_t(wpi::RobotController::GetFPGATime());
|
||||||
const auto value = rawBytesEntry.Get();
|
const auto value = rawBytesEntry.Get();
|
||||||
if (!value.size()) return PhotonPipelineResult{};
|
if (!value.size()) return PhotonPipelineResult{};
|
||||||
|
|
||||||
@@ -223,7 +224,7 @@ std::vector<PhotonPipelineResult> PhotonCamera::GetAllUnreadResults() {
|
|||||||
ret.reserve(changes.size());
|
ret.reserve(changes.size());
|
||||||
|
|
||||||
for (size_t i = 0; i < changes.size(); i++) {
|
for (size_t i = 0; i < changes.size(); i++) {
|
||||||
const nt::Timestamped<std::vector<uint8_t>>& value = changes[i];
|
const wpi::nt::Timestamped<std::vector<uint8_t>>& value = changes[i];
|
||||||
|
|
||||||
if (!value.value.size() || value.time == 0) {
|
if (!value.value.size() || value.time == 0) {
|
||||||
continue;
|
continue;
|
||||||
@@ -237,7 +238,7 @@ std::vector<PhotonPipelineResult> PhotonCamera::GetAllUnreadResults() {
|
|||||||
|
|
||||||
// TODO: NT4 timestamps are still not to be trusted. But it's the best we
|
// TODO: NT4 timestamps are still not to be trusted. But it's the best we
|
||||||
// can do until we can make time sync more reliable.
|
// can do until we can make time sync more reliable.
|
||||||
result.SetReceiveTimestamp(units::microsecond_t(value.time) -
|
result.SetReceiveTimestamp(wpi::units::microsecond_t(value.time) -
|
||||||
result.GetLatency());
|
result.GetLatency());
|
||||||
|
|
||||||
ret.push_back(result);
|
ret.push_back(result);
|
||||||
@@ -261,11 +262,11 @@ void PhotonCamera::CheckTimeSyncOrWarn(photon::PhotonPipelineResult& result) {
|
|||||||
timesyncAlert.SetText(warningText);
|
timesyncAlert.SetText(warningText);
|
||||||
timesyncAlert.Set(true);
|
timesyncAlert.Set(true);
|
||||||
|
|
||||||
if (frc::Timer::GetFPGATimestamp() <
|
if (wpi::Timer::GetFPGATimestamp() <
|
||||||
(prevTimeSyncWarnTime + WARN_DEBOUNCE_SEC)) {
|
(prevTimeSyncWarnTime + WARN_DEBOUNCE_SEC)) {
|
||||||
prevTimeSyncWarnTime = frc::Timer::GetFPGATimestamp();
|
prevTimeSyncWarnTime = wpi::Timer::GetFPGATimestamp();
|
||||||
|
|
||||||
FRC_ReportWarning(
|
WPILIB_ReportWarning(
|
||||||
warningText +
|
warningText +
|
||||||
"\n\nCheck /photonvision/.timesync/{{COPROCESSOR_HOSTNAME}} for more "
|
"\n\nCheck /photonvision/.timesync/{{COPROCESSOR_HOSTNAME}} for more "
|
||||||
"information.");
|
"information.");
|
||||||
@@ -317,7 +318,7 @@ const std::string_view PhotonCamera::GetCameraName() const {
|
|||||||
|
|
||||||
bool PhotonCamera::IsConnected() {
|
bool PhotonCamera::IsConnected() {
|
||||||
auto currentHeartbeat = heartbeatSubscriber.Get();
|
auto currentHeartbeat = heartbeatSubscriber.Get();
|
||||||
auto now = frc::Timer::GetFPGATimestamp();
|
auto now = wpi::Timer::GetFPGATimestamp();
|
||||||
|
|
||||||
if (currentHeartbeat < 0) {
|
if (currentHeartbeat < 0) {
|
||||||
// we have never heard from the camera
|
// we have never heard from the camera
|
||||||
@@ -365,10 +366,10 @@ void PhotonCamera::VerifyVersion() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((frc::Timer::GetFPGATimestamp() - lastVersionCheckTime) <
|
if ((wpi::Timer::GetFPGATimestamp() - lastVersionCheckTime) <
|
||||||
VERSION_CHECK_INTERVAL)
|
VERSION_CHECK_INTERVAL)
|
||||||
return;
|
return;
|
||||||
this->lastVersionCheckTime = frc::Timer::GetFPGATimestamp();
|
this->lastVersionCheckTime = wpi::Timer::GetFPGATimestamp();
|
||||||
|
|
||||||
const std::string& versionString = versionEntry.Get("");
|
const std::string& versionString = versionEntry.Get("");
|
||||||
if (versionString.empty()) {
|
if (versionString.empty()) {
|
||||||
@@ -376,13 +377,13 @@ void PhotonCamera::VerifyVersion() {
|
|||||||
std::vector<std::string> cameraNames =
|
std::vector<std::string> cameraNames =
|
||||||
rootTable->GetInstance().GetTable("photonvision")->GetSubTables();
|
rootTable->GetInstance().GetTable("photonvision")->GetSubTables();
|
||||||
if (cameraNames.empty()) {
|
if (cameraNames.empty()) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(wpi::warn::Warning,
|
||||||
"Could not find any PhotonVision coprocessors on "
|
"Could not find any PhotonVision coprocessors on "
|
||||||
"NetworkTables. Double check that PhotonVision is "
|
"NetworkTables. Double check that PhotonVision is "
|
||||||
"running, and that your camera is connected!");
|
"running, and that your camera is connected!");
|
||||||
} else {
|
} else {
|
||||||
FRC_ReportError(
|
WPILIB_ReportError(
|
||||||
frc::warn::Warning,
|
wpi::warn::Warning,
|
||||||
"PhotonVision coprocessor at path {} not found on NetworkTables. "
|
"PhotonVision coprocessor at path {} not found on NetworkTables. "
|
||||||
"Double check that your camera names match!",
|
"Double check that your camera names match!",
|
||||||
path_);
|
path_);
|
||||||
@@ -391,8 +392,8 @@ void PhotonCamera::VerifyVersion() {
|
|||||||
for (unsigned int i = 0; i < cameraNames.size(); i++) {
|
for (unsigned int i = 0; i < cameraNames.size(); i++) {
|
||||||
cameraNameOutString += ("\n" + cameraNames[i]);
|
cameraNameOutString += ("\n" + cameraNames[i]);
|
||||||
}
|
}
|
||||||
FRC_ReportError(
|
WPILIB_ReportError(
|
||||||
frc::warn::Warning,
|
wpi::warn::Warning,
|
||||||
"Found the following PhotonVision cameras on NetworkTables:\n{}",
|
"Found the following PhotonVision cameras on NetworkTables:\n{}",
|
||||||
cameraNameOutString);
|
cameraNameOutString);
|
||||||
}
|
}
|
||||||
@@ -400,12 +401,12 @@ void PhotonCamera::VerifyVersion() {
|
|||||||
std::string local_uuid{SerdeType<PhotonPipelineResult>::GetSchemaHash()};
|
std::string local_uuid{SerdeType<PhotonPipelineResult>::GetSchemaHash()};
|
||||||
|
|
||||||
// implicit conversion here might throw an exception, so be careful of that
|
// implicit conversion here might throw an exception, so be careful of that
|
||||||
wpi::json remote_uuid_json =
|
wpi::util::json remote_uuid_json =
|
||||||
rawBytesEntry.GetTopic().GetProperty("message_uuid");
|
rawBytesEntry.GetTopic().GetProperty("message_uuid");
|
||||||
if (!remote_uuid_json.is_string()) {
|
if (!remote_uuid_json.is_string()) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(
|
||||||
"Cannot find property message_uuid for PhotonCamera {}",
|
wpi::warn::Warning,
|
||||||
path);
|
"Cannot find property message_uuid for PhotonCamera {}", path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::string remote_uuid{remote_uuid_json};
|
std::string remote_uuid{remote_uuid_json};
|
||||||
@@ -429,12 +430,12 @@ void PhotonCamera::VerifyVersion() {
|
|||||||
">>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
|
">>> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
|
||||||
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"
|
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"
|
||||||
"\n\n";
|
"\n\n";
|
||||||
FRC_ReportWarning(bfw);
|
WPILIB_ReportWarning(bfw);
|
||||||
std::string error_str = fmt::format(
|
std::string error_str = fmt::format(
|
||||||
"Photonlib version {} (message definition version {}) does not match "
|
"Photonlib version {} (message definition version {}) does not match "
|
||||||
"coprocessor version {} (message definition version {})!",
|
"coprocessor version {} (message definition version {})!",
|
||||||
PhotonVersion::versionString, local_uuid, versionString, remote_uuid);
|
PhotonVersion::versionString, local_uuid, versionString, remote_uuid);
|
||||||
FRC_ReportError(frc::err::Error, "{}", error_str);
|
WPILIB_ReportError(wpi::err::Error, "{}", error_str);
|
||||||
throw std::runtime_error(error_str);
|
throw std::runtime_error(error_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,18 +30,18 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <Eigen/Core>
|
#include <Eigen/Core>
|
||||||
#include <frc/Errors.h>
|
|
||||||
#include <frc/geometry/Pose3d.h>
|
|
||||||
#include <frc/geometry/Rotation3d.h>
|
|
||||||
#include <frc/geometry/Transform3d.h>
|
|
||||||
#include <hal/FRCUsageReporting.h>
|
|
||||||
#include <opencv2/calib3d.hpp>
|
#include <opencv2/calib3d.hpp>
|
||||||
#include <opencv2/core/mat.hpp>
|
#include <opencv2/core/mat.hpp>
|
||||||
#include <opencv2/core/types.hpp>
|
#include <opencv2/core/types.hpp>
|
||||||
#include <units/angle.h>
|
|
||||||
#include <units/math.h>
|
|
||||||
#include <units/time.h>
|
|
||||||
#include <wpi/deprecated.h>
|
#include <wpi/deprecated.h>
|
||||||
|
#include <wpi/hal/UsageReporting.h>
|
||||||
|
#include <wpi/math/geometry/Pose3d.hpp>
|
||||||
|
#include <wpi/math/geometry/Rotation3d.hpp>
|
||||||
|
#include <wpi/math/geometry/Transform3d.hpp>
|
||||||
|
#include <wpi/system/Errors.hpp>
|
||||||
|
#include <wpi/units/angle.hpp>
|
||||||
|
#include <wpi/units/math.hpp>
|
||||||
|
#include <wpi/units/time.hpp>
|
||||||
|
|
||||||
#include "photon/PhotonCamera.h"
|
#include "photon/PhotonCamera.h"
|
||||||
#include "photon/estimation/TargetModel.h"
|
#include "photon/estimation/TargetModel.h"
|
||||||
@@ -55,37 +55,41 @@ WPI_IGNORE_DEPRECATED
|
|||||||
namespace photon {
|
namespace photon {
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
cv::Point3d ToPoint3d(const frc::Translation3d& translation);
|
cv::Point3d ToPoint3d(const wpi::math::Translation3d& translation);
|
||||||
std::optional<std::array<cv::Point3d, 4>> CalcTagCorners(
|
std::optional<std::array<cv::Point3d, 4>> CalcTagCorners(
|
||||||
int tagID, const frc::AprilTagFieldLayout& aprilTags);
|
int tagID, const wpi::apriltag::AprilTagFieldLayout& aprilTags);
|
||||||
frc::Pose3d ToPose3d(const cv::Mat& tvec, const cv::Mat& rvec);
|
wpi::math::Pose3d ToPose3d(const cv::Mat& tvec, const cv::Mat& rvec);
|
||||||
cv::Point3d TagCornerToObjectPoint(units::meter_t cornerX,
|
cv::Point3d TagCornerToObjectPoint(wpi::units::meter_t cornerX,
|
||||||
units::meter_t cornerY, frc::Pose3d tagPose);
|
wpi::units::meter_t cornerY,
|
||||||
|
wpi::math::Pose3d tagPose);
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
PhotonPoseEstimator::PhotonPoseEstimator(frc::AprilTagFieldLayout tags,
|
PhotonPoseEstimator::PhotonPoseEstimator(
|
||||||
frc::Transform3d robotToCamera)
|
wpi::apriltag::AprilTagFieldLayout tags,
|
||||||
|
wpi::math::Transform3d robotToCamera)
|
||||||
: aprilTags(tags),
|
: aprilTags(tags),
|
||||||
m_robotToCamera(robotToCamera),
|
m_robotToCamera(robotToCamera),
|
||||||
lastPose(frc::Pose3d()),
|
lastPose(wpi::math::Pose3d()),
|
||||||
referencePose(frc::Pose3d()),
|
referencePose(wpi::math::Pose3d()),
|
||||||
poseCacheTimestamp(-1_s),
|
poseCacheTimestamp(-1_s),
|
||||||
headingBuffer(frc::TimeInterpolatableBuffer<frc::Rotation2d>(1_s)) {
|
headingBuffer(
|
||||||
|
wpi::math::TimeInterpolatableBuffer<wpi::math::Rotation2d>(1_s)) {
|
||||||
HAL_Report(HALUsageReporting::kResourceType_PhotonPoseEstimator,
|
HAL_Report(HALUsageReporting::kResourceType_PhotonPoseEstimator,
|
||||||
InstanceCount);
|
InstanceCount);
|
||||||
InstanceCount++;
|
InstanceCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
PhotonPoseEstimator::PhotonPoseEstimator(frc::AprilTagFieldLayout tags,
|
PhotonPoseEstimator::PhotonPoseEstimator(
|
||||||
PoseStrategy strat,
|
wpi::apriltag::AprilTagFieldLayout tags, PoseStrategy strat,
|
||||||
frc::Transform3d robotToCamera)
|
wpi::math::Transform3d robotToCamera)
|
||||||
: aprilTags(tags),
|
: aprilTags(tags),
|
||||||
strategy(strat),
|
strategy(strat),
|
||||||
m_robotToCamera(robotToCamera),
|
m_robotToCamera(robotToCamera),
|
||||||
lastPose(frc::Pose3d()),
|
lastPose(wpi::math::Pose3d()),
|
||||||
referencePose(frc::Pose3d()),
|
referencePose(wpi::math::Pose3d()),
|
||||||
poseCacheTimestamp(-1_s),
|
poseCacheTimestamp(-1_s),
|
||||||
headingBuffer(frc::TimeInterpolatableBuffer<frc::Rotation2d>(1_s)) {
|
headingBuffer(
|
||||||
|
wpi::math::TimeInterpolatableBuffer<wpi::math::Rotation2d>(1_s)) {
|
||||||
InstanceCount++;
|
InstanceCount++;
|
||||||
HAL_ReportUsage("PhotonVision/PhotonPoseEstimator", InstanceCount, "");
|
HAL_ReportUsage("PhotonVision/PhotonPoseEstimator", InstanceCount, "");
|
||||||
}
|
}
|
||||||
@@ -93,8 +97,8 @@ PhotonPoseEstimator::PhotonPoseEstimator(frc::AprilTagFieldLayout tags,
|
|||||||
void PhotonPoseEstimator::SetMultiTagFallbackStrategy(PoseStrategy strategy) {
|
void PhotonPoseEstimator::SetMultiTagFallbackStrategy(PoseStrategy strategy) {
|
||||||
if (strategy == MULTI_TAG_PNP_ON_COPROCESSOR ||
|
if (strategy == MULTI_TAG_PNP_ON_COPROCESSOR ||
|
||||||
strategy == MULTI_TAG_PNP_ON_RIO) {
|
strategy == MULTI_TAG_PNP_ON_RIO) {
|
||||||
FRC_ReportError(
|
WPILIB_ReportError(
|
||||||
frc::warn::Warning,
|
wpi::warn::Warning,
|
||||||
"Fallback cannot be set to MULTI_TAG_PNP! Setting to lowest ambiguity",
|
"Fallback cannot be set to MULTI_TAG_PNP! Setting to lowest ambiguity",
|
||||||
"");
|
"");
|
||||||
strategy = LOWEST_AMBIGUITY;
|
strategy = LOWEST_AMBIGUITY;
|
||||||
@@ -112,15 +116,16 @@ std::optional<EstimatedRobotPose> PhotonPoseEstimator::Update(
|
|||||||
std::optional<ConstrainedSolvepnpParams> constrainedPnpParams) {
|
std::optional<ConstrainedSolvepnpParams> constrainedPnpParams) {
|
||||||
// Time in the past -- give up, since the following if expects times > 0
|
// Time in the past -- give up, since the following if expects times > 0
|
||||||
if (result.GetTimestamp() < 0_s) {
|
if (result.GetTimestamp() < 0_s) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(wpi::warn::Warning,
|
||||||
"Result timestamp was reported in the past!");
|
"Result timestamp was reported in the past!");
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the pose cache timestamp was set, and the result is from the same
|
// If the pose cache timestamp was set, and the result is from the same
|
||||||
// timestamp, return an empty result
|
// timestamp, return an empty result
|
||||||
if (poseCacheTimestamp > 0_s &&
|
if (poseCacheTimestamp > 0_s &&
|
||||||
units::math::abs(poseCacheTimestamp - result.GetTimestamp()) < 0.001_ms) {
|
wpi::units::math::abs(poseCacheTimestamp - result.GetTimestamp()) <
|
||||||
|
0.001_ms) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,9 +175,9 @@ std::optional<EstimatedRobotPose> PhotonPoseEstimator::Update(
|
|||||||
break;
|
break;
|
||||||
case MULTI_TAG_PNP_ON_RIO:
|
case MULTI_TAG_PNP_ON_RIO:
|
||||||
if (!cameraMatrixData && !cameraDistCoeffs) {
|
if (!cameraMatrixData && !cameraDistCoeffs) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(
|
||||||
"No camera calibration provided to multi-tag-on-rio!",
|
wpi::warn::Warning,
|
||||||
"");
|
"No camera calibration provided to multi-tag-on-rio!", "");
|
||||||
ret = Update(result, this->multiTagFallbackStrategy);
|
ret = Update(result, this->multiTagFallbackStrategy);
|
||||||
}
|
}
|
||||||
ret =
|
ret =
|
||||||
@@ -185,8 +190,8 @@ std::optional<EstimatedRobotPose> PhotonPoseEstimator::Update(
|
|||||||
using namespace frc;
|
using namespace frc;
|
||||||
|
|
||||||
if (!cameraMatrixData || !cameraDistCoeffs) {
|
if (!cameraMatrixData || !cameraDistCoeffs) {
|
||||||
FRC_ReportError(
|
WPILib_ReportError(
|
||||||
frc::warn::Warning,
|
wpi::warn::Warning,
|
||||||
"No camera calibration data provided for Constrained SolvePnP!");
|
"No camera calibration data provided for Constrained SolvePnP!");
|
||||||
ret = Update(result, this->multiTagFallbackStrategy);
|
ret = Update(result, this->multiTagFallbackStrategy);
|
||||||
break;
|
break;
|
||||||
@@ -203,12 +208,12 @@ std::optional<EstimatedRobotPose> PhotonPoseEstimator::Update(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
frc::Pose3d fieldToRobotSeed;
|
wpi::math::Pose3d fieldToRobotSeed;
|
||||||
|
|
||||||
if (result.MultiTagResult().has_value()) {
|
if (result.MultiTagResult().has_value()) {
|
||||||
fieldToRobotSeed =
|
fieldToRobotSeed =
|
||||||
frc::Pose3d{} + (result.MultiTagResult()->estimatedPose.best +
|
wpi::math::Pose3d{} + (result.MultiTagResult()->estimatedPose.best +
|
||||||
m_robotToCamera.Inverse());
|
m_robotToCamera.Inverse());
|
||||||
} else {
|
} else {
|
||||||
std::optional<EstimatedRobotPose> nestedUpdate =
|
std::optional<EstimatedRobotPose> nestedUpdate =
|
||||||
Update(result, cameraMatrixData, cameraDistCoeffs, {},
|
Update(result, cameraMatrixData, cameraDistCoeffs, {},
|
||||||
@@ -236,8 +241,8 @@ std::optional<EstimatedRobotPose> PhotonPoseEstimator::Update(
|
|||||||
ret = EstimatePnpDistanceTrigSolvePose(result);
|
ret = EstimatePnpDistanceTrigSolvePose(result);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
FRC_ReportError(frc::warn::Warning, "Invalid Pose Strategy selected!",
|
WPILIB_ReportError(wpi::warn::Warning, "Invalid Pose Strategy selected!",
|
||||||
"");
|
"");
|
||||||
ret = std::nullopt;
|
ret = std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,8 +255,8 @@ std::optional<EstimatedRobotPose> PhotonPoseEstimator::Update(
|
|||||||
bool ShouldEstimate(const PhotonPipelineResult& result) {
|
bool ShouldEstimate(const PhotonPipelineResult& result) {
|
||||||
// Time in the past -- give up, since the following if expects times > 0
|
// Time in the past -- give up, since the following if expects times > 0
|
||||||
if (result.GetTimestamp() < 0_s) {
|
if (result.GetTimestamp() < 0_s) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILib_ReportError(wpi::warn::Warning,
|
||||||
"Result timestamp was reported in the past!");
|
"Result timestamp was reported in the past!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,12 +286,12 @@ PhotonPoseEstimator::EstimateLowestAmbiguityPose(
|
|||||||
|
|
||||||
auto& bestTarget = *foundIt;
|
auto& bestTarget = *foundIt;
|
||||||
|
|
||||||
std::optional<frc::Pose3d> fiducialPose =
|
std::optional<wpi::math::Pose3d> fiducialPose =
|
||||||
aprilTags.GetTagPose(bestTarget.GetFiducialId());
|
aprilTags.GetTagPose(bestTarget.GetFiducialId());
|
||||||
if (!fiducialPose) {
|
if (!fiducialPose) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(wpi::warn::Warning,
|
||||||
"Tried to get pose of unknown April Tag: {}",
|
"Tried to get pose of unknown April Tag: {}",
|
||||||
bestTarget.GetFiducialId());
|
bestTarget.GetFiducialId());
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,28 +307,28 @@ PhotonPoseEstimator::EstimateClosestToCameraHeightPose(
|
|||||||
if (!ShouldEstimate(cameraResult)) {
|
if (!ShouldEstimate(cameraResult)) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
units::meter_t smallestHeightDifference =
|
wpi::units::meter_t smallestHeightDifference =
|
||||||
units::meter_t(std::numeric_limits<double>::infinity());
|
wpi::units::meter_t(std::numeric_limits<double>::infinity());
|
||||||
|
|
||||||
std::optional<EstimatedRobotPose> pose = std::nullopt;
|
std::optional<EstimatedRobotPose> pose = std::nullopt;
|
||||||
|
|
||||||
for (auto& target : cameraResult.GetTargets()) {
|
for (auto& target : cameraResult.GetTargets()) {
|
||||||
std::optional<frc::Pose3d> fiducialPose =
|
std::optional<wpi::math::Pose3d> fiducialPose =
|
||||||
aprilTags.GetTagPose(target.GetFiducialId());
|
aprilTags.GetTagPose(target.GetFiducialId());
|
||||||
if (!fiducialPose) {
|
if (!fiducialPose) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(wpi::warn::Warning,
|
||||||
"Tried to get pose of unknown April Tag: {}",
|
"Tried to get pose of unknown April Tag: {}",
|
||||||
target.GetFiducialId());
|
target.GetFiducialId());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
frc::Pose3d const targetPose = *fiducialPose;
|
wpi::math::Pose3d const targetPose = *fiducialPose;
|
||||||
|
|
||||||
units::meter_t const alternativeDifference = units::math::abs(
|
wpi::units::meter_t const alternativeDifference = wpi::units::math::abs(
|
||||||
m_robotToCamera.Z() -
|
m_robotToCamera.Z() -
|
||||||
targetPose.TransformBy(target.GetAlternateCameraToTarget().Inverse())
|
targetPose.TransformBy(target.GetAlternateCameraToTarget().Inverse())
|
||||||
.Z());
|
.Z());
|
||||||
|
|
||||||
units::meter_t const bestDifference = units::math::abs(
|
wpi::units::meter_t const bestDifference = wpi::units::math::abs(
|
||||||
m_robotToCamera.Z() -
|
m_robotToCamera.Z() -
|
||||||
targetPose.TransformBy(target.GetBestCameraToTarget().Inverse()).Z());
|
targetPose.TransformBy(target.GetBestCameraToTarget().Inverse()).Z());
|
||||||
|
|
||||||
@@ -350,26 +355,26 @@ PhotonPoseEstimator::EstimateClosestToCameraHeightPose(
|
|||||||
|
|
||||||
std::optional<EstimatedRobotPose>
|
std::optional<EstimatedRobotPose>
|
||||||
PhotonPoseEstimator::EstimateClosestToReferencePose(
|
PhotonPoseEstimator::EstimateClosestToReferencePose(
|
||||||
PhotonPipelineResult cameraResult, frc::Pose3d referencePose) {
|
PhotonPipelineResult cameraResult, wpi::math::Pose3d referencePose) {
|
||||||
if (!ShouldEstimate(cameraResult)) {
|
if (!ShouldEstimate(cameraResult)) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
units::meter_t smallestDifference =
|
wpi::units::meter_t smallestDifference =
|
||||||
units::meter_t(std::numeric_limits<double>::infinity());
|
wpi::units::meter_t(std::numeric_limits<double>::infinity());
|
||||||
units::second_t stateTimestamp = units::second_t(0);
|
wpi::units::second_t stateTimestamp = wpi::units::second_t(0);
|
||||||
frc::Pose3d pose = lastPose;
|
wpi::math::Pose3d pose = lastPose;
|
||||||
|
|
||||||
auto targets = cameraResult.GetTargets();
|
auto targets = cameraResult.GetTargets();
|
||||||
for (auto& target : targets) {
|
for (auto& target : targets) {
|
||||||
std::optional<frc::Pose3d> fiducialPose =
|
std::optional<wpi::math::Pose3d> fiducialPose =
|
||||||
aprilTags.GetTagPose(target.GetFiducialId());
|
aprilTags.GetTagPose(target.GetFiducialId());
|
||||||
if (!fiducialPose) {
|
if (!fiducialPose) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(wpi::warn::Warning,
|
||||||
"Tried to get pose of unknown April Tag: {}",
|
"Tried to get pose of unknown April Tag: {}",
|
||||||
target.GetFiducialId());
|
target.GetFiducialId());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
frc::Pose3d targetPose = fiducialPose.value();
|
wpi::math::Pose3d targetPose = fiducialPose.value();
|
||||||
|
|
||||||
const auto altPose =
|
const auto altPose =
|
||||||
targetPose.TransformBy(target.GetAlternateCameraToTarget().Inverse())
|
targetPose.TransformBy(target.GetAlternateCameraToTarget().Inverse())
|
||||||
@@ -378,9 +383,9 @@ PhotonPoseEstimator::EstimateClosestToReferencePose(
|
|||||||
targetPose.TransformBy(target.GetBestCameraToTarget().Inverse())
|
targetPose.TransformBy(target.GetBestCameraToTarget().Inverse())
|
||||||
.TransformBy(m_robotToCamera.Inverse());
|
.TransformBy(m_robotToCamera.Inverse());
|
||||||
|
|
||||||
units::meter_t const alternativeDifference = units::math::abs(
|
wpi::units::meter_t const alternativeDifference = wpi::units::math::abs(
|
||||||
referencePose.Translation().Distance(altPose.Translation()));
|
referencePose.Translation().Distance(altPose.Translation()));
|
||||||
units::meter_t const bestDifference = units::math::abs(
|
wpi::units::meter_t const bestDifference = wpi::units::math::abs(
|
||||||
referencePose.Translation().Distance(bestPose.Translation()));
|
referencePose.Translation().Distance(bestPose.Translation()));
|
||||||
if (alternativeDifference < smallestDifference) {
|
if (alternativeDifference < smallestDifference) {
|
||||||
smallestDifference = alternativeDifference;
|
smallestDifference = alternativeDifference;
|
||||||
@@ -400,7 +405,7 @@ PhotonPoseEstimator::EstimateClosestToReferencePose(
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::array<cv::Point3d, 4>> detail::CalcTagCorners(
|
std::optional<std::array<cv::Point3d, 4>> detail::CalcTagCorners(
|
||||||
int tagID, const frc::AprilTagFieldLayout& aprilTags) {
|
int tagID, const wpi::apriltag::AprilTagFieldLayout& aprilTags) {
|
||||||
if (auto tagPose = aprilTags.GetTagPose(tagID); tagPose.has_value()) {
|
if (auto tagPose = aprilTags.GetTagPose(tagID); tagPose.has_value()) {
|
||||||
return std::array{TagCornerToObjectPoint(-3_in, -3_in, *tagPose),
|
return std::array{TagCornerToObjectPoint(-3_in, -3_in, *tagPose),
|
||||||
TagCornerToObjectPoint(+3_in, -3_in, *tagPose),
|
TagCornerToObjectPoint(+3_in, -3_in, *tagPose),
|
||||||
@@ -411,23 +416,23 @@ std::optional<std::array<cv::Point3d, 4>> detail::CalcTagCorners(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::Point3d detail::ToPoint3d(const frc::Translation3d& translation) {
|
cv::Point3d detail::ToPoint3d(const wpi::math::Translation3d& translation) {
|
||||||
return cv::Point3d(-translation.Y().value(), -translation.Z().value(),
|
return cv::Point3d(-translation.Y().value(), -translation.Z().value(),
|
||||||
+translation.X().value());
|
+translation.X().value());
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::Point3d detail::TagCornerToObjectPoint(units::meter_t cornerX,
|
cv::Point3d detail::TagCornerToObjectPoint(wpi::units::meter_t cornerX,
|
||||||
units::meter_t cornerY,
|
wpi::units::meter_t cornerY,
|
||||||
frc::Pose3d tagPose) {
|
wpi::math::Pose3d tagPose) {
|
||||||
frc::Translation3d cornerTrans =
|
wpi::math::Translation3d cornerTrans =
|
||||||
tagPose.Translation() +
|
tagPose.Translation() + wpi::math::Translation3d(0.0_m, cornerX, cornerY)
|
||||||
frc::Translation3d(0.0_m, cornerX, cornerY).RotateBy(tagPose.Rotation());
|
.RotateBy(tagPose.Rotation());
|
||||||
return ToPoint3d(cornerTrans);
|
return ToPoint3d(cornerTrans);
|
||||||
}
|
}
|
||||||
|
|
||||||
frc::Pose3d detail::ToPose3d(const cv::Mat& tvec, const cv::Mat& rvec) {
|
wpi::math::Pose3d detail::ToPose3d(const cv::Mat& tvec, const cv::Mat& rvec) {
|
||||||
using namespace frc;
|
using namespace wpi::math;
|
||||||
using namespace units;
|
using namespace wpi::units;
|
||||||
|
|
||||||
cv::Mat R;
|
cv::Mat R;
|
||||||
cv::Rodrigues(rvec, R); // R is 3x3
|
cv::Rodrigues(rvec, R); // R is 3x3
|
||||||
@@ -458,7 +463,7 @@ PhotonPoseEstimator::EstimateCoprocMultiTagPose(
|
|||||||
const auto field2camera = cameraResult.MultiTagResult()->estimatedPose.best;
|
const auto field2camera = cameraResult.MultiTagResult()->estimatedPose.best;
|
||||||
|
|
||||||
const auto fieldToRobot =
|
const auto fieldToRobot =
|
||||||
frc::Pose3d() + field2camera + m_robotToCamera.Inverse();
|
wpi::math::Pose3d() + field2camera + m_robotToCamera.Inverse();
|
||||||
return photon::EstimatedRobotPose(fieldToRobot, cameraResult.GetTimestamp(),
|
return photon::EstimatedRobotPose(fieldToRobot, cameraResult.GetTimestamp(),
|
||||||
cameraResult.GetTargets(),
|
cameraResult.GetTargets(),
|
||||||
MULTI_TAG_PNP_ON_COPROCESSOR);
|
MULTI_TAG_PNP_ON_COPROCESSOR);
|
||||||
@@ -512,7 +517,7 @@ std::optional<EstimatedRobotPose> PhotonPoseEstimator::EstimateRioMultiTagPose(
|
|||||||
tvec, false, cv::SOLVEPNP_SQPNP);
|
tvec, false, cv::SOLVEPNP_SQPNP);
|
||||||
}
|
}
|
||||||
|
|
||||||
const frc::Pose3d pose = detail::ToPose3d(tvec, rvec);
|
const wpi::math::Pose3d pose = detail::ToPose3d(tvec, rvec);
|
||||||
|
|
||||||
return photon::EstimatedRobotPose(
|
return photon::EstimatedRobotPose(
|
||||||
pose.TransformBy(m_robotToCamera.Inverse()), cameraResult.GetTimestamp(),
|
pose.TransformBy(m_robotToCamera.Inverse()), cameraResult.GetTimestamp(),
|
||||||
@@ -526,47 +531,50 @@ PhotonPoseEstimator::EstimatePnpDistanceTrigSolvePose(
|
|||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
PhotonTrackedTarget bestTarget = cameraResult.GetBestTarget();
|
PhotonTrackedTarget bestTarget = cameraResult.GetBestTarget();
|
||||||
std::optional<frc::Rotation2d> headingSampleOpt =
|
std::optional<wpi::math::Rotation2d> headingSampleOpt =
|
||||||
headingBuffer.Sample(cameraResult.GetTimestamp());
|
headingBuffer.Sample(cameraResult.GetTimestamp());
|
||||||
if (!headingSampleOpt) {
|
if (!headingSampleOpt) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(
|
||||||
"There was no heading data! Use AddHeadingData to add it!");
|
wpi::warn::Warning,
|
||||||
|
"There was no heading data! Use AddHeadingData to add it!");
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
frc::Rotation2d headingSample = headingSampleOpt.value();
|
wpi::math::Rotation2d headingSample = headingSampleOpt.value();
|
||||||
|
|
||||||
frc::Translation2d camToTagTranslation =
|
wpi::math::Translation2d camToTagTranslation =
|
||||||
frc::Translation3d(
|
wpi::math::Translation3d(
|
||||||
bestTarget.GetBestCameraToTarget().Translation().Norm(),
|
bestTarget.GetBestCameraToTarget().Translation().Norm(),
|
||||||
frc::Rotation3d(0_rad, -units::degree_t(bestTarget.GetPitch()),
|
wpi::math::Rotation3d(0_rad,
|
||||||
-units::degree_t(bestTarget.GetYaw())))
|
-wpi::units::degree_t(bestTarget.GetPitch()),
|
||||||
|
-wpi::units::degree_t(bestTarget.GetYaw())))
|
||||||
.RotateBy(m_robotToCamera.Rotation())
|
.RotateBy(m_robotToCamera.Rotation())
|
||||||
.ToTranslation2d()
|
.ToTranslation2d()
|
||||||
.RotateBy(headingSample);
|
.RotateBy(headingSample);
|
||||||
|
|
||||||
std::optional<frc::Pose3d> fiducialPose =
|
std::optional<wpi::math::Pose3d> fiducialPose =
|
||||||
aprilTags.GetTagPose(bestTarget.GetFiducialId());
|
aprilTags.GetTagPose(bestTarget.GetFiducialId());
|
||||||
if (!fiducialPose) {
|
if (!fiducialPose) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(wpi::warn::Warning,
|
||||||
"Tried to get pose of unknown April Tag: {}",
|
"Tried to get pose of unknown April Tag: {}",
|
||||||
bestTarget.GetFiducialId());
|
bestTarget.GetFiducialId());
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
frc::Pose2d tagPose = fiducialPose.value().ToPose2d();
|
wpi::math::Pose2d tagPose = fiducialPose.value().ToPose2d();
|
||||||
|
|
||||||
frc::Translation2d fieldToCameraTranslation =
|
wpi::math::Translation2d fieldToCameraTranslation =
|
||||||
tagPose.Translation() - camToTagTranslation;
|
tagPose.Translation() - camToTagTranslation;
|
||||||
|
|
||||||
frc::Translation2d camToRobotTranslation =
|
wpi::math::Translation2d camToRobotTranslation =
|
||||||
(-m_robotToCamera.Translation().ToTranslation2d())
|
(-m_robotToCamera.Translation().ToTranslation2d())
|
||||||
.RotateBy(headingSample);
|
.RotateBy(headingSample);
|
||||||
|
|
||||||
frc::Pose2d robotPose = frc::Pose2d(
|
wpi::math::Pose2d robotPose = wpi::math::Pose2d(
|
||||||
fieldToCameraTranslation + camToRobotTranslation, headingSample);
|
fieldToCameraTranslation + camToRobotTranslation, headingSample);
|
||||||
|
|
||||||
return EstimatedRobotPose{frc::Pose3d(robotPose), cameraResult.GetTimestamp(),
|
return EstimatedRobotPose{wpi::math::Pose3d(robotPose),
|
||||||
|
cameraResult.GetTimestamp(),
|
||||||
cameraResult.GetTargets(), PNP_DISTANCE_TRIG_SOLVE};
|
cameraResult.GetTargets(), PNP_DISTANCE_TRIG_SOLVE};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -576,22 +584,23 @@ PhotonPoseEstimator::EstimateAverageBestTargetsPose(
|
|||||||
if (!ShouldEstimate(cameraResult)) {
|
if (!ShouldEstimate(cameraResult)) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
std::vector<std::pair<frc::Pose3d, std::pair<double, units::second_t>>>
|
std::vector<
|
||||||
|
std::pair<wpi::math::Pose3d, std::pair<double, wpi::units::second_t>>>
|
||||||
tempPoses;
|
tempPoses;
|
||||||
double totalAmbiguity = 0;
|
double totalAmbiguity = 0;
|
||||||
|
|
||||||
auto targets = cameraResult.GetTargets();
|
auto targets = cameraResult.GetTargets();
|
||||||
for (auto& target : targets) {
|
for (auto& target : targets) {
|
||||||
std::optional<frc::Pose3d> fiducialPose =
|
std::optional<wpi::math::Pose3d> fiducialPose =
|
||||||
aprilTags.GetTagPose(target.GetFiducialId());
|
aprilTags.GetTagPose(target.GetFiducialId());
|
||||||
if (!fiducialPose) {
|
if (!fiducialPose) {
|
||||||
FRC_ReportError(frc::warn::Warning,
|
WPILIB_ReportError(wpi::warn::Warning,
|
||||||
"Tried to get pose of unknown April Tag: {}",
|
"Tried to get pose of unknown April Tag: {}",
|
||||||
target.GetFiducialId());
|
target.GetFiducialId());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
frc::Pose3d targetPose = fiducialPose.value();
|
wpi::math::Pose3d targetPose = fiducialPose.value();
|
||||||
// Ambiguity = 0, use that pose
|
// Ambiguity = 0, use that pose
|
||||||
if (target.GetPoseAmbiguity() == 0) {
|
if (target.GetPoseAmbiguity() == 0) {
|
||||||
return EstimatedRobotPose{
|
return EstimatedRobotPose{
|
||||||
@@ -608,17 +617,17 @@ PhotonPoseEstimator::EstimateAverageBestTargetsPose(
|
|||||||
cameraResult.GetTimestamp())));
|
cameraResult.GetTimestamp())));
|
||||||
}
|
}
|
||||||
|
|
||||||
frc::Translation3d transform = frc::Translation3d();
|
wpi::math::Translation3d transform = wpi::math::Translation3d();
|
||||||
frc::Rotation3d rotation = frc::Rotation3d();
|
wpi::math::Rotation3d rotation = wpi::math::Rotation3d();
|
||||||
|
|
||||||
for (std::pair<frc::Pose3d, std::pair<double, units::second_t>>& pair :
|
for (std::pair<wpi::math::Pose3d, std::pair<double, wpi::units::second_t>>&
|
||||||
tempPoses) {
|
pair : tempPoses) {
|
||||||
double const weight = (1. / pair.second.first) / totalAmbiguity;
|
double const weight = (1. / pair.second.first) / totalAmbiguity;
|
||||||
transform = transform + pair.first.Translation() * weight;
|
transform = transform + pair.first.Translation() * weight;
|
||||||
rotation = rotation + pair.first.Rotation() * weight;
|
rotation = rotation + pair.first.Rotation() * weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EstimatedRobotPose{frc::Pose3d(transform, rotation),
|
return EstimatedRobotPose{wpi::math::Pose3d(transform, rotation),
|
||||||
cameraResult.GetTimestamp(),
|
cameraResult.GetTimestamp(),
|
||||||
cameraResult.GetTargets(), AVERAGE_BEST_TARGETS};
|
cameraResult.GetTargets(), AVERAGE_BEST_TARGETS};
|
||||||
}
|
}
|
||||||
@@ -627,8 +636,8 @@ std::optional<EstimatedRobotPose>
|
|||||||
PhotonPoseEstimator::EstimateConstrainedSolvepnpPose(
|
PhotonPoseEstimator::EstimateConstrainedSolvepnpPose(
|
||||||
photon::PhotonPipelineResult cameraResult,
|
photon::PhotonPipelineResult cameraResult,
|
||||||
photon::PhotonCamera::CameraMatrix cameraMatrix,
|
photon::PhotonCamera::CameraMatrix cameraMatrix,
|
||||||
photon::PhotonCamera::DistortionMatrix distCoeffs, frc::Pose3d seedPose,
|
photon::PhotonCamera::DistortionMatrix distCoeffs,
|
||||||
bool headingFree, double headingScaleFactor) {
|
wpi::math::Pose3d seedPose, bool headingFree, double headingScaleFactor) {
|
||||||
if (!ShouldEstimate(cameraResult)) {
|
if (!ShouldEstimate(cameraResult)) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
@@ -638,9 +647,9 @@ PhotonPoseEstimator::EstimateConstrainedSolvepnpPose(
|
|||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
} else {
|
} else {
|
||||||
// If heading fixed, force rotation component
|
// If heading fixed, force rotation component
|
||||||
seedPose = frc::Pose3d{
|
seedPose = wpi::math::Pose3d{
|
||||||
seedPose.Translation(),
|
seedPose.Translation(),
|
||||||
frc::Rotation3d{
|
wpi::math::Rotation3d{
|
||||||
headingBuffer.Sample(cameraResult.GetTimestamp()).value()}};
|
headingBuffer.Sample(cameraResult.GetTimestamp()).value()}};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -651,7 +660,8 @@ PhotonPoseEstimator::EstimateConstrainedSolvepnpPose(
|
|||||||
VisionEstimation::EstimateRobotPoseConstrainedSolvePNP(
|
VisionEstimation::EstimateRobotPoseConstrainedSolvePNP(
|
||||||
cameraMatrix, distCoeffs, targets, m_robotToCamera, seedPose,
|
cameraMatrix, distCoeffs, targets, m_robotToCamera, seedPose,
|
||||||
aprilTags, photon::kAprilTag36h11, headingFree,
|
aprilTags, photon::kAprilTag36h11, headingFree,
|
||||||
frc::Rotation2d{
|
wpi::math::Rotation2d{
|
||||||
|
|
||||||
headingBuffer.Sample(cameraResult.GetTimestamp()).value()},
|
headingBuffer.Sample(cameraResult.GetTimestamp()).value()},
|
||||||
headingScaleFactor);
|
headingScaleFactor);
|
||||||
|
|
||||||
@@ -659,7 +669,7 @@ PhotonPoseEstimator::EstimateConstrainedSolvepnpPose(
|
|||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
frc::Pose3d best = frc::Pose3d{} + pnpResult->best;
|
wpi::math::Pose3d best = wpi::math::Pose3d{} + pnpResult->best;
|
||||||
|
|
||||||
return EstimatedRobotPose{best, cameraResult.GetTimestamp(),
|
return EstimatedRobotPose{best, cameraResult.GetTimestamp(),
|
||||||
cameraResult.GetTargets(),
|
cameraResult.GetTargets(),
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <frc/apriltag/AprilTagFieldLayout.h>
|
#include <wpi/apriltag/AprilTagFieldLayout.hpp>
|
||||||
#include <frc/apriltag/AprilTagFields.h>
|
#include <wpi/apriltag/AprilTagFields.hpp>
|
||||||
|
|
||||||
#include "photon/estimation/CameraTargetRelation.h"
|
#include "photon/estimation/CameraTargetRelation.h"
|
||||||
#include "photon/estimation/RotTrlTransform3d.h"
|
#include "photon/estimation/RotTrlTransform3d.h"
|
||||||
@@ -40,19 +40,19 @@
|
|||||||
namespace photon {
|
namespace photon {
|
||||||
PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera)
|
PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera)
|
||||||
: PhotonCameraSim(camera, photon::SimCameraProperties::PERFECT_90DEG(),
|
: PhotonCameraSim(camera, photon::SimCameraProperties::PERFECT_90DEG(),
|
||||||
frc::AprilTagFieldLayout::LoadField(
|
wpi::apriltag::AprilTagFieldLayout::LoadField(
|
||||||
frc::AprilTagField::kDefaultField)) {}
|
wpi::apriltag::AprilTagField::kDefaultField)) {}
|
||||||
|
|
||||||
PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera,
|
PhotonCameraSim::PhotonCameraSim(
|
||||||
const SimCameraProperties& props,
|
PhotonCamera* camera, const SimCameraProperties& props,
|
||||||
const frc::AprilTagFieldLayout& tagLayout)
|
const wpi::apriltag::AprilTagFieldLayout& tagLayout)
|
||||||
: prop{props}, cam{camera}, tagLayout{tagLayout} {
|
: prop{props}, cam{camera}, tagLayout{tagLayout} {
|
||||||
SetMinTargetAreaPixels(kDefaultMinAreaPx);
|
SetMinTargetAreaPixels(kDefaultMinAreaPx);
|
||||||
videoSimRaw =
|
videoSimRaw =
|
||||||
frc::CameraServer::PutVideo(std::string{camera->GetCameraName()} + "-raw",
|
wpi::CameraServer::PutVideo(std::string{camera->GetCameraName()} + "-raw",
|
||||||
prop.GetResWidth(), prop.GetResHeight());
|
prop.GetResWidth(), prop.GetResHeight());
|
||||||
videoSimRaw.SetPixelFormat(cs::VideoMode::PixelFormat::kGray);
|
videoSimRaw.SetPixelFormat(wpi::cs::VideoMode::PixelFormat::kGray);
|
||||||
videoSimProcessed = frc::CameraServer::PutVideo(
|
videoSimProcessed = wpi::CameraServer::PutVideo(
|
||||||
std::string{camera->GetCameraName()} + "-processed", prop.GetResWidth(),
|
std::string{camera->GetCameraName()} + "-processed", prop.GetResWidth(),
|
||||||
prop.GetResHeight());
|
prop.GetResHeight());
|
||||||
ts.subTable = cam->GetCameraTable();
|
ts.subTable = cam->GetCameraTable();
|
||||||
@@ -62,21 +62,21 @@ PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera,
|
|||||||
PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera,
|
PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera,
|
||||||
const SimCameraProperties& props,
|
const SimCameraProperties& props,
|
||||||
double minTargetAreaPercent,
|
double minTargetAreaPercent,
|
||||||
units::meter_t maxSightRange)
|
wpi::units::meter_t maxSightRange)
|
||||||
: PhotonCameraSim(camera, props) {
|
: PhotonCameraSim(camera, props) {
|
||||||
this->minTargetAreaPercent = minTargetAreaPercent;
|
this->minTargetAreaPercent = minTargetAreaPercent;
|
||||||
this->maxSightRange = maxSightRange;
|
this->maxSightRange = maxSightRange;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PhotonCameraSim::CanSeeTargetPose(const frc::Pose3d& camPose,
|
bool PhotonCameraSim::CanSeeTargetPose(const wpi::math::Pose3d& camPose,
|
||||||
const VisionTargetSim& target) {
|
const VisionTargetSim& target) {
|
||||||
CameraTargetRelation rel{camPose, target.GetPose()};
|
CameraTargetRelation rel{camPose, target.GetPose()};
|
||||||
return ((units::math::abs(rel.camToTargYaw.Degrees()) <
|
return ((wpi::units::math::abs(rel.camToTargYaw.Degrees()) <
|
||||||
prop.GetHorizFOV().Degrees() / 2.0) &&
|
prop.GetHorizFOV().Degrees() / 2.0) &&
|
||||||
(units::math::abs(rel.camToTargPitch.Degrees()) <
|
(wpi::units::math::abs(rel.camToTargPitch.Degrees()) <
|
||||||
prop.GetVertFOV().Degrees() / 2.0) &&
|
prop.GetVertFOV().Degrees() / 2.0) &&
|
||||||
(!target.GetModel().GetIsPlanar() ||
|
(!target.GetModel().GetIsPlanar() ||
|
||||||
units::math::abs(rel.targToCamAngle.Degrees()) < 90_deg) &&
|
wpi::units::math::abs(rel.targToCamAngle.Degrees()) < 90_deg) &&
|
||||||
(rel.camToTarg.Translation().Norm() <= maxSightRange));
|
(rel.camToTarg.Translation().Norm() <= maxSightRange));
|
||||||
}
|
}
|
||||||
bool PhotonCameraSim::CanSeeCorner(const std::vector<cv::Point2f>& points) {
|
bool PhotonCameraSim::CanSeeCorner(const std::vector<cv::Point2f>& points) {
|
||||||
@@ -89,13 +89,13 @@ bool PhotonCameraSim::CanSeeCorner(const std::vector<cv::Point2f>& points) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
std::optional<uint64_t> PhotonCameraSim::ConsumeNextEntryTime() {
|
std::optional<uint64_t> PhotonCameraSim::ConsumeNextEntryTime() {
|
||||||
uint64_t now = wpi::Now();
|
uint64_t now = wpi::util::Now();
|
||||||
uint64_t timestamp{};
|
uint64_t timestamp{};
|
||||||
int iter = 0;
|
int iter = 0;
|
||||||
while (now >= nextNTEntryTime) {
|
while (now >= nextNTEntryTime) {
|
||||||
timestamp = nextNTEntryTime;
|
timestamp = nextNTEntryTime;
|
||||||
uint64_t frameTime = prop.EstSecUntilNextFrame()
|
uint64_t frameTime = prop.EstSecUntilNextFrame()
|
||||||
.convert<units::microseconds>()
|
.convert<wpi::units::microseconds>()
|
||||||
.to<uint64_t>();
|
.to<uint64_t>();
|
||||||
nextNTEntryTime += frameTime;
|
nextNTEntryTime += frameTime;
|
||||||
|
|
||||||
@@ -113,13 +113,13 @@ std::optional<uint64_t> PhotonCameraSim::ConsumeNextEntryTime() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
PhotonPipelineResult PhotonCameraSim::Process(
|
PhotonPipelineResult PhotonCameraSim::Process(
|
||||||
units::second_t latency, const frc::Pose3d& cameraPose,
|
wpi::units::second_t latency, const wpi::math::Pose3d& cameraPose,
|
||||||
std::vector<VisionTargetSim> targets) {
|
std::vector<VisionTargetSim> targets) {
|
||||||
std::sort(targets.begin(), targets.end(),
|
std::sort(targets.begin(), targets.end(),
|
||||||
[cameraPose](const VisionTargetSim& t1, const VisionTargetSim& t2) {
|
[cameraPose](const VisionTargetSim& t1, const VisionTargetSim& t2) {
|
||||||
units::meter_t dist1 =
|
wpi::units::meter_t dist1 =
|
||||||
t1.GetPose().Translation().Distance(cameraPose.Translation());
|
t1.GetPose().Translation().Distance(cameraPose.Translation());
|
||||||
units::meter_t dist2 =
|
wpi::units::meter_t dist2 =
|
||||||
t2.GetPose().Translation().Distance(cameraPose.Translation());
|
t2.GetPose().Translation().Distance(cameraPose.Translation());
|
||||||
return dist1 > dist2;
|
return dist1 > dist2;
|
||||||
});
|
});
|
||||||
@@ -144,7 +144,7 @@ PhotonPipelineResult PhotonCameraSim::Process(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<frc::Translation3d> fieldCorners = tgt.GetFieldVertices();
|
std::vector<wpi::math::Translation3d> fieldCorners = tgt.GetFieldVertices();
|
||||||
if (tgt.GetModel().GetIsSpherical()) {
|
if (tgt.GetModel().GetIsSpherical()) {
|
||||||
TargetModel model = tgt.GetModel();
|
TargetModel model = tgt.GetModel();
|
||||||
fieldCorners = model.GetFieldVertices(TargetModel::GetOrientedPose(
|
fieldCorners = model.GetFieldVertices(TargetModel::GetOrientedPose(
|
||||||
@@ -186,11 +186,12 @@ PhotonPipelineResult PhotonCameraSim::Process(
|
|||||||
r = i;
|
r = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cv::RotatedRect rect{
|
cv::RotatedRect rect{cv::Point2d{center.x, center.y},
|
||||||
cv::Point2d{center.x, center.y},
|
cv::Size2d{imagePoints[r].x - lc.x,
|
||||||
cv::Size2d{imagePoints[r].x - lc.x,
|
imagePoints[b].y - imagePoints[t].y},
|
||||||
imagePoints[b].y - imagePoints[t].y},
|
wpi::units::radian_t{-angles[r]}
|
||||||
units::radian_t{-angles[r]}.convert<units::degrees>().to<float>()};
|
.convert<wpi::units::degrees>()
|
||||||
|
.to<float>()};
|
||||||
std::vector<cv::Point2f> points{};
|
std::vector<cv::Point2f> points{};
|
||||||
rect.points(points);
|
rect.points(points);
|
||||||
|
|
||||||
@@ -210,7 +211,7 @@ PhotonPipelineResult PhotonCameraSim::Process(
|
|||||||
minAreaRectPts.reserve(4);
|
minAreaRectPts.reserve(4);
|
||||||
minAreaRect.points(minAreaRectPts);
|
minAreaRect.points(minAreaRectPts);
|
||||||
cv::Point2d centerPt = minAreaRect.center;
|
cv::Point2d centerPt = minAreaRect.center;
|
||||||
frc::Rotation3d centerRot = prop.GetPixelRot(centerPt);
|
wpi::math::Rotation3d centerRot = prop.GetPixelRot(centerPt);
|
||||||
double areaPercent = prop.GetContourAreaPercent(noisyTargetCorners);
|
double areaPercent = prop.GetContourAreaPercent(noisyTargetCorners);
|
||||||
|
|
||||||
if (!(CanSeeCorner(noisyTargetCorners) &&
|
if (!(CanSeeCorner(noisyTargetCorners) &&
|
||||||
@@ -250,12 +251,12 @@ PhotonPipelineResult PhotonCameraSim::Process(
|
|||||||
std::vector<TargetCorner> cornersDouble{cornersFloat.begin(),
|
std::vector<TargetCorner> cornersDouble{cornersFloat.begin(),
|
||||||
cornersFloat.end()};
|
cornersFloat.end()};
|
||||||
detectableTgts.emplace_back(
|
detectableTgts.emplace_back(
|
||||||
-centerRot.Z().convert<units::degrees>().to<double>(),
|
-centerRot.Z().convert<wpi::units::degrees>().to<double>(),
|
||||||
-centerRot.Y().convert<units::degrees>().to<double>(), areaPercent,
|
-centerRot.Y().convert<wpi::units::degrees>().to<double>(), areaPercent,
|
||||||
centerRot.X().convert<units::degrees>().to<double>(),
|
centerRot.X().convert<wpi::units::degrees>().to<double>(),
|
||||||
tgt.GetFiducialId(), classId, conf,
|
tgt.GetFiducialId(), classId, conf,
|
||||||
pnpSim ? pnpSim->best : frc::Transform3d{},
|
pnpSim ? pnpSim->best : wpi::math::Transform3d{},
|
||||||
pnpSim ? pnpSim->alt : frc::Transform3d{},
|
pnpSim ? pnpSim->alt : wpi::math::Transform3d{},
|
||||||
pnpSim ? pnpSim->ambiguity : -1, smallVec, cornersDouble);
|
pnpSim ? pnpSim->ambiguity : -1, smallVec, cornersDouble);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +289,7 @@ PhotonPipelineResult PhotonCameraSim::Process(
|
|||||||
videoSimRaw.PutFrame(videoSimFrameRaw);
|
videoSimRaw.PutFrame(videoSimFrameRaw);
|
||||||
} else {
|
} else {
|
||||||
videoSimRaw.SetConnectionStrategy(
|
videoSimRaw.SetConnectionStrategy(
|
||||||
cs::VideoSource::ConnectionStrategy::kConnectionForceClose);
|
wpi::cs::VideoSource::ConnectionStrategy::kConnectionForceClose);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (videoSimProcEnabled) {
|
if (videoSimProcEnabled) {
|
||||||
@@ -333,19 +334,19 @@ PhotonPipelineResult PhotonCameraSim::Process(
|
|||||||
videoSimProcessed.PutFrame(videoSimFrameProcessed);
|
videoSimProcessed.PutFrame(videoSimFrameProcessed);
|
||||||
} else {
|
} else {
|
||||||
videoSimProcessed.SetConnectionStrategy(
|
videoSimProcessed.SetConnectionStrategy(
|
||||||
cs::VideoSource::ConnectionStrategy::kConnectionForceClose);
|
wpi::cs::VideoSource::ConnectionStrategy::kConnectionForceClose);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<MultiTargetPNPResult> multiTagResults = std::nullopt;
|
std::optional<MultiTargetPNPResult> multiTagResults = std::nullopt;
|
||||||
|
|
||||||
std::vector<frc::AprilTag> visibleLayoutTags =
|
std::vector<wpi::apriltag::AprilTag> visibleLayoutTags =
|
||||||
VisionEstimation::GetVisibleLayoutTags(detectableTgts, tagLayout);
|
VisionEstimation::GetVisibleLayoutTags(detectableTgts, tagLayout);
|
||||||
if (visibleLayoutTags.size() > 1) {
|
if (visibleLayoutTags.size() > 1) {
|
||||||
std::vector<int16_t> usedIds{};
|
std::vector<int16_t> usedIds{};
|
||||||
usedIds.resize(visibleLayoutTags.size());
|
usedIds.resize(visibleLayoutTags.size());
|
||||||
std::transform(visibleLayoutTags.begin(), visibleLayoutTags.end(),
|
std::transform(visibleLayoutTags.begin(), visibleLayoutTags.end(),
|
||||||
usedIds.begin(),
|
usedIds.begin(),
|
||||||
[](const frc::AprilTag& tag) { return tag.ID; });
|
[](const wpi::apriltag::AprilTag& tag) { return tag.ID; });
|
||||||
std::sort(usedIds.begin(), usedIds.end());
|
std::sort(usedIds.begin(), usedIds.end());
|
||||||
auto pnpResult = VisionEstimation::EstimateCamPosePNP(
|
auto pnpResult = VisionEstimation::EstimateCamPosePNP(
|
||||||
prop.GetIntrinsics(), prop.GetDistCoeffs(), detectableTgts, tagLayout,
|
prop.GetIntrinsics(), prop.GetDistCoeffs(), detectableTgts, tagLayout,
|
||||||
@@ -357,17 +358,17 @@ PhotonPipelineResult PhotonCameraSim::Process(
|
|||||||
|
|
||||||
return PhotonPipelineResult{
|
return PhotonPipelineResult{
|
||||||
PhotonPipelineMetadata{heartbeatCounter, 0,
|
PhotonPipelineMetadata{heartbeatCounter, 0,
|
||||||
units::microsecond_t{latency}.to<int64_t>(),
|
wpi::units::microsecond_t{latency}.to<int64_t>(),
|
||||||
1000000},
|
1000000},
|
||||||
detectableTgts, multiTagResults};
|
detectableTgts, multiTagResults};
|
||||||
}
|
}
|
||||||
void PhotonCameraSim::SubmitProcessedFrame(const PhotonPipelineResult& result) {
|
void PhotonCameraSim::SubmitProcessedFrame(const PhotonPipelineResult& result) {
|
||||||
SubmitProcessedFrame(result, wpi::Now());
|
SubmitProcessedFrame(result, wpi::util::Now());
|
||||||
}
|
}
|
||||||
void PhotonCameraSim::SubmitProcessedFrame(const PhotonPipelineResult& result,
|
void PhotonCameraSim::SubmitProcessedFrame(const PhotonPipelineResult& result,
|
||||||
uint64_t ReceiveTimestamp) {
|
uint64_t ReceiveTimestamp) {
|
||||||
ts.latencyMillisEntry.Set(
|
ts.latencyMillisEntry.Set(
|
||||||
result.GetLatency().convert<units::milliseconds>().to<double>(),
|
result.GetLatency().convert<wpi::units::milliseconds>().to<double>(),
|
||||||
ReceiveTimestamp);
|
ReceiveTimestamp);
|
||||||
|
|
||||||
Packet newPacket{};
|
Packet newPacket{};
|
||||||
@@ -381,7 +382,7 @@ void PhotonCameraSim::SubmitProcessedFrame(const PhotonPipelineResult& result,
|
|||||||
ts.targetPitchEntry.Set(0.0, ReceiveTimestamp);
|
ts.targetPitchEntry.Set(0.0, ReceiveTimestamp);
|
||||||
ts.targetYawEntry.Set(0.0, ReceiveTimestamp);
|
ts.targetYawEntry.Set(0.0, ReceiveTimestamp);
|
||||||
ts.targetAreaEntry.Set(0.0, ReceiveTimestamp);
|
ts.targetAreaEntry.Set(0.0, ReceiveTimestamp);
|
||||||
ts.targetPoseEntry.Set(frc::Transform3d{}, ReceiveTimestamp);
|
ts.targetPoseEntry.Set(wpi::math::Transform3d{}, ReceiveTimestamp);
|
||||||
ts.targetSkewEntry.Set(0.0, ReceiveTimestamp);
|
ts.targetSkewEntry.Set(0.0, ReceiveTimestamp);
|
||||||
} else {
|
} else {
|
||||||
PhotonTrackedTarget bestTarget = result.GetBestTarget();
|
PhotonTrackedTarget bestTarget = result.GetBestTarget();
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user