Iron Irwini (iron)

Iron Irwini 是 ROS 2 的第九个版本。 以下是 Iron Irwini 自上一个版本以来的重要变化和功能的重点介绍。 有关自 Humble 以来所有更改的列表,请参阅 长格式更改日志

支持的平台

Iron Irwini 主要支持以下平台:

一级平台:

  • Ubuntu 22.04 (Jammy): amd64 and arm64

  • Windows 10 (Visual Studio 2019): amd64

二级平台:

  • RHEL 9: amd64

第 3 层平台:

  • macOS: amd64

  • Debian Bullseye: amd64

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

安装

Install Iron Irwini

此 ROS 2 版本中的新功能

Python 包的 API 文档生成

ROS 2 已为多个版本的 C++ 软件包提供了自动 API 文档,例如 https://docs.ros.org/en/rolling/p/rclcpp/generated/index.html。 Iron 还为 Python 软件包添加了自动 API 文档,例如 https://docs.ros.org/en/rolling/p/rclpy/rclpy.html

有关更多详细信息,请参阅 https://github.com/ros-infrastructure/rosdoc2/pull/28https://github.com/ros-infrastructure/rosdoc2/pull/49https://github.com/ros-infrastructure/rosdoc2/pull/51https://github.com/ros-infrastructure/rosdoc2/pull/52

服务自省

现在可以针对每个服务启用服务自省。 启用后,用户可以查看与请求服务的客户端、接受请求的服务器、发送响应的服务器以及接受响应的客户端相关的元数据。 也可以选择自省客户端/服务器请求/响应的内容。 所有信息都发布在由服务名称生成的隐藏主题上。 因此,如果服务名为“/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 2012https://github.com/ros2/ros2/issues/1285 上的跟踪错误。

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

对于现在的许多版本,用户可以注册一个回调,当外部实体(如“ros2 param set”)更改节点上的参数时,该回调将被调用。 此回调可以检查更改的参数类型和值,如果其中一个不符合某些条件,则拒绝所有参数。 但是,它不能修改参数列表,也不应该修改状态(因为在设置回调之后可能还有其他回调会拒绝参数)。

此版本添加了前置和后置回调。 回调按以下顺序调用:

  • “前置”设置参数回调,可以根据任意条件修改参数列表。

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

  • “后置”设置参数回调,可以根据参数进行状态更改,并且仅在前两个回调成功时才调用。

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/1947https://github.com/ros2/rclpy/pull/966https://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:不断发展的消息类型的子集定义,其中许多部分已在 Iron 中实现。

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

其次,已经确定了一种散列类型描述的方法,即 ROS 接口散列标准 (RIHS) - 从第一个版本 RIHS01 开始。 在构建时,会自动为所有编译的 ROS 类型计算 RIHS 散列,并将其嵌入到生成的代码中,以便对其进行检查。 这些散列也会在发现期间自动传达,并包含在 rmw_topic_endpoint_info_t 中,用于图形自省查询,例如 get_publishers_info_by_topic

完整的“TypeDescription”数据结构以及用于生成它的原始源文本(例如“.msg”文件)现在默认嵌入到消息库中,因此“typesupport”或最终用户可以使用这些文件。 虽然我们期望这些数据能为大多数用户提供价值,但一些试图最小化安装空间字节的用户可以在构建 ROS 2 Core 时通过定义 CMake 变量“ROSIDL_GENERATOR_C_DISABLE_TYPE_DESCRIPTION_CODEGEN”来禁用该功能。

最后,新服务“type_description_interfaces/GetTypeDescription.srv”已被定义,以允许节点在遇到未知的 RIHS 类型哈希时从宣传该类型的节点请求完整定义。 正在努力在 ROS 2 Nodes 中原生提供此功能,作为节点构建的可选开关。 此功能尚未发布,但预计将在 2023 年中期某个时候移植到 Iron 中。 同时,用户节点可以独立实现该服务,使用稳定的服务接口。

请参阅 REP 2011 了解设计方案。 请参阅 类型描述分布 了解功能集的开发情况。

动态类型和动态消息

除了上面提到的类型描述分布功能外,还能够在运行时构建和访问动态创建的类型(即动态类型)。 此功能在 Iron for Fast DDS 和 rcl 中可用,具有新的 rmw 接口,用于支持将消息作为动态消息(即从动态类型的结构构建或遵循动态类型的结构的消息)。

首先,在 rosidl 中引入了实用程序,以帮助构建和操作类型描述。

接下来,编写了 rosidl_dynamic_typesupport 包,并提供一个与中间件无关的接口来在运行时构建动态类型和动态消息。 类型可以在运行时通过编程方式构建,或者通过解析“type_description_interfaces/TypeDescription”消息构建。

