Foxy Fitzroy (foxy)

Foxy Fitzroy est la sixième version de ROS 2.

Plates-formes prises en charge

Foxy Fitzroy est principalement pris en charge sur les plates-formes suivantes :

Plateformes de niveau 1 :

  • Ubuntu 20.04 (Focal) : amd64 et arm64

  • Mac macOS 10.14 (Mojave)

  • Windows 10 (Visual Studio 2019)

Plateformes de niveau 3 :

  • Ubuntu 20.04 (Focal): arm32

  • Debian Buster (10) : amd64, arm64 et arm32

  • OpenEmbedded Thud (2.6) / webOS OSE : arm32 et x86

Pour plus d’informations sur les implémentations RMW, les versions du compilateur/interpréteur et les versions des dépendances système, consultez REP 2000.

Nouvelles fonctionnalités de cette version de ROS 2

Pendant le développement, le méta-ticket Foxy sur GitHub contient un état à jour des tâches de haut niveau en cours ainsi que des références spécifiques billets avec plus de détails.

Changements dans la version 8 du correctif (2022-09-28)

Lancer l’environnement de portée GroupAction

L’action SetEnvironmentVariable est désormais limitée à tout GroupAction à partir duquel elle est renvoyée.

Par exemple, considérez les fichiers de lancement suivants,

import launch
from launch.actions import SetEnvironmentVariable
from launch.actions import GroupAction
from launch_ros.actions import Node


def generate_launch_description():
    return launch.LaunchDescription([
        SetEnvironmentVariable(name='my_env_var', value='1'),
        Node(package='foo', executable='foo', output='screen'),
        GroupAction([
            SetEnvironmentVariable(name='my_env_var', value='2'),
        ]),
    ])

Avant la version 8 du patch, le nœud foo commencerait par my_env_var=2, mais maintenant il commencera par my_env_var=1.

Pour désactiver le nouveau comportement, vous pouvez définir l’argument scoped=False sur GroupAction.

Billets associés :

Changements dans la version 7 du correctif (2022-02-08)

Lancer le changement de comportement du frontend set_env

launch#468 a modifié par inadvertance le comportement de la portée de l’action set_env dans les fichiers de lancement frontaux. Les modifications apportées aux variables d’environnement à l’aide de l’action set_env ne sont plus limitées aux actions parent group, et s’appliquent à la place globalement. Depuis qu’il a été rétroporté, le changement affecte cette version.

Nous considérons ce changement comme une régression et avons l’intention de corriger le comportement dans la prochaine version du correctif et dans les futures distributions ROS. Nous prévoyons également de corriger le comportement dans les fichiers de lancement Python, qui n’ont jamais défini correctement les variables d’environnement.

Problèmes liés:

Correction du lancement de l’analyseur frontal

Une refactorisation de l’analyseur frontend de lancement a corrigé certains problèmes d’analyse des caractères spéciaux. En conséquence, il y a eu un petit changement de comportement en ce qui concerne l’analyse des chaînes. Par exemple, auparavant, pour transmettre un nombre en tant que chaîne, vous deviez ajouter des guillemets supplémentaires (deux ensembles de guillemets étaient nécessaires si vous utilisiez une substitution) :

<!-- results in the string value "'3'" -->
<param name="foo" value="''3''"/>

Après la refactorisation, ce qui précède se traduira par la chaîne "''3''" (notez le jeu supplémentaire de guillemets). Désormais, les utilisateurs doivent utiliser l’attribut type pour signaler que la valeur doit être interprétée comme une chaîne :

<param name="foo" value="3" type="str"/>

Demandes d’extraction associées :

Correction des fuites de mémoire et du comportement indéfini dans rmw_fastrtps_dynamic_cpp

L’API a été modifiée dans les fichiers d’en-tête suivants :

  • rmw_fastrtps_dynamic_cpp/TypeSupport.hpp

  • rmw_fastrtps_dynamic_cpp/TypeSupport_impl.hpp

Bien qu’ils soient techniquement accessibles au public, il est peu probable que les gens les utilisent directement. Par conséquent, nous avons décidé de casser l’API afin de corriger les fuites de mémoire et les comportements indéfinis.

