Skip to content

Commit 31ff8a6

Browse files
committed
[wpimath] Refactor StateSpaceUtil into separate files
* Moved makeWhiteNoiseVector() to random.Normal.normal() * Moved isControllable() and isDetectable() to system.LinearSystemUtil * Renamed makeCostMatrix() to costMatrix() (Java) * Renamed makeCovarianceMatrix() to covarianceMatrix() (Java) * Renamed MakeCostMatrix() to CostMatrix() (C++) * Renamed MakeCovMatrix() to CovarianceMatrix() (C++) * Removed deprecated poseTo3dVector(), poseTo4dVector(), poseToVector() * Removed clampInputMaxMagnitude() * We don't use it, and Eigen has this functionality built in via `u = u.array().min(u_max.array()).max(u_min.array());` * Simplified implementation of desaturateInputVector()
1 parent cba939c commit 31ff8a6

File tree

51 files changed

+748
-734
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+748
-734
lines changed

wpilibc/src/main/native/cpp/simulation/DifferentialDrivetrainSim.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <utility>
88

9+
#include "wpi/math/random/Normal.hpp"
910
#include "wpi/math/system/NumericalIntegration.hpp"
1011
#include "wpi/math/system/plant/LinearSystemId.hpp"
1112
#include "wpi/math/util/StateSpaceUtil.hpp"
@@ -61,7 +62,7 @@ void DifferentialDrivetrainSim::SetGearing(double newGearing) {
6162
void DifferentialDrivetrainSim::Update(wpi::units::second_t dt) {
6263
m_x = wpi::math::RKDP([this](auto& x, auto& u) { return Dynamics(x, u); },
6364
m_x, m_u, dt);
64-
m_y = m_x + wpi::math::MakeWhiteNoiseVector<7>(m_measurementStdDevs);
65+
m_y = m_x + wpi::math::Normal<7>(m_measurementStdDevs);
6566
}
6667

6768
double DifferentialDrivetrainSim::GetGearing() const {

wpilibc/src/main/native/include/wpi/simulation/LinearSystemSim.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
#include <array>
88

99
#include "wpi/math/linalg/EigenCore.hpp"
10+
#include "wpi/math/random/Normal.hpp"
1011
#include "wpi/math/system/LinearSystem.hpp"
1112
#include "wpi/math/util/StateSpaceUtil.hpp"
12-
#include "wpi/units/current.hpp"
1313
#include "wpi/units/time.hpp"
1414

1515
namespace wpi::sim {
@@ -61,7 +61,7 @@ class LinearSystemSim {
6161
// Add noise. If the user did not pass a noise vector to the
6262
// constructor, then this method will not do anything because
6363
// the standard deviations default to zero.
64-
m_y += wpi::math::MakeWhiteNoiseVector<Outputs>(m_measurementStdDevs);
64+
m_y += wpi::math::Normal<Outputs>(m_measurementStdDevs);
6565
}
6666

6767
/**

wpilibcExamples/src/main/cpp/examples/DifferentialDrivePoseEstimator/include/ExampleGlobalMeasurementSensor.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#pragma once
66

77
#include "wpi/math/geometry/Pose2d.hpp"
8-
#include "wpi/math/util/StateSpaceUtil.hpp"
8+
#include "wpi/math/random/Normal.hpp"
99

1010
/**
1111
* This dummy class represents a global measurement sensor, such as a computer
@@ -15,7 +15,7 @@ class ExampleGlobalMeasurementSensor {
1515
public:
1616
static wpi::math::Pose2d GetEstimatedGlobalPose(
1717
const wpi::math::Pose2d& estimatedRobotPose) {
18-
auto randVec = wpi::math::MakeWhiteNoiseVector(0.1, 0.1, 0.1);
18+
auto randVec = wpi::math::Normal(0.1, 0.1, 0.1);
1919
return wpi::math::Pose2d{
2020
estimatedRobotPose.X() + wpi::units::meter_t{randVec(0)},
2121
estimatedRobotPose.Y() + wpi::units::meter_t{randVec(1)},

wpilibcExamples/src/main/cpp/examples/MecanumDrivePoseEstimator/include/ExampleGlobalMeasurementSensor.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#pragma once
66

77
#include "wpi/math/geometry/Pose2d.hpp"
8-
#include "wpi/math/util/StateSpaceUtil.hpp"
8+
#include "wpi/math/random/Normal.hpp"
99

1010
/**
1111
* This dummy class represents a global measurement sensor, such as a computer
@@ -15,7 +15,7 @@ class ExampleGlobalMeasurementSensor {
1515
public:
1616
static wpi::math::Pose2d GetEstimatedGlobalPose(
1717
const wpi::math::Pose2d& estimatedRobotPose) {
18-
auto randVec = wpi::math::MakeWhiteNoiseVector(0.1, 0.1, 0.1);
18+
auto randVec = wpi::math::Normal(0.1, 0.1, 0.1);
1919
return wpi::math::Pose2d{
2020
estimatedRobotPose.X() + wpi::units::meter_t{randVec(0)},
2121
estimatedRobotPose.Y() + wpi::units::meter_t{randVec(1)},

wpilibcExamples/src/main/cpp/examples/SwerveDrivePoseEstimator/include/ExampleGlobalMeasurementSensor.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#pragma once
66

77
#include "wpi/math/geometry/Pose2d.hpp"
8-
#include "wpi/math/util/StateSpaceUtil.hpp"
8+
#include "wpi/math/random/Normal.hpp"
99

1010
/**
1111
* This dummy class represents a global measurement sensor, such as a computer
@@ -15,7 +15,7 @@ class ExampleGlobalMeasurementSensor {
1515
public:
1616
static wpi::math::Pose2d GetEstimatedGlobalPose(
1717
const wpi::math::Pose2d& estimatedRobotPose) {
18-
auto randVec = wpi::math::MakeWhiteNoiseVector(0.1, 0.1, 0.1);
18+
auto randVec = wpi::math::Normal(0.1, 0.1, 0.1);
1919
return wpi::math::Pose2d{
2020
estimatedRobotPose.X() + wpi::units::meter_t{randVec(0)},
2121
estimatedRobotPose.Y() + wpi::units::meter_t{randVec(1)},

wpilibj/src/main/java/org/wpilib/simulation/DifferentialDrivetrainSim.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.wpilib.math.numbers.N1;
1212
import org.wpilib.math.numbers.N2;
1313
import org.wpilib.math.numbers.N7;
14+
import org.wpilib.math.random.Normal;
1415
import org.wpilib.math.system.LinearSystem;
1516
import org.wpilib.math.system.NumericalIntegration;
1617
import org.wpilib.math.system.plant.DCMotor;
@@ -146,7 +147,7 @@ public void update(double dt) {
146147
m_x = NumericalIntegration.rkdp(this::getDynamics, m_x, m_u, dt);
147148
m_y = m_x;
148149
if (m_measurementStdDevs != null) {
149-
m_y = m_y.plus(StateSpaceUtil.makeWhiteNoiseVector(m_measurementStdDevs));
150+
m_y = m_y.plus(Normal.normal(m_measurementStdDevs));
150151
}
151152
}
152153

wpilibj/src/main/java/org/wpilib/simulation/LinearSystemSim.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.ejml.simple.SimpleMatrix;
99
import org.wpilib.math.linalg.Matrix;
1010
import org.wpilib.math.numbers.N1;
11+
import org.wpilib.math.random.Normal;
1112
import org.wpilib.math.system.LinearSystem;
1213
import org.wpilib.math.util.Num;
1314
import org.wpilib.math.util.StateSpaceUtil;
@@ -83,7 +84,7 @@ public void update(double dt) {
8384

8485
// Add measurement noise.
8586
if (m_measurementStdDevs != null) {
86-
m_y = m_y.plus(StateSpaceUtil.makeWhiteNoiseVector(m_measurementStdDevs));
87+
m_y = m_y.plus(Normal.normal(m_measurementStdDevs));
8788
}
8889
}
8990

wpilibjExamples/src/main/java/org/wpilib/examples/differentialdriveposeestimator/ExampleGlobalMeasurementSensor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.wpilib.math.geometry.Pose2d;
88
import org.wpilib.math.geometry.Rotation2d;
99
import org.wpilib.math.linalg.VecBuilder;
10-
import org.wpilib.math.util.StateSpaceUtil;
10+
import org.wpilib.math.random.Normal;
1111
import org.wpilib.math.util.Units;
1212

1313
/** This dummy class represents a global measurement sensor, such as a computer vision solution. */
@@ -22,8 +22,7 @@ private ExampleGlobalMeasurementSensor() {
2222
* @param estimatedRobotPose The robot pose.
2323
*/
2424
public static Pose2d getEstimatedGlobalPose(Pose2d estimatedRobotPose) {
25-
var rand =
26-
StateSpaceUtil.makeWhiteNoiseVector(VecBuilder.fill(0.5, 0.5, Units.degreesToRadians(30)));
25+
var rand = Normal.normal(VecBuilder.fill(0.5, 0.5, Units.degreesToRadians(30)));
2726
return new Pose2d(
2827
estimatedRobotPose.getX() + rand.get(0, 0),
2928
estimatedRobotPose.getY() + rand.get(1, 0),

wpilibjExamples/src/main/java/org/wpilib/examples/mecanumdriveposeestimator/ExampleGlobalMeasurementSensor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.wpilib.math.geometry.Pose2d;
88
import org.wpilib.math.geometry.Rotation2d;
99
import org.wpilib.math.linalg.VecBuilder;
10-
import org.wpilib.math.util.StateSpaceUtil;
10+
import org.wpilib.math.random.Normal;
1111
import org.wpilib.math.util.Units;
1212

1313
/** This dummy class represents a global measurement sensor, such as a computer vision solution. */
@@ -22,8 +22,7 @@ private ExampleGlobalMeasurementSensor() {
2222
* @param estimatedRobotPose The robot pose.
2323
*/
2424
public static Pose2d getEstimatedGlobalPose(Pose2d estimatedRobotPose) {
25-
var rand =
26-
StateSpaceUtil.makeWhiteNoiseVector(VecBuilder.fill(0.5, 0.5, Units.degreesToRadians(30)));
25+
var rand = Normal.normal(VecBuilder.fill(0.5, 0.5, Units.degreesToRadians(30)));
2726
return new Pose2d(
2827
estimatedRobotPose.getX() + rand.get(0, 0),
2928
estimatedRobotPose.getY() + rand.get(1, 0),

wpilibjExamples/src/main/java/org/wpilib/examples/swervedriveposeestimator/ExampleGlobalMeasurementSensor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.wpilib.math.geometry.Pose2d;
88
import org.wpilib.math.geometry.Rotation2d;
99
import org.wpilib.math.linalg.VecBuilder;
10-
import org.wpilib.math.util.StateSpaceUtil;
10+
import org.wpilib.math.random.Normal;
1111
import org.wpilib.math.util.Units;
1212

1313
/** This dummy class represents a global measurement sensor, such as a computer vision solution. */
@@ -22,8 +22,7 @@ private ExampleGlobalMeasurementSensor() {
2222
* @param estimatedRobotPose The robot pose.
2323
*/
2424
public static Pose2d getEstimatedGlobalPose(Pose2d estimatedRobotPose) {
25-
var rand =
26-
StateSpaceUtil.makeWhiteNoiseVector(VecBuilder.fill(0.5, 0.5, Units.degreesToRadians(30)));
25+
var rand = Normal.normal(VecBuilder.fill(0.5, 0.5, Units.degreesToRadians(30)));
2726
return new Pose2d(
2827
estimatedRobotPose.getX() + rand.get(0, 0),
2928
estimatedRobotPose.getY() + rand.get(1, 0),

0 commit comments

Comments
 (0)