PID
Constructors​
PID()​
Creates a PID object with constants. Everything past kP has a default starting value, so you can just put kP.
p
kP
i
kI
d
kD
p_start_i
i will start when error is within this
name
a string for the name of the PID
- Prototype
- Example
ez::PID liftPID{1, 0.003, 4, 100, "Lift"};
PID(double p, double i = 0, double d = 0, double start_i = 0, std::string name = "");
Functions​
compute()​
Computes PID.
current
the current sensor value for the subsystem
- Prototype
- Example
ez::PID liftPID{1, 0.003, 4, 100, "Lift"};
pros::Motor lift_motor(1);
void opcontrol() {
while (true) {
if (master.get_digital(DIGITAL_L1)) {
liftPID.target_set(500);
}
else if (master.get_digital(DIGITAL_L2)) {
liftPID.target_set(0);
}
lift_motor.move(liftPID.compute(lift_motor.get_position()));
pros::delay(ez::util::DELAY_TIME);
}
}
double compute(double current);
compute_error()​
Computes PID based on error. This function ignores target entirely and the user has to calculate error.
error
the target minus current, you calculate this yourself
current
the current sensor value for the subsystem
- Prototype
- Example
ez::PID liftPID{1, 0.003, 4, 100, "Lift"};
pros::Motor lift_motor(1);
void opcontrol() {
double target = 0.0;
double error = 0.0;
while (true) {
if (master.get_digital(DIGITAL_L1)) {
target = 500.0;
}
else if (master.get_digital(DIGITAL_L2)) {
target = 0.0;
}
error = target - lift_motor.get_position();
lift_motor.move(liftPID.compute_error(error, lift_motor.get_position()));
pros::delay(ez::util::DELAY_TIME);
}
}
double compute_error(double err, double current);
Setters​
constants_set()​
Sets PID constants.
p
kP
i
kI
d
kD
p_start_i
i will start when error is within this
- Prototype
- Example
ez::PID liftPID;
void initialize() {
liftPID.constants_set(1, 0, 4);
}
void constants_set(double p, double i = 0, double d = 0, double p_start_i = 0);
target_set()​
Sets PID target.
target
the goal position for your subsystem
- Prototype
- Example
ez::PID liftPID{1, 0.003, 4, 100, "Lift"};
pros::Motor lift_motor(1);
void opcontrol() {
while (true) {
if (master.get_digital(DIGITAL_L1)) {
liftPID.target_set(500);
}
else if (master.get_digital(DIGITAL_L2)) {
liftPID.target_set(0);
}
lift_motor.move(liftPID.compute(lift_motor.get_position()));
pros::delay(ez::util::DELAY_TIME);
}
}
void target_set(double input);
exit_condition_set()​
Sets the exit condition constants. To disable one of the conditions, set the constants relating to it to 0
.
p_small_exit_time
time, in ms, before exiting p_small_error
p_small_error
small error threshold
p_big_exit_time
time, in ms, before exiting p_big_error
p_big_error
big error threshold
p_velocity_exit_time
time, in ms, for velocity to be 0
p_mA_timeout
time, in ms, for is_over_current
to be true
- Prototype
- Example
ez::PID liftPID{1, 0.003, 4, 100, "Lift"};
void initialize() {
liftPID.exit_condition_set(100, 3, 500, 7, 500, 500);
}
void exit_condition_set(int p_small_exit_time, double p_small_error, int p_big_exit_time = 0, double p_big_error = 0, int p_velocity_exit_time = 0, int p_mA_timeout = 0);
velocity_sensor_secondary_toggle_set()​
Enables / disables the use of the second sensor. True enables this and uses the secondary sensor in velocity exits, false disables.
toggle
sensor value for the secondary sensor
- Prototype
- Example
ez::PID liftPID;
void initialize() {
liftPID.velocity_sensor_secondary_toggle_set(true); // Enable the secondary sensor
}
void velocity_sensor_secondary_toggle_set(bool toggle);
velocity_sensor_secondary_set()​
This sets the sensor value for the secondary sensor. The secondary sensor is used in addition to the main sensor for determining velocity exits, if enabled.
secondary_sensor
sensor value for the secondary sensor
- Prototype
- Example
...
void velocity_sensor_secondary_set(double secondary_sensor);
velocity_sensor_main_exit_set()​
Sets a threshold for the main sensors velocity. The velocity timer will start increasing when the main sensor is within this value. This is defaulted to 0.05
.
zero
double, a small threshold
- Prototype
- Example
ez::PID liftPID;
void initialize() {
liftPID.velocity_sensor_secondary_toggle_set(true); // Enable the secondary sensor
}
void velocity_sensor_main_exit_set(double zero);
velocity_sensor_secondary_exit_set()​
Sets a threshold for the secondary sensors velocity. The velocity timer will start increasing when the secondary sensor is within this value. This is defaulted to 0.1
. This is only used when the secondary sensor is enabled.
zero
double, a small threshold
- Prototype
- Example
ez::PID liftPID;
void initialize() {
liftPID.velocity_sensor_secondary_toggle_set(true); // Enable the secondary sensor
}
void velocity_sensor_secondary_exit_set(double zero);
name_set()​
A string that prints when exit conditions are met. When you have multiple mechanisms using exit conditions and you're debugging, seeing which exit condition is doing what can be useful.
name
a string for the name of the PID
- Prototype
- Example
ez::PID liftPID{1, 0.003, 4, 100};
void initialize() {
liftPID.name_set("Lift");
}
void name_set(std::string name);
Getters​
target_set()​
Sets PID target.
target
the goal position for your subsystem
- Prototype
- Example
ez::PID liftPID{1, 0.003, 4, 100, "Lift"};
pros::Motor lift_motor(1);
void opcontrol() {
while (true) {
if (master.get_digital(DIGITAL_L1)) {
liftPID.target_set(500);
printf("%.2f\n", liftPID.target_get()); // This prints 500
}
else if (master.get_digital(DIGITAL_L2)) {
liftPID.target_set(0);
printf("%.2f\n", liftPID.target_get()); // This prints 0
}
lift_motor.move(liftPID.compute(lift_motor.get_position()));
pros::delay(ez::util::DELAY_TIME);
}
}
double target_set();
velocity_sensor_secondary_toggle_get()​
Returns the value for the secondary sensor. The secondary sensor is used in addition to the main sensor for determining velocity exits, if enabled.
- Prototype
- Example
ez::PID liftPID;
void initialize() {
printf("%i\n",liftPID.velocity_sensor_secondary_toggle_get()); // This prints 0
liftPID.velocity_sensor_secondary_toggle_set(true); // Enable the secondary sensor
printf("%i\n",liftPID.velocity_sensor_secondary_toggle_get()); // This prints 1
}
double velocity_sensor_secondary_toggle_get();
velocity_sensor_main_exit_get()​
Gets a threshold for the secondary sensors velocity. The velocity timer will start increasing when the secondary sensor is within this value. This is defaulted to 0.1
.
- Prototype
- Example
ez::PID liftPID;
void initialize() {
liftPID.velocity_sensor_secondary_toggle_set(true); // Enable the secondary sensor
printf("%.2f\n",liftPID.velocity_sensor_main_exit_get()); // This prints 0.05
}
double velocity_sensor_main_exit_get();
velocity_sensor_secondary_exit_get()​
Gets a threshold for the secondary sensors velocity. The velocity timer will start increasing when the secondary sensor is within this value. This is defaulted to 0.1
. This is only used when the secondary sensor is enabled.
- Prototype
- Example
ez::PID liftPID;
void initialize() {
liftPID.velocity_sensor_secondary_toggle_set(true); // Enable the secondary sensor
printf("%.2f\n",liftPID.velocity_sensor_secondary_exit_get()); // This prints 0.1
}
double velocity_sensor_secondary_exit_get();
velocity_sensor_secondary_get()​
Returns if the secondary sensor is enabled or disables. True means this is enabled and the secondary sensor is in use, false means disabled.
- Prototype
- Example
ez::PID liftPID;
void initialize() {
liftPID.velocity_sensor_secondary_toggle_set(true); // Enable the secondary sensor
}
double velocity_sensor_secondary_get();
Exit Conditions​
Exit conditions are a series of things that need to happen for you to know your subsystem has arrived at the desired target.
exit_output​
The .exit_condition()
function can return any of the following variables depending on what triggered it to exit.
enum exit_output { RUNNING = 1,
SMALL_EXIT = 2,
BIG_EXIT = 3,
VELOCITY_EXIT = 4,
mA_EXIT = 5,
ERROR_NO_CONSTANTS = 6 };