mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-25 01:41:43 +00:00
Replace .to<double>() and .template to<double>() with .value() (#3667)
It's a less verbose way to do the same thing.
This commit is contained in:
@@ -166,7 +166,7 @@ class ControlAffinePlantInversionFeedforward {
|
||||
Eigen::Vector<double, Inputs> Calculate(
|
||||
const Eigen::Vector<double, States>& r,
|
||||
const Eigen::Vector<double, States>& nextR) {
|
||||
Eigen::Vector<double, States> rDot = (nextR - r) / m_dt.to<double>();
|
||||
Eigen::Vector<double, States> rDot = (nextR - r) / m_dt.value();
|
||||
|
||||
m_uff = m_B.householderQr().solve(
|
||||
rDot - m_f(r, Eigen::Vector<double, Inputs>::Zero()));
|
||||
|
||||
@@ -193,8 +193,8 @@ class ProfiledPIDController
|
||||
* @param maximumInput The maximum value expected from the input.
|
||||
*/
|
||||
void EnableContinuousInput(Distance_t minimumInput, Distance_t maximumInput) {
|
||||
m_controller.EnableContinuousInput(minimumInput.template to<double>(),
|
||||
maximumInput.template to<double>());
|
||||
m_controller.EnableContinuousInput(minimumInput.value(),
|
||||
maximumInput.value());
|
||||
m_minimumInput = minimumInput;
|
||||
m_maximumInput = maximumInput;
|
||||
}
|
||||
@@ -227,8 +227,8 @@ class ProfiledPIDController
|
||||
void SetTolerance(
|
||||
Distance_t positionTolerance,
|
||||
Velocity_t velocityTolerance = std::numeric_limits<double>::infinity()) {
|
||||
m_controller.SetTolerance(positionTolerance.template to<double>(),
|
||||
velocityTolerance.template to<double>());
|
||||
m_controller.SetTolerance(positionTolerance.value(),
|
||||
velocityTolerance.value());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -273,8 +273,8 @@ class ProfiledPIDController
|
||||
|
||||
frc::TrapezoidProfile<Distance> profile{m_constraints, m_goal, m_setpoint};
|
||||
m_setpoint = profile.Calculate(GetPeriod());
|
||||
return m_controller.Calculate(measurement.template to<double>(),
|
||||
m_setpoint.position.template to<double>());
|
||||
return m_controller.Calculate(measurement.value(),
|
||||
m_setpoint.position.value());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -351,7 +351,7 @@ class ProfiledPIDController
|
||||
builder.AddDoubleProperty(
|
||||
"d", [this] { return GetD(); }, [this](double value) { SetD(value); });
|
||||
builder.AddDoubleProperty(
|
||||
"goal", [this] { return GetGoal().position.template to<double>(); },
|
||||
"goal", [this] { return GetGoal().position.value(); },
|
||||
[this](double value) { SetGoal(Distance_t{value}); });
|
||||
}
|
||||
|
||||
|
||||
@@ -70,10 +70,10 @@ class SimpleMotorFeedforward {
|
||||
auto plant = LinearSystemId::IdentifyVelocitySystem<Distance>(kV, kA);
|
||||
LinearPlantInversionFeedforward<1, 1> feedforward{plant, dt};
|
||||
|
||||
Eigen::Vector<double, 1> r{currentVelocity.template to<double>()};
|
||||
Eigen::Vector<double, 1> nextR{nextVelocity.template to<double>()};
|
||||
Eigen::Vector<double, 1> r{currentVelocity.value()};
|
||||
Eigen::Vector<double, 1> nextR{nextVelocity.value()};
|
||||
|
||||
return kS * wpi::sgn(currentVelocity.template to<double>()) +
|
||||
return kS * wpi::sgn(currentVelocity.value()) +
|
||||
units::volt_t{feedforward.Calculate(r, nextR)(0)};
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ Eigen::Vector<double, States> AngleResidual(
|
||||
const Eigen::Vector<double, States>& b, int angleStateIdx) {
|
||||
Eigen::Vector<double, States> ret = a - b;
|
||||
ret[angleStateIdx] =
|
||||
AngleModulus(units::radian_t{ret[angleStateIdx]}).to<double>();
|
||||
AngleModulus(units::radian_t{ret[angleStateIdx]}).value();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -269,11 +269,10 @@ class SwerveDrivePoseEstimator {
|
||||
Translation2d(chassisSpeeds.vx * 1_s, chassisSpeeds.vy * 1_s)
|
||||
.RotateBy(angle);
|
||||
|
||||
Eigen::Vector<double, 3> u{fieldRelativeSpeeds.X().template to<double>(),
|
||||
fieldRelativeSpeeds.Y().template to<double>(),
|
||||
omega.template to<double>()};
|
||||
Eigen::Vector<double, 3> u{fieldRelativeSpeeds.X().value(),
|
||||
fieldRelativeSpeeds.Y().value(), omega.value()};
|
||||
|
||||
Eigen::Vector<double, 1> localY{angle.Radians().template to<double>()};
|
||||
Eigen::Vector<double, 1> localY{angle.Radians().value()};
|
||||
m_previousAngle = angle;
|
||||
|
||||
m_latencyCompensator.AddObserverState(m_observer, u, localY, currentTime);
|
||||
|
||||
@@ -125,7 +125,7 @@ class LinearFilter {
|
||||
*/
|
||||
static LinearFilter<T> SinglePoleIIR(double timeConstant,
|
||||
units::second_t period) {
|
||||
double gain = std::exp(-period.to<double>() / timeConstant);
|
||||
double gain = std::exp(-period.value() / timeConstant);
|
||||
return LinearFilter({1.0 - gain}, {-gain});
|
||||
}
|
||||
|
||||
@@ -144,7 +144,7 @@ class LinearFilter {
|
||||
* user.
|
||||
*/
|
||||
static LinearFilter<T> HighPass(double timeConstant, units::second_t period) {
|
||||
double gain = std::exp(-period.to<double>() / timeConstant);
|
||||
double gain = std::exp(-period.value() / timeConstant);
|
||||
return LinearFilter({gain, -gain}, {-gain});
|
||||
}
|
||||
|
||||
@@ -225,7 +225,7 @@ class LinearFilter {
|
||||
}
|
||||
|
||||
Eigen::Vector<double, Samples> a =
|
||||
S.householderQr().solve(d) / std::pow(period.to<double>(), Derivative);
|
||||
S.householderQr().solve(d) / std::pow(period.value(), Derivative);
|
||||
|
||||
// Reverse gains list
|
||||
std::vector<double> gains;
|
||||
|
||||
@@ -65,8 +65,8 @@ class SwerveDriveKinematics {
|
||||
for (size_t i = 0; i < NumModules; i++) {
|
||||
// clang-format off
|
||||
m_inverseKinematics.template block<2, 3>(i * 2, 0) <<
|
||||
1, 0, (-m_modules[i].Y()).template to<double>(),
|
||||
0, 1, (+m_modules[i].X()).template to<double>();
|
||||
1, 0, (-m_modules[i].Y()).value(),
|
||||
0, 1, (+m_modules[i].X()).value();
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
@@ -82,8 +82,8 @@ class SwerveDriveKinematics {
|
||||
for (size_t i = 0; i < NumModules; i++) {
|
||||
// clang-format off
|
||||
m_inverseKinematics.template block<2, 3>(i * 2, 0) <<
|
||||
1, 0, (-m_modules[i].Y()).template to<double>(),
|
||||
0, 1, (+m_modules[i].X()).template to<double>();
|
||||
1, 0, (-m_modules[i].Y()).value(),
|
||||
0, 1, (+m_modules[i].X()).value();
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
|
||||
@@ -26,16 +26,16 @@ SwerveDriveKinematics<NumModules>::ToSwerveModuleStates(
|
||||
// clang-format off
|
||||
m_inverseKinematics.template block<2, 3>(i * 2, 0) =
|
||||
Eigen::Matrix<double, 2, 3>{
|
||||
{1, 0, (-m_modules[i].Y() + centerOfRotation.Y()).template to<double>()},
|
||||
{0, 1, (+m_modules[i].X() - centerOfRotation.X()).template to<double>()}};
|
||||
{1, 0, (-m_modules[i].Y() + centerOfRotation.Y()).value()},
|
||||
{0, 1, (+m_modules[i].X() - centerOfRotation.X()).value()}};
|
||||
// clang-format on
|
||||
}
|
||||
m_previousCoR = centerOfRotation;
|
||||
}
|
||||
|
||||
Eigen::Vector3d chassisSpeedsVector{chassisSpeeds.vx.to<double>(),
|
||||
chassisSpeeds.vy.to<double>(),
|
||||
chassisSpeeds.omega.to<double>()};
|
||||
Eigen::Vector3d chassisSpeedsVector{chassisSpeeds.vx.value(),
|
||||
chassisSpeeds.vy.value(),
|
||||
chassisSpeeds.omega.value()};
|
||||
|
||||
Eigen::Matrix<double, NumModules * 2, 1> moduleStatesMatrix =
|
||||
m_inverseKinematics * chassisSpeedsVector;
|
||||
@@ -46,7 +46,7 @@ SwerveDriveKinematics<NumModules>::ToSwerveModuleStates(
|
||||
units::meters_per_second_t y{moduleStatesMatrix(i * 2 + 1, 0)};
|
||||
|
||||
auto speed = units::math::hypot(x, y);
|
||||
Rotation2d rotation{x.to<double>(), y.to<double>()};
|
||||
Rotation2d rotation{x.value(), y.value()};
|
||||
|
||||
moduleStates[i] = {speed, rotation};
|
||||
}
|
||||
@@ -74,10 +74,9 @@ ChassisSpeeds SwerveDriveKinematics<NumModules>::ToChassisSpeeds(
|
||||
|
||||
for (size_t i = 0; i < NumModules; ++i) {
|
||||
SwerveModuleState module = moduleStates[i];
|
||||
moduleStatesMatrix(i * 2, 0) =
|
||||
module.speed.to<double>() * module.angle.Cos();
|
||||
moduleStatesMatrix(i * 2, 0) = module.speed.value() * module.angle.Cos();
|
||||
moduleStatesMatrix(i * 2 + 1, 0) =
|
||||
module.speed.to<double>() * module.angle.Sin();
|
||||
module.speed.value() * module.angle.Sin();
|
||||
}
|
||||
|
||||
Eigen::Vector3d chassisSpeedsVector =
|
||||
|
||||
@@ -109,8 +109,7 @@ class Spline {
|
||||
* @return The vector.
|
||||
*/
|
||||
static Eigen::Vector2d ToVector(const Translation2d& translation) {
|
||||
return Eigen::Vector2d{translation.X().to<double>(),
|
||||
translation.Y().to<double>()};
|
||||
return Eigen::Vector2d{translation.X().value(), translation.Y().value()};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -80,14 +80,14 @@ class WPILIB_DLLEXPORT SplineHelper {
|
||||
private:
|
||||
static Spline<3>::ControlVector CubicControlVector(double scalar,
|
||||
const Pose2d& point) {
|
||||
return {{point.X().to<double>(), scalar * point.Rotation().Cos()},
|
||||
{point.Y().to<double>(), scalar * point.Rotation().Sin()}};
|
||||
return {{point.X().value(), scalar * point.Rotation().Cos()},
|
||||
{point.Y().value(), scalar * point.Rotation().Sin()}};
|
||||
}
|
||||
|
||||
static Spline<5>::ControlVector QuinticControlVector(double scalar,
|
||||
const Pose2d& point) {
|
||||
return {{point.X().to<double>(), scalar * point.Rotation().Cos(), 0.0},
|
||||
{point.Y().to<double>(), scalar * point.Rotation().Sin(), 0.0}};
|
||||
return {{point.X().value(), scalar * point.Rotation().Cos(), 0.0},
|
||||
{point.Y().value(), scalar * point.Rotation().Sin(), 0.0}};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -21,7 +21,7 @@ template <int States>
|
||||
void DiscretizeA(const Eigen::Matrix<double, States, States>& contA,
|
||||
units::second_t dt,
|
||||
Eigen::Matrix<double, States, States>* discA) {
|
||||
*discA = (contA * dt.to<double>()).exp();
|
||||
*discA = (contA * dt.value()).exp();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,8 +42,8 @@ void DiscretizeAB(const Eigen::Matrix<double, States, States>& contA,
|
||||
// Matrices are blocked here to minimize matrix exponentiation calculations
|
||||
Eigen::Matrix<double, States + Inputs, States + Inputs> Mcont;
|
||||
Mcont.setZero();
|
||||
Mcont.template block<States, States>(0, 0) = contA * dt.to<double>();
|
||||
Mcont.template block<States, Inputs>(0, States) = contB * dt.to<double>();
|
||||
Mcont.template block<States, States>(0, 0) = contA * dt.value();
|
||||
Mcont.template block<States, Inputs>(0, States) = contB * dt.value();
|
||||
|
||||
// Discretize A and B with the given timestep
|
||||
Eigen::Matrix<double, States + Inputs, States + Inputs> Mdisc = Mcont.exp();
|
||||
@@ -76,8 +76,7 @@ void DiscretizeAQ(const Eigen::Matrix<double, States, States>& contA,
|
||||
M.template block<States, States>(States, 0).setZero();
|
||||
M.template block<States, States>(States, States) = contA.transpose();
|
||||
|
||||
Eigen::Matrix<double, 2 * States, 2 * States> phi =
|
||||
(M * dt.to<double>()).exp();
|
||||
Eigen::Matrix<double, 2 * States, 2 * States> phi = (M * dt.value()).exp();
|
||||
|
||||
// Phi12 = phi[0:States, States:2*States]
|
||||
// Phi22 = phi[States:2*States, States:2*States]
|
||||
@@ -122,7 +121,7 @@ void DiscretizeAQTaylor(const Eigen::Matrix<double, States, States>& contA,
|
||||
Eigen::Matrix<double, States, States> Q = (contQ + contQ.transpose()) / 2.0;
|
||||
|
||||
Eigen::Matrix<double, States, States> lastTerm = Q;
|
||||
double lastCoeff = dt.to<double>();
|
||||
double lastCoeff = dt.value();
|
||||
|
||||
// Aᵀⁿ
|
||||
Eigen::Matrix<double, States, States> Atn = contA.transpose();
|
||||
@@ -132,7 +131,7 @@ void DiscretizeAQTaylor(const Eigen::Matrix<double, States, States>& contA,
|
||||
// i = 6 i.e. 5th order should be enough precision
|
||||
for (int i = 2; i < 6; ++i) {
|
||||
lastTerm = -contA * lastTerm + Q * Atn;
|
||||
lastCoeff *= dt.to<double>() / static_cast<double>(i);
|
||||
lastCoeff *= dt.value() / static_cast<double>(i);
|
||||
|
||||
phi12 += lastTerm * lastCoeff;
|
||||
|
||||
@@ -156,7 +155,7 @@ void DiscretizeAQTaylor(const Eigen::Matrix<double, States, States>& contA,
|
||||
template <int Outputs>
|
||||
Eigen::Matrix<double, Outputs, Outputs> DiscretizeR(
|
||||
const Eigen::Matrix<double, Outputs, Outputs>& R, units::second_t dt) {
|
||||
return R / dt.to<double>();
|
||||
return R / dt.value();
|
||||
}
|
||||
|
||||
} // namespace frc
|
||||
|
||||
@@ -50,8 +50,7 @@ class LinearSystemLoop {
|
||||
: LinearSystemLoop(
|
||||
plant, controller, observer,
|
||||
[=](const Eigen::Vector<double, Inputs>& u) {
|
||||
return frc::NormalizeInputVector<Inputs>(
|
||||
u, maxVoltage.template to<double>());
|
||||
return frc::NormalizeInputVector<Inputs>(u, maxVoltage.value());
|
||||
},
|
||||
dt) {}
|
||||
|
||||
@@ -97,7 +96,7 @@ class LinearSystemLoop {
|
||||
: LinearSystemLoop(controller, feedforward, observer,
|
||||
[=](const Eigen::Vector<double, Inputs>& u) {
|
||||
return frc::NormalizeInputVector<Inputs>(
|
||||
u, maxVoltage.template to<double>());
|
||||
u, maxVoltage.value());
|
||||
}) {}
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace frc {
|
||||
*/
|
||||
template <typename F, typename T>
|
||||
T RK4(F&& f, T x, units::second_t dt) {
|
||||
const auto h = dt.to<double>();
|
||||
const auto h = dt.value();
|
||||
|
||||
T k1 = f(x);
|
||||
T k2 = f(x + h * 0.5 * k1);
|
||||
@@ -43,7 +43,7 @@ T RK4(F&& f, T x, units::second_t dt) {
|
||||
*/
|
||||
template <typename F, typename T, typename U>
|
||||
T RK4(F&& f, T x, U u, units::second_t dt) {
|
||||
const auto h = dt.to<double>();
|
||||
const auto h = dt.value();
|
||||
|
||||
T k1 = f(x, u);
|
||||
T k2 = f(x + h * 0.5 * k1, u);
|
||||
@@ -91,13 +91,13 @@ T RKF45(F&& f, T x, U u, units::second_t dt, double maxError = 1e-6) {
|
||||
double truncationError;
|
||||
|
||||
double dtElapsed = 0.0;
|
||||
double h = dt.to<double>();
|
||||
double h = dt.value();
|
||||
|
||||
// Loop until we've gotten to our desired dt
|
||||
while (dtElapsed < dt.to<double>()) {
|
||||
while (dtElapsed < dt.value()) {
|
||||
do {
|
||||
// Only allow us to advance up to the dt remaining
|
||||
h = std::min(h, dt.to<double>() - dtElapsed);
|
||||
h = std::min(h, dt.value() - dtElapsed);
|
||||
|
||||
// Notice how the derivative in the Wikipedia notation is dy/dx.
|
||||
// That means their y is our x and their x is our t
|
||||
@@ -167,13 +167,13 @@ T RKDP(F&& f, T x, U u, units::second_t dt, double maxError = 1e-6) {
|
||||
double truncationError;
|
||||
|
||||
double dtElapsed = 0.0;
|
||||
double h = dt.to<double>();
|
||||
double h = dt.value();
|
||||
|
||||
// Loop until we've gotten to our desired dt
|
||||
while (dtElapsed < dt.to<double>()) {
|
||||
while (dtElapsed < dt.value()) {
|
||||
do {
|
||||
// Only allow us to advance up to the dt remaining
|
||||
h = std::min(h, dt.to<double>() - dtElapsed);
|
||||
h = std::min(h, dt.value() - dtElapsed);
|
||||
|
||||
// clang-format off
|
||||
T k1 = f(x, u);
|
||||
|
||||
@@ -47,9 +47,9 @@ class WPILIB_DLLEXPORT LinearSystemId {
|
||||
{0.0, 1.0},
|
||||
{0.0, (-std::pow(G, 2) * motor.Kt /
|
||||
(motor.R * units::math::pow<2>(r) * m * motor.Kv))
|
||||
.to<double>()}};
|
||||
Eigen::Matrix<double, 2, 1> B{
|
||||
0.0, (G * motor.Kt / (motor.R * r * m)).to<double>()};
|
||||
.value()}};
|
||||
Eigen::Matrix<double, 2, 1> B{0.0,
|
||||
(G * motor.Kt / (motor.R * r * m)).value()};
|
||||
Eigen::Matrix<double, 1, 2> C{1.0, 0.0};
|
||||
Eigen::Matrix<double, 1, 1> D{0.0};
|
||||
|
||||
@@ -71,10 +71,8 @@ class WPILIB_DLLEXPORT LinearSystemId {
|
||||
DCMotor motor, units::kilogram_square_meter_t J, double G) {
|
||||
Eigen::Matrix<double, 2, 2> A{
|
||||
{0.0, 1.0},
|
||||
{0.0,
|
||||
(-std::pow(G, 2) * motor.Kt / (motor.Kv * motor.R * J)).to<double>()}};
|
||||
Eigen::Matrix<double, 2, 1> B{0.0,
|
||||
(G * motor.Kt / (motor.R * J)).to<double>()};
|
||||
{0.0, (-std::pow(G, 2) * motor.Kt / (motor.Kv * motor.R * J)).value()}};
|
||||
Eigen::Matrix<double, 2, 1> B{0.0, (G * motor.Kt / (motor.R * J)).value()};
|
||||
Eigen::Matrix<double, 1, 2> C{1.0, 0.0};
|
||||
Eigen::Matrix<double, 1, 1> D{0.0};
|
||||
|
||||
@@ -107,9 +105,8 @@ class WPILIB_DLLEXPORT LinearSystemId {
|
||||
static LinearSystem<1, 1, 1> IdentifyVelocitySystem(
|
||||
decltype(1_V / Velocity_t<Distance>(1)) kV,
|
||||
decltype(1_V / Acceleration_t<Distance>(1)) kA) {
|
||||
Eigen::Matrix<double, 1, 1> A{-kV.template to<double>() /
|
||||
kA.template to<double>()};
|
||||
Eigen::Matrix<double, 1, 1> B{1.0 / kA.template to<double>()};
|
||||
Eigen::Matrix<double, 1, 1> A{-kV.value() / kA.value()};
|
||||
Eigen::Matrix<double, 1, 1> B{1.0 / kA.value()};
|
||||
Eigen::Matrix<double, 1, 1> C{1.0};
|
||||
Eigen::Matrix<double, 1, 1> D{0.0};
|
||||
|
||||
@@ -142,10 +139,8 @@ class WPILIB_DLLEXPORT LinearSystemId {
|
||||
static LinearSystem<2, 1, 1> IdentifyPositionSystem(
|
||||
decltype(1_V / Velocity_t<Distance>(1)) kV,
|
||||
decltype(1_V / Acceleration_t<Distance>(1)) kA) {
|
||||
Eigen::Matrix<double, 2, 2> A{
|
||||
{0.0, 1.0},
|
||||
{0.0, -kV.template to<double>() / kA.template to<double>()}};
|
||||
Eigen::Matrix<double, 2, 1> B{0.0, 1.0 / kA.template to<double>()};
|
||||
Eigen::Matrix<double, 2, 2> A{{0.0, 1.0}, {0.0, -kV.value() / kA.value()}};
|
||||
Eigen::Matrix<double, 2, 1> B{0.0, 1.0 / kA.value()};
|
||||
Eigen::Matrix<double, 1, 2> C{1.0, 0.0};
|
||||
Eigen::Matrix<double, 1, 1> D{0.0};
|
||||
|
||||
@@ -170,12 +165,12 @@ class WPILIB_DLLEXPORT LinearSystemId {
|
||||
static LinearSystem<2, 2, 2> IdentifyDrivetrainSystem(
|
||||
decltype(1_V / 1_mps) kVlinear, decltype(1_V / 1_mps_sq) kAlinear,
|
||||
decltype(1_V / 1_mps) kVangular, decltype(1_V / 1_mps_sq) kAangular) {
|
||||
double A1 = -(kVlinear.to<double>() / kAlinear.to<double>() +
|
||||
kVangular.to<double>() / kAangular.to<double>());
|
||||
double A2 = -(kVlinear.to<double>() / kAlinear.to<double>() -
|
||||
kVangular.to<double>() / kAangular.to<double>());
|
||||
double B1 = 1.0 / kAlinear.to<double>() + 1.0 / kAangular.to<double>();
|
||||
double B2 = 1.0 / kAlinear.to<double>() - 1.0 / kAangular.to<double>();
|
||||
double A1 = -(kVlinear.value() / kAlinear.value() +
|
||||
kVangular.value() / kAangular.value());
|
||||
double A2 = -(kVlinear.value() / kAlinear.value() -
|
||||
kVangular.value() / kAangular.value());
|
||||
double B1 = 1.0 / kAlinear.value() + 1.0 / kAangular.value();
|
||||
double B2 = 1.0 / kAlinear.value() - 1.0 / kAangular.value();
|
||||
|
||||
Eigen::Matrix<double, 2, 2> A =
|
||||
0.5 * Eigen::Matrix<double, 2, 2>{{A1, A2}, {A2, A1}};
|
||||
@@ -239,8 +234,8 @@ class WPILIB_DLLEXPORT LinearSystemId {
|
||||
units::kilogram_square_meter_t J,
|
||||
double G) {
|
||||
Eigen::Matrix<double, 1, 1> A{
|
||||
(-std::pow(G, 2) * motor.Kt / (motor.Kv * motor.R * J)).to<double>()};
|
||||
Eigen::Matrix<double, 1, 1> B{(G * motor.Kt / (motor.R * J)).to<double>()};
|
||||
(-std::pow(G, 2) * motor.Kt / (motor.Kv * motor.R * J)).value()};
|
||||
Eigen::Matrix<double, 1, 1> B{(G * motor.Kt / (motor.R * J)).value()};
|
||||
Eigen::Matrix<double, 1, 1> C{1.0};
|
||||
Eigen::Matrix<double, 1, 1> D{0.0};
|
||||
|
||||
@@ -269,15 +264,15 @@ class WPILIB_DLLEXPORT LinearSystemId {
|
||||
auto C2 = G * motor.Kt / (motor.R * r);
|
||||
|
||||
Eigen::Matrix<double, 2, 2> A{
|
||||
{((1 / m + units::math::pow<2>(rb) / J) * C1).to<double>(),
|
||||
((1 / m - units::math::pow<2>(rb) / J) * C1).to<double>()},
|
||||
{((1 / m - units::math::pow<2>(rb) / J) * C1).to<double>(),
|
||||
((1 / m + units::math::pow<2>(rb) / J) * C1).to<double>()}};
|
||||
{((1 / m + units::math::pow<2>(rb) / J) * C1).value(),
|
||||
((1 / m - units::math::pow<2>(rb) / J) * C1).value()},
|
||||
{((1 / m - units::math::pow<2>(rb) / J) * C1).value(),
|
||||
((1 / m + units::math::pow<2>(rb) / J) * C1).value()}};
|
||||
Eigen::Matrix<double, 2, 2> B{
|
||||
{((1 / m + units::math::pow<2>(rb) / J) * C2).to<double>(),
|
||||
((1 / m - units::math::pow<2>(rb) / J) * C2).to<double>()},
|
||||
{((1 / m - units::math::pow<2>(rb) / J) * C2).to<double>(),
|
||||
((1 / m + units::math::pow<2>(rb) / J) * C2).to<double>()}};
|
||||
{((1 / m + units::math::pow<2>(rb) / J) * C2).value(),
|
||||
((1 / m - units::math::pow<2>(rb) / J) * C2).value()},
|
||||
{((1 / m - units::math::pow<2>(rb) / J) * C2).value(),
|
||||
((1 / m + units::math::pow<2>(rb) / J) * C2).value()}};
|
||||
Eigen::Matrix<double, 2, 2> C{{1.0, 0.0}, {0.0, 1.0}};
|
||||
Eigen::Matrix<double, 2, 2> D{{0.0, 0.0}, {0.0, 0.0}};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user