Class BangBangController

java.lang.Object
org.wpilib.math.controller.BangBangController
All Implemented Interfaces:
TelemetryLoggable, ComplexTunable

public class BangBangController extends Object implements TelemetryLoggable, ComplexTunable
Implements a bang-bang controller, which outputs either 0 or 1 depending on whether the measurement is less than the setpoint. This maximally-aggressive control approach works very well for velocity control of high-inertia mechanisms, and poorly on most other things.

Note that this is an *asymmetric* bang-bang controller - it will not exert any control effort in the reverse direction (e.g. it won't try to slow down an overspeeding shooter wheel). This asymmetry is *extremely important*. Bang-bang control is extremely simple, but also potentially hazardous. Always ensure that your motor controllers are set to "coast" before attempting to control them with a bang-bang controller.

  • Constructor Details

    • BangBangController

      public BangBangController(double tolerance)
      Creates a new bang-bang controller.

      Always ensure that your motor controllers are set to "coast" before attempting to control them with a bang-bang controller.

      Parameters:
      tolerance - Tolerance for atSetpoint.
    • BangBangController

      public BangBangController()
      Creates a new bang-bang controller.

      Always ensure that your motor controllers are set to "coast" before attempting to control them with a bang-bang controller.

  • Method Details

    • setSetpoint

      public void setSetpoint(double setpoint)
      Sets the setpoint for the bang-bang controller.
      Parameters:
      setpoint - The desired setpoint.
    • getSetpoint

      public double getSetpoint()
      Returns the current setpoint of the bang-bang controller.
      Returns:
      The current setpoint.
    • atSetpoint

      public boolean atSetpoint()
      Returns true if the error is within the tolerance of the setpoint.
      Returns:
      Whether the error is within the acceptable bounds.
    • setTolerance

      public final void setTolerance(double tolerance)
      Sets the error within which atSetpoint will return true.
      Parameters:
      tolerance - Position error which is tolerable.
    • getTolerance

      public double getTolerance()
      Returns the current tolerance of the controller.
      Returns:
      The current tolerance.
    • getMeasurement

      public double getMeasurement()
      Returns the current measurement of the process variable.
      Returns:
      The current measurement of the process variable.
    • getError

      public double getError()
      Returns the current error.
      Returns:
      The current error.
    • calculate

      public double calculate(double measurement, double setpoint)
      Returns the calculated control output.

      Always ensure that your motor controllers are set to "coast" before attempting to control them with a bang-bang controller.

      Parameters:
      measurement - The most recent measurement of the process variable.
      setpoint - The setpoint for the process variable.
      Returns:
      The calculated motor output (0 or 1).
    • calculate

      public double calculate(double measurement)
      Returns the calculated control output.
      Parameters:
      measurement - The most recent measurement of the process variable.
      Returns:
      The calculated motor output (0 or 1).
    • logTo

      public void logTo(TelemetryTable table)
      Description copied from interface: TelemetryLoggable
      Logs the object to a TelemetryTable.
      Specified by:
      logTo in interface TelemetryLoggable
      Parameters:
      table - telemetry table
    • getTelemetryType

      public String getTelemetryType()
      Description copied from interface: TelemetryLoggable
      Gets the telemetry table type. Default is no specified table type (null). A mismatch in type during logging results in a reported warning, so this should always return the same value.
      Specified by:
      getTelemetryType in interface TelemetryLoggable
      Returns:
      Table type
    • publishTunable

      public void publishTunable(TunableTable table)
      Description copied from interface: ComplexTunable
      Publishes the tunable to the given table.

      This function may be called when the tunable is initially published or republished during backend migration, and it must not throw. If an exception escapes, registry and backend state is not guaranteed to be restored.

      Specified by:
      publishTunable in interface ComplexTunable
      Parameters:
      table - table
    • getTunableType

      public String getTunableType()
      Description copied from interface: ComplexTunable
      Gets the tunable table type. Default is no specified table type (null).
      Specified by:
      getTunableType in interface ComplexTunable
      Returns:
      Table type