Note

rosidl_dynamic_typesupport 库需要序列化支持库来实现特定于中间件的动态类型行为。

rosidl_dynamic_typesupport_fastrtps 中实现了 Fast DDS 的序列化支持库。

理想情况下,更多的中间件将实现支持库,从而扩大支持此功能的中间件数量。

最后,为了支持动态类型和动态消息的使用,在 rmwrcl 中添加了新方法,支持:

  • 能够获得中间件特定的序列化支持

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

  • 能够使用动态类型获取动态消息

正在努力使用动态类型在客户端库中创建订阅(请参阅下面的 rclcpp 问题),但不确定该功能何时会登陆或反向移植。

这将允许用户订阅仅在运行时才知道类型描述的主题。

与此同时,用户可以使用作为此功能集的一部分引入的新 rmwrcl 功能编写自己的订阅动态类型的订阅。

请参阅 REP 2011 了解设计方案。 请参阅 动态订阅 了解功能集的开发情况,其中 rclcpp 需要完成大部分工作。

launch

PythonExpression 现在支持导入模块

现在可以在执行评估之前启动“PythonExpression”导入模块。 这对于在评估表达式时引入要使用的附加功能非常有用。

See https://github.com/ros2/launch/pull/655 for more information.

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

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

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

添加“AnySubstitution”和“AllSubstitution”