Le correctif a été initialement soumis dans rmw_fastrtps#429 et plus tard rétroporté sur Foxy dans rmw_fastrtps#577.

Changements dans la version 2 du correctif (2020-08-07)

Bogue dans static_transform_publisher

Lors du développement de Foxy, un bogue a été introduit dans le programme tf2_ros static_transform_publisher. L’implémentation de l’ordre des angles d’Euler transmis à static_transform_publisher est en désaccord avec la documentation. Le correctif Foxy version 2 corrige l’ordre afin que l’implémentation soit en accord avec la documentation (lacet, tangage, roulis). Pour les utilisateurs qui ont commencé à utiliser la version initiale de Foxy ou la version 1 du correctif, cela signifie que tous les fichiers de lancement qui utilisent static_transform_publisher devront avoir l’ordre de la ligne de commande permuté en fonction du nouvel ordre. Pour les utilisateurs qui viennent de ROS 2 Dashing, ROS 2 Eloquent ou ROS 1, aucune modification ne doit être apportée au port vers la version 2 du correctif Foxy.

Changements depuis la sortie d’Eloquent

CMake classique contre CMake moderne

Dans CMake « classique », un package fournit des variables CMake telles que <pkgname>_INCLUDE_DIRS et <pkgname>_LIBRARIES lorsqu’il est find_package()-ed. Avec ament_cmake cela est réalisé en appelant ament_export_include_directories et ament_export_libraries. En combinaison avec ament_export_dependencies, ament_cmake garantit que tous les répertoires d’inclusion et bibliothèques de dépendances récursives sont concaténés et inclus dans ces variables.

Dans CMake « moderne », un package fournit à la place une cible d’interface (communément appelée <pkgname>::<pkgname>) qui en elle-même encapsule toutes les dépendances récursives. Afin d’exporter une cible de bibliothèque pour utiliser CMake moderne, ament_export_targets doit être appelé avec un nom d’exportation qui est également utilisé lors de l’installation des bibliothèques à l’aide de install(TARGETS <libA> <libB> EXPORT <export_name> .. .). Les cibles d’interface exportées sont disponibles via la variable CMake <pkgname>_TARGETS. Pour que les cibles de bibliothèque soient exportables comme ceci, elles ne doivent pas s’appuyer sur des fonctions classiques affectant l’état global comme include_directories() mais définir les répertoires d’inclusion sur la cible elle-même - pour la construction ainsi que l’environnement d’installation - en utilisant des expressions de générateur, par ex. target_include_directories(<cible> PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>" "$<INSTALL_INTERFACE:include>").

Lorsque ament_target_dependencies est utilisé pour ajouter des dépendances à une cible de bibliothèque, la fonction utilise des cibles CMake modernes lorsqu’elles sont disponibles. Sinon, il revient à l’utilisation de variables CMake classiques. Par conséquent, vous ne devez exporter des cibles CMake modernes que si toutes les dépendances fournissent également des cibles CMake modernes. Sinon, la cible d’interface exportée contiendra les chemins absolus pour inclure les répertoires/bibliothèques dans la logique CMake générée, ce qui rend le package non déplaçable.

Pour des exemples de mise à jour des packages vers CMake moderne dans Foxy, voir ros2/ros2#904.

ament_export_interfaces remplacé par ament_export_targets

La fonction CMake ament_export_interfaces du package ament_cmake_export_interfaces a été dépréciée au profit de la fonction ament_export_targets dans le nouveau package ament_cmake_export_targets. Voir le ticket GitHub ament/ament_cmake#237 pour plus de contexte.

rosidl_generator_c|espace de noms cpp / modifications de l’API

Les packages rosidl_generator_c et rosidl_generator_cpp ont été refactorisés avec de nombreux en-têtes et sources déplacés dans les nouveaux packages rosidl_runtime_c et rosidl_runtime_cpp. L’intention est de supprimer les dépendances d’exécution sur les packages du générateur et donc les outils de génération de code utilisant Python. Lors du déplacement des en-têtes, les chemins d’inclusion/espaces de noms ont été mis à jour en conséquence, de sorte que dans de nombreux cas, la modification des directives d’inclusion du package générateur vers le package d’exécution est suffisante.

Le code C/C++ généré a également été refactorisé. Les fichiers se terminant par __struct.h|hpp, __functions.h, __traits.hpp, etc. ont été déplacés dans un sous-répertoire detail mais la plupart du code n’inclut que l’en-tête nommé d’après l’interface sans aucun de ces suffixes.

Certains types concernant les limites de chaîne et de séquence ont également été renommés pour correspondre aux conventions de dénomination, mais ils ne devraient pas être utilisés dans le code utilisateur (au-dessus de l’implémentation RMW et des packages de prise en charge de type)

Pour plus d’informations, voir ros2/rosidl#446 (pour C) et ros2/rosidl#447 (pour C++).

Répertoire de travail par défaut pour ament_add_test

Le répertoire de travail par défaut pour les tests ajoutés avec ament_add_test a été remplacé par CMAKE_CURRENT_BINARY_DIR pour correspondre au comportement de CMake add_test. Mettez à jour les tests pour qu’ils fonctionnent avec la nouvelle valeur par défaut ou passez WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} pour restaurer la valeur précédente.

