Foxy Fitzroy (foxy)

Foxy Fitzroy 是 ROS 2 的第六个版本。

支持的平台

Foxy Fitzroy 主要支持以下平台:

一级平台:

  • Ubuntu 20.04(Focal):amd64arm64

  • Mac macOS 10.14 (Mojave)

  • Windows 10(Visual Studio 2019)

Tier 3 平台:

  • Ubuntu 20.04(Focal):arm32

  • Debian Buster (10):amd64arm64``和``arm32

  • OpenEmbedded Thud(2.6)/ webOS OSE:arm32x86

有关 RMW 实现、编译器/解释器版本和系统依赖版本的更多信息,请参阅 REP 2000

安装

安装 Foxy Fitzroy <../../foxy/Installation.html>`__

这个ROS 2版本的新功能有:

在开发过程中,GitHub 上的 Foxy meta-ticket 包含进行中的高级任务的最新状态,以及涉及更多细节的特定票据的引用。

补丁发布8中的更改(2022-09-28)

启动 GroupAction 范围的环境

SetEnvironmentVariable 操作现在被限定为返回它的任何 GroupAction

例如,考虑以下启动文件,

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'),
        ]),
    ])

在补丁发布8之前,节点``foo``将以``my_env_var=2``开始,但现在将以``my_env_var=1``开始。

要退出新行为,可以在``GroupAction``上设置参数``scoped=False``。

相关票据:

Patch Release 7 变更(2022-02-08)

Launch set_env 前端行为变更

launch#468 错误地改变了前端启动文件中 set_env 操作的作用域。使用 set_env 操作更改环境变量不再局限于父级 group 操作,而是全局应用。由于该更改已被反向移植,因此影响到了这个版本。

我们认为这个变更是一个回归问题,并打算在下一个补丁发布版本和未来的 ROS 发布版本中修复该行为。我们还计划修复 Python 启动文件中的行为,这些文件从未正确地限定设置环境变量。

相关问题:

修复启动前端解析器

对启动前端解析器进行了重构,修复了一些`解析特殊字符的问题 <https://github.com/ros2/launch_ros/issues/214>`_。因此,在解析字符串时有了一些小的行为变化。例如,以前要将数字作为字符串传递,需要添加额外的引号(如果使用替换,需要两组引号):

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

在重构后,上述内容将得到字符串 ``"''3''"``(注意额外的引号)。现在,用户应该使用``type``属性来表示值应该被解释为字符串:

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

相关拉取请求:

修复rmw_fastrtps_dynamic_cpp中的内存泄漏和未定义行为

以下头文件的API已更改:

  • rmw_fastrtps_dynamic_cpp/TypeSupport.hpp

  • rmw_fastrtps_dynamic_cpp/TypeSupport_impl.hpp

虽然从技术上讲它们是公开可访问的,但人们不太可能直接使用它们。因此,我们决定破坏API以修复内存泄漏和未定义行为。

修复最初在 rmw_fastrtps#429 提交,并后来被回溯到Foxy中的 rmw_fastrtps#577

Patch版本2的更改(2020-08-07)

static_transform_publisher中的错误

在Foxy的开发过程中,tf2_ros的static_transform_publisher程序引入了一个错误。传递给static_transform_publisher的欧拉角顺序的实现与文档不一致。Foxy的Patch版本2通过`修复 <https://github.com/ros2/geometry2/pull/296>`_ 顺序,使其与文档一致(偏航角、俯仰角、翻滚角)。对于已经开始使用初始版本或Patch版本1的用户,这意味着使用static_transform_publisher的任何启动文件都必须根据新的顺序交换命令行顺序。对于从ROS 2 Dashing、ROS 2 Eloquent或ROS 1迁移的用户,无需进行任何更改即可迁移到Foxy的Patch版本2。

自Eloquent版本以来的更改

经典的CMake与现代的CMake对比

在“经典”CMake中,当一个软件包被使用``find_package()``命令查找时,它会提供CMake变量,例如``<pkgname>_INCLUDE_DIRS``和``<pkgname>_LIBRARIES``。而使用``ament_cmake``时,可以通过调用``ament_export_include_directories``和``ament_export_libraries``来实现这一点。结合``ament_export_dependencies``使用,``ament_cmake``确保所有递归依赖的包含目录和库都被连接并包含在这些变量中。

