Iron Irwini (iron)

Iron Irwini 是 ROS 2 的第九个版本。以下是自上一个版本以来 Iron Irwini 的重要变更和功能亮点。有关自 Humble 版本以来的所有更改,请参阅 完整的变更日志

支持的平台

Iron Irwini 主要支持以下平台:

一级平台:

  • Ubuntu 22.04 (Jammy): amd64arm64

  • Windows 10(Visual Studio 2019):amd64

二级平台:

  • RHEL 9:amd64

Tier 3 平台:

  • macOS:amd64

  • Debian Bullseye:amd64

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

安装

安装 Iron Irwini <../../iron/Installation.html>`__

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

服务内省

现在可以按照每个服务的基础启用服务内省。启用后,用户可以查看与请求服务的客户端、接受请求的服务器、发送响应的服务器和接受响应的客户端相关联的元数据。还可以内省客户端/服务器请求/响应的内容。所有信息都发布在从服务名称生成的隐藏主题上。因此,如果服务名称为 /myservice,则信息将发布在 /myservice/_service_event 上。

请注意,默认情况下,此功能已禁用;要启用它,用户必须在创建服务器客户端或服务器后调用 configure_introspection。有示例展示了如何做到这一点,可以参考 https://github.com/ros2/demos/tree/iron/demo_nodes_cpp/src/services (C++) 和 https://github.com/ros2/demos/blob/iron/demo_nodes_py/demo_nodes_py/services/introspection.py (Python)。

有关更多信息,请参见 REP 2012 和追踪问题 https://github.com/ros2/ros2/issues/1285

支持预设和后置设置参数回调

很长一段时间以来,用户可以注册回调函数,当节点上的参数被外部实体(如 ros2 param set)更改时,回调函数会被调用。该回调函数可以检查更改的参数类型和值,并在其中一个参数不满足特定条件时拒绝整个更改。但是,它不能修改参数列表,也不应修改状态(因为可能存在在设置回调函数之后会拒绝参数的其他回调函数)。

此版本添加了预设和后置回调。回调函数按照以下顺序调用:

  • “pre”设置参数回调,可以根据任意标准修改参数列表。

  • “set”参数回调,不能修改参数列表,只能根据其类型和值接受或拒绝参数(这是现有的回调)。

  • “post”设置参数回调,可以根据参数进行状态更改,只有在前两个回调成功时才会调用。

在https://github.com/ros2/demos/blob/iron/demo_nodes_cpp/src/parameters/set_parameters_callback.cpp(C++)和https://github.com/ros2/demos/blob/iron/demo_nodes_py/demo_nodes_py/parameters/set_parameters_callback.py(Python)中有示例。

有关更多信息,请参见https://github.com/ros2/rclcpp/pull/1947,https://github.com/ros2/rclpy/pull/966和https://github.com/ros2/demos/pull/565。

改进的发现选项

之前的ROS 2版本提供了有限的发现选项。基于DDS的RMW实现的默认行为是通过多播发现任何可达节点。通过设置环境变量``ROS_LOCALHOST_ONLY``可以将其限制在同一台机器上,但是任何其他配置都需要直接配置中间件,通常是通过中间件特定的XML文件和环境变量。ROS Iron保留了相同的默认发现行为,但弃用了``ROS_LOCALHOST_ONLY``,采用了更精细的选项。

  • ``ROS_AUTOMATIC_DISCOVERY_RANGE``控制ROS节点尝试发现彼此的范围。有效选项包括:

    • SUBNET - 默认选项,对于基于DDS的中间件,它将通过多播发现任何可达节点。

    • LOCALHOST - 仅尝试发现同一台机器上的其他节点。

    • OFF - 不会自动尝试发现任何其他节点,即使在同一台机器上。

    • SYSTEM_DEFAULT - 不会更改任何发现设置。当您已经为中间件自定义了设置并且不希望ROS更改它们时,这很有用。

  • ROS_STATIC_PEERS - 以分号(;)分隔的地址列表,ROS应该尝试在其中发现节点。这允许用户连接到特定机器上的节点(只要它们的发现范围没有设置为``OFF``)。

例如,您可能有多个机器人,将``ROS_AUTOMATIC_DISCOVERY_RANGE``设置为``LOCALHOST``,以便它们彼此之间不进行通信。当您想将RViz连接到其中一个机器人时,您可以将其地址添加到终端中的``ROS_STATIC_PEERS``。现在,您可以使用ROS 2 CLI和可视化工具与机器人进行交互。

有关此功能的更多信息,请参阅https://github.com/ros2/ros2/issues/1359。

匹配事件

除了QoS事件之外,当任何发布者和订阅之间建立或断开连接时,还可以生成匹配事件。用户可以为每个发布者和订阅提供回调函数,这些函数由匹配事件触发,并以用户认为合适的方式处理它们,类似于处理在主题上收到的消息的方式。

  • 发布者:当它找到与主题匹配且具有兼容QoS的订阅,或者连接的订阅被断开时,会发生此事件。

  • 订阅:当它找到与主题匹配且具有兼容QoS的发布者,或者已连接的发布者断开连接时,会发生此事件。

有关更多信息,请参阅https://github.com/ros2/rmw/issues/330上的跟踪问题。

日志记录器的外部配置服务

现在可以通过服务远程配置节点记录器级别。在节点创建过程中启用``enable_logger_service``选项后,``set_logger_levels``和``get_logger_levels``服务将可用。

请注意,默认情况下禁用了``enable_logger_service``选项,因此用户需要在节点创建时启用此选项。

请参阅 https://github.com/ros2/ros2/issues/1355 了解更多信息。

类型 描述 发行版

现在可以传递有关ROS 2消息类型的信息,以便具有潜在不同类型但名称相同的系统可以更透明地发现它们的兼容性。这个能力集由REP-2011的一个子集定义:Evolving Message Types,在Iron中已经有了许多部分的进展。

首先,新包 type_description_interfaces 的引入提供了一种通用的方式来传递ROS 2通信接口类型(msg、srv、action)的描述。

接下来,已经确定了一种哈希类型描述的方法,即ROS Interface Hashing Standard(RIHS)- 从第一个版本RIHS01开始。RIHS哈希在构建时自动计算所有已编译的ROS类型,并嵌入到生成的代码中以供检查。这些哈希值也在发现过程中自动传递,并包含在``rmw_topic_endpoint_info_t``中,用于图形内省查询,例如``get_publishers_info_by_topic``。

完整的``TypeDescription``数据结构以及用于生成它的原始源代码文本(例如``.msg``文件)现在默认包含在消息库中,以便``typesupport``或最终用户使用。虽然我们预计这些数据对大多数用户都有价值,但一些试图减少安装空间中的字节数的用户可以在构建ROS 2核心时通过定义CMake变量``ROSIDL_GENERATOR_C_DISABLE_TYPE_DESCRIPTION_CODEGEN``来禁用此功能。

最后,定义了新的服务``type_description_interfaces/GetTypeDescription.srv``,允许节点在遇到未知的RIHS类型哈希时从广告该类型的节点请求完整的定义。正在进行的工作是在ROS 2节点中本地提供此功能,作为节点构造的可选开关。此功能尚未发布,但预计将在2023年中期之前后移入Iron。与此同时,用户节点可以使用稳定的服务接口独立实现此服务。

有关设计提案,请参阅`REP 2011 <https://github.com/ros-infrastructure/rep/pull/358>`__。有关功能集的开发进展,请参阅`类型描述分发 <https://github.com/ros2/ros2/issues/1159>`__。

