Reading Array Values Published by NetworkTables

This article describes how to read values published by NetworkTables using a program running on the robot. This is useful when using computer vision where the images are processed on your driver station laptop and the results stored into NetworkTables possibly using a separate vision processor like a raspberry pi, or a tool on the robot like a python program to do the image processing.

Très souvent, les valeurs concernent un ou plusieurs domaines d’intérêt tels que les objectifs ou les pièces de jeu et plusieurs instances sont renvoyées. Dans l’exemple ci-dessous, plusieurs valeurs de x, y, largeur, hauteur et zones sont envoyés par le processeur d’image et le programme du robot peut trier les valeurs qui sont intéressantes grâce à un traitement plus poussé.

Verify the NetworkTables Topics Being Published

Image of OutlineViewer with the NetworkTables topics

You can verify the names of the NetworkTables topics used for publishing the values by using the Outline Viewer application. It is a C++ program in your user directory in the wpilib/<YEAR>/tools folder. The application is started by selecting the « WPILib » menu in Visual Studio Code then Start Tool then « OutlineViewer ». In this example, with the image processing program running (GRIP) you can see the values being put into NetworkTables.

In this case the values are stored in a table called GRIP and a sub-table called myContoursReport. You can see that the values are in brackets and there are 2 values in this case for each topic. The NetworkTables topic names are centerX, centerY, area, height and width.

Les deux exemples suivants sont des programmes simples qui illustrent l’utilisation de NetworkTables. Tout le code est dans la méthode robotInit(), il n’est donc exécuté qu’au démarrage du programme. Dans vos programmes, vous obtiendrez plus probablement les valeurs dans le code qui gère vers quelle direction le robot doit viser pour atteindre une cible, ou une boucle de contrôle pendant les périodes autonome ou téléopérée.

Writing a Program to Access the Topics

DoubleArraySubscriber areasSub;

@Override
public void robotInit() {
  NetworkTable table = NetworkTableInstance.getDefault().getTable("GRIP/mycontoursReport");
  areasSub = table.getDoubleArrayTopic("area").subscribe(new double[] {});
}

@Override
public void teleopPeriodic() {
    double[] areas = areasSub.get();

    System.out.print("areas: " );

    for (double area : areas) {
      System.out.print(area + " ");
    }

    System.out.println();
}
nt::DoubleArraySubscriber areasSub;

void Robot::RobotInit() override {
  auto table = nt::NetworkTableInstance::GetDefault().GetTable("GRIP/myContoursReport");
  areasSub = table->GetDoubleArrayTopic("area").Subscribe({});
}

void Robot::TeleopPeriodic() override {
  std::cout << "Areas: ";

  std::vector<double> arr = areasSub.Get();

  for (double val : arr) {
    std::cout << val << " ";
  }

  std::cout << std::endl;
}
def robotInit(self):
    table = ntcore.NetworkTableInstance.getDefault().getTable("GRIP/mycontoursReport")
    self.areasSub = table.getDoubleArrayTopic("area").subscribe([])

def teleopPeriodic(self):
    areas = self.areasSub.get()
    print("Areas:", areas)

Les étapes pour obtenir les valeurs et aussi les imprimer sont les suivantes:

  1. Déclarer la variable de table qui contiendra l’instance de la sous-table contenant les valeurs.

  2. Initialiser l’instance de sous-table afin qu’elle puisse être utilisée plus tard pour récupérer les valeurs.

  3. Read the array of values from NetworkTables. In the case of a communicating programs, it’s possible that the program producing the output being read here might not yet be available when the robot program starts up. To avoid issues of the data not being ready, a default array of values is supplied. This default value will be returned if the NetworkTables topic hasn’t yet been published. This code will loop over the value of areas every 20ms.

Program Output

Image de Riolog montrant des valeurs

Dans ce cas, le programme ne regarde seulement que le tableau des zones, mais dans un exemple réel, toutes les valeurs seraient plus susceptibles d’être utilisées. En utilisant le Riolog dans VS Code ou le journal (log) du Driver Station, vous pouvez voir les valeurs au fur et à mesure qu’elles sont récupérées. Ce programme utilise un exemple d’image statique afin que les zones ne changent pas, mais vous pouvez imaginer qu’avec une caméra sur votre robot, les valeurs changeraient constamment.