From 12774591a4ac31caff2a8bf193ee3750d6463640 Mon Sep 17 00:00:00 2001 From: Matt Date: Wed, 1 Nov 2023 19:16:41 -0400 Subject: [PATCH 1/6] Bump opencv to fix cross-compile rpath (#992) --- build.gradle | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8f4fe228ba..a869efc46e 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ apply from: "versioningHelper.gradle" ext { wpilibVersion = "2024.1.1-beta-2" - openCVversion = "4.8.0-1" + openCVversion = "4.8.0-2" joglVersion = "2.4.0-rc-20200307" javalinVersion = "5.6.2" frcYear = "2024" @@ -41,6 +41,11 @@ ext { wpilibTools.deps.wpilibVersion = wpilibVersion +// Tell gradlerio what version of things to use (that we care about) +// See: https://github.com/wpilibsuite/GradleRIO/blob/main/src/main/java/edu/wpi/first/gradlerio/wpi/WPIVersionsExtension.java +wpi.getVersions().getOpencvVersion().convention(openCVversion); +wpi.getVersions().getWpilibVersion().convention(wpilibVersion); + spotless { java { target fileTree('.') { From 5a4eb54693fb54668f29354454e640e217fda193 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 2 Nov 2023 19:34:31 -0400 Subject: [PATCH 2/6] Check if WS is closing before sending message (#993) --- .../org/photonvision/server/DataSocketHandler.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java b/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java index f7f0345723..9fe6189f45 100644 --- a/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java @@ -53,8 +53,6 @@ public class DataSocketHandler { @SuppressWarnings("FieldCanBeLocal") private final UIOutboundSubscriber uiOutboundSubscriber = new UIOutboundSubscriber(this); - public static class UIMap extends HashMap {} - private static class ThreadSafeSingleton { private static final DataSocketHandler INSTANCE = new DataSocketHandler(); } @@ -70,23 +68,23 @@ private DataSocketHandler() { } public void onConnect(WsConnectContext context) { + users.add(context); context.session.setIdleTimeout( Duration.ofMillis(Long.MAX_VALUE)); // TODO: determine better value var remote = (InetSocketAddress) context.session.getRemoteAddress(); var host = remote.getAddress().toString() + ":" + remote.getPort(); logger.info("New websocket connection from " + host); - users.add(context); dcService.publishEvent( new IncomingWebSocketEvent<>( DataChangeDestination.DCD_GENSETTINGS, "userConnected", context)); } protected void onClose(WsCloseContext context) { + users.remove(context); var remote = (InetSocketAddress) context.session.getRemoteAddress(); var host = remote.getAddress().toString() + ":" + remote.getPort(); var reason = context.reason() != null ? context.reason() : "Connection closed by client"; logger.info("Closing websocket connection from " + host + " for reason: " + reason); - users.remove(context); } @SuppressWarnings({"unchecked"}) @@ -349,7 +347,9 @@ public void onBinaryMessage(WsBinaryMessageContext context) { private void sendMessage(Object message, WsContext user) throws JsonProcessingException { ByteBuffer b = ByteBuffer.wrap(objectMapper.writeValueAsBytes(message)); - user.send(b); + if (user.session.isOpen()) { + user.send(b); + } } public void broadcastMessage(Object message, WsContext userToSkip) From 5136dad535381f49b6cf2164b63503688a73eb8f Mon Sep 17 00:00:00 2001 From: superpenguin612 <74030080+superpenguin612@users.noreply.github.com> Date: Thu, 2 Nov 2023 22:36:24 -0400 Subject: [PATCH 3/6] Add StickyFPS quirk for Arducam OV2311 (#994) Disable setting first video mode on boot. Resolution is actually set immediately after --- .../main/java/org/photonvision/vision/camera/CameraQuirk.java | 2 ++ .../main/java/org/photonvision/vision/camera/QuirkyCamera.java | 3 ++- .../java/org/photonvision/vision/camera/USBCameraSource.java | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/CameraQuirk.java b/photon-core/src/main/java/org/photonvision/vision/camera/CameraQuirk.java index 69f9c564cb..928aa6f847 100644 --- a/photon-core/src/main/java/org/photonvision/vision/camera/CameraQuirk.java +++ b/photon-core/src/main/java/org/photonvision/vision/camera/CameraQuirk.java @@ -30,4 +30,6 @@ public enum CameraQuirk { CompletelyBroken, /** Has adjustable focus and autofocus switch */ AdjustableFocus, + /** Changing FPS repeatedly with small delay does not work correctly */ + StickyFPS, } diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/QuirkyCamera.java b/photon-core/src/main/java/org/photonvision/vision/camera/QuirkyCamera.java index da2dc835cb..53d89167ec 100644 --- a/photon-core/src/main/java/org/photonvision/vision/camera/QuirkyCamera.java +++ b/photon-core/src/main/java/org/photonvision/vision/camera/QuirkyCamera.java @@ -44,7 +44,8 @@ public class QuirkyCamera { new QuirkyCamera( -1, -1, "mmal service 16.1", CameraQuirk.PiCam), // PiCam (via V4L2, not zerocopy) new QuirkyCamera(-1, -1, "unicam", CameraQuirk.PiCam), // PiCam (via V4L2, not zerocopy) - new QuirkyCamera(0x85B, 0x46D, CameraQuirk.AdjustableFocus) // Logitech C925-e + new QuirkyCamera(0x85B, 0x46D, CameraQuirk.AdjustableFocus), // Logitech C925-e + new QuirkyCamera(0x6366, 0x0c45, CameraQuirk.StickyFPS) // Arducam OV2311 ); public static final QuirkyCamera DefaultCamera = new QuirkyCamera(0, 0, ""); diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameraSource.java b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameraSource.java index ad235da26a..6717f4edd8 100644 --- a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameraSource.java +++ b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameraSource.java @@ -102,7 +102,8 @@ public class USBCameraSettables extends VisionSourceSettables { protected USBCameraSettables(CameraConfiguration configuration) { super(configuration); getAllVideoModes(); - setVideoMode(videoModes.get(0)); + if (!cameraQuirks.hasQuirk(CameraQuirk.StickyFPS)) + setVideoMode(videoModes.get(0)); // fixes double FPS set } public void setAutoExposure(boolean cameraAutoExposure) { From 7eb4645ee2d2bf2e64951d27cd36ad17ce9e840b Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 4 Nov 2023 09:42:30 -0400 Subject: [PATCH 4/6] Bump wpilib to beta-3 (#998) --- build.gradle | 4 ++-- photonlib-cpp-examples/build.gradle | 2 +- photonlib-java-examples/build.gradle | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index a869efc46e..fdf2fa70cb 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id "com.diffplug.spotless" version "6.22.0" id "edu.wpi.first.NativeUtils" version "2024.2.0" apply false id "edu.wpi.first.wpilib.repositories.WPILibRepositoriesPlugin" version "2020.2" - id "edu.wpi.first.GradleRIO" version "2024.1.1-beta-2" + id "edu.wpi.first.GradleRIO" version "2024.1.1-beta-3" id 'edu.wpi.first.WpilibTools' version '1.3.0' } @@ -20,7 +20,7 @@ allprojects { apply from: "versioningHelper.gradle" ext { - wpilibVersion = "2024.1.1-beta-2" + wpilibVersion = "2024.1.1-beta-3" openCVversion = "4.8.0-2" joglVersion = "2.4.0-rc-20200307" javalinVersion = "5.6.2" diff --git a/photonlib-cpp-examples/build.gradle b/photonlib-cpp-examples/build.gradle index f86d65a4ae..881e04a114 100644 --- a/photonlib-cpp-examples/build.gradle +++ b/photonlib-cpp-examples/build.gradle @@ -1,6 +1,6 @@ plugins { id "com.diffplug.spotless" version "6.1.2" - id "edu.wpi.first.GradleRIO" version "2024.1.1-beta-2" apply false + id "edu.wpi.first.GradleRIO" version "2024.1.1-beta-3" apply false } allprojects { diff --git a/photonlib-java-examples/build.gradle b/photonlib-java-examples/build.gradle index 68dd2983a2..1c92e043f9 100644 --- a/photonlib-java-examples/build.gradle +++ b/photonlib-java-examples/build.gradle @@ -1,6 +1,6 @@ plugins { id "com.diffplug.spotless" version "6.1.2" - id "edu.wpi.first.GradleRIO" version "2024.1.1-beta-2" apply false + id "edu.wpi.first.GradleRIO" version "2024.1.1-beta-3" apply false } apply from: "examples.gradle" From 9370937280df465e6cbabeba99dd5fa465e3635c Mon Sep 17 00:00:00 2001 From: amquake Date: Sat, 4 Nov 2023 09:25:49 -0700 Subject: [PATCH 5/6] [photon-lib] Make PhotonPoseEstimator coprocessor multitag result relative to tag layout origin (#997) Fixes #991. --- .../main/java/org/photonvision/PhotonPoseEstimator.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/photon-lib/src/main/java/org/photonvision/PhotonPoseEstimator.java b/photon-lib/src/main/java/org/photonvision/PhotonPoseEstimator.java index 1c73f2cab2..32b4c7ba1f 100644 --- a/photon-lib/src/main/java/org/photonvision/PhotonPoseEstimator.java +++ b/photon-lib/src/main/java/org/photonvision/PhotonPoseEstimator.java @@ -100,7 +100,8 @@ public enum PoseStrategy { * @param fieldTags A WPILib {@link AprilTagFieldLayout} linking AprilTag IDs to Pose3d objects * with respect to the FIRST field using the Field - * Coordinate System. + * Coordinate System. Note that setting the origin of this layout object will affect the + * results from this class. * @param strategy The strategy it should use to determine the best pose. * @param camera PhotonCamera * @param robotToCamera Transform3d from the center of the robot to the camera mount position (ie, @@ -141,6 +142,8 @@ private void checkUpdate(Object oldObj, Object newObj) { /** * Get the AprilTagFieldLayout being used by the PositionEstimator. * + *

Note: Setting the origin of this layout will affect the results from this class. + * * @return the AprilTagFieldLayout */ public AprilTagFieldLayout getFieldTags() { @@ -150,6 +153,8 @@ public AprilTagFieldLayout getFieldTags() { /** * Set the AprilTagFieldLayout being used by the PositionEstimator. * + *

Note: Setting the origin of this layout will affect the results from this class. + * * @param fieldTags the AprilTagFieldLayout */ public void setFieldTags(AprilTagFieldLayout fieldTags) { @@ -415,6 +420,7 @@ private Optional multiTagOnCoprocStrategy( var best = new Pose3d() .plus(best_tf) // field-to-camera + .relativeTo(fieldTags.getOrigin()) .plus(robotToCamera.inverse()); // field-to-robot return Optional.of( new EstimatedRobotPose( From 623b4e5b8457979eda40cc6bb5c0df59cfb8e8f1 Mon Sep 17 00:00:00 2001 From: Sriman Achanta <68172138+srimanachanta@users.noreply.github.com> Date: Sun, 5 Nov 2023 11:33:45 -0500 Subject: [PATCH 6/6] Show Saved Snapshots in UI (#995) Add Camera Control tab to Cameras for the button to live in --- .../src/assets/styles/variables.scss | 11 + .../cameras/CameraCalibrationCard.vue | 2 +- .../components/cameras/CameraControlCard.vue | 202 ++++++++++++++++++ .../src/views/CameraSettingsView.vue | 2 + .../frame/consumer/FileSaveFrameConsumer.java | 14 +- .../vision/processes/VisionModule.java | 9 +- .../photonvision/server/RequestHandler.java | 46 +++- .../java/org/photonvision/server/Server.java | 1 + 8 files changed, 277 insertions(+), 10 deletions(-) create mode 100644 photon-client/src/components/cameras/CameraControlCard.vue diff --git a/photon-client/src/assets/styles/variables.scss b/photon-client/src/assets/styles/variables.scss index 2aab2068a6..89886135fa 100644 --- a/photon-client/src/assets/styles/variables.scss +++ b/photon-client/src/assets/styles/variables.scss @@ -7,3 +7,14 @@ $heading-font-family: $default-font; .v-application { font-family: $default-font !important; } + +.v-row-group__header { + background: #005281 !important; +} +.theme--dark.v-data-table + > .v-data-table__wrapper + > table + > tbody + > tr:hover:not(.v-data-table__expanded__content):not(.v-data-table__empty-wrapper) { + background: #005281 !important; +} diff --git a/photon-client/src/components/cameras/CameraCalibrationCard.vue b/photon-client/src/components/cameras/CameraCalibrationCard.vue index 2c40c28b23..0bbfbe3df9 100644 --- a/photon-client/src/components/cameras/CameraCalibrationCard.vue +++ b/photon-client/src/components/cameras/CameraCalibrationCard.vue @@ -218,7 +218,7 @@ const endCalibration = () => {