Format de journalisation de la console par défaut

Le format de sortie de journalisation de la console par défaut a été modifié pour inclure l’horodatage par défaut, voir :

Flux de sortie de journalisation de la console par défaut

Depuis Foxy, tous les messages de journalisation à tous les niveaux de gravité sont enregistrés par défaut dans stderr. Cela garantit que les messages de journalisation sortent immédiatement et alignent le système de journalisation ROS 2 sur la plupart des autres systèmes de journalisation. Il est possible de changer le flux en stdout lors de l’exécution via la variable d’environnement RCUTILS_LOGGING_USE_STDOUT, mais tous les messages de journalisation iront toujours dans le même flux. Voir https://github.com/ros2/rcutils/pull/196 pour plus de détails.

lancement_ros

Nom du nœud et paramètres d’espace de noms modifiés

Les paramètres d’action Node liés au nommage ont été modifiés :

  • node_name a été renommé en name

  • node_namespace a été renommé en namespace

  • node_executable a été renommé en executable

  • exec_name a été ajouté pour nommer le processus associé au nœud. Auparavant, les utilisateurs auraient utilisé l’argument de mot-clé name.

Les anciens paramètres sont obsolètes.

Ces modifications ont été apportées pour rendre l’interface de lancement plus idiomatique. Par exemple, au lieu de

<node pkg="demo_nodes_cpp" exec="talker" node-name="foo" />

nous pouvons maintenant écrire

<node pkg="demo_nodes_cpp" exec="talker" name="foo" />

Cette modification s’applique également à ComposableNodeContainer, ComposableNode et LifecycleNode. Pour des exemples, voir les modifications pertinentes apportées aux démos.

Requête d’extraction associée dans launch_ros.

RCLCP

Modification de la signature de rappel d’abonnement avancé

Avec la pull request https://github.com/ros2/rclcpp/pull/1047 la signature des rappels qui reçoivent les informations de message avec le message a changé. Auparavant, il utilisait le type rmw rmw_message_info_t, mais utilise maintenant le type rclcpp rclcpp::MessageInfo. Les modifications requises sont simples et peuvent être démontrées dans ces demandes d’extraction :

Modification de la signature de rappel de message sérialisé

La pull request ros2/rclcpp#1081 introduit une nouvelle signature des rappels pour récupérer les messages ROS sous forme sérialisée. Le C-Struct rcl_serialized_message_t précédemment utilisé est remplacé par un type de données C++ rclcpp ::SerializedMessage.

Les exemples de nœuds dans demo_nodes_cpp, à savoir talker_serialized_message ainsi que listener_serialized_message reflètent ces changements.

Changement radical dans la signature des getters de l’interface de nœud

Avec la demande d’extraction ros2/rclcpp#1069, la signature des getters d’interface de nœud a été modifiée pour retourner la propriété partagée des interfaces de nœud (c’est-à-dire un `` std::shared_ptr``) au lieu d’un pointeur brut non propriétaire. Les modifications requises dans les packages en aval qui s’appuyaient sur la signature précédente sont simples et directes : utilisez la méthode std::shared_ptr::get().

