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
Table des matières
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
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
Faites un clic droit sur ce lien et sélectionnez Enregistrer sous publisher_member_function.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 |
topic_stats_options.publish_period |
La période pendant laquelle collecter des données statistiques et publier un message de statistiques (par défaut |
topic_stats_options.publish_topic |
Le sujet à utiliser lors de la publication de données statistiques (par défaut |
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

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.