Skip to content

Robot Won't Move - Troubleshooting Guide

Every technical hurdle is an opportunity for Discovery. If your robot isn’t moving as expected, don’t panic—this is where your team’s Innovation and Teamwork shine. Follow this checklist to systematically diagnose the issue, turning a stressful moment into a Fun learning experience and ensuring your robot makes its next high-Impact appearance on the field.

  • Look at the Driver Station.
  • Is “Robot Code” showing GREEN?
    • RED/YELLOW: Code isn’t running.
    • GREEN: Code is running, skip to Step 2.

If not green:

  1. Check for errors in RioLog.
  2. Reboot the RoboRIO.
  3. Restart the Driver Station.
  4. Redeploy code if needed.
  • Look at Driver Station mode.
  • Are you in Teleop, Auto, or Test mode?
  • Is the ENABLE button pressed?

If disabled:

  1. Click the mode you want (usually Teleop)
  2. Click the ENABLE button.
  3. Robot should move now.
  • Look at Driver Station USB tab.
  • Do you see your controller?
  • Are the lights on the controller on?

If not connected:

  1. Unplug and replug controller.
  2. Try different USB port.
  3. Replace controller batteries.
  4. Try different controller.

If quick check didn’t fix it, work through these steps:

Print joystick values to see if they’re being read:

@Override
public void execute() {
double forward = -controller.getLeftY();
double strafe = controller.getLeftX();
double rotate = controller.getRightX();
// Add this to debug
System.out.println("Joystick: F=" + forward + " S=" + strafe + " R=" + rotate);
drivetrain.drive(forward, strafe, rotate);
}

What to look for:

  • Values changing: Joystick works, problem is elsewhere.
  • Always zero: Joystick not being read.
  • No output: Command isn’t running.

Step 2: Verify Command is Running (1 minute)

Section titled “Step 2: Verify Command is Running (1 minute)”

Add debug print to see if command runs:

public DriveCommand(Drivetrain drivetrain, XboxController controller) {
this.drivetrain = drivetrain;
this.controller = controller;
addRequirements(drivetrain);
System.out.println("DriveCommand created!"); // Add this
}
@Override
public void execute() {
System.out.println("DriveCommand executing!"); // Add this
// ... rest of code
}

What to look for:

  • “executing!” prints every 20ms: Command is running.
  • Only “created!” once: Command not scheduled.
  • No output at all: Command not being created.

Make sure drivetrain has a default command:

public RobotContainer() {
// In RobotContainer.java
drivetrain.setDefaultCommand(
new DriveCommand(drivetrain, driver)
);
}

Verify it’s set:

  1. Add print to RobotContainer constructor.
  2. Look for “DriveCommand created!” in RioLog.
  3. Check that default command is actually set.

Add debug to subsystem:

public void drive(double forward, double strafe, double rotate) {
System.out.println("Drive called: " + forward + ", " + strafe + ", " + rotate);
drive.drive(forward, strafe, rotate);
}

What to look for:

  • “Drive called!” prints: Subsystem receiving commands.
  • No output: Subsystem not being called.

Step 5: Check Motor Configuration (2 minutes)

Section titled “Step 5: Check Motor Configuration (2 minutes)”

Verify motors are configured correctly:

// Check in your subsystem constructor
public Drivetrain() {
// Add debug to verify motors are created
System.out.println("Creating drivetrain...");
drive = new SwerveDrive();
System.out.println("Drivetrain created!");
}

Check motor hardware:

  1. Look for CAN errors in RioLog.
  2. Verify motor IDs are correct.
  3. Check that motors are getting power.
  4. Try one motor at a time.

Symptoms:

  • Joystick values don’t change.
  • “DriveCommand executing!” but values are zero.

Solution:

// Try different port numbers
private final XboxController driver = new XboxController(0); // Try 1, 2, 3

Symptoms:

  • Robot moves only when joystick is at max.
  • Small movements don’t work.

Solution:

// Reduce or remove deadband
double forward = -controller.getLeftY();
if (Math.abs(forward) < 0.1) forward = 0; // Reduce from 0.2 to 0.1

Symptoms:

  • “DriveCommand created!” but never “executing!”.
  • Command runs once then stops.

Solution:

// Make sure it's set as DEFAULT command
drivetrain.setDefaultCommand(new DriveCommand(drivetrain, driver));
// NOT scheduled with .schedule()
// new DriveCommand(drivetrain, driver).schedule(); // Wrong way

Symptoms:

  • Command creates but doesn’t execute.
  • Other commands prevent this one from running.

Solution:

public DriveCommand(Drivetrain drivetrain, XboxController controller) {
this.drivetrain = drivetrain;
this.controller = controller;
addRequirements(drivetrain); // MUST have this!
}

Symptoms:

  • Everything looks good in code.
  • Motors show in RioLog but don’t move.
  • No CAN errors

Solution:

  1. Check motor power cables.
  2. Verify motor controllers have power.
  3. Check motor breakers (if applicable)
  4. Try swapping motor controllers.

Symptoms:

  • Works in simulation but not real robot.
  • Code runs but no movement.

Solution:

// Check you're using REAL IO, not SIM IO
public Drivetrain() {
// Make sure you're not creating IOSim by accident
drive = new SwerveDrive();
}

  1. Disable robot.
  2. Reboot RoboRIO.
  3. Restart Driver Station.
  4. Re-enable robot.
  1. Stop code
  2. Build project: ./gradlew build
  3. Deploy: ./gradlew deploy
  4. Re-enable robot.
// Make sure signals are updating
motor.setPosition(0).setUpdateFrequency(100); // 100Hz
  1. Check Phoenix Positioner shows motors.
  2. Look for CAN errors in RioLog.
  3. Verify CAN bus is connected.

If you’ve tried everything above:

  1. What you see: RioLog output, Driver Station status.
  2. What you tried: Which fixes you attempted.
  3. What happens: Exact symptoms (what does/doesn’t work)
  4. Code snippet: Relevant parts of your code.
"My swerve drive won't move. I've verified:
- Robot code is running (green on Driver Station)
- Joystick values are printing (F=0.5, S=0.0, R=0.0)
- Command is executing (prints every 20ms)
- Subsystem drive() is being called
- Motors show in Phoenix but don't move
No CAN errors in RioLog. All motor IDs are correct.
What should I check next?"

  • ✅ Test all subsystems individually.
  • ✅ Verify each motor works.
  • ✅ Check all joystick mappings.
  • ✅ Document controller ports.
  • ✅ Keep this checklist handy.
  • ✅ Have spare controllers ready.
  • ✅ Know motor IDs and CAN bus layout.
  • ✅ Practice quick diagnosis.
  • ✅ Document what was wrong.
  • ✅ Add check to prevent future issues.
  • ✅ Tell team members what to watch for.


Still stuck? Ask the community - we’re here to help!