Obsolète set_on_parameters_set_callback

À la place, utilisez les méthodes rclcpp::Node add_on_set_parameters_callback et remove_on_set_parameters_callback pour ajouter et supprimer des fonctions qui sont appelées lorsque les paramètres sont définis.

Demande d’extraction associée : https://github.com/ros2/rclcpp/pull/1123

Changement de rupture dans la signature du getter de l’éditeur

Avec la demande d’extraction ros2/rclcpp#1119, la signature du getter de l’éditeur a été modifiée pour retourner la propriété partagée de la structure rcl sous-jacente (c’est-à-dire un std::shared_ptr) au lieu d’un pointeur brut non propriétaire. Cela était nécessaire pour corriger une erreur de segmentation dans certaines circonstances. Les modifications requises dans les packages en aval qui s’appuyaient sur la signature précédente sont simples et directes : utilisez la méthode std::shared_ptr::get().

rclcpp_action

Obsolète ClientGoalHandle::async_result()

À l’aide de cette API, il est possible de se heurter à une condition de concurrence entraînant la levée d’une exception. Préférez plutôt utiliser Client::async_get_result(), qui est plus sûr.

Voir ros2/rclcpp#1120 et le problème connexe pour plus d’informations.

rclpy

Prise en charge de plusieurs rappels de jeu de paramètres

Utilisez les méthodes Node add_on_set_parameters_callback et remove_on_set_parameters_callback pour ajouter et supprimer des fonctions qui sont appelées lorsque les paramètres sont définis.

La méthode set_parameters_callback est obsolète.

Demandes d’extraction associées : https://github.com/ros2/rclpy/pull/457, https://github.com/ros2/rclpy/pull/504

rmw_connext_cpp

Mode de compatibilité des types de localisateur Connext 5.1

Jusqu’à Eloquent inclus, rmw_connext_cpp définissait la propriété dds.transport.use_510_compatible_locator_kinds sur true. Cette propriété n’est plus forcée et la communication de transport partagé entre Foxy et les versions précédentes cessera de fonctionner. Journaux similaires à :

PRESParticipant_checkTransportInfoMatching:Warning: discovered remote participant 'RTI Administration Console' using the 'shmem' transport with class ID 16777216.
This class ID does not match the class ID 2 of the same transport in the local participant 'talker'.
These two participants will not communicate over the 'shmem' transport.
Check the value of the property 'dds.transport.use_510_compatible_locator_kinds' in the local participant.
See https://community.rti.com/kb/what-causes-error-discovered-remote-participant for additional info.

sera observé lorsque cette incompatibilité se produit.

Si la compatibilité est nécessaire, elle peut être configurée dans un fichier de profils QoS externe contenant :

<participant_qos>
   <property>
      <value>
            <element>
               <name>
                  dds.transport.use_510_compatible_locator_kinds
               </name>
               <value>1</value>
            </element>
      </value>
   </property>
</participant_qos>

N’oubliez pas de définir la variable d’environnement NDDS_QOS_PROFILES sur le chemin du fichier des profils QoS. Pour plus d’informations, consultez la section How to Change Transport Settings in 5.2.0 Applications for Compatibility with 5.1.0 of Transport_Compatibility.

voir

Outils d’horodatage des messages à l’aide de l’heure ROS

Les outils “2D Pose Estimate”, “2D Nav Goal” et “Publish Point” horodatent désormais leurs messages en utilisant l’heure ROS au lieu de l’heure système, afin que le paramètre use_sim_time ait un effet sur eux.

Demande d’extraction associée : https://github.com/ros2/rviz/pull/519

std_msgs

Abandon des messages