动态类型和动态消息

除了上述提到的类型描述分发功能之外,还可以在运行时构建和访问动态创建的类型(即动态类型)。此功能在Fast DDS和``rcl``中对Iron可用,并且为支持以动态类型获取消息(即从动态类型构建或遵循其结构的消息)提供了新的``rmw``接口。

首先,在`rosidl <https://index.ros.org/r/rosidl/github-ros2-rosidl/#iron>`__中引入了一些实用工具,用于构建和操作类型描述。

接下来,编写了`rosidl_dynamic_typesupport <https://index.ros.org/r/rosidl_dynamic_typesupport/github-ros2-rosidl_dynamic_typesupport/#iron>`__包,并提供了一个中间件无关的接口,用于在运行时构建动态类型和动态消息。类型可以通过编程方式或解析``type_description_interfaces/TypeDescription``消息在运行时进行构建。

注解

``rosidl_dynamic_typesupport``库需要序列化支持库来实现特定于中间件的动态类型行为。为Fast DDS实现了一个用于序列化支持的库`rosidl_dynamic_typesupport_fastrtps <https://index.ros.org/r/rosidl_dynamic_typesupport_fastrtps/github-ros2-rosidl_dynamic_typesupport_fastrtps/#iron>`__。理想情况下,将有更多中间件实现支持库,扩大支持此功能的中间件数量。

