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.

Résumé

Dans ce didacticiel, vous en avez appris davantage sur la fonction lookup_transform et ses fonctionnalités de délai d’attente. Vous avez également appris à intercepter et à gérer les exceptions supplémentaires qui peuvent être levées par tf2.