Utiliser le temps (Python)
Objectif : Apprendre à utiliser le timeout
dans la fonction lookup_transform
pour attendre qu’une transformation soit disponible sur l’arborescence tf2.
Niveau du didacticiel : Intermédiaire
Durée : 10 minutes
Arrière-plan
Dans les tutoriels précédents, nous avons recréé la démo de la tortue en écrivant un tf2 broadcaster et un tf2 listener. Nous avons également appris à ajouter un nouveau cadre à l’arbre de transformation. Nous allons maintenant en apprendre plus sur l’argument timeout
qui fait que le lookup_transform
attend la transformation spécifiée jusqu’à la durée spécifiée avant de lancer une exception. Cet outil peut être utile pour écouter les transformations publiées à des rythmes variables ou les sources entrantes avec une mise en réseau peu fiable et une latence non négligeable. Ce tutoriel vous apprendra comment utiliser le timeout dans la fonction lookup_transform
pour attendre qu’une transformation soit disponible sur l’arborescence tf2.
Tâches
1 Mettre à jour le nœud d’écoute
Modifiez turtle_tf2_listener.py
et supprimez le paramètre timeout=Duration(seconds=1.0)
qui est passé à l’appel lookup_transform()
à la ligne 76. Il devrait ressembler à celui illustré ci-dessous :
trans = self._tf_buffer.lookup_transform(
to_frame_rel,
from_frame_rel,
now)
De plus, importez des exceptions supplémentaires que nous traiterons en début de fichier :
from tf2_ros import LookupException, ConnectivityException, ExtrapolationException
Modifiez la gestion des exceptions à la ligne 81 en ajoutant les exceptions nouvellement importées et l’instruction raise
pour voir l’exception :
except (LookupException, ConnectivityException, ExtrapolationException):
self.get_logger().info('transform not ready')
raise
return
Si vous essayez maintenant d’exécuter le fichier de lancement, vous remarquerez qu’il échoue :
ros2 launch learning_tf2_py turtle_tf2_demo.launch.py
2 Corrigez le nœud d’écoute
Vous devriez maintenant remarquer que lookup_transform()
échoue. Il vous indique que la trame n’existe pas ou que les données sont dans le futur. Pour résoudre ce problème, éditez votre code à la ligne 76 comme indiqué ci-dessous (renvoyez le paramètre timeout
) :
trans = self._tf_buffer.lookup_transform(
to_frame_rel,
from_frame_rel,
now,
timeout=rclpy.duration.Duration(seconds=1.0))
Le lookup_transform
peut prendre quatre arguments, le dernier étant un délai d’attente facultatif. Il bloquera jusqu’à cette durée en attendant qu’il expire.
Note
Une fois cette modification effectuée, supprimez la ligne raise
du bloc except()
que nous avons ajouté ci-dessus ou le code continuera d’échouer.
Vous pouvez maintenant exécuter le fichier de lancement.
ros2 launch learning_tf2_py turtle_tf2_demo.launch.py
Vous devriez remarquer que lookup_transform()
se bloquera jusqu’à ce que la transformation entre les deux tortues soit disponible (cela prendra généralement quelques millisecondes). Une fois le délai d’attente atteint (une seconde dans ce cas), une exception sera levée uniquement si la transformation n’est toujours pas disponible.