Class TimesliceRobot
- All Implemented Interfaces:
AutoCloseable
public class TimesliceRobot extends TimedRobot
The TimesliceRobot class is intended to be subclassed by a user creating a robot program.
This class schedules robot operations serially in a timeslice format. TimedRobot's periodic functions are the first in the timeslice table with 0 ms offset and 20 ms period. You can schedule additional controller periodic functions at a shorter period (5 ms by default). You give each one a timeslice duration, then they're run sequentially. The main benefit of this approach is consistent starting times for each controller periodic, which can make odometry and estimators more accurate and controller outputs change more consistently.
Here's an example of measured subsystem durations and their timeslice allocations:
Subsystem | Duration (ms) | Allocation (ms) |
Total | 5.0 | 5.0 |
TimedRobot | ? | 2.0 |
Drivetrain | 1.32 | 1.5 |
Flywheel | 0.6 | 0.7 |
Turret | 0.6 | 0.8 |
Free | 0.0 | N/A |
Since TimedRobot periodic functions only run every 20ms, that leaves a 2 ms empty spot in the allocation table for three of the four 5 ms cycles comprising 20 ms. That's OK because the OS needs time to do other things.
If the robot periodic functions and the controller periodic functions have a lot of scheduling
jitter that cause them to occasionally overlap with later timeslices, consider giving the main
robot thread a real-time priority using Threads.setCurrentThreadPriority(boolean,int)
. An
RT priority of 15 is a reasonable choice.
If you do enable RT though, make sure your periodic functions do not block. If they do, the operating system will lock up, and you'll have to boot the roboRIO into safe mode and delete the robot program to recover.
-
Field Summary
-
Constructor Summary
Constructors Constructor Description TimesliceRobot(double robotPeriodicAllocation, double controllerPeriod)
Constructor for TimesliceRobot. -
Method Summary
Methods inherited from class edu.wpi.first.wpilibj.TimedRobot
addPeriodic, addPeriodic, close, endCompetition, startCompetition
Methods inherited from class edu.wpi.first.wpilibj.IterativeRobotBase
autonomousExit, autonomousInit, autonomousPeriodic, disabledExit, disabledInit, disabledPeriodic, driverStationConnected, enableLiveWindowInTest, getPeriod, isLiveWindowEnabledInTest, loopFunc, robotInit, robotPeriodic, setNetworkTablesFlushEnabled, simulationInit, simulationPeriodic, teleopExit, teleopInit, teleopPeriodic, testExit, testInit, testPeriodic
Methods inherited from class edu.wpi.first.wpilibj.RobotBase
getMainThreadId, getRuntimeType, isAutonomous, isAutonomousEnabled, isDisabled, isEnabled, isReal, isSimulation, isTeleop, isTeleopEnabled, isTest, isTestEnabled, startRobot, suppressExitWarning
-
Constructor Details
-
TimesliceRobot
Constructor for TimesliceRobot.- Parameters:
robotPeriodicAllocation
- The allocation in seconds to give the TimesliceRobot periodic functions.controllerPeriod
- The controller period in seconds. The sum of all scheduler allocations should be less than or equal to this value.
-
-
Method Details
-
schedule
Schedule a periodic function with the constructor's controller period and the given allocation. The function's runtime allocation will be placed after the end of the previous one's.If a call to this function makes the allocations exceed the controller period, an exception will be thrown since that means the TimesliceRobot periodic functions and the given function will have conflicting timeslices.
- Parameters:
func
- Function to schedule.allocation
- The function's runtime allocation in seconds out of the controller period.
-