¿Qué es una Tabla de Enrutamiento?

NetworkTables es una implementación de un «diccionario» distribuido. Es decir, los valores con nombre se crean en el robot, en la Driver Station o, potencialmente, en un coprocesador conectado, y los valores se distribuyen automáticamente a todos los demás participantes. Por ejemplo, una Driver Station puede recibir imágenes de la cámara a través de la red, realizar algún algoritmo de procesamiento de la visión y obtener algunos valores para enviarlos al robot. Los valores podrían ser un X, Y, y la distancia. Escribiendo estos resultados en valores de NetworkTables llamados «X», «Y», y «Distancia» pueden ser leídos por el robot poco después de ser escritos. Entonces el robot puede actuar sobre ellos.

Las tablas de enrutamiento pueden ser usadas por programas en el robot ya sea C++, Java o LabView e integradas en cada versión de WPILib.

Organización de NetworkTables

En una tabla de enrutamiento los datos están organizados en una jerarquía parecida a un directorio en un disco con carpetas y archivos. En cualquier instancia de la tabla de enrutamiento puede haber múltiples valores y subtablas que pueden ser anidadas de cualquier forma deseada que se acomode a la organización de los datos. Las subtablas son representadas por paréntesis con diagonal (/) separando la subtabla anidada y los valores de los índices. Cada valor tiene un índice asociado con el que es usado para obtener el valor. Por ejemple, usted podría tener una tabla llamada DataTable como se muestra en los siguientes ejemplos. Dentro de la DataTable se tienen 2 índices, X y Y con sus valores asociados. El OutlineViewer es una buena herramienta para explorar los valores guardados en la tabla de enrutamiento mientras el programa está en ejecución.

Los tipos de datos para las tablas de enrutamiento son booleanos, numéricos o de cadena. Los valores numéricos son escritos como valores de doble precisión. Adicionalmente usted puede tener arreglos de cualquiera de esos tipos para asegurar que elementos de múltiples datos son entregados consecuentemente. También existe la opción de almacenar datos sin procesar que pueden ser usados para representar datos estructurados.

Hay algunas tablas predeterminadas que son creadas automáticamente cuando inicia el programa:

Nombre de la Tabla

Uso

/SmartDashboard

Usada para guardas valores escritos en la SmartDashboard o Shuffleboard usando el conjunto de métodos SmartDashboard.put().

/LiveWindow

Usada para guardar valores del Modo de prueba (Modo de la driver station). Normalmente estos son subsistemas y los sensores y actuadores asociados.

/FMSInfo

Información acerca del partido en ejecución que viene de la driver station y el Field Management System.

Escribir un programa sencillo de NetworkTables

Las clases de una tabla de enrutamiento se instancian automáticamente cuando el programa inicia. Para acceder a la instancia de la Tabla de Enrutamiento, llame a los métodos read y write de getDefault() que pueden ser usado para obtener la instancia predeterminada.

package edu.wpi.first.wpilibj.templates;

import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;

public class EasyNetworkTableExample extends TimedRobot {
   NetworkTableEntry xEntry;
   NetworkTableEntry yEntry;

   public void robotInit() {
      //Get the default instance of NetworkTables that was created automatically
      //when your program starts
      NetworkTableInstance inst = NetworkTableInstance.getDefault();

      //Get the table within that instance that contains the data. There can
      //be as many tables as you like and exist to make it easier to organize
      //your data. In this case, it's a table called datatable.
      NetworkTable table = inst.getTable("datatable");

      //Get the entries within that table that correspond to the X and Y values
      //for some operation in your program.
      xEntry = table.getEntry("X");
      yEntry = table.getEntry("Y");
   }

   double x = 0;
   double y = 0;

   public void teleopPeriodic() {
      //Using the entry objects, set the value to a double that is constantly
      //increasing. The keys are actually "/datatable/X" and "/datatable/Y".
      //If they don't already exist, the key/value pair is added.
      xEntry.setDouble(x);
      yEntry.setDouble(y);
      x += 0.05;
      y += 1.0;
   }
}

Los valores para X y Y pueden ser vistos fácilmente usando el OutlineViewer que muestra la jerarquía de la Tabla de Enrutamiento y todos los valores asociados con cada índice.

Nota

En realidad NetworkTables tiene un espacio de nombres plano para las claves. Tener tablas y subtablas es una abstracción para facilitar la organización de los datos. Así que para una tabla llamada «SmartDashboard» y una clave llamada «xValue», es realmente una sola clave llamada «/SmartDashboard/xValue». La jerarquía no está realmente representada en los datos distribuidos, sólo claves con prefijos que son la tabla contenida.