Activation des statistiques de sujet (C++)

Objectif : Activer les statistiques de sujet ROS 2 et afficher les données statistiques de sortie.

Niveau du didacticiel : Avancé

Durée : 10 minutes

Arrière-plan

Il s’agit d’un court didacticiel expliquant comment activer Topic Statistics dans ROS 2 et afficher la sortie des statistiques publiées à l’aide des outils de ligne de commande (:doc :ros2topic).

ROS 2 fournit la mesure intégrée des statistiques pour les messages reçus par n’importe quel abonnement, appelée Topic Statistics. Avec Topic Statistics activé pour votre abonnement, vous pouvez caractériser les performances de votre système ou utiliser les données pour vous aider à diagnostiquer les problèmes actuels.

Pour plus de détails, veuillez consulter la page des concepts de statistiques thématiques.

Conditions préalables

Une installation à partir des binaires ou de la source.

Dans les tutoriels précédents, vous avez appris à créer un espace de travail, créer un package et créez un C++ éditeur et abonné.

Ce tutoriel suppose que vous avez toujours votre package cpp_pubsub du tutoriel C++ .

Tâches

1 Écrivez le nœud de l’abonné avec les statistiques activées

Naviguez dans le dossier ros2_ws/src/cpp_pubsub/src, créé dans le tutoriel précédent, et téléchargez l’exemple de code talker en saisissant la commande suivante :

wget -O member_function_with_topic_statistics.cpp https://raw.githubusercontent.com/ros2/examples/rolling/rclcpp/topics/minimal_subscriber/member_function_with_topic_statistics.cpp

Il y aura maintenant un nouveau fichier nommé member_function_with_topic_statistics.cpp. Ouvrez le fichier à l’aide de votre éditeur de texte préféré.

#include <chrono>
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "rclcpp/subscription_options.hpp"

#include "std_msgs/msg/string.hpp"

class MinimalSubscriberWithTopicStatistics : public rclcpp::Node
{
public:
  MinimalSubscriberWithTopicStatistics()
  : Node("minimal_subscriber_with_topic_statistics")
  {
    // manually enable topic statistics via options
    auto options = rclcpp::SubscriptionOptions();
    options.topic_stats_options.state = rclcpp::TopicStatisticsState::Enable;

    // configure the collection window and publish period (default 1s)
    options.topic_stats_options.publish_period = std::chrono::seconds(10);

    // configure the topic name (default '/statistics')
    // options.topic_stats_options.publish_topic = "/topic_statistics"

    auto callback = [this](std_msgs::msg::String::SharedPtr msg) {
        this->topic_callback(msg);
      };

    subscription_ = this->create_subscription<std_msgs::msg::String>(
      "topic", 10, callback, options);
  }

private:
  void topic_callback(const std_msgs::msg::String::ConstSharedPtr msg) const
  {
    RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
  }
  rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MinimalSubscriberWithTopicStatistics>());
  rclcpp::shutdown();
  return 0;
}

1.1 Examiner le code

Comme dans le didacticiel C++, nous avons un nœud d’abonné qui reçoit des messages de chaîne du ` topic` sujet de la fonction topic_callback. Cependant, nous avons maintenant ajouté des options pour configurer l’abonnement afin d’activer les statistiques de sujet avec la structure d’options rclcpp::SubscriptionOptions().

// manually enable topic statistics via options
auto options = rclcpp::SubscriptionOptions();
options.topic_stats_options.state = rclcpp::TopicStatisticsState::Enable;

En option, des champs tels que la période de collecte/publication des statistiques et le sujet utilisé pour publier les statistiques peuvent également être configurés.

// configure the collection window and publish period (default 1s)
options.topic_stats_options.publish_period = std::chrono::seconds(10);

// configure the topic name (default '/statistics')
// options.topic_stats_options.publish_topic = "/my_topic"

Les champs configurables sont décrits dans le tableau suivant :

Champ de configuration de l’abonnement

But

topic_stats_options.state

Activer ou désactiver les statistiques de sujet (par défaut rclcpp::TopicStatisticsState::Disable)

topic_stats_options.publish_period

La période pendant laquelle collecter des données statistiques et publier un message de statistiques (par défaut 1s)

topic_stats_options.publish_topic

Le sujet à utiliser lors de la publication de données statistiques (par défaut /statistics)

1.2 CMakeLists.txt

Ouvrez maintenant le fichier CMakeLists.txt.

Ajoutez l’exécutable et nommez-le listener_with_topic_statistics afin que vous puissiez exécuter votre nœud en utilisant ros2 run :