在“现代”CMake中,软件包提供一个接口目标(通常命名为``<pkgname>::<pkgname>``),该接口目标本身封装了所有递归依赖项。为了导出一个库目标以使用现代CMake,需要使用``ament_export_targets``并提供一个导出名称,在使用``install(TARGETS <libA> <libB> EXPORT <export_name> ...)``安装库时也使用相同的导出名称。导出的接口目标可以通过CMake变量``<pkgname>_TARGETS``进行访问。为了使库目标能够以这种方式导出,它们不能依赖于影响全局状态的经典函数,如``include_directories()``,而是在目标本身上设置包含目录 - 用于构建环境和安装环境 - 使用生成器表达式,例如``target_include_directories(<target> PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>" "$<INSTALL_INTERFACE:include>")``。

当使用``ament_target_dependencies``将依赖项添加到库目标时,该函数将使用现代CMake目标(如果可用)。否则,它将退回到使用经典CMake变量。因此,只有在所有依赖项也提供现代CMake目标时,才应导出现代CMake目标。否则,导出的接口目标将包含在生成的CMake逻辑中的包含目录/库的绝对路径,使得软件包无法重定位。

有关在Foxy中将软件包更新为现代CMake的示例,请参见`ros2/ros2#904 <https://github.com/ros2/ros2/issues/904>`_。

ament_export_interfaces被ament_export_targets取代

包``ament_cmake_export_interfaces``中的CMake函数``ament_export_interfaces``已被弃用,建议使用新包``ament_cmake_export_targets``中的函数``ament_export_targets``。有关更多信息,请参见GitHub工单`ament/ament_cmake#237 <https://github.com/ament/ament_cmake/issues/237>`_。

rosidl_generator_c|cpp 命名空间/API更改

包``rosidl_generator_c``和``rosidl_generator_cpp``已进行了重构,许多头文件和源文件被移动到新包``rosidl_runtime_c``和``rosidl_runtime_cpp``中。目的是消除对生成器包的运行依赖,因此移除使用Python的代码生成工具。在移动头文件时,相应的包含路径和命名空间已进行了更新,因此在许多情况下,将包含指令从生成器包更改为运行时包即可。

生成的C / C++代码也已进行了重构。以``__struct.h|hpp``、__functions.h``__traits.hpp``等结尾的文件已移动到子目录``detail``中,但大多数代码只包含与接口同名的头文件,不包含这些后缀。

一些涉及字符串和序列边界的类型也已重命名以符合命名约定,但不希望在用户代码中使用(超过了RMW实现和类型支持包)。

有关更多信息,请参见`ros2/rosidl#446(用于C)<https://github.com/ros2/rosidl/issues/446>`_和`ros2/rosidl#447(用于C++)<https://github.com/ros2/rosidl/issues/447>`_。

ament_add_test的默认工作目录

使用``ament_add_test``添加的测试的默认工作目录已更改为``CMAKE_CURRENT_BINARY_DIR``,以匹配CMake的``add_test``行为。要么更新测试以适应新的默认值,要么传递``WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}``以恢复先前的值。

默认控制台日志输出流

从Foxy版本开始,默认情况下,所有严重级别的日志消息都会被记录到stderr中。这确保日志消息立即输出,并使ROS 2日志系统与大多数其他日志系统保持一致。可以通过RCUTILS_LOGGING_USE_STDOUT环境变量在运行时将输出流更改为stdout,但所有日志消息仍将发送到同一输出流。有关更多详细信息,请参见 https://github.com/ros2/rcutils/pull/196

launch_ros

节点名称和命名空间参数已更改

与命名相关的``Node``动作参数已更改:

  • node_name``已更名为``name

  • node_namespace 已更名为 namespace

  • node_executable 已更名为 executable

  • 已添加``exec_name`` 以命名与节点关联的进程。以前,用户可能使用了 name 关键字参数。

旧参数已被弃用。

这些更改是为了使启动界面更符合惯用语法。例如,以前的写法是

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

现在我们可以写成

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

这个变更也适用于``ComposableNodeContainer``、ComposableNode``和``LifecycleNode。有关示例,请参阅`演示中的相关更改。 <https://github.com/ros2/demos/pull/431>`_

在launch_ros中的相关拉取请求。

rclcpp

高级订阅回调签名的变更

使用拉取请求`https://github.com/ros2/rclcpp/pull/1047 <https://github.com/ros2/rclcpp/pull/1047>`_,接收消息信息的回调函数的签名已经发生了变化。之前使用``rmw``类型的``rmw_message_info_t``,现在使用``rclcpp``类型的``rclcpp::MessageInfo``。所需的更改很简单,并且可以在以下拉取请求中看到示例:

序列化消息回调签名的更改

拉取请求 ros2/rclcpp#1081 引入了一种新的回调签名,用于检索序列化形式的ROS消息。先前使用的 C 结构体 rcl_serialized_message_t 被 C++ 数据类型 rclcpp::SerializedMessage 取代。

demo_nodes_cpp 中的示例节点,即 talker_serialized_messagelistener_serialized_message 反映了这些更改。

节点接口获取器签名中的重大更改

通过拉取请求 ros2/rclcpp#1069,节点接口获取器的签名已被修改为返回节点接口的共享所有权(即 std::shared_ptr),而不是非拥有的裸指针。依赖于先前签名的下游软件包所需的更改是简单而直接的:使用 std::shared_ptr::get() 方法。

弃用 set_on_parameters_set_callback

相反,使用``rclcpp::Node``的``add_on_set_parameters_callback``和``remove_on_set_parameters_callback``方法来添加和删除在设置参数时调用的函数。

相关的拉取请求:https://github.com/ros2/rclcpp/pull/1123

Publisher getter 签名的破坏性更改

