From 3a15375044ad894f3d2187a6bdb52ebce3485744 Mon Sep 17 00:00:00 2001 From: samfreund Date: Sun, 16 Nov 2025 21:44:37 -0600 Subject: [PATCH 1/4] bump wpilib to 2026 beta --- .github/pull_request_template.md | 2 +- build.gradle | 4 ++-- .../advanced-installation/sw_install/windows-pc.md | 2 +- photon-lib/py/setup.py | 10 +++++----- photonlib-cpp-examples/aimandrange/build.gradle | 6 +++--- photonlib-cpp-examples/aimattarget/build.gradle | 6 +++--- photonlib-cpp-examples/poseest/build.gradle | 6 +++--- photonlib-java-examples/aimandrange/build.gradle | 6 +++--- photonlib-java-examples/aimattarget/build.gradle | 6 +++--- photonlib-java-examples/poseest/build.gradle | 6 +++--- photonlib-python-examples/aimandrange/pyproject.toml | 2 +- photonlib-python-examples/aimattarget/pyproject.toml | 2 +- photonlib-python-examples/poseest/pyproject.toml | 2 +- 13 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0d5211e4a4..7cf1df8b3c 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,6 +14,6 @@ Merge checklist: - [ ] This PR has been [linted](https://docs.photonvision.org/en/latest/docs/contributing/linting.html). - [ ] If this PR changes behavior or adds a feature, user documentation is updated - [ ] If this PR touches photon-serde, all messages have been regenerated and hashes have not changed unexpectedly -- [ ] If this PR touches configuration, this is backwards compatible with settings back to v2025.3.2 +- [ ] If this PR touches configuration, this is backwards compatible with settings back to v2026.1.1-beta-1 - [ ] If this PR touches pipeline settings or anything related to data exchange, the frontend typing is updated - [ ] If this PR addresses a bug, a regression test for it is added diff --git a/build.gradle b/build.gradle index fcbbe71c35..33a32c94d3 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id "cpp" id "com.diffplug.spotless" version "6.24.0" id "edu.wpi.first.wpilib.repositories.WPILibRepositoriesPlugin" version "2020.2" - id "edu.wpi.first.GradleRIO" version "2025.3.2" + id "edu.wpi.first.GradleRIO" version "2026.1.1-beta-1" id 'edu.wpi.first.WpilibTools' version '1.3.0' id 'com.google.protobuf' version '0.9.3' apply false id 'edu.wpi.first.GradleJni' version '1.1.0' @@ -32,7 +32,7 @@ ext.allOutputsFolder = file("$project.buildDir/outputs") apply from: "versioningHelper.gradle" ext { - wpilibVersion = "2025.3.2" + wpilibVersion = "2026.1.1-beta-1" wpimathVersion = wpilibVersion openCVYear = "2025" openCVversion = "4.10.0-3" diff --git a/docs/source/docs/advanced-installation/sw_install/windows-pc.md b/docs/source/docs/advanced-installation/sw_install/windows-pc.md index 629b32fa74..b428790b4d 100644 --- a/docs/source/docs/advanced-installation/sw_install/windows-pc.md +++ b/docs/source/docs/advanced-installation/sw_install/windows-pc.md @@ -12,7 +12,7 @@ Bonjour provides more stable networking when using Windows PCs. Install [Bonjour ## Installing Java -PhotonVision requires a JDK installed and on the system path. **JDK 17 is needed. Windows Users must use the JDK that ships with WPILib.** [Download and install it from here.](https://github.com/wpilibsuite/allwpilib/releases/tag/v2025.3.2) Either ensure the only Java on your PATH is the WPILIB Java or specify it to gradle with `-Dorg.gradle.java.home=C:\Users\Public\wpilib\2025\jdk`: +PhotonVision requires a JDK installed and on the system path. **JDK 17 is needed. Windows Users must use the JDK that ships with WPILib.** [Download and install it from here.](https://github.com/wpilibsuite/allwpilib/releases/tag/2026.1.1-beta-1) Either ensure the only Java on your PATH is the WPILIB Java or specify it to gradle with `-Dorg.gradle.java.home=C:\Users\Public\wpilib\2025\jdk`: ``` > ./gradlew run "-Dorg.gradle.java.home=C:\Users\Public\wpilib\2025\jdk" diff --git a/photon-lib/py/setup.py b/photon-lib/py/setup.py index f2e3d278ab..41a550ca2f 100644 --- a/photon-lib/py/setup.py +++ b/photon-lib/py/setup.py @@ -61,11 +61,11 @@ version=versionString, install_requires=[ "numpy~=2.1", - "wpilib<2026,>=2025.3.2", - "robotpy-wpimath<2026,>=2025.3.2", - "robotpy-apriltag<2026,>=2025.3.2", - "robotpy-cscore<2026,>=2025.3.2", - "pyntcore<2026,>=2025.3.2", + "wpilib<2026,>=2026.1.1-beta-1", + "robotpy-wpimath<2026,>=2026.1.1-beta-1", + "robotpy-apriltag<2026,>=2026.1.1-beta-1", + "robotpy-cscore<2026,>=2026.1.1-beta-1", + "pyntcore<2026,>=2026.1.1-beta-1", "opencv-python;platform_machine!='roborio'", ], description=descriptionStr, diff --git a/photonlib-cpp-examples/aimandrange/build.gradle b/photonlib-cpp-examples/aimandrange/build.gradle index 0c20a5cddf..e00e0d0d71 100644 --- a/photonlib-cpp-examples/aimandrange/build.gradle +++ b/photonlib-cpp-examples/aimandrange/build.gradle @@ -1,7 +1,7 @@ plugins { id "cpp" id "google-test-test-suite" - id "edu.wpi.first.GradleRIO" version "2025.3.2" + id "edu.wpi.first.GradleRIO" version "2026.1.1-beta-1" } repositories { @@ -11,8 +11,8 @@ repositories { wpi.maven.useLocal = false wpi.maven.useDevelopment = false -wpi.versions.wpilibVersion = "2025.3.2" -wpi.versions.wpimathVersion = "2025.3.2" +wpi.versions.wpilibVersion = "2026.1.1-beta-1" +wpi.versions.wpimathVersion = "2026.1.1-beta-1" // Define my targets (RoboRIO) and artifacts (deployable files) // This is added by GradleRIO's backing project DeployUtils. diff --git a/photonlib-cpp-examples/aimattarget/build.gradle b/photonlib-cpp-examples/aimattarget/build.gradle index 0c20a5cddf..e00e0d0d71 100644 --- a/photonlib-cpp-examples/aimattarget/build.gradle +++ b/photonlib-cpp-examples/aimattarget/build.gradle @@ -1,7 +1,7 @@ plugins { id "cpp" id "google-test-test-suite" - id "edu.wpi.first.GradleRIO" version "2025.3.2" + id "edu.wpi.first.GradleRIO" version "2026.1.1-beta-1" } repositories { @@ -11,8 +11,8 @@ repositories { wpi.maven.useLocal = false wpi.maven.useDevelopment = false -wpi.versions.wpilibVersion = "2025.3.2" -wpi.versions.wpimathVersion = "2025.3.2" +wpi.versions.wpilibVersion = "2026.1.1-beta-1" +wpi.versions.wpimathVersion = "2026.1.1-beta-1" // Define my targets (RoboRIO) and artifacts (deployable files) // This is added by GradleRIO's backing project DeployUtils. diff --git a/photonlib-cpp-examples/poseest/build.gradle b/photonlib-cpp-examples/poseest/build.gradle index 0c20a5cddf..e00e0d0d71 100644 --- a/photonlib-cpp-examples/poseest/build.gradle +++ b/photonlib-cpp-examples/poseest/build.gradle @@ -1,7 +1,7 @@ plugins { id "cpp" id "google-test-test-suite" - id "edu.wpi.first.GradleRIO" version "2025.3.2" + id "edu.wpi.first.GradleRIO" version "2026.1.1-beta-1" } repositories { @@ -11,8 +11,8 @@ repositories { wpi.maven.useLocal = false wpi.maven.useDevelopment = false -wpi.versions.wpilibVersion = "2025.3.2" -wpi.versions.wpimathVersion = "2025.3.2" +wpi.versions.wpilibVersion = "2026.1.1-beta-1" +wpi.versions.wpimathVersion = "2026.1.1-beta-1" // Define my targets (RoboRIO) and artifacts (deployable files) // This is added by GradleRIO's backing project DeployUtils. diff --git a/photonlib-java-examples/aimandrange/build.gradle b/photonlib-java-examples/aimandrange/build.gradle index 274072eb01..9dc902a9b6 100644 --- a/photonlib-java-examples/aimandrange/build.gradle +++ b/photonlib-java-examples/aimandrange/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2025.3.2" + id "edu.wpi.first.GradleRIO" version "2026.1.1-beta-1" } sourceCompatibility = JavaVersion.VERSION_17 @@ -13,8 +13,8 @@ repositories { } wpi.maven.useDevelopment = true -wpi.versions.wpilibVersion = "2025.3.2" -wpi.versions.wpimathVersion = "2025.3.2" +wpi.versions.wpilibVersion = "2026.1.1-beta-1" +wpi.versions.wpimathVersion = "2026.1.1-beta-1" // Define my targets (RoboRIO) and artifacts (deployable files) diff --git a/photonlib-java-examples/aimattarget/build.gradle b/photonlib-java-examples/aimattarget/build.gradle index 15409f7cd2..12719b0575 100644 --- a/photonlib-java-examples/aimattarget/build.gradle +++ b/photonlib-java-examples/aimattarget/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2025.3.2" + id "edu.wpi.first.GradleRIO" version "2026.1.1-beta-1" } sourceCompatibility = JavaVersion.VERSION_17 @@ -9,8 +9,8 @@ targetCompatibility = JavaVersion.VERSION_17 def ROBOT_MAIN_CLASS = "frc.robot.Main" wpi.maven.useDevelopment = true -wpi.versions.wpilibVersion = "2025.3.2" -wpi.versions.wpimathVersion = "2025.3.2" +wpi.versions.wpilibVersion = "2026.1.1-beta-1" +wpi.versions.wpimathVersion = "2026.1.1-beta-1" // Define my targets (RoboRIO) and artifacts (deployable files) diff --git a/photonlib-java-examples/poseest/build.gradle b/photonlib-java-examples/poseest/build.gradle index b8ee5358ca..3b903edfcc 100644 --- a/photonlib-java-examples/poseest/build.gradle +++ b/photonlib-java-examples/poseest/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2025.3.2" + id "edu.wpi.first.GradleRIO" version "2026.1.1-beta-1" } sourceCompatibility = JavaVersion.VERSION_17 @@ -9,8 +9,8 @@ targetCompatibility = JavaVersion.VERSION_17 def ROBOT_MAIN_CLASS = "frc.robot.Main" wpi.maven.useDevelopment = true -wpi.versions.wpilibVersion = "2025.3.2" -wpi.versions.wpimathVersion = "2025.3.2" +wpi.versions.wpilibVersion = "2026.1.1-beta-1" +wpi.versions.wpimathVersion = "2026.1.1-beta-1" // Define my targets (RoboRIO) and artifacts (deployable files) diff --git a/photonlib-python-examples/aimandrange/pyproject.toml b/photonlib-python-examples/aimandrange/pyproject.toml index 3fc8c5bded..4f8a37014b 100644 --- a/photonlib-python-examples/aimandrange/pyproject.toml +++ b/photonlib-python-examples/aimandrange/pyproject.toml @@ -6,7 +6,7 @@ [tool.robotpy] # Version of robotpy this project depends on -robotpy_version = "2025.3.2" +robotpy_version = "2026.1.1-beta-1" # Which extra RobotPy components should be installed # -> equivalent to `pip install robotpy[extra1, ...] diff --git a/photonlib-python-examples/aimattarget/pyproject.toml b/photonlib-python-examples/aimattarget/pyproject.toml index 3fc8c5bded..4f8a37014b 100644 --- a/photonlib-python-examples/aimattarget/pyproject.toml +++ b/photonlib-python-examples/aimattarget/pyproject.toml @@ -6,7 +6,7 @@ [tool.robotpy] # Version of robotpy this project depends on -robotpy_version = "2025.3.2" +robotpy_version = "2026.1.1-beta-1" # Which extra RobotPy components should be installed # -> equivalent to `pip install robotpy[extra1, ...] diff --git a/photonlib-python-examples/poseest/pyproject.toml b/photonlib-python-examples/poseest/pyproject.toml index 3fc8c5bded..4f8a37014b 100644 --- a/photonlib-python-examples/poseest/pyproject.toml +++ b/photonlib-python-examples/poseest/pyproject.toml @@ -6,7 +6,7 @@ [tool.robotpy] # Version of robotpy this project depends on -robotpy_version = "2025.3.2" +robotpy_version = "2026.1.1-beta-1" # Which extra RobotPy components should be installed # -> equivalent to `pip install robotpy[extra1, ...] From 7cc5a011bc48fc4bb56ea54d7e81fec5b15e059a Mon Sep 17 00:00:00 2001 From: Sam Freund Date: Sun, 16 Nov 2025 21:55:57 -0600 Subject: [PATCH 2/4] Discard changes to .github/pull_request_template.md --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7cf1df8b3c..0d5211e4a4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,6 +14,6 @@ Merge checklist: - [ ] This PR has been [linted](https://docs.photonvision.org/en/latest/docs/contributing/linting.html). - [ ] If this PR changes behavior or adds a feature, user documentation is updated - [ ] If this PR touches photon-serde, all messages have been regenerated and hashes have not changed unexpectedly -- [ ] If this PR touches configuration, this is backwards compatible with settings back to v2026.1.1-beta-1 +- [ ] If this PR touches configuration, this is backwards compatible with settings back to v2025.3.2 - [ ] If this PR touches pipeline settings or anything related to data exchange, the frontend typing is updated - [ ] If this PR addresses a bug, a regression test for it is added From e811894d69219552999c021e08758f351dd6aa38 Mon Sep 17 00:00:00 2001 From: samfreund Date: Mon, 17 Nov 2025 01:21:27 -0600 Subject: [PATCH 3/4] pin robotpy versions --- photon-lib/py/setup.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/photon-lib/py/setup.py b/photon-lib/py/setup.py index 41a550ca2f..361f7b81c2 100644 --- a/photon-lib/py/setup.py +++ b/photon-lib/py/setup.py @@ -61,11 +61,11 @@ version=versionString, install_requires=[ "numpy~=2.1", - "wpilib<2026,>=2026.1.1-beta-1", - "robotpy-wpimath<2026,>=2026.1.1-beta-1", - "robotpy-apriltag<2026,>=2026.1.1-beta-1", - "robotpy-cscore<2026,>=2026.1.1-beta-1", - "pyntcore<2026,>=2026.1.1-beta-1", + "wpilib==2026.1.1-beta-1", + "robotpy-wpimath==2026.1.1-beta-1", + "robotpy-apriltag==2026.1.1-beta-1", + "robotpy-cscore==2026.1.1-beta-1", + "pyntcore==2026.1.1-beta-1", "opencv-python;platform_machine!='roborio'", ], description=descriptionStr, From c4e9ab7288d8fe769c085161a4e01bb55051541e Mon Sep 17 00:00:00 2001 From: samfreund Date: Mon, 17 Nov 2025 01:47:22 -0600 Subject: [PATCH 4/4] fix sleipnir api break --- .vscode/settings.json | 5 +++- .../wrap/casadi_wrapper.cpp | 23 ++++++++----------- .../photon/estimation/VisionEstimation.cpp | 5 ++-- .../wrap/casadi_wrapper.h | 4 ++-- .../native/jni/ConstrainedSolvepnpJNI.cpp | 5 ++-- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 376e6c941c..3dee93dc6c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,8 @@ { "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, - "python.testing.cwd": "photon-lib/py" + "python.testing.cwd": "photon-lib/py", + "files.associations": { + "bitset": "cpp" + } } \ No newline at end of file diff --git a/photon-targeting/src/main/native/cpp/photon/constrained_solvepnp/wrap/casadi_wrapper.cpp b/photon-targeting/src/main/native/cpp/photon/constrained_solvepnp/wrap/casadi_wrapper.cpp index ffe1bb9e47..ebe0ea589a 100644 --- a/photon-targeting/src/main/native/cpp/photon/constrained_solvepnp/wrap/casadi_wrapper.cpp +++ b/photon-targeting/src/main/native/cpp/photon/constrained_solvepnp/wrap/casadi_wrapper.cpp @@ -156,8 +156,7 @@ struct ProblemState { #undef MAKE_ARGV }; -wpi::expected +wpi::expected constrained_solvepnp::do_optimization( bool heading_free, int nTags, constrained_solvepnp::CameraCalibration cameraCal, @@ -173,7 +172,7 @@ constrained_solvepnp::do_optimization( if constexpr (VERBOSE) fmt::println("Got unexpected num cols!"); // TODO find a new error code return wpi::unexpected{ - sleipnir::SolverExitCondition::kNonfiniteInitialCostOrConstraints}; + slp::ExitStatus::NONFINITE_INITIAL_COST_OR_CONSTRAINTS}; } // rescale observations to homogenous pixel coordinates @@ -203,7 +202,7 @@ constrained_solvepnp::do_optimization( auto problemOpt = createProblem(nTags, heading_free); if (!problemOpt) { return wpi::unexpected{ - sleipnir::SolverExitCondition::kNonfiniteInitialCostOrConstraints}; + slp::ExitStatus::NONFINITE_INITIAL_COST_OR_CONSTRAINTS}; } ProblemState<3> pState{robot2camera, field2points, point_observations, @@ -233,7 +232,7 @@ constrained_solvepnp::do_optimization( // Check for diverging iterates if (x.template lpNorm() > 1e20 || !x.allFinite()) { - return wpi::unexpected{sleipnir::SolverExitCondition::kDivergingIterates}; + return wpi::unexpected{slp::ExitStatus::DIVERGING_ITERATES}; } GradMat g = pState.calculateGradJ(x); @@ -254,7 +253,7 @@ constrained_solvepnp::do_optimization( auto H_ldlt = H.ldlt(); if (H_ldlt.info() != Eigen::Success) { std::cerr << "LDLT decomp failed! H=" << std::endl << H << std::endl; - return wpi::unexpected{sleipnir::SolverExitCondition::kLocallyInfeasible}; + return wpi::unexpected{slp::ExitStatus::LOCALLY_INFEASIBLE}; } // Make sure H is positive definite (all eigenvalues are > 0) @@ -278,8 +277,7 @@ constrained_solvepnp::do_optimization( if (H_ldlt.info() != Eigen::Success) { std::cerr << "LDLT decomp failed! H=" << std::endl << H << std::endl; - return wpi::unexpected{ - sleipnir::SolverExitCondition::kLocallyInfeasible}; + return wpi::unexpected{slp::ExitStatus::LOCALLY_INFEASIBLE}; } // If our eigenvalues aren't positive definite, pick a new δ for next @@ -289,8 +287,7 @@ constrained_solvepnp::do_optimization( // If the Hessian perturbation is too high, report failure if (δ > 1e20) { - return wpi::unexpected{ - sleipnir::SolverExitCondition::kLocallyInfeasible}; + return wpi::unexpected{slp::ExitStatus::LOCALLY_INFEASIBLE}; } } else { // Done! @@ -301,8 +298,7 @@ constrained_solvepnp::do_optimization( } if (i_reg == MAX_REG_STEPS) { - return wpi::unexpected{ - sleipnir::SolverExitCondition::kLocallyInfeasible}; + return wpi::unexpected{slp::ExitStatus::LOCALLY_INFEASIBLE}; } } else { // std::printf("Already regularized\n"); @@ -345,8 +341,7 @@ constrained_solvepnp::do_optimization( // If our step size shrank too much, report local infesibility if (alpha < α_min_frac * γConstraint) { - return wpi::unexpected{ - sleipnir::SolverExitCondition::kLocallyInfeasible}; + return wpi::unexpected{slp::ExitStatus::LOCALLY_INFEASIBLE}; } } } diff --git a/photon-targeting/src/main/native/cpp/photon/estimation/VisionEstimation.cpp b/photon-targeting/src/main/native/cpp/photon/estimation/VisionEstimation.cpp index 2349a5831c..0ae99457b1 100644 --- a/photon-targeting/src/main/native/cpp/photon/estimation/VisionEstimation.cpp +++ b/photon-targeting/src/main/native/cpp/photon/estimation/VisionEstimation.cpp @@ -191,9 +191,8 @@ std::optional EstimateRobotPoseConstrainedSolvePNP( guess2.X().value(), guess2.Y().value(), guess2.Rotation().Radians().value()}; - wpi::expected - result = constrained_solvepnp::do_optimization( + wpi::expected result = + constrained_solvepnp::do_optimization( headingFree, knownTags.size(), cameraCal, robotToCamera, guessMat, field2points, pointObservations, gyroTheta.Radians().value(), gyroErrorScaleFac); diff --git a/photon-targeting/src/main/native/include/photon/constrained_solvepnp/wrap/casadi_wrapper.h b/photon-targeting/src/main/native/include/photon/constrained_solvepnp/wrap/casadi_wrapper.h index da966a87e0..c71629f730 100644 --- a/photon-targeting/src/main/native/include/photon/constrained_solvepnp/wrap/casadi_wrapper.h +++ b/photon-targeting/src/main/native/include/photon/constrained_solvepnp/wrap/casadi_wrapper.h @@ -18,7 +18,7 @@ #pragma once #include -#include +#include #include namespace constrained_solvepnp { @@ -40,7 +40,7 @@ using RobotStateMat = Eigen::Matrix; * to this. The number of columns in field2points and point_observations just be * exactly 4x nTags. */ -wpi::expected do_optimization( +wpi::expected do_optimization( bool heading_free, int nTags, CameraCalibration cameraCal, // Note that casadi is column major, apparently Eigen::Matrix robot2camera, diff --git a/photon-targeting/src/main/native/jni/ConstrainedSolvepnpJNI.cpp b/photon-targeting/src/main/native/jni/ConstrainedSolvepnpJNI.cpp index 8e7672d4fd..b674512062 100644 --- a/photon-targeting/src/main/native/jni/ConstrainedSolvepnpJNI.cpp +++ b/photon-targeting/src/main/native/jni/ConstrainedSolvepnpJNI.cpp @@ -84,9 +84,8 @@ Java_org_photonvision_jni_ConstrainedSolvepnpJni_do_1optimization std::cout << "observations:\n" << pointObservationsMat << std::endl; #endif - wpi::expected - result = constrained_solvepnp::do_optimization( + wpi::expected result = + constrained_solvepnp::do_optimization( headingFree, nTags, cameraCal_, robot2cameraMat, xGuessMat, field2pointsMat, pointObservationsMat, gyro_θ, gyro_error_scale_fac);