Que sont les NetworkTables?

Les NetworkTables sont une implémentation d’un » dictionnaire « distribué. Les valeurs nommées sont créées sur le robot, le poste de pilotage ou éventuellement un coprocesseur connecté, et les valeurs sont automatiquement distribuées à tous les autres participants. Par exemple, un ordinateur portable de poste de pilotage peut recevoir des images de caméra sur le réseau, exécuter un algorithme de traitement de la vision et proposer des valeurs à renvoyer au robot. Les valeurs peuvent être X, Y et Distance. En écrivant ces résultats dans des valeurs NetworkTables appelées «X», «Y» et «Distance», ils peuvent être lus par le robot peu de temps après avoir été écrits. Ensuite, le robot peut agir sur eux.

Les NetworkTables peuvent être utilisées par des programmes écrits en C++, Java ou LabVIEW à bord du robot.

L’organisation des NetworkTables

Les données sont organisées dans les NetworkTables dans une hiérarchie un peu comme un répertoire sur disque avec des dossiers et des fichiers. Pour toute instance de NetworkTables, il peut y avoir plusieurs valeurs et sous-tables qui peuvent être imbriquées de la manière qui convient le mieux pour une organisation de données souhaitée. Les sous-tables sont en fait représentées comme une clé longue (long key) avec des barres obliques (/) séparant les noms de clé de sous-table et de valeur imbriqués. Chaque valeur est associée à une clé qui est utilisée pour récupérer la valeur. Par exemple, vous pouvez avoir une table appelée datatable comme indiqué dans les exemples suivants. Dans un datatable, il y a deux clés, X et Y et leurs valeurs associées. L’utilitaire OutlineViewer est un bon outil pour explorer les valeurs stockées dans NetworkTables pendant l’exécution d’un programme.

Les types de données pour NetworkTables sont soit booléens, numériques ou chaîne. Les valeurs numériques sont écrites sous forme de valeurs à double précision. En outre, vous pouvez disposer de tableaux de n’importe lequel de ces types pour garantir que plusieurs éléments de données sont fournis de manière cohérente. Il existe également la possibilité de stocker des données brutes qui peuvent être utilisées pour représenter des données structurées.

Certaines tables par défaut sont créées automatiquement au démarrage du programme:

Nom de table

Utilité

/SmartDashboard

Utilisé pour stocker les valeurs écrites sur le SmartDashboard ou le Shuffleboard à l’aide de l’ensemble de méthodes SmartDashboard.put().

/LiveWindow

Utilisé pour stocker les valeurs du mode Test (Test sur le Driver Station). Il s’agit généralement de sous-systèmes et des capteurs et actionneurs associés.

/FMSInfo

Informations sur le match en cours d’exécution provenant de Driver Station et du Field Management System

Écrire un programme simple avec les NetworkTables

Les classes NetworkTables sont instanciées automatiquement au démarrage de votre programme. L’accès à l’instance de NetworkTables implique l’appel de méthodes pour lire et écrire; la méthode getDefault() peut être utilisée pour obtenir l’instance par défaut.

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;
       }
   }
}

Les valeurs de X et Y peuvent être facilement visualisées à l’aide du programme OutlineViewer qui montre la hiérarchie NetworkTables et toutes les valeurs associées à chaque clé.

Note

En fait, les NetworkTables ont un espace de noms sans hiérarchie pour les clés. Avoir des tableaux et des sous-tableaux est une abstraction pour faciliter l’organisation de vos données. Donc pour une table appelée « SmartDashboard » et une clé nommée « xValue », il s’agit en réalité d’une seule clé appelée « / SmartDashboard / xValue ». La hiérarchie n’est pas réellement représentée dans les données distribuées, seulement les clés avec des préfixes qui sont la table contenue.