Bien que découragés depuis longtemps, nous avons officiellement déprécié les messages suivants dans std_msgs. Il y a des copies dans example_interfaces

  • std_msgs/msg/Bool

  • std_msgs/msg/Byte

  • std_msgs/msg/ByteMultiArray

  • std_msgs/msg/Char

  • std_msgs/msg/Float32

  • std_msgs/msg/Float32MultiArray

  • std_msgs/msg/Float64

  • std_msgs/msg/Float64MultiArray

  • std_msgs/msg/Int16

  • std_msgs/msg/Int16MultiArray

  • Plâtré de qualité supérieure / marché secondaire / sans torsion

  • Plâtre de versement / marché secondaire / ne pas montrer

  • std_msgs/msg/Int64

  • std_msgs/msg/Int64MultiArray

  • std_msgs/msg/Int8

  • std_msgs/msg/Int8MultiArray

  • std_msgs/msg/MultiArrayDimension

  • std_msgs/msg/MultiArrayLayout

  • std_msgs/msg/chaîne

  • std_msgs/msg/UInt16

  • std_msgs/msg/UInt16MultiArray

  • Plâtré de qualité supérieure / marché secondaire / sans torsion

  • Plâtre de versement / marché secondaire / ne pas montrer

  • std_msgs/msg/UInt64

  • std_msgs/msg/UInt64MultiArray

  • std_msgs/msg/UInt8

  • std_msgs/msg/UInt8MultiArray

Fonctions de sécurité

Utilisation d’enclaves de sécurité

Depuis Foxy, les participants du domaine ne sont plus mappés directement sur les nœuds ROS. Par conséquent, les fonctionnalités de sécurité ROS 2 (qui sont spécifiques aux participants du domaine) ne sont plus directement mappées sur les nœuds ROS. Au lieu de cela, Foxy introduit le concept d’une « enclave » de sécurité, où une « enclave » est un processus ou un groupe de processus qui partageront les mêmes règles d’identité et de contrôle d’accès.

Cela signifie que les artefacts de sécurité ne sont plus récupérés en fonction du nom du nœud, mais en fonction du nom de l’enclave de sécurité. Un nom d’enclave de nœud peut être défini en utilisant l’argument ROS --enclave, par ex. ros2 run demo_nodes_py talker --ros-args --enclave /my_enclave

Document de conception connexe : https://github.com/ros2/design/pull/274

Notez que les fichiers d’autorisations sont limités par la taille du paquet de transport sous-jacent, donc le regroupement de plusieurs autorisations sous la même enclave ne fonctionnera pas si le fichier d’autorisations résultant dépasse 64 Ko. Problème connexe [ros2/sros2#228]

Renommage des variables d’environnement

Renommage des variables d’environnement

Nom en éloquent

Nom en Foxy

ROS_SECURITY_ROOT_DIRECTORY

ROS_SECURITY_KEYSTORE

ROS_SECURITY_NODE_DIRECTORY

ROS_SECURITY_ENCLAVE_OVERRIDE

Problèmes connus

  • [ros2/ros2#922] Les performances des services sont instables pour les nœuds rclcpp utilisant eProsima Fast-RTPS ou ADLINK CycloneDDS comme implémentation RMW . Plus précisément, les clients de service ne reçoivent parfois pas la réponse des serveurs.

  • [ros2/rclcpp#1212] Les objets Waitable réentrants prêts peuvent tenter de s’exécuter plusieurs fois.

Chronologie avant la sortie

Quelques étapes menant à la sortie :

Note

Les dates ci-dessous reflètent une prolongation d’environ deux semaines en raison de la pandémie de coronavirus.

Épouser. 22 avril 2020

Gel de l’API et des fonctionnalités pour les packages ros_core 1. Notez que cela inclut rmw, qui est une dépendance récursive de ros_core. Seules les versions de correctifs de bogues doivent être effectuées après ce point. De nouveaux packages peuvent être publiés indépendamment.

Mon. April 29th, 2020 (beta)

Versions mises à jour des packages desktop 2 disponibles. Test des nouvelles fonctionnalités.

Épouser. 27 mai 2020 (release candidate)

Versions mises à jour des packages desktop 2 disponibles.

Épouser. 3 juin 2020

Geler rosdistro. Aucun PR pour Foxy sur le repo rosdistro ne sera fusionné (réouverture après l’annonce de la sortie).

1

La variante ros_core décrite dans le référentiel variants.

2(1,2)

La variante desktop décrite dans le référentiel variants.