mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-22 01:11:42 +00:00
[wpiunits] Java units API rewrite (#6958)
Java generics are too limited to do what we need. This refactors generic code previously in Unit and Measure into unit-specific classes that can have unit-safe math operations (notably, times and divide) that can return values in known units instead of a wildcarded Measure<?>. Unit-specific measure implementations are automatically generated by ./wpiunits/generate_units.py, which generates generic interfaces and mutable and immutable implementations of those interfaces. These make up the bulk of the diff of this PR (approximately 9300 LOC). This also adds units for angular and linear velocities, accelerations, and momenta; moment of inertia; and torque.
This commit is contained in:
@@ -4,11 +4,10 @@
|
||||
|
||||
package edu.wpi.first.wpilibj2.command;
|
||||
|
||||
import static edu.wpi.first.units.Units.Second;
|
||||
import static edu.wpi.first.units.Units.Seconds;
|
||||
import static edu.wpi.first.util.ErrorMessages.requireNonNullParam;
|
||||
|
||||
import edu.wpi.first.units.Measure;
|
||||
import edu.wpi.first.units.Time;
|
||||
import edu.wpi.first.units.measure.Time;
|
||||
import edu.wpi.first.util.function.BooleanConsumer;
|
||||
import edu.wpi.first.util.sendable.Sendable;
|
||||
import edu.wpi.first.util.sendable.SendableBuilder;
|
||||
@@ -179,8 +178,8 @@ public abstract class Command implements Sendable {
|
||||
* @param time the timeout duration
|
||||
* @return the command with the timeout added
|
||||
*/
|
||||
public ParallelRaceGroup withTimeout(Measure<Time> time) {
|
||||
return withTimeout(time.in(Second));
|
||||
public ParallelRaceGroup withTimeout(Time time) {
|
||||
return withTimeout(time.in(Seconds));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -6,8 +6,7 @@ package edu.wpi.first.wpilibj2.command;
|
||||
|
||||
import static edu.wpi.first.util.ErrorMessages.requireNonNullParam;
|
||||
|
||||
import edu.wpi.first.units.Measure;
|
||||
import edu.wpi.first.units.Time;
|
||||
import edu.wpi.first.units.measure.Time;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.BooleanSupplier;
|
||||
@@ -137,7 +136,7 @@ public final class Commands {
|
||||
* @return the command
|
||||
* @see WaitCommand
|
||||
*/
|
||||
public static Command waitTime(Measure<Time> time) {
|
||||
public static Command waitTime(Time time) {
|
||||
return new WaitCommand(time);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,9 +19,7 @@ import edu.wpi.first.math.kinematics.MecanumDriveKinematics;
|
||||
import edu.wpi.first.math.kinematics.MecanumDriveMotorVoltages;
|
||||
import edu.wpi.first.math.kinematics.MecanumDriveWheelSpeeds;
|
||||
import edu.wpi.first.math.trajectory.Trajectory;
|
||||
import edu.wpi.first.units.Distance;
|
||||
import edu.wpi.first.units.MutableMeasure;
|
||||
import edu.wpi.first.units.Velocity;
|
||||
import edu.wpi.first.units.measure.MutLinearVelocity;
|
||||
import edu.wpi.first.wpilibj.Timer;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
@@ -60,22 +58,14 @@ public class MecanumControllerCommand extends Command {
|
||||
private final Supplier<MecanumDriveWheelSpeeds> m_currentWheelSpeeds;
|
||||
private final Consumer<MecanumDriveMotorVoltages> m_outputDriveVoltages;
|
||||
private final Consumer<MecanumDriveWheelSpeeds> m_outputWheelSpeeds;
|
||||
private final MutableMeasure<Velocity<Distance>> m_prevFrontLeftSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_prevRearLeftSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_prevFrontRightSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_prevRearRightSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_frontLeftSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_rearLeftSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_frontRightSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_rearRightSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutLinearVelocity m_prevFrontLeftSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_prevRearLeftSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_prevFrontRightSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_prevRearRightSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_frontLeftSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_rearLeftSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_frontRightSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_rearRightSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
|
||||
/**
|
||||
* Constructs a new MecanumControllerCommand that when executed will follow the provided
|
||||
|
||||
@@ -16,9 +16,7 @@ import edu.wpi.first.math.kinematics.ChassisSpeeds;
|
||||
import edu.wpi.first.math.kinematics.DifferentialDriveKinematics;
|
||||
import edu.wpi.first.math.kinematics.DifferentialDriveWheelSpeeds;
|
||||
import edu.wpi.first.math.trajectory.Trajectory;
|
||||
import edu.wpi.first.units.Distance;
|
||||
import edu.wpi.first.units.MutableMeasure;
|
||||
import edu.wpi.first.units.Velocity;
|
||||
import edu.wpi.first.units.measure.MutLinearVelocity;
|
||||
import edu.wpi.first.util.sendable.SendableBuilder;
|
||||
import edu.wpi.first.wpilibj.Timer;
|
||||
import java.util.function.BiConsumer;
|
||||
@@ -51,14 +49,10 @@ public class RamseteCommand extends Command {
|
||||
private final PIDController m_rightController;
|
||||
private final BiConsumer<Double, Double> m_output;
|
||||
private DifferentialDriveWheelSpeeds m_prevSpeeds = new DifferentialDriveWheelSpeeds();
|
||||
private final MutableMeasure<Velocity<Distance>> m_prevLeftSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_prevRightSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_leftSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutableMeasure<Velocity<Distance>> m_rightSpeedSetpoint =
|
||||
MutableMeasure.zero(MetersPerSecond);
|
||||
private final MutLinearVelocity m_prevLeftSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_prevRightSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_leftSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private final MutLinearVelocity m_rightSpeedSetpoint = MetersPerSecond.mutable(0);
|
||||
private double m_prevTime;
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,10 +4,9 @@
|
||||
|
||||
package edu.wpi.first.wpilibj2.command;
|
||||
|
||||
import static edu.wpi.first.units.Units.Second;
|
||||
import static edu.wpi.first.units.Units.Seconds;
|
||||
|
||||
import edu.wpi.first.units.Measure;
|
||||
import edu.wpi.first.units.Time;
|
||||
import edu.wpi.first.units.measure.Time;
|
||||
import edu.wpi.first.util.sendable.SendableBuilder;
|
||||
import edu.wpi.first.util.sendable.SendableRegistry;
|
||||
import edu.wpi.first.wpilibj.Timer;
|
||||
@@ -39,8 +38,8 @@ public class WaitCommand extends Command {
|
||||
*
|
||||
* @param time the time to wait
|
||||
*/
|
||||
public WaitCommand(Measure<Time> time) {
|
||||
this(time.in(Second));
|
||||
public WaitCommand(Time time) {
|
||||
this(time.in(Seconds));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -4,17 +4,16 @@
|
||||
|
||||
package edu.wpi.first.wpilibj2.command.sysid;
|
||||
|
||||
import static edu.wpi.first.units.MutableMeasure.mutable;
|
||||
import static edu.wpi.first.units.Units.Second;
|
||||
import static edu.wpi.first.units.Units.Seconds;
|
||||
import static edu.wpi.first.units.Units.Volts;
|
||||
import static java.util.Map.entry;
|
||||
|
||||
import edu.wpi.first.units.Measure;
|
||||
import edu.wpi.first.units.MutableMeasure;
|
||||
import edu.wpi.first.units.Time;
|
||||
import edu.wpi.first.units.Velocity;
|
||||
import edu.wpi.first.units.Voltage;
|
||||
import edu.wpi.first.units.VoltageUnit;
|
||||
import edu.wpi.first.units.measure.MutVoltage;
|
||||
import edu.wpi.first.units.measure.Time;
|
||||
import edu.wpi.first.units.measure.Velocity;
|
||||
import edu.wpi.first.units.measure.Voltage;
|
||||
import edu.wpi.first.wpilibj.Timer;
|
||||
import edu.wpi.first.wpilibj.sysid.SysIdRoutineLog;
|
||||
import edu.wpi.first.wpilibj2.command.Command;
|
||||
@@ -43,7 +42,7 @@ import java.util.function.Consumer;
|
||||
public class SysIdRoutine extends SysIdRoutineLog {
|
||||
private final Config m_config;
|
||||
private final Mechanism m_mechanism;
|
||||
private final MutableMeasure<Voltage> m_outputVolts = mutable(Volts.of(0));
|
||||
private final MutVoltage m_outputVolts = Volts.mutable(0);
|
||||
private final Consumer<State> m_recordState;
|
||||
|
||||
/**
|
||||
@@ -62,13 +61,13 @@ public class SysIdRoutine extends SysIdRoutineLog {
|
||||
/** Hardware-independent configuration for a SysId test routine. */
|
||||
public static class Config {
|
||||
/** The voltage ramp rate used for quasistatic test routines. */
|
||||
public final Measure<Velocity<Voltage>> m_rampRate;
|
||||
public final Velocity<VoltageUnit> m_rampRate;
|
||||
|
||||
/** The step voltage output used for dynamic test routines. */
|
||||
public final Measure<Voltage> m_stepVoltage;
|
||||
public final Voltage m_stepVoltage;
|
||||
|
||||
/** Safety timeout for the test routine commands. */
|
||||
public final Measure<Time> m_timeout;
|
||||
public final Time m_timeout;
|
||||
|
||||
/** Optional handle for recording test state in a third-party logging solution. */
|
||||
public final Consumer<State> m_recordState;
|
||||
@@ -87,11 +86,11 @@ public class SysIdRoutine extends SysIdRoutineLog {
|
||||
* logged in WPILog.
|
||||
*/
|
||||
public Config(
|
||||
Measure<Velocity<Voltage>> rampRate,
|
||||
Measure<Voltage> stepVoltage,
|
||||
Measure<Time> timeout,
|
||||
Velocity<VoltageUnit> rampRate,
|
||||
Voltage stepVoltage,
|
||||
Time timeout,
|
||||
Consumer<State> recordState) {
|
||||
m_rampRate = rampRate != null ? rampRate : Volts.of(1).per(Seconds.of(1));
|
||||
m_rampRate = rampRate != null ? rampRate : Volts.of(1).per(Second);
|
||||
m_stepVoltage = stepVoltage != null ? stepVoltage : Volts.of(7);
|
||||
m_timeout = timeout != null ? timeout : Seconds.of(10);
|
||||
m_recordState = recordState;
|
||||
@@ -107,8 +106,7 @@ public class SysIdRoutine extends SysIdRoutineLog {
|
||||
* @param timeout Safety timeout for the test routine commands. Defaults to 10 seconds if left
|
||||
* null.
|
||||
*/
|
||||
public Config(
|
||||
Measure<Velocity<Voltage>> rampRate, Measure<Voltage> stepVoltage, Measure<Time> timeout) {
|
||||
public Config(Velocity<VoltageUnit> rampRate, Voltage stepVoltage, Time timeout) {
|
||||
this(rampRate, stepVoltage, timeout, null);
|
||||
}
|
||||
|
||||
@@ -132,7 +130,7 @@ public class SysIdRoutine extends SysIdRoutineLog {
|
||||
*/
|
||||
public static class Mechanism {
|
||||
/** Sends the SysId-specified drive signal to the mechanism motors during test routines. */
|
||||
public final Consumer<Measure<Voltage>> m_drive;
|
||||
public final Consumer<? super Voltage> m_drive;
|
||||
|
||||
/**
|
||||
* Returns measured data (voltages, positions, velocities) of the mechanism motors during test
|
||||
@@ -163,10 +161,7 @@ public class SysIdRoutine extends SysIdRoutineLog {
|
||||
* the subsystem if left null.
|
||||
*/
|
||||
public Mechanism(
|
||||
Consumer<Measure<Voltage>> drive,
|
||||
Consumer<SysIdRoutineLog> log,
|
||||
Subsystem subsystem,
|
||||
String name) {
|
||||
Consumer<Voltage> drive, Consumer<SysIdRoutineLog> log, Subsystem subsystem, String name) {
|
||||
m_drive = drive;
|
||||
m_log = log != null ? log : l -> {};
|
||||
m_subsystem = subsystem;
|
||||
@@ -189,8 +184,7 @@ public class SysIdRoutine extends SysIdRoutineLog {
|
||||
* will be appended to the log entry title for the routine's test state, e.g.
|
||||
* "sysid-test-state-subsystem".
|
||||
*/
|
||||
public Mechanism(
|
||||
Consumer<Measure<Voltage>> drive, Consumer<SysIdRoutineLog> log, Subsystem subsystem) {
|
||||
public Mechanism(Consumer<Voltage> drive, Consumer<SysIdRoutineLog> log, Subsystem subsystem) {
|
||||
this(drive, log, subsystem, null);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user