最后,为了支持使用动态类型和动态消息,向`rmw <https://index.ros.org/r/rmw/github-ros2-rmw/#iron>`__和`rcl <https://index.ros.org/r/rcl/github-ros2-rcl/#iron>`__添加了新的方法来支持:

  • 获取特定于中间件的序列化支持的能力

  • 在运行时构建使用动态类型的消息类型支持的能力

  • 使用动态类型接收动态消息的能力

正在进行的工作是启用动态类型以在客户端库中创建订阅(参见下面的``rclcpp``问题),尽管尚不确定此功能何时可用或是否会进行回溯。这将允许用户订阅仅在运行时才知道类型描述的主题。与此同时,用户可以通过使用作为此功能集的一部分引入的新``rmw``和``rcl``功能编写自己的订阅来订阅动态类型。

有关设计提案,请参阅 REP 2011。有关功能集的开发进展,请参阅 Dynamic Subscription,其中 rclcpp 需要完成大部分工作。

launch

现在``PythonExpression``支持导入模块

现在可以在执行评估之前让``launch``的``PythonExpression``导入模块。这在评估表达式时引入附加功能非常有用。

有关更多信息,请参见 https://github.com/ros2/launch/pull/655

ReadyToTest 可以从事件处理程序中调用

现在可以注册一个使用 ReadyToTest 的事件处理程序作为其输出。这对于在允许测试运行之前下载资源等操作非常有用。

请参阅 https://github.com/ros2/launch/pull/665 获取更多信息。

新增了 AnySubstitutionAllSubstitution

现在可以指定在任何输入参数为真时进行替换(AnySubstitution),或者在所有输入参数为真时进行替换(AllSubstitution)。

请参阅 https://github.com/ros2/launch/pull/649 获取更多详细信息。

添加一个新的替换以获取启动日志目录

现在可以使用名为``LaunchLogDir``的替换来获取当前的启动日志目录。

请参阅 https://github.com/ros2/launch/pull/652 获取更多详细信息。

launch_ros

添加一个``LifecycleTransition``操作

现在可以通过新的``LifeCycleTransition``操作向生命周期节点发送转换信号。

更多信息请参阅 https://github.com/ros2/launch_ros/pull/317

添加了``SetROSLogDir``操作。

现在可以通过``SetROSLogDir``操作来配置用于记录日志的目录。

更多信息请参阅 https://github.com/ros2/launch_ros/pull/325

能够为``ComposableNode``指定条件。

现在可以指定一个条件,该条件必须满足才能将``ComposableNode``插入其容器。

请参阅 https://github.com/ros2/launch_ros/pull/311 获取更多信息。

launch_testing

进程启动的超时现在可以配置

在此版本发布之前,“ReadyToTest”操作会等待进程启动的确切时间为15秒。如果进程的启动时间超过15秒,它们将失败。现在有一个新的修饰符叫做“ready_to_test_action_timeout”,允许用户配置等待进程启动的时间。

请参阅 https://github.com/ros2/launch/pull/625 获取更多信息。

rclcpp

新增了处理``Node``和``LifecycleNode``的新范例

``Node``和``LifecycleNode``类之间存在关联,因为它们都提供相同的基本方法(尽管``LifecycleNode``还提供了额外的方法)。由于各种实现考虑因素,它们没有派生自共同的基类。

这给希望接受``Node``或``LifecycleNode``的下游代码带来了一些麻烦。一种解决方案是有两个方法签名,一个接受``Node``,一个接受``LifecycleNode``。另一个推荐的解决方案是有一个接受可以从两个类中访问的"节点接口"指针的方法,例如:

void do_thing(rclcpp::node_interfaces::NodeGraphInterface graph)
{
  fprintf(stderr, "Doing a thing\n");
}

void do_thing(rclcpp::Node::SharedPtr node)
{
  do_thing(node->get_node_graph_interface());
}

void do_thing(rclcpp::LifecycleNode::SharedPtr node)
{
  do_thing(node->get_node_graph_interface());
}

这样做是可行的,但是当需要许多节点接口时可能会变得有些笨拙。为了改善这种情况,现在有一个新的``NodeInterfaces``类,可以构造来包含这些接口,然后被其他代码使用。

在https://github.com/ros2/rclcpp/pull/2041中有关于如何使用它的示例。

引入了一个新的执行器类型:事件执行器(Events Executor)

iRobot的``EventsExecutor``已合并到主要的``rclcpp``代码库中。这个替代执行器实现使用中间件实现的事件驱动回调,在``rclcpp``层触发回调。除了推送模型之外,``EventsExecutor``还将定时器管理移到了一个单独的线程中,这可以提供更准确的结果和更低的开销,尤其是在有很多定时器的情况下。

