[wpimath] Remove rho overload from LinearQuadraticRegulator constructors (#2687)

It was added as part of Bryson's rule described in
https://file.tavsys.net/control/controls-engineering-in-frc.pdf. It
doesn't really simplify usage though, and the same thing can be
replicated by multiplying the elements of Q by rho manually. It's easier
to do it that way, it's how 3512 has been doing controller debugging for
a while, and it's probably what other teams will do as well instead of
using the "more structured" way.

Removing these unhelpful overloads also simplifies the LQR interface.
This commit is contained in:
Tyler Veness
2020-09-03 20:53:17 -07:00
committed by GitHub
parent 8edc17dac9
commit 35790a8990
10 changed files with 16 additions and 216 deletions

View File

@@ -44,27 +44,8 @@ class LinearQuadraticRegulatorImpl {
const LinearSystem<States, Inputs, Outputs>& plant,
const std::array<double, States>& Qelems,
const std::array<double, Inputs>& Relems, units::second_t dt)
: LinearQuadraticRegulatorImpl(plant.A(), plant.B(), Qelems, 1.0, Relems,
dt) {}
/**
* Constructs a controller with the given coefficients and plant.
*
* @param plant The plant being controlled.
* @param Qelems The maximum desired error tolerance for each state.
* @param rho A weighting factor that balances control effort and state
* excursion. Greater values penalize state excursion more heavily. 1 is a
* good starting value.
* @param Relems The maximum desired control effort for each input.
* @param dt Discretization timestep.
*/
template <int Outputs>
LinearQuadraticRegulatorImpl(
const LinearSystem<States, Inputs, Outputs>& plant,
const std::array<double, States>& Qelems, const double rho,
const std::array<double, Inputs>& Relems, units::second_t dt)
: LinearQuadraticRegulatorImpl(plant.A(), plant.B(), Qelems, rho, Relems,
dt) {}
: LinearQuadraticRegulatorImpl(plant.A(), plant.B(), Qelems, Relems, dt) {
}
/**
* Constructs a controller with the given coefficients and plant.
@@ -72,9 +53,6 @@ class LinearQuadraticRegulatorImpl {
* @param A Continuous system matrix of the plant being controlled.
* @param B Continuous input matrix of the plant being controlled.
* @param Qelems The maximum desired error tolerance for each state.
* @param rho A weighting factor that balances control effort and state
* excursion. Greater values penalize state excursion more heavily. 1 is a
* good starting value.
* @param Relems The maximum desired control effort for each input.
* @param dt Discretization timestep.
*/
@@ -83,27 +61,7 @@ class LinearQuadraticRegulatorImpl {
const std::array<double, States>& Qelems,
const std::array<double, Inputs>& Relems,
units::second_t dt)
: LinearQuadraticRegulatorImpl(A, B, Qelems, 1.0, Relems, dt) {}
/**
* Constructs a controller with the given coefficients and plant.
*
* @param A Continuous system matrix of the plant being controlled.
* @param B Continuous input matrix of the plant being controlled.
* @param Qelems The maximum desired error tolerance for each state.
* @param rho A weighting factor that balances control effort and state
* excursion. Greater values penalize state excursion more heavily. 1 is a
* good starting value.
* @param Relems The maximum desired control effort for each input.
* @param dt Discretization timestep.
*/
LinearQuadraticRegulatorImpl(const Eigen::Matrix<double, States, States>& A,
const Eigen::Matrix<double, States, Inputs>& B,
const std::array<double, States>& Qelems,
const double rho,
const std::array<double, Inputs>& Relems,
units::second_t dt)
: LinearQuadraticRegulatorImpl(A, B, MakeCostMatrix(Qelems) * rho,
: LinearQuadraticRegulatorImpl(A, B, MakeCostMatrix(Qelems),
MakeCostMatrix(Relems), dt) {}
/**
@@ -244,28 +202,7 @@ class LinearQuadraticRegulator
const std::array<double, States>& Qelems,
const std::array<double, Inputs>& Relems,
units::second_t dt)
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, 1.0, Relems,
dt) {}
/**
* Constructs a controller with the given coefficients and plant.
*
* @param system The plant being controlled.
* @param Qelems The maximum desired error tolerance for each state.
* @param rho A weighting factor that balances control effort and state
* excursion. Greater values penalize state excursion more heavily. 1 is a
* good starting value.
* @param Relems The maximum desired control effort for each input.
* @param dt Discretization timestep.
*/
template <int Outputs>
LinearQuadraticRegulator(const LinearSystem<States, Inputs, Outputs>& plant,
const std::array<double, States>& Qelems,
const double rho,
const std::array<double, Inputs>& Relems,
units::second_t dt)
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, rho, Relems,
dt) {}
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, Relems, dt) {}
/**
* Constructs a controller with the given coefficients and plant.
@@ -273,9 +210,6 @@ class LinearQuadraticRegulator
* @param A Continuous system matrix of the plant being controlled.
* @param B Continuous input matrix of the plant being controlled.
* @param Qelems The maximum desired error tolerance for each state.
* @param rho A weighting factor that balances control effort and state
* excursion. Greater values penalize state excursion more heavily. 1 is a
* good starting value.
* @param Relems The maximum desired control effort for each input.
* @param dt Discretization timestep.
*/
@@ -284,28 +218,8 @@ class LinearQuadraticRegulator
const std::array<double, States>& Qelems,
const std::array<double, Inputs>& Relems,
units::second_t dt)
: LinearQuadraticRegulator(A, B, Qelems, 1.0, Relems, dt) {}
/**
* Constructs a controller with the given coefficients and plant.
*
* @param A Continuous system matrix of the plant being controlled.
* @param B Continuous input matrix of the plant being controlled.
* @param Qelems The maximum desired error tolerance for each state.
* @param rho A weighting factor that balances control effort and state
* excursion. Greater values penalize state excursion more heavily. 1 is a
* good starting value.
* @param Relems The maximum desired control effort for each input.
* @param dt Discretization timestep.
*/
LinearQuadraticRegulator(const Eigen::Matrix<double, States, States>& A,
const Eigen::Matrix<double, States, Inputs>& B,
const std::array<double, States>& Qelems,
const double rho,
const std::array<double, Inputs>& Relems,
units::second_t dt)
: detail::LinearQuadraticRegulatorImpl<States, Inputs>{
A, B, Qelems, rho, Relems, dt} {}
: LinearQuadraticRegulator(A, B, MakeCostMatrix(Qelems),
MakeCostMatrix(Relems), dt) {}
/**
* Constructs a controller with the given coefficients and plant.
@@ -338,17 +252,7 @@ class LinearQuadraticRegulator<1, 1>
const std::array<double, 1>& Qelems,
const std::array<double, 1>& Relems,
units::second_t dt)
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, 1.0, Relems,
dt) {}
template <int Outputs>
LinearQuadraticRegulator(const LinearSystem<1, 1, Outputs>& plant,
const std::array<double, 1>& Qelems,
const double rho,
const std::array<double, 1>& Relems,
units::second_t dt)
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, rho, Relems,
dt) {}
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, Relems, dt) {}
LinearQuadraticRegulator(const Eigen::Matrix<double, 1, 1>& A,
const Eigen::Matrix<double, 1, 1>& B,
@@ -356,13 +260,6 @@ class LinearQuadraticRegulator<1, 1>
const std::array<double, 1>& Relems,
units::second_t dt);
LinearQuadraticRegulator(const Eigen::Matrix<double, 1, 1>& A,
const Eigen::Matrix<double, 1, 1>& B,
const std::array<double, 1>& Qelems,
const double rho,
const std::array<double, 1>& Relems,
units::second_t dt);
LinearQuadraticRegulator(const Eigen::Matrix<double, 1, 1>& A,
const Eigen::Matrix<double, 1, 1>& B,
const Eigen::Matrix<double, 1, 1>& Q,
@@ -384,17 +281,7 @@ class LinearQuadraticRegulator<2, 1>
const std::array<double, 2>& Qelems,
const std::array<double, 1>& Relems,
units::second_t dt)
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, 1.0, Relems,
dt) {}
template <int Outputs>
LinearQuadraticRegulator(const LinearSystem<2, 1, Outputs>& plant,
const std::array<double, 2>& Qelems,
const double rho,
const std::array<double, 1>& Relems,
units::second_t dt)
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, rho, Relems,
dt) {}
: LinearQuadraticRegulator(plant.A(), plant.B(), Qelems, Relems, dt) {}
LinearQuadraticRegulator(const Eigen::Matrix<double, 2, 2>& A,
const Eigen::Matrix<double, 2, 1>& B,
@@ -402,13 +289,6 @@ class LinearQuadraticRegulator<2, 1>
const std::array<double, 1>& Relems,
units::second_t dt);
LinearQuadraticRegulator(const Eigen::Matrix<double, 2, 2>& A,
const Eigen::Matrix<double, 2, 1>& B,
const std::array<double, 2>& Qelems,
const double rho,
const std::array<double, 1>& Relems,
units::second_t dt);
LinearQuadraticRegulator(const Eigen::Matrix<double, 2, 2>& A,
const Eigen::Matrix<double, 2, 1>& B,
const Eigen::Matrix<double, 2, 2>& Q,