diff --git a/wpilibc/src/test/native/cpp/spline/CubicHermiteSplineTest.cpp b/wpilibc/src/test/native/cpp/spline/CubicHermiteSplineTest.cpp index 8254dd4f90..319be79d0b 100644 --- a/wpilibc/src/test/native/cpp/spline/CubicHermiteSplineTest.cpp +++ b/wpilibc/src/test/native/cpp/spline/CubicHermiteSplineTest.cpp @@ -73,6 +73,22 @@ class CubicHermiteSplineTest : public ::testing::Test { EXPECT_NEAR(poses.front().first.Rotation().Radians().to(), a.Rotation().Radians().to(), 1E-9); + // Check interior waypoints + bool interiorsGood = true; + for (auto& waypoint : waypoints) { + bool found = false; + for (auto& state : poses) { + if (std::abs( + waypoint.Distance(state.first.Translation()).to()) < + 1E-9) { + found = true; + } + } + interiorsGood &= found; + } + + EXPECT_TRUE(interiorsGood); + // Check last point. EXPECT_NEAR(poses.back().first.Translation().X().to(), b.Translation().X().to(), 1E-9); @@ -97,3 +113,10 @@ TEST_F(CubicHermiteSplineTest, SCurve) { Pose2d end{3_m, 0_m, Rotation2d{90_deg}}; Run(start, waypoints, end); } + +TEST_F(CubicHermiteSplineTest, OneInterior) { + Pose2d start{0_m, 0_m, 0_rad}; + std::vector waypoints{Translation2d(2_m, 0_m)}; + Pose2d end{4_m, 0_m, 0_rad}; + Run(start, waypoints, end); +} diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/spline/SplineHelper.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/spline/SplineHelper.java index 1c71229390..87b65fcd0c 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/spline/SplineHelper.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/spline/SplineHelper.java @@ -175,7 +175,7 @@ public final class SplineHelper { / 4.0; double[] midXControlVector = {waypoints[0].getX(), xDeriv}; - double[] midYControlVector = {waypoints[0].getX(), yDeriv}; + double[] midYControlVector = {waypoints[0].getY(), yDeriv}; splines[0] = new CubicHermiteSpline(xInitial, midXControlVector, yInitial, midYControlVector); diff --git a/wpilibj/src/test/java/edu/wpi/first/wpilibj/spline/CubicHermiteSplineTest.java b/wpilibj/src/test/java/edu/wpi/first/wpilibj/spline/CubicHermiteSplineTest.java index d7d4558ae7..aeb879e67e 100644 --- a/wpilibj/src/test/java/edu/wpi/first/wpilibj/spline/CubicHermiteSplineTest.java +++ b/wpilibj/src/test/java/edu/wpi/first/wpilibj/spline/CubicHermiteSplineTest.java @@ -76,6 +76,20 @@ class CubicHermiteSplineTest { poses.get(0).poseMeters.getRotation().getRadians(), 1E-9) ); + // Check interior waypoints + boolean interiorsGood = true; + for (var waypoint : waypoints) { + boolean found = false; + for (var state : poses) { + if (waypoint.getDistance(state.poseMeters.getTranslation()) == 0) { + found = true; + } + } + interiorsGood &= found; + } + + assertTrue(interiorsGood); + // Check last point assertAll( () -> assertEquals(b.getTranslation().getX(), @@ -104,4 +118,15 @@ class CubicHermiteSplineTest { run(start, waypoints, end); } + + @SuppressWarnings("PMD.JUnitTestsShouldIncludeAssert") + @Test + void testOneInterior() { + var start = new Pose2d(0, 0, Rotation2d.fromDegrees(0.0)); + ArrayList waypoints = new ArrayList<>(); + waypoints.add(new Translation2d(2.0, 0.0)); + var end = new Pose2d(4, 0, Rotation2d.fromDegrees(0.0)); + + run(start, waypoints, end); + } }