Autonomous

/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008. All Rights Reserved.                             */
/* Open Source Software - may be modified and shared by FRC teams. The code   */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project.                                                               */
/*----------------------------------------------------------------------------*/

package edu.wpi.first.wpilibj.templates;


import edu.wpi.first.wpilibj.*;
import edu.wpi.first.wpilibj.Joystick; 
import edu.wpi.first.wpilibj.RobotDrive; 
import edu.wpi.first.wpilibj.SimpleRobot; 
import edu.wpi.first.wpilibj.Timer; 



/**
 * The VM is configured to automatically run this class, and to call the
 * functions corresponding to each mode, as described in the SimpleRobot
 * documentation. If you change the name of this class or the package after
 * creating this project, you must also update the manifest file in the resource
 * directory.
 */
public class Team1605 extends SimpleRobot {
    
    
    Joystick stickDriverLeft = new Joystick(1);
    Joystick stickDriverRight = new Joystick(2);
    
    
    Jaguar leftMotor = new Jaguar(2);
    Jaguar rightMotor = new Jaguar(1);
    Victor shooterMotor = new Victor(3);
    Victor gatherMotor1 = new Victor(4); 
    Victor bridgeHandMotor = new Victor(6);
    
    RobotDrive robotDrive = new RobotDrive(leftMotor,rightMotor);
    
   
    
    /**
     * This function is called once each time the robot enters autonomous mode.
     */
    public void autonomous() {
        robotDrive.drive(0.5,0.0);//drive at 50% speed 0% turn
        Timer.delay(5.0);//wait 5 seconds
        //robotDrive.drive(0.0,0.0);//stop
        //Timer.delay(10.0);// wait 10 seconds
        
        //leftMotor.set(-1);
        //yrightMotor.set(1);
        //Timer.delay(15);
        //leftMotor.set(0);
        //rightMotor.set(0);
        //Timer.delay(3);
        
        
        
    }

    /**
     * This function is called once each time the robot enters operator control.
     */
    public void operatorControl() {
      while(isOperatorControl() && isEnabled())
    {
        
    
     robotDrive.tankDrive(stickDriverLeft.getAxis(Joystick.AxisType.kY), stickDriverRight.getAxis(Joystick.AxisType.kY));
    
        
       
        if(stickDriverRight.getButton(Joystick.ButtonType.kTrigger)) {
           shooterMotor.set(1);
        }
        else {
            shooterMotor.set(0);
        }
        
        
        if(stickDriverLeft.getButton(Joystick.ButtonType.kTrigger)) {
            gatherMotor1.set(-1);
            
        }
        else {
            gatherMotor1.set(0);
            
        }
       
        bridgeHandMotor.set(stickDriverLeft.getAxis(Joystick.AxisType.kY)); 
               
        
        Timer.delay(.01);
    }

    }
}

This is my code… i need help with the autonomous. i want it to go straight for about 5 seconds. But it only goes straight for about half to 1 second…

Your autonomous function should look like

 
public void autonomous() {

     while(isAutonomous()){  //Place everything in a loop.
        robotDrive.drive(0.5,0.0);//drive at 50% speed 0% turn
        Timer.delay(5.0);//wait 5 seconds
     }      
 

You don’t need to iterate in autonomous; assuming you have a sequence of statements (e.g. drive forwards, stop, shoot) they should only execute once each. Look at this example.

Try the following instead:

public void autonomous() {
        robotDrive.setSafetyEnabled(false);
        robotDrive.drive(0.5,0.0);//drive at 50% speed 0% turn
        Timer.delay(5.0);//wait 5 seconds
}

When setSafetyEnabled is true (by default it is), the robot won’t drive if the code continues for too long. That’s probably causing your robot to stop entirely after ~0.1 seconds.

Another option would be to use the system clock:

We used similar code on an alliance partner’s robot at week 0 and it worked flawlessly.


public void autonomous() {
     long startTime = System.currentTimeMills();
     while(isAutonomous()){  //Place everything in a loop.
        long timePassed = System.currentTimeMills() - startTime;
        if(timePassed < 5000){
                //in the first 5 seconds of auto
                robotDrive.drive(0.1,0.0);
        }else {
                robotDrive.drive(0,0.0);
        }
        Timer.delay(.05);
     }

This code should not cause any drive not updated enough issues because the delay is only .05 second, and you should still be able to have the safety enabled.

Also you’ll noticed I chanced the speed to .01, you only need to cross the line, so I would slowly increment the speed until it matches your needs. Driving at half speed for 5 seconds could have some unintended consequences.

It’s important to actually tell your motors to stop after commanding the drivetrain to move forward for 5 seconds. Otherwise your code will go on its merry way, but the drivetrain will continue to be commanded.

Regardless of how you end up implementing the code you need to explicitly command the motors to 0.

lineskier’s code does this:

robotDrive.drive(0.0, 0.0);

It’s an important item that should not be overlooked.