From 95cb38e6df82574431ab31f8adab7eee9877c7a5 Mon Sep 17 00:00:00 2001 From: Benjamin Hall Date: Thu, 13 Nov 2025 13:48:43 -0500 Subject: [PATCH 1/5] [wpimath] Fix `ElevatorSim::GetCurrentDraw()` in C++ (#8370) The Kv calculation in C++ was missing a negative sign compared to the Java implementation. --- .../src/main/native/cpp/simulation/ElevatorSim.cpp | 2 +- .../test/native/cpp/simulation/ElevatorSimTest.cpp | 12 ++++++++++++ .../first/wpilibj/simulation/ElevatorSimTest.java | 12 ++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/wpilibc/src/main/native/cpp/simulation/ElevatorSim.cpp b/wpilibc/src/main/native/cpp/simulation/ElevatorSim.cpp index 4553dc4d0a..1edb299832 100644 --- a/wpilibc/src/main/native/cpp/simulation/ElevatorSim.cpp +++ b/wpilibc/src/main/native/cpp/simulation/ElevatorSim.cpp @@ -88,7 +88,7 @@ units::ampere_t ElevatorSim::GetCurrentDraw() const { double kA = 1.0 / m_plant.B(1, 0); using Kv_t = units::unit_t>>; - Kv_t Kv = Kv_t{kA * m_plant.A(1, 1)}; + Kv_t Kv = Kv_t{-kA * m_plant.A(1, 1)}; units::meters_per_second_t velocity{m_x(1)}; units::radians_per_second_t motorVelocity = velocity * Kv * m_gearbox.Kv; diff --git a/wpilibc/src/test/native/cpp/simulation/ElevatorSimTest.cpp b/wpilibc/src/test/native/cpp/simulation/ElevatorSimTest.cpp index 2777ee48c0..29a053715c 100644 --- a/wpilibc/src/test/native/cpp/simulation/ElevatorSimTest.cpp +++ b/wpilibc/src/test/native/cpp/simulation/ElevatorSimTest.cpp @@ -92,3 +92,15 @@ TEST(ElevatorSimTest, Stability) { frc::Vectord<1>{12.0}, 20_ms * 50)(0)}, sim.GetPosition(), 1_cm); } + +TEST(ElevatorSimTest, CurrentDraw) { + auto const motor = frc::DCMotor::KrakenX60(2); + frc::sim::ElevatorSim sim(motor, 20, 8_kg, 0.1_m, 0_m, 1_m, true, 0_m, + {0.01, 0.0}); + + EXPECT_DOUBLE_EQ(0.0, sim.GetCurrentDraw().value()); + sim.SetInputVoltage(motor.Voltage(motor.Torque(60_A), 0_rad_per_s)); + sim.Update(100_ms); + // current draw should start at 60 A and decrease as the back emf catches up + EXPECT_TRUE(0_A < sim.GetCurrentDraw() && sim.GetCurrentDraw() < 60_A); +} diff --git a/wpilibj/src/test/java/edu/wpi/first/wpilibj/simulation/ElevatorSimTest.java b/wpilibj/src/test/java/edu/wpi/first/wpilibj/simulation/ElevatorSimTest.java index 99ffbcd976..7f7f18fcc9 100644 --- a/wpilibj/src/test/java/edu/wpi/first/wpilibj/simulation/ElevatorSimTest.java +++ b/wpilibj/src/test/java/edu/wpi/first/wpilibj/simulation/ElevatorSimTest.java @@ -124,4 +124,16 @@ class ElevatorSimTest { sim.getPositionMeters(), 0.01); } + + @Test + void testCurrentDraw() { + var motor = DCMotor.getKrakenX60(2); + var sim = new ElevatorSim(motor, 20, 8.0, 0.1, 0.0, 1.0, true, 0.0, 0.01, 0.0); + + assertEquals(0.0, sim.getCurrentDrawAmps()); + sim.setInputVoltage(motor.getVoltage(motor.getTorque(60.0), 0.0)); + sim.update(0.100); + // current draw should start at 60 A and decrease as the back emf catches up + assertTrue(0.0 < sim.getCurrentDrawAmps() && sim.getCurrentDrawAmps() < 60.0); + } } From bd7a88a6d03c9d22cc1dca47952388b363b9f337 Mon Sep 17 00:00:00 2001 From: Warren Reynolds <43365474+w-reynolds@users.noreply.github.com> Date: Wed, 19 Nov 2025 12:13:27 +1100 Subject: [PATCH 2/5] [examples] Fix order of Swerve Modules in Odometry Update (#8396) The order of the Swerve Modules in the m_odometry.Update call needs to match the order they are defined in the creation of the kDriveKinematics object. --- .../SwerveControllerCommand/cpp/subsystems/DriveSubsystem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wpilibcExamples/src/main/cpp/examples/SwerveControllerCommand/cpp/subsystems/DriveSubsystem.cpp b/wpilibcExamples/src/main/cpp/examples/SwerveControllerCommand/cpp/subsystems/DriveSubsystem.cpp index a6b810a386..cace6112d1 100644 --- a/wpilibcExamples/src/main/cpp/examples/SwerveControllerCommand/cpp/subsystems/DriveSubsystem.cpp +++ b/wpilibcExamples/src/main/cpp/examples/SwerveControllerCommand/cpp/subsystems/DriveSubsystem.cpp @@ -45,8 +45,8 @@ DriveSubsystem::DriveSubsystem() void DriveSubsystem::Periodic() { // Implementation of subsystem periodic method goes here. m_odometry.Update(m_gyro.GetRotation2d(), - {m_frontLeft.GetPosition(), m_rearLeft.GetPosition(), - m_frontRight.GetPosition(), m_rearRight.GetPosition()}); + {m_frontLeft.GetPosition(), m_frontRight.GetPosition(), + m_rearLeft.GetPosition(), m_rearRight.GetPosition()}); } void DriveSubsystem::Drive(units::meters_per_second_t xSpeed, From 7cd0ef5bd9a7ca55e6d133af288a86e21b7108dd Mon Sep 17 00:00:00 2001 From: Gold856 <117957790+Gold856@users.noreply.github.com> Date: Tue, 18 Nov 2025 20:14:01 -0500 Subject: [PATCH 3/5] [docs] Revert "Update readme to say Xcode is required" (#8397) This reverts commit 49b4b064cf98c0e367f54ac8719779cc158eba3a (#7892). --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d267e261d..87a41c682c 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Using Gradle makes building WPILib very straightforward. It only has a few depen - C++ compiler - On Linux, install GCC 11 or greater - On Windows, install [Visual Studio Community 2022](https://visualstudio.microsoft.com/vs/community/) and select the C++ programming language during installation (Gradle can't use the build tools for Visual Studio) - - On macOS 13.3 or newer, install Xcode 14 or later (the command-line build tools are insufficient). + - On macOS, install the Xcode command-line build tools via `xcode-select --install`. Xcode 14 or later is required. - ARM compiler toolchain - Run `./gradlew installRoboRioToolchain` after cloning this repository - If the WPILib installer was used, this toolchain is already installed From f6b4ad575b61c20d984ae12afa1bdd334d282d3a Mon Sep 17 00:00:00 2001 From: Ryan Blue Date: Sat, 22 Nov 2025 10:55:44 -0500 Subject: [PATCH 4/5] [ci] Pin docker-run-action and remove rm command (#8415) The fix was made but has not been tagged. --- .github/workflows/gradle.yml | 4 ++-- .github/workflows/sentinel-build.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 216873e2ca..32e6d3491b 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -52,11 +52,11 @@ jobs: run: echo "EXTRA_GRADLE_ARGS=-PreleaseMode" >> $GITHUB_ENV if: startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, '2027') - name: Build with Gradle - uses: addnab/docker-run-action@v3 + uses: addnab/docker-run-action@3e77f186b7a929ef010f183a9e24c0f9955ea609 with: image: ${{ matrix.container }} options: -v ${{ github.workspace }}:/work -w /work -e ARTIFACTORY_PUBLISH_USERNAME -e ARTIFACTORY_PUBLISH_PASSWORD -e GITHUB_REF -e CI - run: df . && rm -f semicolon_delimited_script && echo $GITHUB_REF && ./gradlew build --build-cache -PbuildServer -PskipJavaFormat ${{ matrix.build-options }} ${{ env.EXTRA_GRADLE_ARGS }} + run: df . && echo $GITHUB_REF && ./gradlew build --build-cache -PbuildServer -PskipJavaFormat ${{ matrix.build-options }} ${{ env.EXTRA_GRADLE_ARGS }} env: ARTIFACTORY_PUBLISH_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }} ARTIFACTORY_PUBLISH_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }} diff --git a/.github/workflows/sentinel-build.yml b/.github/workflows/sentinel-build.yml index fc169f0c25..43d44191c3 100644 --- a/.github/workflows/sentinel-build.yml +++ b/.github/workflows/sentinel-build.yml @@ -53,11 +53,11 @@ jobs: with: fetch-depth: 0 - name: Build with Gradle - uses: addnab/docker-run-action@v3 + uses: addnab/docker-run-action@3e77f186b7a929ef010f183a9e24c0f9955ea609 with: image: ${{ matrix.container }} options: -v ${{ github.workspace }}:/work -w /work -e GITHUB_REF -e CI - run: df . && rm -f semicolon_delimited_script && echo $GITHUB_REF && ./gradlew build -PbuildServer -PskipJavaFormat ${{ matrix.build-options }} + run: df . && echo $GITHUB_REF && ./gradlew build -PbuildServer -PskipJavaFormat ${{ matrix.build-options }} - name: Check free disk space run: df . - uses: actions/upload-artifact@v4 From 769ce5e9fab76f44b08c10c90686ec073743b47e Mon Sep 17 00:00:00 2001 From: Keagan Kautzer <106849350+kkautzer@users.noreply.github.com> Date: Sun, 23 Nov 2025 16:40:30 -0600 Subject: [PATCH 5/5] [wpiunits] Rename `AngularMomentumUnit.mult` to `per` (#8409) Fixes #8408 --- .../wpi/first/units/AngularMomentumUnit.java | 20 +++++++++---------- .../main/java/edu/wpi/first/units/Units.java | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/wpiunits/src/main/java/edu/wpi/first/units/AngularMomentumUnit.java b/wpiunits/src/main/java/edu/wpi/first/units/AngularMomentumUnit.java index be54a13504..5a4ce4cc53 100644 --- a/wpiunits/src/main/java/edu/wpi/first/units/AngularMomentumUnit.java +++ b/wpiunits/src/main/java/edu/wpi/first/units/AngularMomentumUnit.java @@ -80,6 +80,16 @@ public final class AngularMomentumUnit extends MultUnit