Telemetry & Logging
Telemetry is how the robot reports information for tuning, debugging, and analysis. This page covers both SmartDashboard and AdvantageKit logging.
SmartDashboard
SmartDashboard is the simplest telemetry system built into WPILib. It sends key-value pairs to NetworkTables and can be viewed from any tool.
When to Use SmartDashboard
- Quick debugging
- Live values during testing
- Basic telemetry during matches
Basic Example
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
public void periodic() {
SmartDashboard.putNumber("Arm Angle", getAngle());
SmartDashboard.putBoolean("Has Game Piece", hasPiece());
}
Reading SmartDashboard Values
You can also read values from the dashboard (use sparingly):
double setpoint = SmartDashboard.getNumber("Arm Setpoint", 0.0);
pidController.setSetpoint(setpoint);
AdvantageKit
AdvantageKit is a high-performance logging framework used for real-time telemetry and replay. It records everything the robot does for offline debugging.
What AdvantageKit Provides
- Full match logging
- Automatic timestamping
- Replay simulator
- Plots, charts, time-aligned telemetry
- Swerve and path debugging
You don't need to know all the special stuff - just the recordOutput() method.
Basic Logger Example
import org.littletonrobotics.junction.Logger;
public void periodic() {
Logger.recordOutput("Arm/Angle", getAngle());
Logger.recordOutput("Arm/Target", targetAngle);
Logger.recordOutput("Intake/HasPiece", hasPiece());
}
Logging a Complex Object
AdvantageKit supports Pose2d, Rotation2d, and other geometry types automatically.
Logger.recordOutput("Drive/Pose", drivetrain.getPose());
Logging Motor/Encoder Data
Logger.recordOutput("Arm/MotorTemp", motor.getTemperature());
Logger.recordOutput("Arm/EncoderPosition", encoder.getPosition());
Best Practices
What to Log
- Subsystem states (enabled, disabled, idling)
- Sensor values (encoders, limit switches)
- Odometry / robot pose
Use Namespace Folders
...and DON'T change the spelling or capitalization.
Logger.recordOutput("Arm/Angle", angle);
Logger.recordOutput("Arm/Target", target);
Logger.recordOutput("Drive/LeftVelocity", leftVel);