Example Autonomous Routines
Reading documentation can be overwhelming, so EZ-Template has example autonomous routines for you to use and modify on your own to learn by doing.
Assumed Constants
These are default speeds that we can use throughout our autonomous routines to make it easier to modify them retroactively.
const int DRIVE_SPEED = 110;
const int TURN_SPEED = 90;
const int SWING_SPEED = 90;
Drive
This autonomous routine will have the robot go forward for 24 inches with slew enabled, come back -12 inches, and then come back another -12 inches to where it started. It will do all of this at the predefined DRIVE_SPEED
.
void drive_example() {
// The first parameter is target inches
// The second parameter is max speed the robot will drive at
// The third parameter is a boolean (true or false) for enabling/disabling a slew at the start of drive motions
// for slew, only enable it when the drive distance is greater than the slew distance + a few inches
chassis.pid_drive_set(24_in, DRIVE_SPEED, true);
chassis.pid_wait();
chassis.pid_drive_set(-12_in, DRIVE_SPEED);
chassis.pid_wait();
chassis.pid_drive_set(-12_in, DRIVE_SPEED);
chassis.pid_wait();
}
Turn
This autonomous routine will turn 90 degrees, then back 45 degrees, and finally to 0 where it started. It will do all of this at the predefined TURN_SPEED
.
void turn_example() {
// The first parameter is the target in degrees
// The second parameter is max speed the robot will drive at
chassis.pid_turn_set(90_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_turn_set(45_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_turn_set(0_deg, TURN_SPEED);
chassis.pid_wait();
}
Drive and Turn
This autonomous routine will combine driving and turning in a single function.
void drive_and_turn() {
chassis.pid_drive_set(24_in, DRIVE_SPEED, true);
chassis.pid_wait();
chassis.pid_turn_set(45_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_turn_set(-45_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_turn_set(0_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_drive_set(-24_in, DRIVE_SPEED, true);
chassis.pid_wait();
}
Wait Until and Changing Speed
Now we add pid_wait_until()
. This new function will wait until a specified distance has been traveled and then allow the code to continue. The robot will drive at DRIVE_SPEED
until the robot has traveled 6 inches, then will lower the max speed to 30. The same thing happens on the return back.
void wait_until_change_speed() {
// pid_wait_until will wait until the robot gets to a desired position
// When the robot gets to 6 inches slowly, the robot will travel the remaining distance at full speed
chassis.pid_drive_set(24_in, 30, true);
chassis.pid_wait_until(6_in);
chassis.pid_speed_max_set(DRIVE_SPEED); // After driving 6 inches at 30 speed, the robot will go the remaining distance at DRIVE_SPEED
chassis.pid_wait();
chassis.pid_turn_set(45_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_turn_set(-45_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_turn_set(0_deg, TURN_SPEED);
chassis.pid_wait();
// When the robot gets to -6 inches slowly, the robot will travel the remaining distance at full speed
chassis.pid_drive_set(-24_in, 30, true);
chassis.pid_wait_until(-6_in);
chassis.pid_speed_max_set(DRIVE_SPEED); // After driving 6 inches at 30 speed, the robot will go the remaining distance at DRIVE_SPEED
chassis.pid_wait();
}
Swing Turns
Swing turns are turns that only use one side of the drive. Left swings use the left side, and right swings use the right side. This will drive in a segmented S curve.
void swing_example() {
// The first parameter is ez::LEFT_SWING or ez::RIGHT_SWING
// The second parameter is the target in degrees
// The third parameter is the speed of the moving side of the drive
// The fourth parameter is the speed of the still side of the drive, this allows for wider arcs
chassis.pid_swing_set(ez::LEFT_SWING, 45_deg, SWING_SPEED, 45);
chassis.pid_wait();
chassis.pid_swing_set(ez::RIGHT_SWING, 0_deg, SWING_SPEED, 45);
chassis.pid_wait();
chassis.pid_swing_set(ez::RIGHT_SWING, 45_deg, SWING_SPEED, 45);
chassis.pid_wait();
chassis.pid_swing_set(ez::LEFT_SWING, 0_deg, SWING_SPEED, 45);
chassis.pid_wait();
}
Motion Chaining
Motion Chaining is when you exit a movement while the robot is still moving so you carry momentum into the next movement.
void motion_chaining() {
// Motion chaining is where motions all try to blend together instead of individual movements.
// This works by exiting while the robot is still moving a little bit.
// To use this, replace pid_wait with pid_wait_quick_chain.
chassis.pid_drive_set(24_in, DRIVE_SPEED, true);
chassis.pid_wait();
chassis.pid_turn_set(45_deg, TURN_SPEED);
chassis.pid_wait_quick_chain();
chassis.pid_turn_set(-45_deg, TURN_SPEED);
chassis.pid_wait_quick_chain();
chassis.pid_turn_set(0_deg, TURN_SPEED);
chassis.pid_wait();
// Your final motion should still be a normal pid_wait
chassis.pid_drive_set(-24_in, DRIVE_SPEED, true);
chassis.pid_wait();
}
Combining All Movements
This combines all movements from above.
void combining_movements() {
chassis.pid_drive_set(24_in, DRIVE_SPEED, true);
chassis.pid_wait();
chassis.pid_turn_set(45_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_swing_set(ez::RIGHT_SWING, -45_deg, SWING_SPEED, 45);
chassis.pid_wait();
chassis.pid_turn_set(0_deg, TURN_SPEED);
chassis.pid_wait();
chassis.pid_drive_set(-24_in, DRIVE_SPEED, true);
chassis.pid_wait();
}
Interference
Interference checks if the drive exited in an unintentional way. If the robot stops unintentionally or pulls too many amps this will trigger. This allows you to add fail-safes that stop your robot from burning out. The below function will attempt to "tug" an opponent's mobile goal a couple of times before giving up.
void tug(int attempts) {
for (int i = 0; i < attempts - 1; i++) {
// Attempt to drive backward
printf("i - %i", i);
chassis.pid_drive_set(-12_in, 127);
chassis.pid_wait();
// If failsafed...
if (chassis.interfered) {
chassis.drive_sensor_reset();
chassis.pid_drive_set(-2_in, 20);
pros::delay(1000);
}
// If the robot successfully drove back, return
else {
return;
}
}
}
// If there is no interference, the robot will drive forward and turn 90 degrees.
// If interfered, the robot will drive forward and then attempt to drive backward.
void interfered_example() {
chassis.pid_drive_set(24_in, DRIVE_SPEED, true);
chassis.pid_wait();
if (chassis.interfered) {
tug(3);
return;
}
chassis.pid_turn_set(90_deg, TURN_SPEED);
chassis.pid_wait();
}