在拉取请求`ros2/rclcpp#1119 <https://github.com/ros2/rclcpp/pull/1119>`中,发布者句柄获取器的签名已修改为返回底层 rcl 结构的共享所有权(即``std::shared_ptr``),而不是非拥有原始指针。这是为了修复特定情况下的段错误而必要的。依赖于先前签名的下游软件包所需的更改是简单明了的:使用``std::shared_ptr::get()``方法。

rclcpp_action

弃用ClientGoalHandle::async_result()

使用此API可能会遇到竞态条件,导致抛出异常。相反,请优先使用``Client::async_get_result()``,它更安全。

参见 ros2/rclcpp#1120 以及相关问题了解更多信息。

rclpy

支持多个参数设置回调

使用``Node``的方法``add_on_set_parameters_callback``和``remove_on_set_parameters_callback``来添加和移除在参数设置时调用的函数。

方法``set_parameters_callback``已被弃用。

相关的拉取请求: https://github.com/ros2/rclpy/pull/457, https://github.com/ros2/rclpy/pull/504

rmw_connext_cpp

Connext 5.1定位器类型兼容模式

在``Eloquent``版本及之前,rmw_connext_cpp``会将``dds.transport.use_510_compatible_locator_kinds``属性设置为``true。现在不再强制设置此属性,因此``Foxy``和之前版本之间的共享传输通信将停止工作。类似下面的日志将会出现:

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.

当发生此不兼容性时将会观察到。

如果需要兼容性,可以在外部的QoS配置文件中进行设置,文件内容如下:

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

请记得将 NDDS_QOS_PROFILES 环境变量设置为 QoS 配置文件的路径。有关更多信息,请参阅 Transport_Compatibility 中的 How to Change Transport Settings in 5.2.0 Applications for Compatibility with 5.1.0 部分。

rviz

工具现在使用 ROS 时间戳来标记消息

2D Pose Estimate2D Nav GoalPublish Point 工具现在使用 ROS 时间戳而不是系统时间来标记它们的消息,以使 use_sim_time 参数对其产生影响。

相关的拉取请求:https://github.com/ros2/rviz/pull/519

std_msgs

消息的废弃

虽然长期以来我们一直不鼓励使用,但我们已正式弃用了 std_msgs 中的以下消息。在 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

  • std_msgs/msg/Int32

  • std_msgs/msg/Int32MultiArray

  • 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/String

  • std_msgs/msg/UInt16

  • std_msgs/msg/UInt16MultiArray

  • std_msgs/msg/UInt32

  • std_msgs/msg/UInt32MultiArray

  • std_msgs/msg/UInt64

  • std_msgs/msg/UInt64MultiArray

  • std_msgs/msg/UInt8

  • std_msgs/msg/UInt8MultiArray

安全功能

使用安全飞地

从Foxy版本开始,域参与者不再直接映射到ROS节点。因此,ROS 2的安全特性(特定于域参与者)也不再直接映射到ROS节点。相反,Foxy引入了安全"enclave"(飞地)的概念,其中"enclave"是一个进程或一组进程,它们将共享相同的身份和访问控制规则。

这意味着安全工件不再基于节点名称进行检索,而是基于安全飞地的名称进行检索。可以使用ROS参数``--enclave``来设置节点飞地名称,例如``ros2 run demo_nodes_py talker --ros-args --enclave /my_enclave``。

相关设计文档:https://github.com/ros2/design/pull/274

请注意,权限文件受底层传输数据包大小的限制,因此,如果生成的权限文件超过64kB,则无法将许多权限分组到同一个飞地中。相关问题`[ros2/sros2#228] <https://github.com/ros2/sros2/issues/228>`_

环境变量的重命名

环境变量的重命名

Eloquent中的名称

Foxy中的名称

ROS_SECURITY_ROOT_DIRECTORY

ROS_SECURITY_KEYSTORE

ROS_SECURITY_NODE_DIRECTORY

ROS_SECURITY_ENCLAVE_OVERRIDE

已知问题

  • [ros2/ros2#922] 使用 eProsima Fast-RTPS 或 ADLINK CycloneDDS 作为 RMW 实现的 rclcpp 节点的服务性能不稳定。具体而言,有时服务客户端无法接收到服务器的响应。

  • [ros2/rclcpp#1212] 可重入的可等待对象可能会尝试执行多次。

发布前的时间线

发布前的一些关键节点:

注解

以下日期反映了由于冠状病毒大流行而延长的大约两周时间。

2020年4月22日,星期三

ros_core 1 包的 API 和功能冻结。请注意,这包括 rmw,它是 ros_core 的递归依赖项。在此之后,只能进行错误修复发布。新的软件包可以独立发布。

2020年4月29日,星期一(测试版)

已提供更新的``desktop`` [2]_软件包。测试新功能。

2020年5月27日(候选版本)

已提供更新的``desktop`` [2]_软件包。

2020年6月3日

冻结rosdistro。不会合并Foxy在`rosdistro`存储库上的PR(发布公告后重新开放)。

1

``ros_core``变体在`variants <https://github.com/ros2/variants>`_存储库中描述。

2(1,2)

在`变体<https://github.com/ros2/variants>`_存储库中描述的“desktop”变体。