Bump wpilib to 2026 beta (#2192)

## Description

<!-- What changed? Why? (the code + comments should speak for itself on
the "how") -->

<!-- Fun screenshots or a cool video or something are super helpful as
well. If this touches platform-specific behavior, this is where test
evidence should be collected. -->

<!-- Any issues this pull request closes or pull requests this
supersedes should be linked with `Closes #issuenumber`. -->

Bump to wpilib 2026 beta. This does not bump our pythonlib, as robotpy
hasn't come out yet.

## Meta

Merge checklist:
- [ ] Pull Request title is [short, imperative
summary](https://cbea.ms/git-commit/) of proposed changes
- [ ] The description documents the _what_ and _why_
- [ ] 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 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

---------

Co-authored-by: Gold856 <117957790+Gold856@users.noreply.github.com>
This commit is contained in:
Sam Freund
2025-12-11 23:53:54 -06:00
committed by GitHub
parent 467f22bfdc
commit 9490c2f2cd
34 changed files with 61 additions and 76 deletions

View File

@@ -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"
@@ -40,7 +40,7 @@ ext {
libcameraDriverVersion = "dev-v2025.0.4-2-gc91d4b7"
rknnVersion = "dev-v2025.0.0-7-g83c1bf3"
rubikVersion = "dev-v2025.1.0-7-g39588a8"
frcYear = "2025"
frcYear = "2026beta"
mrcalVersion = "dev-v2025.0.0-2-g2adb187";

View File

@@ -12,7 +12,7 @@ VERY Limited macOS support is available.
## Installing Java
PhotonVision requires a JDK installed and on the system path. JDK 17 is needed (different versions will not work). You may already have this if you have installed WPILib 2025+. If not, [download and install it from here](https://adoptium.net/temurin/releases?version=17).
PhotonVision requires a JDK installed and on the system path. JDK 17 is needed (different versions will not work). You may already have this if you have installed WPILib 2026+. If not, [download and install it from here](https://adoptium.net/temurin/releases?version=17).
:::{warning}
Using a JDK other than JDK17 will cause issues when running PhotonVision and is not supported.

View File

@@ -12,15 +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`:
```
> ./gradlew run "-Dorg.gradle.java.home=C:\Users\Public\wpilib\2025\jdk"
```
:::{warning}
Using a JDK other than WPILIB's JDK17 will cause issues when running PhotonVision and is not supported.
:::
PhotonVision requires a JDK installed and on the system path. **JDK 17 is needed.** You may already have it if you installed WPILib, but ensure that running `java -version` shows JDK 17. You will likely have to add WPILib's JDK to JAVA_HOME and the JDK's `bin` directory to PATH. If you do not have a JDK 17 install, [download and install it from here.](https://adoptium.net/temurin/releases?version=17)
## Downloading the Latest Stable Release of PhotonVision

View File

@@ -8,7 +8,7 @@ This section contains the build instructions from the source code available at [
**Java Development Kit:**
This project requires Java Development Kit (JDK) 17 to be compiled. This is the same Java version that comes with WPILib for 2025+. **Windows Users must use the JDK that ships with WPILib.** For other platforms, you can follow the instructions to install JDK 17 for your platform [here](https://bell-sw.com/pages/downloads/#jdk-17-lts).
This project requires Java Development Kit (JDK) 17 to be compiled. This is the same Java version that comes with WPILib for 2026+. **Windows Users must use the JDK that ships with WPILib.** For other platforms, you can follow the instructions to install JDK 17 for your platform [here](https://bell-sw.com/pages/downloads/#jdk-17-lts).
**Node JS:**

View File

@@ -11,8 +11,8 @@ A few issues make up the majority of support requests. Run through this checklis
- Even if there's a switch between your laptop and coprocessor, you'll still want a radio or router in the loop somehow.
- The FRC radio is the _only_ router we will officially support due to the innumerable variations between routers.
- (Raspberry Pi, Orange Pi & Limelight only) have you flashed the correct image, and is it [up to date](https://github.com/PhotonVision/photonvision/releases/latest)?
- Is your robot code using a **2025** version of WPILib, and is your coprocessor using the most up to date **2025** release?
- 2022, 2023, 2024, and 2025 versions of either cannot be mix-and-matched!
- Is your robot code using a **2026** version of WPILib, and is your coprocessor using the most up to date **2026** release?
- 2022, 2023, 2024, 2025, and 2026 versions of either cannot be mix-and-matched!
- Your PhotonVision version can be checked on the settings tab.
- Is your team number correctly set on the settings tab?
@@ -30,7 +30,7 @@ Please check that:
1\. You don't have the NetworkTables Server on (toggleable in the settings tab). Turn this off when doing work on a robot.
2\. You have your team number set properly in the settings tab.
3\. Your camera name in the `PhotonCamera` constructor matches the name in the UI.
4\. You are using the 2025 version of WPILib and RoboRIO image.
4\. You are using the 2026 version of WPILib and RoboRIO image.
5\. Your robot is on.
If all of the above are met and you still have issues, feel free to {ref}`contact us <index:contact us>` and provide the following information:

View File

@@ -156,8 +156,7 @@ struct ProblemState {
#undef MAKE_ARGV
};
wpi::expected<constrained_solvepnp::RobotStateMat,
sleipnir::SolverExitCondition>
wpi::expected<constrained_solvepnp::RobotStateMat, slp::ExitStatus>
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<Eigen::Infinity>() > 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};
}
}
}

View File

@@ -191,9 +191,8 @@ std::optional<photon::PnpResult> EstimateRobotPoseConstrainedSolvePNP(
guess2.X().value(), guess2.Y().value(),
guess2.Rotation().Radians().value()};
wpi::expected<constrained_solvepnp::RobotStateMat,
sleipnir::SolverExitCondition>
result = constrained_solvepnp::do_optimization(
wpi::expected<constrained_solvepnp::RobotStateMat, slp::ExitStatus> result =
constrained_solvepnp::do_optimization(
headingFree, knownTags.size(), cameraCal, robotToCamera, guessMat,
field2points, pointObservations, gyroTheta.Radians().value(),
gyroErrorScaleFac);

View File

@@ -18,7 +18,7 @@
#pragma once
#include <Eigen/Core>
#include <sleipnir/optimization/SolverExitCondition.hpp>
#include <sleipnir/optimization/solver/exit_status.hpp>
#include <wpi/expected>
namespace constrained_solvepnp {
@@ -40,7 +40,7 @@ using RobotStateMat = Eigen::Matrix<casadi_real, 3, 1>;
* to this. The number of columns in field2points and point_observations just be
* exactly 4x nTags.
*/
wpi::expected<RobotStateMat, sleipnir::SolverExitCondition> do_optimization(
wpi::expected<RobotStateMat, slp::ExitStatus> do_optimization(
bool heading_free, int nTags, CameraCalibration cameraCal,
// Note that casadi is column major, apparently
Eigen::Matrix<casadi_real, 4, 4, Eigen::ColMajor> robot2camera,

View File

@@ -84,9 +84,8 @@ Java_org_photonvision_jni_ConstrainedSolvepnpJni_do_1optimization
std::cout << "observations:\n" << pointObservationsMat << std::endl;
#endif
wpi::expected<constrained_solvepnp::RobotStateMat,
sleipnir::SolverExitCondition>
result = constrained_solvepnp::do_optimization(
wpi::expected<constrained_solvepnp::RobotStateMat, slp::ExitStatus> result =
constrained_solvepnp::do_optimization(
headingFree, nTags, cameraCal_, robot2cameraMat, xGuessMat,
field2pointsMat, pointObservationsMat, gyro_θ, gyro_error_scale_fac);

View File

@@ -1,6 +1,6 @@
{
"enableCppIntellisense": true,
"currentLanguage": "cpp",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 5
}

View File

@@ -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.

View File

@@ -5,7 +5,7 @@ pluginManagement {
mavenLocal()
jcenter()
gradlePluginPortal()
String frcYear = '2025'
String frcYear = '2026'
File frcHome
if (OperatingSystem.current().isWindows()) {
String publicFolder = System.getenv('PUBLIC')

View File

@@ -1,6 +1,6 @@
{
"enableCppIntellisense": true,
"currentLanguage": "cpp",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 5
}

View File

@@ -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.

View File

@@ -5,7 +5,7 @@ pluginManagement {
mavenLocal()
jcenter()
gradlePluginPortal()
String frcYear = '2025'
String frcYear = '2026'
File frcHome
if (OperatingSystem.current().isWindows()) {
String publicFolder = System.getenv('PUBLIC')

View File

@@ -1,6 +1,6 @@
{
"enableCppIntellisense": true,
"currentLanguage": "cpp",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 5
}

View File

@@ -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.

View File

@@ -5,7 +5,7 @@ pluginManagement {
mavenLocal()
jcenter()
gradlePluginPortal()
String frcYear = '2025'
String frcYear = '2026'
File frcHome
if (OperatingSystem.current().isWindows()) {
String publicFolder = System.getenv('PUBLIC')

View File

@@ -1,6 +1,6 @@
{
"enableCppIntellisense": false,
"currentLanguage": "java",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 4512
}

View File

@@ -1,4 +1,4 @@
Copyright (c) 2009-2025 FIRST and other WPILib contributors
Copyright (c) 2009-2026 FIRST and other WPILib contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -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)

View File

@@ -4,7 +4,7 @@ pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
String frcYear = '2025'
String frcYear = '2026'
File frcHome
if (OperatingSystem.current().isWindows()) {
String publicFolder = System.getenv('PUBLIC')

View File

@@ -1,6 +1,6 @@
{
"enableCppIntellisense": false,
"currentLanguage": "java",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 4512
}

View File

@@ -1,4 +1,4 @@
Copyright (c) 2009-2025 FIRST and other WPILib contributors
Copyright (c) 2009-2026 FIRST and other WPILib contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -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)

View File

@@ -4,7 +4,7 @@ pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
String frcYear = '2025'
String frcYear = '2026'
File frcHome
if (OperatingSystem.current().isWindows()) {
String publicFolder = System.getenv('PUBLIC')

View File

@@ -1,6 +1,6 @@
{
"enableCppIntellisense": false,
"currentLanguage": "java",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 4512
}

View File

@@ -1,4 +1,4 @@
Copyright (c) 2009-2025 FIRST and other WPILib contributors
Copyright (c) 2009-2026 FIRST and other WPILib contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without

View File

@@ -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)

View File

@@ -4,7 +4,7 @@ pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
String frcYear = '2025'
String frcYear = '2026'
File frcHome
if (OperatingSystem.current().isWindows()) {
String publicFolder = System.getenv('PUBLIC')

View File

@@ -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, ...]

View File

@@ -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, ...]

View File

@@ -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, ...]

View File

@@ -10,7 +10,7 @@ nativeUtils.wpi.configureDependencies {
wpimathVersion = wpimathVersion
opencvYear = 'frc'+openCVYear
opencvVersion = openCVversion
niLibVersion = "2025.0.0"
niLibVersion = "2026.1.0"
}
// Configure warnings and errors