From cc740c92c9d2403598c1903a28a477601779e0fd Mon Sep 17 00:00:00 2001 From: Jochem Date: Wed, 8 Jan 2025 19:43:46 +0100 Subject: [PATCH] Added constructor overload to PhotonCameraSim for AprilTagFieldLayout (#1692) --- .../photonlibpy/simulation/photonCameraSim.py | 5 ++- .../simulation/PhotonCameraSim.java | 43 ++++++++++++++++++- .../cpp/photon/simulation/PhotonCameraSim.cpp | 14 ++++-- .../photon/simulation/PhotonCameraSim.h | 8 ++-- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/photon-lib/py/photonlibpy/simulation/photonCameraSim.py b/photon-lib/py/photonlibpy/simulation/photonCameraSim.py index 21449f45d..3aa42190c 100644 --- a/photon-lib/py/photonlibpy/simulation/photonCameraSim.py +++ b/photon-lib/py/photonlibpy/simulation/photonCameraSim.py @@ -36,6 +36,9 @@ class PhotonCameraSim: self, camera: PhotonCamera, props: SimCameraProperties = SimCameraProperties.PERFECT_90DEG(), + tagLayout: AprilTagFieldLayout = AprilTagFieldLayout.loadField( + AprilTagField.kDefaultField + ), minTargetAreaPercent: float | None = None, maxSightRange: meters | None = None, ): @@ -64,7 +67,7 @@ class PhotonCameraSim: self.videoSimProcEnabled: bool = False self.heartbeatCounter: int = 0 self.nextNtEntryTime = wpilib.Timer.getFPGATimestamp() - self.tagLayout = AprilTagFieldLayout.loadField(AprilTagField.kDefaultField) + self.tagLayout = tagLayout self.cam = camera self.prop = props diff --git a/photon-lib/src/main/java/org/photonvision/simulation/PhotonCameraSim.java b/photon-lib/src/main/java/org/photonvision/simulation/PhotonCameraSim.java index d71eecaeb..2bd7cfc78 100644 --- a/photon-lib/src/main/java/org/photonvision/simulation/PhotonCameraSim.java +++ b/photon-lib/src/main/java/org/photonvision/simulation/PhotonCameraSim.java @@ -81,8 +81,7 @@ public class PhotonCameraSim implements AutoCloseable { private double minTargetAreaPercent; private PhotonTargetSortMode sortMode = PhotonTargetSortMode.Largest; - private final AprilTagFieldLayout tagLayout = - AprilTagFieldLayout.loadField(AprilTagFields.kDefaultField); + private final AprilTagFieldLayout tagLayout; // video stream simulation private final CvSource videoSimRaw; @@ -130,8 +129,24 @@ public class PhotonCameraSim implements AutoCloseable { * @param prop Properties of this camera such as FOV and FPS */ public PhotonCameraSim(PhotonCamera camera, SimCameraProperties prop) { + this(camera, prop, AprilTagFieldLayout.loadField(AprilTagFields.kDefaultField)); + } + + /** + * Constructs a handle for simulating {@link PhotonCamera} values. Processing simulated targets + * through this class will change the associated PhotonCamera's results. + * + *

By default, the minimum target area is 100 pixels and there is no maximum sight range. + * + * @param camera The camera to be simulated + * @param prop Properties of this camera such as FOV and FPS + * @param tagLayout The {@link AprilTagFieldLayout} used to solve for tag positions. + */ + public PhotonCameraSim( + PhotonCamera camera, SimCameraProperties prop, AprilTagFieldLayout tagLayout) { this.cam = camera; this.prop = prop; + this.tagLayout = tagLayout; setMinTargetAreaPixels(kDefaultMinAreaPx); videoSimRaw = @@ -163,6 +178,30 @@ public class PhotonCameraSim implements AutoCloseable { SimCameraProperties prop, double minTargetAreaPercent, double maxSightRangeMeters) { + this(camera, prop, AprilTagFieldLayout.loadField(AprilTagFields.kDefaultField)); + this.minTargetAreaPercent = minTargetAreaPercent; + this.maxSightRangeMeters = maxSightRangeMeters; + } + + /** + * Constructs a handle for simulating {@link PhotonCamera} values. Processing simulated targets + * through this class will change the associated PhotonCamera's results. + * + * @param camera The camera to be simulated + * @param prop Properties of this camera such as FOV and FPS + * @param minTargetAreaPercent The minimum percentage(0 - 100) a detected target must take up of + * the camera's image to be processed. Match this with your contour filtering settings in the + * PhotonVision GUI. + * @param maxSightRangeMeters Maximum distance at which the target is illuminated to your camera. + * Note that minimum target area of the image is separate from this. + * @param tagLayout AprilTag field layout to use for multi-tag estimation + */ + public PhotonCameraSim( + PhotonCamera camera, + SimCameraProperties prop, + double minTargetAreaPercent, + double maxSightRangeMeters, + AprilTagFieldLayout tagLayout) { this(camera, prop); this.minTargetAreaPercent = minTargetAreaPercent; this.maxSightRangeMeters = maxSightRangeMeters; diff --git a/photon-lib/src/main/native/cpp/photon/simulation/PhotonCameraSim.cpp b/photon-lib/src/main/native/cpp/photon/simulation/PhotonCameraSim.cpp index 165fc200a..3ee6aaddf 100644 --- a/photon-lib/src/main/native/cpp/photon/simulation/PhotonCameraSim.cpp +++ b/photon-lib/src/main/native/cpp/photon/simulation/PhotonCameraSim.cpp @@ -29,12 +29,19 @@ #include #include +#include +#include + namespace photon { PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera) - : PhotonCameraSim(camera, photon::SimCameraProperties::PERFECT_90DEG()) {} + : PhotonCameraSim(camera, photon::SimCameraProperties::PERFECT_90DEG(), + frc::AprilTagFieldLayout::LoadField( + frc::AprilTagField::kDefaultField)) {} + PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera, - const SimCameraProperties& props) - : prop(props), cam(camera) { + const SimCameraProperties& props, + const frc::AprilTagFieldLayout& tagLayout) + : prop{props}, cam{camera}, tagLayout{tagLayout} { SetMinTargetAreaPixels(kDefaultMinAreaPx); videoSimRaw = frc::CameraServer::PutVideo(std::string{camera->GetCameraName()} + "-raw", @@ -46,6 +53,7 @@ PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera, ts.subTable = cam->GetCameraTable(); ts.UpdateEntries(); } + PhotonCameraSim::PhotonCameraSim(PhotonCamera* camera, const SimCameraProperties& props, double minTargetAreaPercent, diff --git a/photon-lib/src/main/native/include/photon/simulation/PhotonCameraSim.h b/photon-lib/src/main/native/include/photon/simulation/PhotonCameraSim.h index 42b781f1a..65d9d0d2a 100644 --- a/photon-lib/src/main/native/include/photon/simulation/PhotonCameraSim.h +++ b/photon-lib/src/main/native/include/photon/simulation/PhotonCameraSim.h @@ -50,7 +50,10 @@ namespace photon { class PhotonCameraSim { public: explicit PhotonCameraSim(PhotonCamera* camera); - PhotonCameraSim(PhotonCamera* camera, const SimCameraProperties& props); + PhotonCameraSim(PhotonCamera* camera, const SimCameraProperties& props, + const frc::AprilTagFieldLayout& tagLayout = + frc::AprilTagFieldLayout::LoadField( + frc::AprilTagField::kDefaultField)); PhotonCameraSim(PhotonCamera* camera, const SimCameraProperties& props, double minTargetAreaPercent, units::meter_t maxSightRange); @@ -107,8 +110,7 @@ class PhotonCameraSim { static constexpr double kDefaultMinAreaPx{100}; double minTargetAreaPercent; - frc::AprilTagFieldLayout tagLayout{ - frc::AprilTagFieldLayout::LoadField(frc::AprilTagField::kDefaultField)}; + frc::AprilTagFieldLayout tagLayout; cs::CvSource videoSimRaw; cv::Mat videoSimFrameRaw{};