add_executable(listener_with_topic_statistics member_function_with_topic_statistics.cpp)
ament_target_dependencies(listener_with_topic_statistics rclcpp std_msgs)

install(TARGETS
  talker
  listener
  listener_with_topic_statistics
  DESTINATION lib/${PROJECT_NAME})

Assurez-vous d’enregistrer le fichier, puis votre système pub/sub, avec les statistiques de sujet activées, devrait être prêt à l’emploi.

2 Construire et exécuter

Pour compiler, consultez la section Build and run dans le didacticiel pub/sub.

Exécutez l’abonné avec le nœud activé pour les statistiques :

ros2 run cpp_pubsub listener_with_topic_statistics

Exécutez maintenant le nœud Talker :

ros2 run cpp_pubsub talker

Le terminal devrait commencer à publier des messages d’information toutes les 0,5 seconde, comme ceci :

[INFO] [minimal_publisher]: Publishing: "Hello World: 0"
[INFO] [minimal_publisher]: Publishing: "Hello World: 1"
[INFO] [minimal_publisher]: Publishing: "Hello World: 2"
[INFO] [minimal_publisher]: Publishing: "Hello World: 3"
[INFO] [minimal_publisher]: Publishing: "Hello World: 4"

L’écouteur commencera à imprimer des messages sur la console, à partir du nombre de messages sur lequel l’éditeur se trouve à ce moment-là, comme ceci :

[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 10"
[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 11"
[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 12"
[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 13"
[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 14"

Maintenant que le nœud d’abonné reçoit des messages, il publiera périodiquement des messages de statistiques. Nous observerons ces messages dans la section suivante.

3 Observer les données statistiques publiées

Pendant que les nœuds sont en cours d’exécution, ouvrez une nouvelle fenêtre de terminal. Exécutez la commande suivante :

ros2 topic list

Cela listera tous les sujets actuellement actifs. Vous devriez voir ce qui suit :

/parameter_events
/rosout
/statistics
/topic

Si vous avez éventuellement modifié le champ topic_stats_options.publish_topic plus tôt dans le didacticiel, vous verrez ce nom au lieu de /statistics.

Le nœud d’abonné que vous avez créé publie des statistiques, pour le sujet topic, dans le sujet de sortie /statistics.

Nous pouvons visualiser cela en utilisant RQt

../../../_images/topic_stats_rqt.png

Nous pouvons maintenant afficher les données statistiques publiées sur ce sujet avec la commande suivante :

ros2 topic echo /statistics

Le terminal devrait commencer à publier des messages de statistiques toutes les 10 secondes, car la configuration de l’abonnement topic_stats_options.publish_period a éventuellement été modifiée plus tôt dans le didacticiel.

---
measurement_source_name: minimal_subscriber_with_topic_statistics
metrics_source: message_age
unit: ms
window_start:
  sec: 1594856666
  nanosec: 931527366
window_stop:
  sec: 1594856676
  nanosec: 930797670
statistics:
- data_type: 1
  data: .nan
- data_type: 3
  data: .nan
- data_type: 2
  data: .nan
- data_type: 5
  data: 0.0
- data_type: 4
  data: .nan
---
measurement_source_name: minimal_subscriber_with_topic_statistics
metrics_source: message_period
unit: ms
window_start:
  sec: 1594856666
  nanosec: 931527366
window_stop:
  sec: 1594856676
  nanosec: 930797670
statistics:
- data_type: 1
  data: 499.2746365105009
- data_type: 3
  data: 500.0
- data_type: 2
  data: 499.0
- data_type: 5
  data: 619.0
- data_type: 4
  data: 0.4463309283488427
---

À partir de la définition du message, les data_types sont les suivants

valeur du type de données

statistiques

1

moyenne

2

le minimum

3

maximum

4

écart-type

5

nombre d’échantillons

Ici, nous voyons les deux statistiques calculées actuellement possibles pour le message std_msgs::msg::String publié sur /topic par le minimal_publisher. Étant donné que std_msgs::msg::String n’a pas d’en-tête de message, le calcul de message_age ne peut pas être effectué, donc les NaN sont renvoyés. Cependant, le message_period peut être calculé et nous voyons les statistiques renseignées dans le message ci-dessus.

Résumé

Vous avez créé un nœud d’abonné avec les statistiques de rubrique activées, qui a publié des données de statistiques à partir du C++” le nœud de l’éditeur. Vous avez pu compiler et exécuter ce nœud. Pendant la course, vous avez pu observer les données statistiques.