``EventsExecutor``有大量的文档和实际使用情况,使它成为包含在``rclcpp``代码库中的一个强有力的候选项。有关初始实现提案以及性能基准的信息,请参阅https://discourse.ros.org/t/ros2-middleware-change-proposal/15863。有关设计的更多信息,请参阅设计PR: https://github.com/ros2/design/pull/305

由于API相同,尝试``EventsExecutor``就像替换当前的执行器实现(例如``SingleThreadedExecutor``)一样简单:

#include <rclcpp/experimental/executors/events_executor/events_executor.hpp>
using rclcpp::experimental::executors::EventsExecutor;

EventsExecutor executor;
executor.add_node(node);
executor.spin();

**注意**目前``EventsExecutor``和``TimersManager``位于``experimental``命名空间中。虽然它已经作为一个独立的实现使用了一段时间https://github.com/irobot-ros/events-executor,但决定在至少一个发布中使用``experimental``命名空间,以便在发布中更改API。请谨慎使用,因为它将不受非实验性代码的相同API/ABI保证的约束。

rclpy

等待另一个节点加入图形的能力

现在可以使用以下代码等待另一个节点加入网络图形:

node.wait_for_node('/fully_qualified_node_name')

更多信息请参阅 https://github.com/ros2/rclpy/pull/930

AsyncParameterClient 的实现

rclpy 现在具有 AsyncParameterClient 类,使其与 rclcpp 功能相同。该类用于在不阻塞调用节点的情况下在远程节点上执行参数操作。

更多信息和示例请参阅 https://github.com/ros2/rclpy/pull/959

现在,订阅回调函数可选择获取消息信息。

现在可以使用一个函数签名同时接收消息和消息信息来注册订阅回调函数,例如:

def msg_info_cb(msg, msg_info):
    print('Message info:', msg_info)

node.create_subscription(msg_type=std_msgs.msg.String, topic='/chatter', qos_profile=10, callback=msg_info_cb)

消息信息结构包含了各种信息,例如消息的序列号、源和接收时间戳以及发布者的GID。

请参考https://github.com/ros2/rclpy/pull/922获取更多信息。

可选参数,用于隐藏消息类的断言。

所有的消息类现在都包含一个新的可选参数,允许隐藏每个字段类型的断言。默认情况下,断言是隐藏的,这在运行时提供了性能的提升。为了开启断言以进行开发/调试,你有两个选择:

  1. 将环境变量``ROS_PYTHON_CHECK_FIELDS``定义为``'1'``(这将影响项目中的所有消息):

import os
from std_msgs.msg import String

os.environ['ROS_PYTHON_CHECK_FIELDS'] = '1'
new_message=String()
  1. 通过在构造函数中显式定义新参数,选择单个消息的特定行为:

from std_msgs.msg import String

new_message=String(check_fields=True)

有关更多信息,请参阅 https://github.com/ros2/rosidl_python/pull/194

ros2param

在使用``ros2 param``等待节点时设置超时选项

现在可以通过在命令中传递``--timeout``来使各种``ros2 param``命令超时。

有关更多信息,请参阅 https://github.com/ros2/ros2cli/pull/802

已删除过时选项

已删除``--output-dir``和``--print``选项,使用``dump``命令。

请参阅https://github.com/ros2/ros2cli/pull/824获取更多信息。

ros2topic

now 作为 builtin_interfaces.msg.Time 的关键字,auto 作为 std_msgs.msg.Header 的关键字。

