Iron Irwini (iron
)
Iron Irwini 是 ROS 2 的第九个版本。 以下是 Iron Irwini 自上一个版本以来的重要变化和功能的重点介绍。 有关自 Humble 以来所有更改的列表,请参阅 长格式更改日志。
支持的平台
Iron Irwini 主要支持以下平台:
Tier 1 平台:
Ubuntu 22.04 (Jammy):
amd64
andarm64
Windows 10 (Visual Studio 2019):
amd64
二级平台:
RHEL 9:
amd64
第 3 层平台:
macOS:
amd64
Debian Bullseye:
amd64
有关 RMW 实现、编译器/解释器版本和系统依赖项版本的更多信息,请参阅 REP 2000。
安装
此 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/28、https://github.com/ros-infrastructure/rosdoc2/pull/49、https://github.com/ros-infrastructure/rosdoc2/pull/51 和 https://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 2012 和 https://github.com/ros2/ros2/issues/1285 上的跟踪错误。
支持设置参数前和设置参数后回调
对于现在的许多版本,用户可以注册一个回调,当外部实体(如“ros2 param 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:不断发展的消息类型的子集定义的这一功能伞已在 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 中。 同时,用户节点可以使用稳定的服务接口独立实现此服务。
动态类型和动态消息
除了上面提到的类型描述分布功能外,还能够在运行时构建和访问动态创建的类型(即动态类型)。
该功能在 Iron for Fast DDS 和 rcl
中可用,具有新的 rmw
接口,支持将消息作为动态消息(即从动态类型的结构构建或遵循动态类型的结构的消息)。
首先,在 rosidl 中引入了实用程序,以帮助构建和操作类型描述。
接下来,编写了 rosidl_dynamic_typesupport 包,并提供了一个与中间件无关的接口,用于在运行时构建动态类型和动态消息。
可以在运行时以编程方式或通过解析 type_description_interfaces/TypeDescription
消息来构建类型。
rosidl_dynamic_typesupport
库需要序列化支持库来实现特定于中间件的动态类型行为。
在 rosidl_dynamic_typesupport_fastrtps 中实现了 Fast DDS 的序列化支持库。
理想情况下,更多的中间件将实现支持库,从而扩大支持此功能的中间件数量。
最后,为了支持动态类型和动态消息的使用,在 rmw 和 rcl 中添加了新方法,支持:
能够获得中间件特定的序列化支持
能够在运行时构建使用动态类型的消息类型支持
能够使用动态类型获取动态消息
正在努力使用动态类型在客户端库中创建订阅(请参阅下面的 rclcpp
问题),但不确定该功能何时会登陆或反向移植。
这将允许用户订阅仅在运行时才知道类型描述的主题。
与此同时,用户可以使用作为此功能集的一部分引入的新 rmw
和 rcl
功能编写自己的订阅动态类型的订阅。
请参阅 REP 2011 了解设计方案。 请参阅 Dynamic Subscription 了解功能集的开发情况,其中 rclcpp 需要完成大部分工作。
launch
PythonExpression
现在支持导入模块
现在可以在执行评估之前启动 PythonExpression
导入模块。
这对于在评估表达式时引入要使用的其他功能非常有用。
请参阅 https://github.com/ros2/launch/pull/655 了解更多信息。
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``
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中有如何使用它的示例。
引入一种新的执行器类型:事件执行器
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();
注意 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。
隐藏消息类断言的可选参数
所有消息类现在都包含一个新的可选参数,允许隐藏消息中每种字段类型的断言。 默认情况下,断言是隐藏的,这在运行时可以提高性能。 为了启用断言以用于开发/调试目的,您有两个选择:
import os
from std_msgs.msg import String
os.environ['ROS_PYTHON_CHECK_FIELDS'] = '1'
new_message=String()
通过在构造函数中明确定义新参数来选择单个消息的特定行为:
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
消息设置为当前时间。
类似地,传递关键字“auto”时将自动生成“std_msg.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
中实现。
日志文件刷新已更改为每次使用“错误”日志消息时刷新,例如每次 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_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
LaunchConfigurationEquals
和 LaunchConfigurationNotEquals
已弃用
LaunchConfigurationEquals
和 LaunchConfigurationNotEquals
条件已弃用,并将在未来版本中删除。
相反,应使用更通用的 Equals
和 NotEquals
替代。
有关更多信息,请参阅 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_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(从而执行打印颜色等操作)。
通过将 emulate_tty
参数传递给可执行命令,现在可以在 YAML 前端使用该功能。
有关更多信息,请参阅 https://github.com/ros2/launch/pull/669。
将 sigterm_timeout
和 sigkill_timeout
暴露给 YAML前端
在多个版本中,都可以在 launch
Python 代码中配置 SIGTERM 和 SIGKILL 信号的最大超时值。
通过将 sigterm_timeout
或 sigkill_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。
当指定深度为 0 的 KEEP_LAST 的 QoS 时,现在会打印警告
指定深度为 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.Time
和 rclpy.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/381、https://github.com/ros2/rcutils/pull/372、https://github.com/ros2/rcutils/pull/369 和 https://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
命令 hz
、bw
和 pub
创建的节点现在尊重该参数并将根据需要使用模拟时间。
有关更多信息,请参阅 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”插件记录的包文件的机器上拥有所有原始 .msg 文件的正确版本。
有关更多信息,请参阅 https://github.com/ros2/rosbag2/issues/782 和 https://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
将具有
不同的有效选项,具体取决于底层存储插件。
其他更改
pull 请求 1038 添加了在 metadata.yaml 文件中的“自定义”字段中记录任何键/值对的功能。
当用户需要保存某些硬件特定的 ID 或捕获记录的坐标时,此功能非常有用。
pull 请求 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/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 不再分发 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 问题 <https://github.com/ros2/ros2/issues/1298>`__。
有关 Iron Irwini 所遵循的广泛流程,请参阅:doc:流程描述页面。