Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -32,15 +32,15 @@ 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"
javalinVersion = "6.7.0"
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";


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion docs/source/docs/contributing/building-photon.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:**

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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?

Expand All @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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!
Expand All @@ -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");
Expand Down Expand Up @@ -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};
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"enableCppIntellisense": true,
"currentLanguage": "cpp",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 5
}
6 changes: 3 additions & 3 deletions photonlib-cpp-examples/aimandrange/build.gradle
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion photonlib-cpp-examples/aimandrange/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"enableCppIntellisense": true,
"currentLanguage": "cpp",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 5
}
6 changes: 3 additions & 3 deletions photonlib-cpp-examples/aimattarget/build.gradle
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion photonlib-cpp-examples/aimattarget/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"enableCppIntellisense": true,
"currentLanguage": "cpp",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 5
}
6 changes: 3 additions & 3 deletions photonlib-cpp-examples/poseest/build.gradle
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion photonlib-cpp-examples/poseest/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"enableCppIntellisense": false,
"currentLanguage": "java",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 4512
}
2 changes: 1 addition & 1 deletion photonlib-java-examples/aimandrange/WPILib-License.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
6 changes: 3 additions & 3 deletions photonlib-java-examples/aimandrange/build.gradle
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion photonlib-java-examples/aimandrange/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"enableCppIntellisense": false,
"currentLanguage": "java",
"projectYear": "2025",
"projectYear": "2026beta",
"teamNumber": 4512
}
2 changes: 1 addition & 1 deletion photonlib-java-examples/aimattarget/WPILib-License.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
6 changes: 3 additions & 3 deletions photonlib-java-examples/aimattarget/build.gradle
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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)
Expand Down
Loading
Loading