Voyager dans le temps (C++)

Objectif : En savoir plus sur les fonctionnalités avancées de voyage dans le temps de tf2.

Niveau du didacticiel : Intermédiaire

Durée : 10 minutes

Arrière-plan

Dans le didacticiel précédent, nous avons abordé les bases de tf2 et du temps. Ce tutoriel nous emmènera un peu plus loin et exposera une astuce puissante de tf2 : le voyage dans le temps. En bref, l’une des principales caractéristiques de la bibliothèque tf2 est qu’elle est capable de transformer des données dans le temps ainsi que dans l’espace.

Cette fonctionnalité de voyage dans le temps tf2 peut être utile pour diverses tâches, comme surveiller la pose du robot pendant une longue période ou construire un robot suiveur qui suivra les « pas » du leader. Nous allons utiliser cette fonctionnalité de voyage dans le temps pour rechercher des transformations dans le temps et programmer turtle2 pour suivre 5 secondes derrière carrot1.

Voyage dans le temps

Tout d’abord, revenons à l’endroit où nous nous sommes arrêtés dans le didacticiel précédent Utiliser le temps. Accédez à votre package learning_tf2_cpp.

Maintenant, au lieu de faire aller la deuxième tortue là où se trouve la carotte, nous allons faire aller la deuxième tortue là où se trouvait la première carotte il y a 5 secondes. Modifiez l’appel lookupTransform() dans le fichier turtle_tf2_listener.cpp pour

rclcpp::Time when = this->get_clock()->now() - rclcpp::Duration(5, 0);
t = tf_buffer_->lookupTransform(
    toFrameRel,
    fromFrameRel,
    when,
    50ms);

Maintenant, si vous exécutez ceci, pendant les 5 premières secondes, la deuxième tortue ne saurait pas où aller car nous n’avons pas encore d’historique de 5 secondes des poses de la carotte. Mais que se passe-t-il après ces 5 secondes ? Essayons simplement :

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py
../../../_images/turtlesim_delay1.png

Vous devriez maintenant remarquer que votre tortue se déplace de manière incontrôlable comme dans cette capture d’écran. Essayons de comprendre la raison derrière ce comportement.

  1. Dans notre code, nous avons posé la question suivante à tf2 : « Quelle était la pose de carrot1 il y a 5 secondes, par rapport à turtle2 il y a 5 secondes ? ». Cela signifie que nous contrôlons la deuxième tortue en fonction de l’endroit où elle se trouvait il y a 5 secondes ainsi que de l’endroit où se trouvait la première carotte il y a 5 secondes.

  2. Cependant, ce que nous voulons vraiment demander est : « Quelle était la pose de carotte1 il y a 5 secondes, par rapport à la position actuelle de la tortue2 ? ».

API avancée pour lookupTransform()

Pour poser au tf2 cette question particulière, nous utiliserons une API avancée qui nous donne le pouvoir de dire explicitement quand acquérir les transformations spécifiées. Cela se fait en appelant la méthode lookupTransform() avec des paramètres supplémentaires. Votre code ressemblerait maintenant à ceci :

rclcpp::Time now = this->get_clock()->now();
rclcpp::Time when = now - rclcpp::Duration(5, 0);
t = tf_buffer_->lookupTransform(
    toFrameRel,
    now,
    fromFrameRel,
    when,
    "world",
    50ms);

L’API avancée pour lookupTransform() prend six arguments :

  1. Cadre cible

  2. Le temps de se transformer en

  3. Cadre source

  4. L’heure à laquelle la trame source sera évaluée

  5. Cadre qui ne change pas dans le temps, dans ce cas le cadre monde

  6. Temps d’attente pour que le cadre cible soit disponible

Pour résumer, tf2 fait ce qui suit en arrière-plan. Dans le passé, il calculait la transformation de la carotte1 au monde. Dans le cadre du monde, le temps tf2 voyage du passé au présent. Et à l’heure actuelle, tf2 calcule la transformation du world à la turtle2.

Vérification des résultats

Recommençons la simulation, cette fois avec l’API avancée de voyage dans le temps :

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py
../../../_images/turtlesim_delay2.png

Et oui, la deuxième tortue est dirigée là où se trouvait la première carotte il y a 5 secondes !

Résumé

Dans ce tutoriel, vous avez vu l’une des fonctionnalités avancées de tf2. Vous avez appris que tf2 peut transformer des données dans le temps et appris comment le faire avec l’exemple turtlesim. tf2 vous a permis de remonter dans le temps et de faire des transformations de trame entre les poses anciennes et actuelles des tortues en utilisant l’API avancée lookupTransform().