WPILib Example Projects¶
Warning
While every attempt is made to keep WPILib examples functional, they are not intended to be used “as-is.” At the very least, robot-specific constants will need to be changed for the code to work on a user robot. Many empirical constants have their values “faked” for demonstration purposes. Users are strongly encouraged to write their own code (from scratch or from an existing template) rather than copy example code.
WPILib example projects demonstrate a large number of library features and use patterns. Projects range from simple demonstrations of a single functionality to complete, competition-capable robot programs. All of these examples are available in VS Code by entering Control+Shift+P, then selecting WPILib: Create a new project and choosing example.
Basic Examples¶
These examples demonstrate basic/minimal robot functionality. They are useful for beginning teams who are gaining initial familiarity with robot programming, but are highly limited in functionality.
ArcadeDrive (Java, C++): Demonstrates a simple differential drive implementation using “arcade”-style controls through the
DifferentialDriveclass.ArcadeDriveXboxController (Java, C++): Demonstrates the same functionality seen in the previous example, except using an
XboxControllerinstead of an ordinary joystick.GettingStarted (Java, C++): Demonstrates a simple autonomous routine that drives forwards for two seconds at half speed.
MecanumDrive (Java, C++): Demonstrates a simple mecanum drive implementation using the
MecanumDriveclass.MotorControl (Java, C++): Demonstrates how to control the output of a motor with a joystick.
MotorControlEncoder (Java, C++): Identical to the above example, except with the addition of an encoder to read the motor position.
QuickVision (Java, C++): Demonstrates how to stream video from a USB camera to the dashboard.
Relay (Java, C++): Demonstrates the use of the
Relayclass to control a relay output with a set of joystick buttons.Solenoid (Java, C++): Demonstrates the use of the
SolenoidandDoubleSolenoidclasses to control solenoid outputs with a set of joystick buttons.TankDrive (Java): Demonstrates a simple differential drive implementation using “tank”-style controls through the
DifferentialDriveclass.TankDriveXboxController (Java, C++): Demonstrates the same functionality seen in the previous example, except using an
XboxControllerinstead of an ordinary joystick.
Control Examples¶
These examples demonstrate WPILib implementations of common robot controls. Sensors may be present, but are not the emphasized concept of these examples.
DifferentialDriveBot (Java, C++): Demonstrates an advanced differential drive implementation, including encoder-and-gyro odometry through the
DifferentialDriveOdometryclass, and composition with PID velocity control through theDifferentialDriveKinematicsandPIDControllerclasses.ElevatorProfiledPID (Java, C++): Demonstrates the use of the
ProfiledPIDControllerclass to control the position of an elevator mechanism.ElevatorTrapezoidProfile (Java, C++): Demonstrates the use of the
TrapezoidProfileclass in conjunction with a “smart motor controller” to control the position of an elevator mechanism.GyroMecanum (Java, C++): Demonstrates field-oriented control of a mecanum robot through the
MecanumDriveclass in conjunction with a gyro.MecanumBot (Java, C++): Demonstrates an advanced mecanum drive implementation, including encoder-and-gyro odometry through the
MecanumDriveOdometryclass, and composition with PID velocity control through theMecanumDriveKinematicsandPIDControllerclasses.PotentiometerPID (Java, C++): Demonstrates the use of the
PIDControllerclass and a potentiometer to control the position of an elevator mechanism.RamseteController (Java, C++): Demonstrates the use of the
RamseteControllerclass to follow a trajectory during the autonomous period.SwerveBot (Java, C++): Demonstrates an advanced swerve drive implementation, including encoder-and-gyro odometry through the
SwerveDriveOdometryclass, and composition with PID position and velocity control through theSwerveDriveKinematicsandPIDControllerclasses.UltrasonicPID (Java, C++): Demonstrates the use of the
PIDControllerclass in conjunction with an ultrasonic sensor to drive to a set distance from an object.
Sensor Examples¶
These examples demonstrate sensor reading and data processing using WPILib. Mechanisms control may be present, but is not the emphasized concept of these examples.
AxisCameraSample (Java, C++): Demonstrates the use of OpenCV and an Axis Netcam to overlay a rectangle on a captured video feed and stream it to the dashboard.
CANPDP (Java, C++): Demonstrates obtaining sensor information from the PDP over CAN using the
PowerDistributionPanelclass.DutyCycleEncoder (Java, C++): Demonstrates the use of the
DutyCycleEncoderclass to read values from a PWM-type absolute encoder.DutyCycleInput (Java, C++): Demonstrates the use of the
DutyCycleInputclass to read the frequency and fractional duty cycle of a PWM input.Encoder (Java, C++): Demonstrates the use of the
Encoderclass to read values from a quadrature encoder.Gyro (Java, C++): Demonstrates the use of the
AnalogGyroclass to measure robot heading and stabilize driving.IntermediateVision (Java, C++): Demonstrates the use of OpenCV and a USB camera to overlay a rectangle on a captured video feed and stream it to the dashboard.
Ultrasonic (Java, C++): Demonstrates the use of the
Ultrasonicclass to read data from an ultrasonic sensor in conjunction with theMedianFilterclass to reduce signal noise.
Command-Based Examples¶
These examples demonstrate the use of the Command-Based framework.
ArmBot (Java, C++): Demonstrates the use of a
ProfiledPIDSubsystemto control a robot arm.ArmBotOffboard (Java, C++): Demonstrates the use of a
TrapezoidProfileSubsystemin conjunction with a “smart motor controller” to control a robot arm.DriveDistanceOffboard (Java, C++): Demonstrates the use of a
TrapezoidProfileCommandin conjunction with a “smart motor controller” to drive forward by a set distance with a trapezoidal motion profile.FrisbeeBot (Java, C++): A complete set of robot code for a simple frisbee-shooting robot typical of the 2013 FRC game Ultimate Ascent. Demonstrates simple PID control through the
PIDSubystemclass.GearsBot (Java, C++): A complete set of robot code for the WPI demonstration robot, GearsBot.
GyroDriveCommands (Java, C++): Demonstrates the use of
PIDCommandandProfiledPIDCommandin conjunction with a gyro to turn a robot to face a specified heading and to stabilize heading while driving.HatchbotInlined (Java, C++): A complete set of robot code for a simple hatch-delivery bot typical of the 2017 FRC game Steamworks. Commands are written in an “inline” style, in which explicit subclassing of
Commandis avoided.HatchbotTraditional (Java, C++): A complete set of robot code for a simple hatch-delivery bot typical of the 2017 FRC game Steamworks. Commands are written in a “traditional” style, in which subclasses of
Commandare written for each robot action.MecanumControllerCommand (Java, C++): Demonstrates trajectory generation and following with a mecanum drive using the
TrajectoryGeneratorandMecanumControllerCommandclasses.RamseteCommand (Java, C++): Demonstrates trajectory generation and following with a differential drive using the
TrajectoryGeneratorandRamseteCommandclasses. A matching step-by-step tutorial can be found here.SchedulerEventLogging (Java, C++): Demonstrates the use of scheduler event actions to log dashboard event markers whenever a command starts, ends, or is interrupted.
SelectCommand (Java, C++): Demonstrates the use of the
SelectCommandclass to run one of a selection of commands depending on a runtime-evaluated condition.SwerveControllerCommand (Java, C++): Demonstrates trajectory generation and following with a swerve drive using the
TrajectoryGeneratorandSwerveControllerCommandclasses.
Miscellaneous Examples¶
These examples demonstrate miscellaneous WPILib functionality that does not fit into any of the above categories.
AddressableLED (Java, C++): Demonstrates the use of the
AddressableLEDclass to control RGB LEDs for robot decoration and/or driver feedback.DMA (C++): Demonstrates the use of DMA (Direct Memory Access) to read from sensors without using the RoboRIO’s CPU (C++ only).
HIDRumble (Java, C++): Demonstrates the use of the “rumble” functionality for tactile feedback on supported HIDs (such as XboxControllers).
PacGoat (Java, C++): A full command-based robot project from FRC Team 190’s 2014 robot. Uses the legacy version of the command framework; categorized as miscellaneous to avoid confusion.
Shuffleboard (Java, C++): Demonstrates configuring tab/widget layouts on the “Shuffleboard” dashboard from robot code through the
Shuffleboardclass’s fluent builder API.