Writing the Code for a PIDSubsystem
The skeleton of the PIDSubsystem is generated by the RobotBuilder and we have to fill in the rest of the code to provide the potentiometer value and drive the motor with the output of the embedded PIDController.
Make sure the Elevator PID subsystem has been created in the RobotBuilder. Once it’s all set, generate Java/C++ code for the project using the Export menu or the Java/C++ toolbar menu.
RobotBuilder generates the PIDSubsystem methods such that no additional code is needed for basic operation.
Setting the PID Constants
The height constants and PID constants are automatically generated.
public class Elevator extends PIDSubsystem {
// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
public static final double Bottom = 4.6;
public static final double Stow = 1.65;
public static final double Table_Height = 1.58;
// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
private AnalogPotentiometer pot;private PWMVictorSPX motor;
//P I D Variables
private static final double kP = 6.0;
private static final double kI = 0.0;
private static final double kD = 0.0;
private static final double kF = 0.0;
// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
static constexpr const double Bottom = 4.6;
static constexpr const double Stow = 1.65;
static constexpr const double Table_Height = 1.58;
static constexpr const double kP = 6.0;
static constexpr const double kI = 0.0;
static constexpr const double kD = 0.0;
static constexpr const double kF = 0.0;
// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=CONSTANTS
Get Potentiometer Measurement
@Override
public double getMeasurement() {
// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=SOURCE
return pot.get();
// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=SOURCE
}
double Elevator::GetMeasurement() {
// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=SOURCE
return m_pot.Get();
// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=SOURCE
}
The getMeasurement()
method is used to set the value of the sensor that is providing the feedback for the PID controller. In this case, the code is automatically generated and returns the potentiometer voltage as returned by the get()
method.
Calculate PID Output
@Override
public void useOutput(double output, double setpoint) {
output += setpoint*kF;
// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=OUTPUT
motor.set(output);
// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=OUTPUT
}
void Elevator::UseOutput(double output, double setpoint) {
output += setpoint*kF;
// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=OUTPUT
m_motor.Set(output);
// END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=OUTPUT
}
The useOutput
method writes the calculated PID output directly to the motor.
That’s all that is required to create the Elevator PIDSubsystem.