Creando tu programa de prueba (C++/Java)

Una vez que todo esté instalado, estamos listos para crear un programa para el robot. WPILib viene con varias plantillas para los programas. El uso de estas de estas plantillas está altamente recomendado para nuevos usuarios; sin embargo, los usuarios avanzados son libres para escribir su propio código para el robot desde cero. Este artículo es una guía paso a paso para crear un proyecto desde uno de los ejemplos dados, el cual tiene algo de código ya escrito para manejar un robot básico.

Creando un nuevo proyecto WPILib

Bring up the Visual Studio Code command palette with Ctrl+Shift+P. Then, type «WPILib» into the prompt. Since all WPILib commands start with «WPILib», this will bring up the list of WPILib-specific VS Code commands. Now, select the «Create a new project» command:

Choose "WPILib: Create a new project".

Esto abrirá la ventana “New Project Creator Window:”

The different parts of the new project creation window.

Los elementos de la ventana New Project Creator se explican a continuación:

  1. Project Type: El tipo de proyecto que deseamos crear. Para este ejemplo, seleccione Example

  2. Language: Este es el lenguaje (C++ o Java) que se utilizará para este proyecto.

  3. Project Base: Este recuadro se utiliza para generar el proyecto desde la clase base o ejemplo. Para este ejemplo, seleccione Getting Started

  4. Base Folder: determina la carpeta en la que se ubicará el proyecto del robot.

  5. Project Name: The name of the robot project. This also specifies the name that the project folder will be given if the Create New Folder box is checked.

  6. Create a New Folder: Si está marcada, se creará una nueva carpeta para albergar el proyecto dentro de la carpeta previamente especificada. Si está marcado como no el proyecto se ubicará directamente en la carpeta previamente especificada. Se producirá un error si la carpeta no está vacía y esto no está marcado. La carpeta del proyecto se dará si la casilla Crear nueva carpeta está marcada.

  7. Team Number: El número de equipo para el proyecto, el cual se utilizará para los nombres de paquetes dentro del proyecto y para localizar el robot al implementar el código.

  8. Enable Desktop Support Habilita las pruebas unitarias y la simulación. Mientras que WPILib soporta esto, las bibliotecas de software de terceros pueden no hacerlo. Si las bibliotecas no soportan el escritorio, entonces su código puede no compilar o puede fallar. Debe dejarse sin marcar a menos que la prueba unitaria o la simulación sean necesarias y todas las bibliotecas lo soporten. Para este ejemplo, no marque esta casilla.

Una vez que se haya configurado todo lo anterior, haga clic en “Generate Project” y el proyecto del robot será generado.

Nota

Cualquier error en la generación del proyecto aparecerá en la esquina inferior derecha de la pantalla.

Abriendo el nuevo proyecto

Open Project Dialog in VS Code

After successfully creating your project, VS Code will give the option of opening the project as shown above. We can choose to do that now or later by typing Ctrl+K then Ctrl+O (or just Command+O on macOS) and select the folder where we saved our project.

Trusted Workspace dialog in VS Code.

Click Yes I trust the authors.

Una vez abierto, veremos la jerarquía del proyecto a la izquierda. Al hacer doble clic en el archivo se abre el archivo en el editor.

The robot.java code shown after opening a new project.

Configuraciones de C++ (solo C++)

Para proyectos C++, hay un paso más para configurar IntelliSense. Cada vez que abrimos un proyecto, debería aparecernos una ventana emergente en la esquina inferior derecha pidiendo actualizar las configuraciones de C++. Haga clic en «Yes» para configurar IntelliSense

You must choose "Yes" to refresh the C++ configurations.

Imports/Includes

 7import edu.wpi.first.wpilibj.Joystick;
 8import edu.wpi.first.wpilibj.TimedRobot;
 9import edu.wpi.first.wpilibj.Timer;
10import edu.wpi.first.wpilibj.drive.DifferentialDrive;
11import edu.wpi.first.wpilibj.motorcontrol.PWMSparkMax;

Our code needs to reference the components of WPILib that are used. In C++ this is accomplished using #include statements; in Java it is done with import statements. The program references classes for Joystick (for driving), PWMSparkMax (for controlling motors), TimedRobot (the base class used for the example), Timer (used for autonomous), DifferentialDrive (for connecting the joystick control to the motors), and LiveWindow (C++ only).