ros2 topic pub 现在允许使用关键字 nowbuiltin_interfaces.msg.Time 消息设置为当前时间。类似地,当传递关键字 auto 时,将自动生成 std_msgs.msg.Header 消息。此行为与 ROS 1 的 rostopic 一致(http://wiki.ros.org/ROS/YAMLCommandLine#Headers.2Ftimestamps)。

相关PR:ros2/ros2cli#749

``ros2 topic pub``可以配置等待的最长时间

命令``ros2 topic pub -w 1``将在发布消息之前等待至少这么多个订阅者。此版本添加了``--max-wait-time``选项,以便命令在没有看到订阅者时,在最大等待时间内退出。

请参阅 https://github.com/ros2/ros2cli/pull/800 获取更多信息。

``ros2 topic echo``可以配置为等待最长时间

命令``ros2 topic echo``现在接受``--timeout``选项,控制命令等待发布发生的最长时间。

请参阅 https://github.com/ros2/ros2cli/pull/792 获取更多信息。

已删除弃用选项

已删除``echo``命令中的``--lost-messages``选项。

请参阅https://github.com/ros2/ros2cli/pull/824获取更多信息。

自Humble版本以来的更改

更改默认控制台日志文件刷新行为

这主要适用于ROS 2中基于``spdlog``的默认日志记录后端(实现在``rcl_logging_spdlog``中)。日志文件刷新已更改为在每次使用"error"日志消息时刷新,例如每次调用``RCLCPP_ERROR()``,以及每隔五秒钟定期刷新一次。

以前,``spdlog``在配置除了创建用于记录到文件的sink之外的任何内容之前被使用。

我们测试了这个更改,并没有发现CPU开销显著,即使在具有较慢磁盘(例如SD卡)的计算机上也是如此。但是,如果此更改给您带来问题,您可以通过设置``RCL_LOGGING_SPDLOG_EXPERIMENTAL_OLD_FLUSHING_BEHAVIOR=1``环境变量来获取旧的行为。

稍后,我们希望支持完整的配置文件(请参见:https://github.com/ros2/rcl_logging/issues/92),这将使您在日志记录方式上具有更多灵活性,但这只是当前计划的工作。

因此,此环境变量应被视为实验性的,并可能在将来的版本中被删除而不进行弃用,当我们为``rcl_logging_spdlog``日志记录后端添加配置文件支持时。

有关此更改的更多详细信息,请参阅此拉取请求:https://github.com/ros2/rcl_logging/pull/95

ament_cmake_auto

包含的依赖现在标记为``SYSTEM``

在使用``ament_auto_add_executable``或``ament_auto_add_library``时,依赖现在会自动添加为``SYSTEM``。这意味着依赖项的头文件中的警告不会被报告。

请参阅 https://github.com/ament/ament_cmake/pull/385 获取更多详细信息。

ament_cmake_nose

该软件包已被弃用并移除。

Python 的 nose 软件包早已被弃用。由于目前在 Humble 或 Rolling 中发布的开源软件包都不依赖它,此版本弃用并移除了围绕它的 ament 封装。

请参阅 https://github.com/ament/ament_cmake/pull/415 获取更多信息。

ament_lint

可以从linter检查中排除文件

现在可以通过在调用``ament_lint_auto_find_test_dependencies``之前设置``AMENT_LINT_AUTO_FILE_EXCLUDE`` CMake变量来排除特定文件的linter检查。

有关更多信息,请参阅https://github.com/ament/ament_lint/pull/386。

camera_info_manager

生命周期节点支持

``camera_info_manager``现在支持生命周期节点,除了常规的ROS 2节点外。

更多信息请参见 https://github.com/ros-perception/image_common/pull/190

launch

LaunchConfigurationEqualsLaunchConfigurationNotEquals 已弃用。

LaunchConfigurationEqualsLaunchConfigurationNotEquals 条件已弃用,并将在将来的版本中删除。相反,应使用更通用的 EqualsNotEquals 替代。

请参阅 https://github.com/ros2/launch/pull/649 获取更多详细信息。

launch_ros

将名称中使用的 Ros 的类更名为 ROS,以符合 PEP8。

已更改的类有:

  • launch_ros.actions.RosTimer -> launch_ros.actions.ROSTimer

  • launch_ros.actions.PushRosNamespace -> launch.actions.PushROSNamespace

旧的类名仍然存在,但将被弃用。

请参阅 https://github.com/ros2/launch_ros/pull/326 获取更多信息。

launch_xml

向XML前端公开 emulate_tty

在几个发布版本中,通过伪终端模拟TTY(从而实现打印颜色等功能)已经成为可能。现在,通过向可执行命令传递 emulate_tty 参数,该功能在XML前端中也可用。

更多信息请参见 https://github.com/ros2/launch/pull/669

将``sigterm_timeout``和``sigkill_timeout``暴露给XML前端。

在``launch``的Python代码中,已经可以配置SIGTERM和SIGKILL信号的最大超时值。现在,通过将``sigterm_timeout``或``sigkill_timeout``参数传递给可执行命令,该功能也可在XML前端中使用。

更多信息请参见 https://github.com/ros2/launch/pull/667

launch_yaml

将``emulate_tty``暴露给YAML前端。

几个发布版本以来,已经可以让``launch`` Python代码使用伪终端来模拟TTY(从而执行诸如打印颜色之类的操作)。现在,在YAML前端通过向可执行命令传递``emulate_tty``参数即可使用该功能。

更多信息请参见 https://github.com/ros2/launch/pull/669

向YAML前端公开``sigterm_timeout``和``sigkill_timeout``

几个发布版本以来,已经可以在``launch`` Python代码中配置SIGTERM和SIGKILL信号的最大超时值。现在,在YAML前端通过向可执行命令传递``sigterm_timeout``或``sigkill_timeout``参数即可使用该功能。

更多信息请参见 https://github.com/ros2/launch/pull/667

message_filters

新增近似时间策略

新增了一种更简单的近似时间策略,称为``ApproximateEpsilonTime``。该时间策略类似于``ExactTime``,但允许时间戳在某个epsilon容差范围内。有关更多信息,请参阅https://github.com/ros2/message_filters/pull/84。

新的上采样时间策略

增加了一个名为``LatestTime``的新时间策略。它可以通过零阶保持对最多9个消息进行按照其速率进行上采样的同步。更多信息请参见https://github.com/ros2/message_filters/pull/73。

rcl_yaml_param_parser

在参数文件中支持YAML的``!!str``语法

现在可以通过使用YAML的``!!str``语法来强制ROS参数文件解析器将字段解释为字符串。更多信息请参见https://github.com/ros2/rcl/pull/999。

rclcpp

多线程执行器的默认线程数已更改

如果用户没有另外指定,多线程执行器的默认线程数将设置为机器上的 CPU 数量。如果底层操作系统不支持获取此信息,将设置为 2。

有关更多信息,请参阅 https://github.com/ros2/rclcpp/pull/2032

在指定深度为 0 的 KEEP_LAST QoS 时会打印警告信息。

指定 KEEP_LAST QoS 为深度为 0 是一种无意义的设置,因为实体将无法发送或接收任何数据。现在,如果指定了这种组合,rclcpp 将打印警告信息,但仍将继续运行,并让底层中间件选择一个合理的值(通常为深度为 1)。

有关更多信息,请参阅 https://github.com/ros2/rclcpp/pull/2048

已删除弃用的 RCLCPP_SCOPE_EXIT 宏。

在Humble版本中,宏``RCLCPP_SCOPE_EXIT``已被弃用,建议使用``RCPPUTILS_SCOPE_EXIT``。在Iron版本中,``RCLCPP_SCOPE_EXIT``宏已完全移除。

rclpy

多线程执行器的默认线程数已更改

如果用户没有另外指定,多线程执行器的默认线程数将设置为机器上的 CPU 数量。如果底层操作系统不支持获取此信息,将设置为 2。

更多信息请参见https://github.com/ros2/rclpy/pull/1031。

在指定深度为 0 的 KEEP_LAST QoS 时会打印警告信息。

使用``KEEP_LAST``的QoS并将深度设为0是一种无意义的设置,因为实体将无法发送或接收任何数据。如果指定了这种组合,``rclpy``现在会打印警告,但仍然会继续运行,并让底层中间件选择一个合理的值(通常是深度为1)。

更多信息请参见https://github.com/ros2/rclpy/pull/1048。

在与其他类型进行比较时,Time``和``Duration``不再抛出异常。现在可以将``rclpy.time.Time``和``rclpy.duration.Duration``与其他类型进行比较而不会引发异常。如果这些类型不可比较,比较结果将返回``False。请注意,这与之前版本的行为不同。

现在可以将 rclpy.time.Timerclpy.duration.Duration 与其他类型进行比较而不会引发异常。如果类型不可比较,比较结果将返回 False。请注意,这是与之前版本不同的行为变更。

print(None in [rclpy.time.Time(), rclpy.duration.Duration()])  # Prints "False" instead of raising TypeError

更多信息请参阅 https://github.com/ros2/rclpy/pull/1007

rcutils

提高消息记录的性能

当优化 RCUTILS_LOG_*RCLCPP_* 时,用于输出日志消息的代码已经减少了开销。这些日志消息现在应该更高效,尽管不应该高频率调用它们。有关更多信息,请参阅 https://github.com/ros2/rcutils/pull/381https://github.com/ros2/rcutils/pull/372https://github.com/ros2/rcutils/pull/369https://github.com/ros2/rcutils/pull/367

移除了废弃的 rcutils/get_env.h 头文件。

在Humble版本中,头文件``rcutils/get_env.h``已被弃用,推荐使用``rcutils/env.h``。在Iron版本中,完全移除了``rcutils/get_env.h``头文件。

rmw

将GID存储更改为16字节

RMW层中的GID用于作为ROS图中写入者的全局唯一标识符。先前由于旧版RMW实现中的错误,它被错误地设置为24字节。但是``rmw``软件包应该定义它,并且所有的实现都应该遵守该定义。因此,此版本将其定义为16字节(DDS标准),并更改所有实现以使用该定义。

有关更多信息,请参阅https://github.com/ros2/rmw/pull/345和(已关闭但相关的)https://github.com/ros2/rmw/pull/328。

rmw_dds_common

将GID存储更改为16字节

随着``rmw``层的变化,将发送GID信息的消息更改为16个字节。

更多信息请参见https://github.com/ros2/rmw_dds_common/pull/68。

ros2topic

ros2 topic hz/bw/pub``现在会尊重``use_sim_time

在仿真环境下运行时,ROS 2生态系统通常从仿真器发布的``/clock``主题获取时间(而不是使用系统时钟)。通常通过在节点上设置``use_sim_time``参数来通知ROS 2节点进行这种更改。ros2 topic``命令``hz``bw``和``pub``创建的节点现在会尊重该参数,并在适当的时候使用仿真时间。

更多信息请参见https://github.com/ros2/ros2cli/pull/754。

rosbag2

将默认的包文件类型更改为``mcap``

在此版本之前,默认情况下,rosbag2会将数据记录到sqlite3数据库中。在测试过程中发现,在许多情况下,这种方式的性能不够好,并且缺乏离线处理所需的某些功能。

为了满足这些需求,开发了一种新的包文件格式(受到ROS 1原始包文件格式的影响),称为``mcap``。该包文件格式具有许多sqlite3文件格式缺失的功能,并且应该具有更好的性能。

此版本将``mcap``作为编写新包的默认文件格式进行切换。旧的``sqlite3``文件格式仍然可用,并且可以由用户选择进行编写,如果需要的话。此版本还允许从``sqlite3``文件格式或``mcap``文件格式中回放数据。

有关更多信息,请参阅https://github.com/ros2/rosbag2/pull/1160。

使用SQLite3插件将消息定义存储在包文件中。

现在我们支持将消息定义保存到``sqlite3``数据库文件中,保存格式与保存到``mcap``文件中的格式相同。这为第三方工具提供了在解码使用``sqlite3``插件记录的包文件时,无需具有所有原始``.msg``文件的正确版本的机器上进行反序列化的能力。

有关更多信息,请参见 https://github.com/ros2/rosbag2/issues/782https://github.com/ros2/rosbag2/pull/1293

新的回放和录制控制

已添加多个拉取请求以增强用户对包的播放控制。拉取请求 960 添加了指定播放秒数的能力。而拉取请求 1005 允许播放到指定的时间戳。另一个拉取请求 1007 添加了通过服务调用远程停止播放的能力。如果播放器处于暂停模式,停止将取消暂停;如果播放正在进行,则停止播放并强制退出play()方法。

通过服务调用管理录制

有了来自远程节点控制录制过程的新选项。拉取请求 1131 添加了通过服务调用暂停和恢复录制的能力。另一个拉取请求 1115 允许在录制过程中通过发送服务调用来分割包。

在播放过程中通过正则表达式过滤话题

用户有时需要从记录的数据包中仅重放一部分主题,以下两个拉取请求添加了这种功能。拉取请求 1034 添加了一个新选项 --topics-regex,允许使用正则表达式来筛选主题。--topics-regex 选项接受多个以空格分隔的正则表达式。而拉取请求 1046 则通过在新的 --exclude``(和 ``-x)选项中提供正则表达式的方式,添加了排除某些特定主题的能力。

允许插件注册自己的CLI动词参数

拉取请求 1209 添加了 rosbag2 插件注册可选的Python入口点的能力,以提供插件特定的CLI参数值。因此,ros2 bag record 动词的命令行选项 --storage-preset-profile 的有效选项将取决于底层存储插件。

其他变化

拉取请求 1038 添加了在 metadata.yaml 文件的 'custom' 字段中记录任意键/值对的能力。当用户需要保存一些硬件特定的ID或记录捕获位置的坐标时,这很有用。而拉取请求 1180 则通过提供新的命令行选项 --node-name 来更改录制器的底层节点名称。该选项可以用于创建具有多个 rosbag2 录制器实例的远程分布式录制。它提供了向专用的 rosbag2 录制器实例发送服务调用以管理录制过程的能力。

rosidl_python

修改 __slots__ 属性的内容

到目前为止,Python消息类的属性``__slots__``一直被用作包含消息字段名称的成员。在Iron中,这个属性不再只包含消息结构的字段名称,而是包含所有类成员的字段名称。因此,用户不能依赖这个属性来获取字段名称信息,而应该使用方法``get_field_and_field_types()``来获取。

有关更多信息,请参阅 https://github.com/ros2/rosidl_python/pull/194

rviz

地图显示现在可以显示为二进制

RViz地图显示现在可以将地图显示为二进制形式,并且可以设置阈值。在某些情况下,这对于检查地图或与可设置阈值的规划器结合使用非常有用。

有关更多信息,请参阅https://github.com/ros2/rviz/pull/846。

相机显示插件将尊重CameraInfo消息中的感兴趣区域(ROI)。

CameraDisplay插件现在可以根据提供的CameraInfo消息中的感兴趣区域(ROI)设置进行处理。这考虑到了摄像机驱动程序裁剪图像以减少带宽的情况。

更多信息请参见 https://github.com/ros2/rviz/pull/864

来自SOLIDWORKS的二进制STL文件可以正常使用。

对STL加载器进行了更改,以便接受来自SOLIDWORKS的具有"solid"一词的二进制STL文件。从技术上讲,这违反了STL规范,但这种情况非常常见,因此添加了特殊情况来处理这些文件。

更多信息请参见 https://github.com/ros2/rviz/pull/917

tracetools

在Linux上,默认情况下包含跟踪工具仪表。

ROS 2核心现在已经有了一段时间的追踪仪器。然而,默认情况下它被编译取消了。要获得仪器,必须在重建ROS 2源代码之前手动安装LTTng跟踪器。在Iron中,默认包含了追踪仪器和追踪点;因此,LTTng跟踪器现在是ROS 2的一个依赖项。

请注意,这仅适用于Linux。

请参阅https://github.com/ros2/ros2_tracing/pull/31和https://github.com/ros2/ros2/issues/1177获取更多信息。请参阅:此指南以移除仪器(或在Humble和更早版本中添加仪器)

新增了``rclcpp``进程内通信的追踪点

新增了支持``rclcpp``进程内通信的追踪点。这允许评估消息发布和回调开始之间的时间(在进程内通信中)。

请参阅https://github.com/ros2/ros2_tracing/pull/30和https://github.com/ros2/rclcpp/pull/2091获取更多信息。

已知问题

  • rmw_connextdds 不适用于 Windows 二进制发行包。RTI 不再分发用于创建 Windows 二进制文件的 RTI ConnextDDS 6.0.1,而是现在分发不兼容生成的二进制文件的 RTI ConnextDDS 6.1.0。解决方案是在 Windows 上依赖于 ROS 2 和 rmw_connextdds 的源代码构建。

  • 在 Windows 上使用 sros2 需要将 cryptography Python 模块降级为 cryptography==38.0.4,如此 这里 所讨论的。

  • ros1_bridge 无法与来自 上游 Ubuntu 的 ROS Noetic 包配合使用。建议的解决方法是从源代码构建 ROS Noetic,然后使用它来构建 ros1_bridge

发布时间线

2022 年 11 月 - 平台决策

REP 2000 已更新,包含目标平台和主要依赖版本。

2023 年 1 月 - 滚动平台转换

构建农场已更新至新的平台版本和Iron Irwini的依赖版本(如有必要)。

2023年4月10日,星期一 - Alpha + RMW冻结

对ROS基础包进行初步测试和稳定,并对RMW提供者包的API和功能进行冻结。

2023年4月17日,星期一 - 冻结

对Rolling Ridley中的ROS基础包进行API和功能冻结。此后只能发布错误修复版本。新包可以独立发布。

2023年4月24日,星期一 - 分支

从Rolling Ridley分支出。``rosdistro``为ROS Base [1]_软件包的Rolling PR重新开放。Iron开发从``ros-rolling-*``软件包转为``ros-iron-*``软件包。

2023年5月1日,星期一 - Beta

可用的ROS Desktop [2]_软件包的更新版本。请求进行常规测试。

周一,2023年5月15日 - 发布候选版本

构建了正式候选版本软件包。可获取更新的ROS Desktop [2]_软件包版本。

周四,2023年5月18日 - 发布候选版本冻结

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

周二,2023年5月23日 - 正式发布

发布公告。rosdistro 对于Iron的PR重新开放。

1(1,2,3)

ros_base 变体在 REP 2001 (ros-base) 中有描述。

2(1,2)

desktop 变体在 REP 2001 (desktop-variants) 中有详细描述。

开发进展

关于Iron Irwini的开发和发布进展,请查看 跟踪GitHub问题

有关Iron Irwini遵循的整体流程,请参阅 流程描述页