Bug À La Réception Des Messages
Introduction
Lors d'un test sur l'IHM (Interface Homme-Machine) de notre projet, nous avons rencontré un problème inattendu. Lorsque nous publions un message sur le topic AU
, l'application IHM se bloque et nous obtenons une erreur. Dans cet article, nous allons décrire ce problème et essayer de comprendre les raisons qui le causent.
Le test
Pour reproduire ce problème, nous avons lancé la commande suivante :
ros2 launch bringup ihm.launch.py
Cela a démarré les processus nécessaires pour lancer l'IHM. Ensuite, nous avons publié un message sur le topic AU
avec la commande suivante :
ros2 topic pub /main_robot/au std_msgs/msg/Bool '{data: True}'
Le retour
Voici le retour de la commande ros2 launch bringup ihm.launch.py
:
ros2 launch bringup ihm.launch.py
[INFO] [launch]: All log files can be found below /home/greg/.ros/log/2025-03-09-11-21-21-576640-Vivo-greg-10625
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [ihm_node-1]: process started with pid [10626]
[INFO] [parameters_server-2]: process started with pid [10628]
[parameters_server-2] [INFO] [1741515681.841950703] [main_robot.param_server]: Parameters service is ready.
[ihm_node-1] [INFO] [1741515681.899724594] [main_robot.node_ihm]: Initializing IHM Node
[ihm_node-1] [INFO] [1741515681.900188328] [main_robot.node_ihm]: Setting up subscribers...
[ihm_node-1] [INFO] [1741515683.932075888] [main_robot.node_ihm]: Color selected: yellow
[ihm_node-1] [INFO] [1741515685.534126187] [main_robot.node_ihm]: Script selected: 100
[parameters_server-2] [INFO] [1741515685.537592597] [main_robot.param_server]: Received request: team_color=yellow, script_number=100, debug_mode=False
[parameters_server-2] [INFO] [1741515685.538231547] [main_robot.param_server]: Updated parameters: team_color=yellow, script_number=100, debug_mode=False
[ihm_node-1] [INFO] [1741515685.567391922] [main_robot.node_ihm]: Parameters updated successfully: cdf_msgs.srv.Init_Response(success=False)
[parameters_server-2] [INFO] [1741515687.109972283] [main_robot.param_server]: Received request: team_color=yellow, script_number=100, debug_mode=False
[parameters_server-2] [INFO] [1741515687.110362020] [main_robot.param_server]: Updated parameters: team_color=yellow, script_number=100, debug_mode=False
[ihm_node-1] [INFO] [1741515687.133532691] [main_robot.node_ihm]: Parameters updated successfully: cdf_msgs.srv.Init_Response(success=False)
[ihm_node-1] [INFO] [1741515691.698805811] [main_robot.node_ihm]: Shutting down IHM Node
[ihm_node-1] Traceback (most recent call last):
[ihm_node-1] File "/home/greg/Documents/Oppossum/Ros2_base_cdf/install/ihm/lib/ihm/ihm_node", line 33, in <module>
[ihm_node-1] sys.exit(load_entry_point('ihm', 'console_scripts', 'ihm_node')())
[ihm_node-1] File "/home/greg/Documents/Oppossum/Ros2_base_cdf/build/ihm/ihm/ihm_node.py", line 123, in main
[ihm_node-1] rclpy.spin(node) # Gestion des messages ROS 2
[ihm_node-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/__init__.py", line 226, in spin
[ihm_node-1] executor.spin_once()
[ihm_node-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 739, in spin_once
[ihm_node-1] self._spin_once_impl(timeout_sec)
[ihm_node-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 736, in _spin_once_impl
[ihm_node-1] raise handler.exception()
[ihm_node-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/task.py", line 239, in __call__
[ihm_node-1] self._handler.send(None)
[ihm_node-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 437, in handler
[ihm_node-1] await call_coroutine(entity, arg)
[ihm_node-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 362, in _execute_subscription
[ihm_node-1] await await_or_execute(sub.callback, msg)
[ihm_node-1] File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 107, in await_or_execute
[ihm_node-1] return callback(*args)
[ihm_node-1] File "/home/greg/Documents/Oppossum/Ros2_base_cdf/build/ihm/ihm/ihm_node.py", line 108, in au_callback
[ihm_node-1] self.gui.update_au(msg.data)
[ihm_node-1] File "/home/greg/Documents/Oppossum/Ros2_base_cdf/build/ihm/ihm/interface.py", line 345, in update_au
[ihm_node-1] assert self.score_app is not None
[ihm_node-1] AttributeError: 'GUI' object has no attribute 'score_app'
[ERROR] [ihm_node-1]: process has died [pid 10626, exit code 1, cmd '/home/greg/Documents/Oppossum/Ros2_base_cdf/install/ihm/lib/ihm/ihm_node --ros-args -r __node:=node_ihm -r __ns:=/main_robot'].
Analyse du problème
D'après les logs, nous pouvons voir que l'erreur se produit lors de l'appel de la fonction update_au
dans la classe GUI
. Cette fonction tente d'accéder à l'attribut score_app
de l'objet GUI
, mais cet attribut n'existe pas.
Hypothèses
Nous pouvons faire plusieurs hypothèses pour expliquer ce problème :
- Le problème est causé par un bug dans la classe
GUI
qui empêche l'attributscore_app
d'être créé. - Le problème est causé par un problème de synchronisation entre les threads qui utilisent la classe
GUI
. - Le problème est causé par un problème de configuration qui empêche la classe
GUI
de fonctionner correctement.
Conclusion
En résumé, nous avons rencontré un problème inattendu lors de l'utilisation de la classe GUI
dans notre projet. L'erreur se produit lors de l'appel de la fonction update_au
qui tente d'accéder à l'attribut score_app
de l'objet GUI
. Nous avons fait plusieurs hypothèses pour expliquer ce problème et nous allons devoir effectuer des tests et des analyses pour déterminer la cause réelle du problème.
Solutions possibles
Voici quelques solutions possibles pour résoudre ce problème :
- Vérifier la classe
GUI
pour s'assurer qu'elle est correctement configurée et qu'elle crée l'attributscore_app
correctement. - Utiliser des outils de débogage pour analyser les threads et les processus qui utilisent la classe
GUI
et pour déterminer si il y a un problème de synchronisation. - Vérifier la configuration du projet pour s'assurer qu'elle est correcte et qu'elle permet à la classe
GUI
de fonctionner correctement.
Étapes à suivre
Voici les étapes à suivre pour résoudre ce problème :
- Vérifier la classe
GUI
pour s'assurer qu'elle est correctement configurée et qu'elle crée l'attributscore_app
correctement. - Utiliser des outils de débogage pour analyser les threads et les processus qui utilisent la classe
GUI
et pour déterminer si il y a un problème de synchronisation. - Vérifier la configuration du projet pour s'assurer qu'elle est correcte et qu'elle permet à la classe
GUI
de fonctionner correctement. - Effectuer des tests pour vérifier que la classe
GUI
fonctionne correctement
Introduction
Dans notre précédent article, nous avons décrit un problème inattendu qui se produit lors de l'utilisation de la classe GUI
dans notre projet. L'erreur se produit lors de l'appel de la fonction update_au
qui tente d'accéder à l'attribut score_app
de l'objet GUI
. Dans cet article, nous allons répondre à quelques questions fréquentes qui peuvent aider à comprendre le problème et à trouver une solution.
Q1 : Qu'est-ce qui cause le problème ?
R1 : Le problème est causé par un bug dans la classe GUI
qui empêche l'attribut score_app
d'être créé. Cependant, il est possible que le problème soit causé par un problème de synchronisation entre les threads qui utilisent la classe GUI
ou par un problème de configuration qui empêche la classe GUI
de fonctionner correctement.
Q2 : Comment puis-je résoudre ce problème ?
R2 : Pour résoudre ce problème, vous pouvez suivre les étapes suivantes :
- Vérifier la classe
GUI
pour s'assurer qu'elle est correctement configurée et qu'elle crée l'attributscore_app
correctement. - Utiliser des outils de débogage pour analyser les threads et les processus qui utilisent la classe
GUI
et pour déterminer si il y a un problème de synchronisation. - Vérifier la configuration du projet pour s'assurer qu'elle est correcte et qu'elle permet à la classe
GUI
de fonctionner correctement. - Effectuer des tests pour vérifier que la classe
GUI
fonctionne correctement.
Q3 : Qu'est-ce que la synchronisation des threads ?
R3 : La synchronisation des threads est un processus qui permet à plusieurs threads de partager des ressources sans que cela cause des problèmes de concurrence. Les threads peuvent partager des ressources telles que des variables, des objets ou des fichiers. La synchronisation des threads est nécessaire pour éviter les problèmes de concurrence qui peuvent se produire lorsque plusieurs threads tentent d'accéder à la même ressource en même temps.
Q4 : Comment puis-je utiliser des outils de débogage pour analyser les threads et les processus ?
R4 : Pour utiliser des outils de débogage pour analyser les threads et les processus, vous pouvez suivre les étapes suivantes :
- Utiliser un débogueur tel que
pdb
pour analyser les threads et les processus. - Utiliser des outils de débogage tels que
gdb
oulldb
pour analyser les threads et les processus. - Utiliser des outils de débogage tels que
valgrind
ouAddressSanitizer
pour analyser les threads et les processus.
Q5 : Qu'est-ce que la configuration du projet ?
R5 : La configuration du projet est un ensemble de paramètres qui définissent comment le projet doit être exécuté. La configuration du projet peut inclure des paramètres tels que les chemins des fichiers, les noms des variables, les valeurs des constantes, etc. La configuration du projet est nécessaire pour permettre au projet de fonctionner correctement.
Q6 : Comment puis-je vérifier la configuration du projet ?
R6 : Pour vérifier la configuration du projet, vous pouvez suivre les étapes suivantes :
- Vérifier les fichiers de configuration tels que
config.py
ousettings.py
. - Vérifier les variables d'environnement pour s'assurer qu'elles sont correctes.
- Vérifier les paramètres de la ligne de commande pour s'assurer qu'ils sont corrects.
Q7 : Qu'est-ce que les tests ?
R7 : Les tests sont des programmes qui vérifient que le code fonctionne correctement. Les tests peuvent être utilisés pour vérifier que le code fonctionne correctement, que les erreurs sont corrigées et que les performances sont améliorées.
Q8 : Comment puis-je effectuer des tests ?
R8 : Pour effectuer des tests, vous pouvez suivre les étapes suivantes :
- Écrire des tests unitaires pour vérifier que les fonctions individuelles fonctionnent correctement.
- Écrire des tests d'intégration pour vérifier que les composants fonctionnent correctement ensemble.
- Utiliser des outils de test tels que
unittest
oupytest
pour effectuer des tests.
Q9 : Qu'est-ce que les outils de test ?
R9 : Les outils de test sont des programmes qui aident à effectuer des tests. Les outils de test peuvent être utilisés pour écrire des tests, exécuter des tests, analyser les résultats des tests, etc.
Q10 : Comment puis-je utiliser des outils de test ?
R10 : Pour utiliser des outils de test, vous pouvez suivre les étapes suivantes :
- Installer les outils de test tels que
unittest
oupytest
. - Utiliser les outils de test pour écrire des tests, exécuter des tests, analyser les résultats des tests, etc.
Nous espérons que ces questions et réponses vous ont aidé à comprendre le problème et à trouver une solution. Si vous avez d'autres questions, n'hésitez pas à les poser.