Definiendo las variables para nuestro robot de muestra

19public class Robot extends TimedRobot {
20  private final PWMSparkMax m_leftDrive = new PWMSparkMax(0);
21  private final PWMSparkMax m_rightDrive = new PWMSparkMax(1);
22  private final DifferentialDrive m_robotDrive = new DifferentialDrive(m_leftDrive, m_rightDrive);
23  private final Joystick m_stick = new Joystick(0);
24  private final Timer m_timer = new Timer();

The sample robot in our examples will have a joystick on USB port 0 for arcade drive and two motors on PWM ports 0 and 1. Here we create objects of type DifferentialDrive (m_robotDrive), Joystick (m_stick) and Timer (m_timer). This section of the code does three things:

  1. Define las variables como miembros de nuestra clase Robot.

  2. Inicializa las variables.

Nota

La inicialización de variables para C++ está en la sección private en la parte inferior del programa. Esto significa que son privados para la clase (Robot). El código C++ también establece la expiración de la seguridad del motor de 0.1 segundos (la unidad se apagará si no le damos un comando cada .1 segundos) e inicia el Timer utilizado para autónomo.

Inicialización del robot

@Override
public void robotInit() {}

El método RobotInit se ejecuta cuando el programa del robot está arrancando, pero después del constructor. El RobotInit de nuestro programa de muestra no hace nada. Si quisiéramos ejecutar algo aquí podríamos proporcionar el código anterior para anular el predeterminado).

Ejemplo de un autónomo simple

38  /** This function is run once each time the robot enters autonomous mode. */
39  @Override
40  public void autonomousInit() {
41    m_timer.reset();
42    m_timer.start();
43  }
44
45  /** This function is called periodically during autonomous. */
46  @Override
47  public void autonomousPeriodic() {
48    // Drive for 2 seconds
49    if (m_timer.get() < 2.0) {
50      // Drive forwards half speed, make sure to turn input squaring off
51      m_robotDrive.arcadeDrive(0.5, 0.0, false);
52    } else {
53      m_robotDrive.stopMotor(); // stop robot
54    }
55  }

El método AutonomousInit se ejecuta una vez cada vez que el robot pasa a ser autónomo de otro modo En este programa, reiniciamos el Timer y luego lo iniciamos en este método.

AutonomousPeriodic se ejecuta una vez cada período mientras el robot está en modo autónomo. En la clase TimedRobot el período es un tiempo fijo, que por defecto es de 20 ms. En este ejemplo, el código periódico verifica si el temporizador es inferior a 2 segundos y, de ser así, avanza a media velocidad utilizando el método ArcadeDrive de la clase DifferentialDrive. Si tiene más de 2 segundos transcurridos, el código detiene el accionamiento del robot.

Control del joystick para teleoperación

56  /** This function is called once each time the robot enters teleoperated mode. */
57  @Override
58  public void teleopInit() {}
59
60  /** This function is called periodically during teleoperated mode. */
61  @Override
62  public void teleopPeriodic() {
63    m_robotDrive.arcadeDrive(m_stick.getY(), m_stick.getX());
64  }

Como en Autónomo, el modo Teleop tiene una función TeleopInit y TeleopPeriodic. En este ejemplo, no tenemos nada que hacer en TeleopInit, se proporciona con fines ilustrativos solamente. En TeleopPeriodic, el código usa el método``ArcadeDrive`` para mapear el eje Y del Joystick para avanzar / retroceder los motores de accionamiento y el eje X para girar.

Modo prueba

66  /** This function is called once each time the robot enters test mode. */
67  @Override
68  public void testInit() {}
69
70  /** This function is called periodically during test mode. */
71  @Override
72  public void testPeriodic() {}
73}

El modo de prueba se utiliza para probar la funcionalidad del robot. Al igual que TeleopInit, los métodos TestInit y TestPeriodic se proporcionan aquí sólo con fines ilustrativos.

Desplegando el proyecto a un robot

Consulte las instrucciones aquí para desplegar el programa en un robot.