PID Control
PID (Proportional-Integral-Derivative) control replaces imprecise voltage commands with accurate, feedback-driven control. Toggle between an arm (position), a flywheel (velocity), and an elevator (position) below. The gains in each map directly to the motor's PID settings (a TalonFX Slot0Configs).
Key concept: PID uses sensor feedback to automatically adjust motor output; feedforward predicts the voltage needed before any error has accumulated.
Each loop the arm starts at 0° (horizontal). For the first second the setpoint stays at 0°. Use that window to tune kGuntil the arm holds. For a Kraken X44 + 25:1 driving a 2 kg · 0.4 m arm, CTRE's dyno numbers give kG = mgL / (Kₜ·R) ≈ 0.92 V. Add kS to overcome residual static friction. At t = 1 s the setpoint steps to your slider target; kP and kD chase the arm there and damp the overshoot. Order: kG → kS → kP → kD.
Feedback · PID
Feedforward
2 kg · 0.4 m arm on a Kraken X44 + 25:1 reduction (4.11 N·m stall, 7758 RPM free per CTRE dyno data; ≈ 103 N·m / 310 RPM at the arm; back-EMF modelled, ±12 V saturation). Gains use Phoenix 6 / WPILib mechanism-side units. Drop these values straight into a Slot0Configs with SensorToMechanismRatio = 25.
Understanding PID Components
P - Proportional
Definition:"The amount of output to apply per unit of error in the system"
Error = Target - CurrentP_Output = kP × ErrorBehavior: Larger error = stronger correction. Provides immediate response but may cause oscillation.
I - Integral
Definition:"The amount of output to apply per unit of error for every second of that error"
Accumulated_Error += Error × dtI_Output = kI × Accumulated_ErrorBehavior: Eliminates steady-state error by accumulating past errors over time.
Note:The integral term can lead to "windup," which may make your mechanism unstable. In most FRC applications, you can leave the integral term at zero.
D - Derivative
Definition:"The amount of output to apply per change in error over time"
Error_Rate = (Error - Last_Error) / dtD_Output = kD × Error_RateBehavior: Reduces overshoot by predicting future error trends and damping the response.
Feedforward Gains
Feedforward gains predict the required output based on the target, rather than reacting to error.
kS - Static
Always
kG - Gravity
Arms/Elevators
kV - Velocity
Flywheels/Intakes
kA - Acceleration
High Inertia Mechanisms
Complete PID Tuning Guide
For detailed tuning instructions and mechanism-specific guidance:
CTRE Closed-Loop Control ReferencePID and Feedforward Tuning Tutorial
This video walks through PID and feedforward tuning, with practical steps for dialing in your gains:
PID Implementation in Code
PID Configuration Example
Workshop Implementation: PID Control
Before & After: Implementation
Before
- • Commands control Arm with voltage
- • No position feedback control
- • Imprecise, inconsistent movement
- • No automatic target reaching
- • Manual voltage adjustment needed
After
- • PID position control with PositionVoltage
- • Automatic target position reaching
- • Precise, repeatable movements
- • Feedforward compensation for gravity
- • Tolerance checking for "at target"
Loading file...
Code Walkthrough
PID Implementation:
- • PositionVoltage: Replaces VoltageOut for closed-loop control
- • Slot0 Config: PID and feedforward gains configuration
- • Target Setting: setTargetPosition() method for precise control
Gain Values Used:
- • kP = 24.0: Strong proportional response
- • kD = 0.1: Small derivative for damping
- • kS = 0.25: Static friction compensation
- • kG = 0.12: Gravity feedforward for Arm
The arm now reaches and holds a target position on its own. Next, we upgrade to Motion Magic for smooth, profiled movements with controlled acceleration.
This is the WPILib 2027 alpha
2027.0.0-alpha-6, Phoenix 6 26.50.0-alpha-1) on Java 25 and SystemCore — so exact APIs may still shift between alpha builds. This page was last verified against alpha-6 in July 2026.