现在可以指定当任何输入参数为真(“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 秒。

如果进程花费的时间超过这个时间,它们就会失败。

现在有一个名为 ready_to_test_action_timeout 的新装饰器,它允许用户配置等待进程启动的时间。

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

rclcpp

增加了一个用于处理 Node 的新范例和``LifecycleNode``

NodeLifecycleNode 类是相关的,因为它们都提供相同的基本方法集(尽管 LifecycleNode 也提供了其他方法)。

由于各种实现考虑,它们不是从公共基类派生的。

这给想要接受 NodeLifecycleNode 的下游代码带来了一些麻烦。

一种解决方案是使用两个方法签名,一个接受 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中有如何使用它的示例。

引入一种新的执行器类型:事件执行器

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”就像替换当前的Executor实现(例如“SingleThreadedExecutor”)一样简单:

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

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

注意 EventsExecutorTimersManager 当前位于 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

已删除弃用的选项

dump 命令中的 --output-dir--print 选项已被删除。

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

ros2topic

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

ros2 topic pub 现在允许通过 now 关键字将 builtin_interfaces.msg.Time 消息设置为当前时间。 类似地,传递关键字时将自动生成 std_msg.msg.Header 消息``auto``。 此行为与 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 中实现。

日志文件刷新已更改为每次使用“错误”日志消息时刷新,例如每次 RCLCPP_ERROR() 调用,以及每五秒定期刷新一次。

以前,spdlog 的使用无需配置,只需创建用于将日志记录到文件的接收器即可。

我们测试了此更改,发现 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_executableament_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 的类,以使用符合 PEP8 的 ROS

已更改的类:

  • 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

emulate_tty 暴露给 XML 前端

在多个版本中,launch Python 代码都可以使用伪终端来模拟 TTY(从而执行打印颜色等操作)。

现在,通过将 emulate_tty 参数传递给可执行命令,该功能可在 XML 前端中使用。

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

sigterm_timeoutsigkill_timeout 暴露给 XML 前端

在多个版本中,都可以在 launch Python 代码中配置 SIGTERM 和 SIGKILL 信号的最大超时值。

通过将 sigterm_timeoutsigkill_timeout 参数传递给可执行命令,现在可以在 XML 前端使用此功能。

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

launch_yaml

emulate_tty 暴露给 YAML 前端

在多个版本中,launch Python 代码都可以使用伪终端来模拟 TTY(从而执行打印颜色等操作)。

通过将 emulate_tty 参数传递给可执行命令,现在可以在 YAML 前端使用该功能。

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

sigterm_timeoutsigkill_timeout 暴露给 YAML 前端

在多个版本中,都可以在 launch Python 代码中配置 SIGTERM 和 SIGKILL 信号的最大超时值。 通过将 sigterm_timeoutsigkill_timeout 参数传递给可执行命令,该功能现在可在 YAML 前端中使用。

有关更多信息,请参阅 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

当指定 KEEP_LAST 的 QoS 且深度为 0 时,现在会打印警告

指定深度为 0 的 KEEP_LAST QoS 是一种无意义的安排,因为实体将无法发送或接收任何数据。 如果指定了此组合,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 时,现在会打印警告

指定深度为 0 的 KEEP_LAST 的 QoS 是一种无意义的安排,因为实体将无法发送或接收任何数据。

如果指定了此组合,rclpy 现在将打印警告,但仍将继续并让底层中间件选择一个合理的值(通常深度为 1)。

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

与另一个相比,时间和持续时间不再引发异常类型

现在可以将 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 图中编写者的全局唯一标识符。

之前,它被错误地设置为 24字节,基于旧 RMW 实现中的错误。 但是 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 主题获取时间(而不是使用系统时钟)。

ROS 2 节点通常通过在节点上设置 use_sim_time 参数来通知此更改。

ros2 topic 命令 hzbwpub 创建的节点现在尊重该参数并将根据需要使用模拟时间。

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

rosbag2

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

在此版本之前,默认情况下,rosbag2 会将数据记录到 sqlite3 数据库中。 在测试期间,发现在许多情况下,这不够高效,并且缺少离线处理所需的某些功能。

为了满足这些需求,开发了一种名为“mcap”的新包格式(受原始 ROS 1 包文件格式的影响)。 此包文件格式具有 sqlite3 文件格式中缺少的许多功能,并且性能也更高。

此版本切换为使用“mcap”作为写入新包的默认文件格式。 旧的“sqlite3”文件格式仍然可用,用户可以根据需要选择进行写入。 此版本还允许从“sqlite3”文件格式或“mcap”文件格式播放数据。

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

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

现在我们支持将消息定义以与保存到 mcap 文件的格式相同的格式保存到 sqlite3 数据库文件。

这为第三方工具提供了一个机会,使其能够反序列化 rosbag2 文件,而无需在解码使用 sqlite3 插件记录的 bag 文件的机器上拥有所有原始 .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 文件中的“自定义”字段中记录任何键/值对的功能。 当用户需要保存某些硬件特定的 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 的二进制 STL 文件,这些文件中包含单词“solid”。

这在技术上违反了 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/31https://github.com/ros2/ros2/issues/1177。 请参阅 此操作指南以删除检测(或使用 Humble 和更早版本添加检测)

添加了用于 rclcpp 进程内的新跟踪点

添加了新的跟踪点以支持 rclcpp 进程内通信。 这允许评估进程内通信中消息发布和回调启动之间的时间。

有关详细信息,请参阅 https://github.com/ros2/ros2_tracing/pull/30https://github.com/ros2/rclcpp/pull/2091

已知问题

  • rmw_connextdds 不适用于 Windows 二进制发布包。

RTI 不再分发 RTI ConnextDDS 6.0.1,该软件包由打包作业用于为 Windows 创建二进制文件。

相反,他们现在分发 RTI ConnextDDS 6.1.0,它与生成的二进制文件 ABI 不兼容。

解决方案是依赖 Windows 上的 ROS 2 和 rmw_connextdds 的源代码版本。

发布时间表

2022 年 11 月 - 平台决策

REP 2000 更新了目标平台和主要依赖版本。

到 2023 年 1 月 - 滚动平台转移 构建农场将更新 Iron Irwini 的新平台版本和依赖版本(如有必要)。

2023 年 4 月 10 日星期一 - Alpha + RMW 冻结 ROS Base [1] 软件包的初步测试和稳定,以及 RMW 提供商软件包的 API 和功能冻结。

2023 年 4 月 17 日星期一 - 冻结 Rolling Ridley 中 ROS Base [1] 软件包的 API 和功能冻结。

此后只应发布错误修复版本。 新软件包可以独立发布。

2023 年 4 月 24 日星期一 - 分支 Rolling Ridley 的分支。 rosdistro 重新开放,用于 ROS Base [1] 软件包的滚动 PR。 Iron 开发从 ros-rolling-* 软件包转移到 ros-iron-* 软件包。

2023 年 5 月 1 日星期一 - Beta 版 ROS Desktop [2] 软件包的更新版本可用。 要求进行一般测试。

2023 年 5 月 15 日星期一 - 候选版本 构建候选版本软件包。 ROS Desktop [2] 软件包的更新版本可用。

2023 年 5 月 18 日星期四 - 发行版冻结 冻结 rosdistro。 rosdistro 存储库上的 Iron 的 PR 将不会合并(发布公告后重新打开)。

2023 年 5 月 23 日星期二 - 通用可用性 发布公告。 rosdistro 已重新开放供 Iron PR 使用。

开发进度

有关 Iron Irwini 的开发和发布进度,请参阅 跟踪 GitHub 问题

有关 Iron Irwini 所遵循的广泛流程,请参阅 流程描述页面