Humble Hawksbill (humble)

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

支持的平台

Humble Hawksbill 主要支持以下平台:

一级平台:

  • Ubuntu 22.04 (Jammy): amd64arm64

  • Windows 10(Visual Studio 2019):amd64

二级平台:

  • RHEL 8:amd64

Tier 3 平台:

  • Ubuntu 20.04(Focal):amd64

  • macOS:amd64

  • Debian Bullseye:amd64

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

补丁发布1的变化(2022-11-23)

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#751

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

ament_cmake_gen_version_h

生成带有版本信息的 C/C++ 头文件

ament_cmake_gen_version_h 中添加了一个新的 CMake 函数,用于生成带有包版本信息的头文件,详情请见 ament/ament_cmake#377。以下是最简单的使用示例:

project(my_project)
add_library(my_lib ...)
ament_generate_version_header(my_lib)

它将从``package.xml``生成一个带有版本信息的头文件,并使其可用于链接到``my_lib``库的目标。

如何包含该头文件:

#include <my_project/version.h>

头文件的安装位置:

set(VERSION_HEADER ${CMAKE_INSTALL_PREFIX}/include/my_project/my_project/version.h)

启动

在组操作中进行环境变量的作用域设置

与启动配置类似,现在默认情况下,环境变量的状态会作用于组操作。

例如,在以下启动文件中,执行的进程将回显值``1``(在Humble之前将回显``2``):

<launch>
  <set_env name="FOO" value="1" />
  <group>
    <set_env name="FOO" value="2" />
  </group>
  <executable cmd="echo $FOO" output="screen" shell="true" />
</launch>

如果您想禁用启动配置和环境变量的作用域,您可以将``scoped``参数(或属性)设置为false。

相关PR:ros2/launch#601

launch_pytest

我们添加了一个新的软件包,launch_pytest,它可以作为``launch_testing``的替代方案。``launch_pytest``是一个简单的pytest插件,提供pytest fixtures来管理launch service的生命周期。

请查看`软件包的README以获取详细信息和示例。<https://github.com/ros2/launch/tree/humble/launch_pytest>`_

相关PR:ros2/launch#528

允许使用可调用对象与目标动作进行匹配

现在,事件处理程序可以接受可调用对象来进行匹配,而不仅限于接受目标动作对象。

相关 PR: ros2/launch#540

在评估 Python 表达式时可以访问 math 模块

在``PythonExpression``替换(eval)中,我们现在可以使用 Python 的 math 模块中的符号。例如,

<launch>
  <log message="$(eval 'ceil(pi)')" />
</launch>

相关 PR: ros2/launch#557

布尔替代

新增替代 NotSubstitutionAndSubstitutionOrSubstitution 提供了一种方便的方法来执行逻辑操作,例如

<launch>
  <let name="p" value="true" />
  <let name="q" value="false" />
  <group if="$(or $(var p) $(var q))">
    <log message="The first condition is true" />
  </group>
  <group unless="$(and $(var p) $(var q))">
    <log message="The second condition is false" />
  </group>
  <group if="$(not $(var q))">
    <log message="The third condition is true" />
  </group>
</launch>

相关PR:ros2/launch#598

新增操作

  • AppendEnvironmentVariable 将一个值追加到现有环境变量中。

  • ResetLaunchConfigurations 重置应用于启动配置的任何配置。

launch_ros

将 ROS 参数传递给节点操作

现在可以直接提供`ROS 特定的节点参数 <../../How-To-Guides/Node-arguments>`,而无需使用带有前导``--ros-args``标志的``args``:

<launch>
  <node pkg="demo_nodes_cpp" exec="talker" ros_args="--log-level debug" />
</launch>

Python 启动文件中``Node``操作对应的参数是``ros_arguments``:

from launch import LaunchDescription
import launch_ros.actions

def generate_launch_description():
    return LaunchDescription([
        launch_ros.actions.Node(
            package='demo_nodes_cpp',
            executable='talker',
            ros_arguments=['--log-level', 'debug'],
        ),
    ])

相关PR:ros2/launch_ros#249ros2/launch_ros#253

可组合节点的前端支持

现在我们可以从前端launch文件中启动节点容器并将组件加载到其中,例如:

<launch>
  <node_container pkg="rclcpp_components" exec="component_container" name="my_container" namespace="">
    <composable_node pkg="composition" plugin="composition::Talker" name="talker" />
  </node_container>
  <load_composable_node target="my_container">
    <composable_node pkg="composition" plugin="composition::Listener" name="listener" />
  </load_composable_node>
</launch>

相关PR:ros2/launch_ros#235

参数替换

新的``ParameterSubstitution``允许您使用``SetParameter``动作替换先前在launch中设置的参数的值。例如:

<launch>
  <set_parameter name="foo" value="bar" />
  <log message="Parameter foo has value $(param foo)" />
</launch>

相关PR:ros2/launch_ros#297

新增操作

SROS2安全飞地支持证书吊销列表

证书吊销列表 (CRLs) 是一种概念,允许在证书到期之前吊销特定证书。从 Humble 版本开始,现在可以将 CRL 放入 SROS2 安全飞地中,并使其生效。有关如何使用它的示例,请参阅 SROS2 教程

内容过滤主题

内容过滤主题支持更复杂的订阅,表示订阅者不一定想看到主题下每个实例的所有值。当底层 RMW 实现支持此功能时,可以使用内容过滤主题来请求基于内容的订阅。

RMW 内容过滤主题支持

rmw_fastrtps

支持

rmw_connextdds

支持

rmw_cyclonedds

不支持

要了解更多信息,请参阅 content_filtering 示例。

相关设计 PR: ros2/design#282

ros2cli

ros2 launch 命令有一个 --launch-prefix 参数。

这允许在启动文件中给所有可执行文件添加前缀,在许多调试情况下非常有用。有关详细信息,请参阅相关的 pull request,以及 教程

相关的,增加了``--launch-prefix-filter`` 命令行选项,用于选择性地将 --launch-prefix 的前缀添加到可执行文件中。有关详细信息,请参阅 pull request

ros2 topic echo 命令有一个 --flow-style 参数。

这使用户能够在主题的YAML表示中强制使用“流样式”。如果没有此选项,``ros2 topic echo /tf_static``的输出可能类似于:

transforms:
- header:
    stamp:
      sec: 1651172841
      nanosec: 433705575
    frame_id: single_rrbot_link3
  child_frame_id: single_rrbot_camera_link
  transform:
    translation:
      x: 0.05
      y: 0.0
      z: 0.9
    rotation:
      x: 0.0
      y: 0.0
      z: 0.0
      w: 1.0

使用此选项,输出可能类似于:

transforms: [{header: {stamp: {sec: 1651172841, nanosec: 433705575}, frame_id: single_rrbot_link3}, child_frame_id: single_rrbot_camera_link, transform: {translation: {x: 0.05, y: 0.0, z: 0.9}, rotation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}}}]

有关更多信息,请参阅`PyYAML文档 <https://pyyaml.docsforge.com/master/documentation/#dictionaries-without-nested-collections-are-not-dumped-correctly>`__。

``ros2 topic echo``可以根据消息内容进行数据过滤。

这使用户只能打印与特定Python表达式匹配的主题上的数据。例如,使用以下参数只会打印以'foo'开头的字符串消息:

ros2 topic echo --filter 'm.data.startswith("foo")` /chatter

有关更多信息,请参阅`pull request <https://github.com/ros2/ros2cli/pull/654>`__。

rviz2

将纹理应用于任意三角形列表

我们添加了“通过URI定义的纹理应用于任意三角形列表的能力<https://github.com/ros2/rviz/pull/719>`__。现在我们可以使用UV坐标从纹理图中创建梯度,而不是默认的灰度。这将实现标记的复杂着色。要使用此功能,您应该使用 visualization_msgs/Marker.msg 并填写 texture_resourcetextureuv_coordinatesmesh_file 字段。您可以在`这里 <https://github.com/ros2/common_interfaces/pull/153>`__找到更多信息。

../_images/triangle_marker_with_gradient.png

质量属性的可视化(包括惯性)

我们还添加了可视化惯性的功能。要做到这一点,您可以在机器人模型的“质量属性”下选择启用“惯性”:

../_images/rviz_mass_inertia.png

您可以在下面看到一个惯性的图像。

../_images/tb4_inertia.png

在RViz中可视化YUV图像

现在可以直接在RViz中显示YUV图像,而无需先转换为RGB。有关详细信息,请参见 ros2/rviz#701

允许渲染距离大于100米的物体。

默认情况下,RViz仅渲染距离相机100米以内的物体。rviz相机插件中的一个新配置属性名为"Far Plane Distance",可用于配置渲染距离。

../_images/rviz2-far-plane-distance.png

有关详细信息,请参见 ros2/rviz#849

自Galactic版本以来的更改。

C++头文件被安装在子目录中。

在Humble之前的ROS 2版本中,所有软件包的C++头文件都安装在一个单独的包含目录中。例如,在Galactic中,目录结构如下(为简洁起见进行了简化):

/opt/ros/galactic/include/
├── rcl
│   ├── node.h
├── rclcpp
│   ├── node.hpp

这种结构在尝试使用覆盖时可能会引发严重问题。也就是说,由于包含目录的顺序问题,很可能获取到错误的头文件集合。请参阅https://colcon.readthedocs.io/en/released/user/overriding-packages.html,详细了解这些问题。

为了解决这个问题,在Humble中(以及未来的所有ROS 2版本中),目录结构发生了变化:

/opt/ros/humble/include
├── rcl
│   └── rcl
│       ├── node.h
├── rclcpp
│   └── rclcpp
│       ├── node.hpp

请注意,使用这些头文件的下游软件包**无需**进行更改;使用``#include <rclcpp/node.hpp>``与以前一样正常工作。然而,在使用寻找包含目录的IDE时,可能需要将各个包含目录添加到搜索路径中。

请参阅https://github.com/ros2/ros2/issues/1150获取更多信息,包括此更改背后的原因。

common_interfaces

为标记消息支持纹理和嵌入式网格

这两个新增功能将提高使用标准消息以新方式可视化数据的能力,并同时使跟踪这些数据在rosbag中成为可能。

**纹理**引入了三个新字段以支持标记:

# Texture resource is a special URI that can either reference a texture file in
# a format acceptable to (resource retriever)[https://index.ros.org/p/resource_retriever/]
# or an embedded texture via a string matching the format:
#   "embedded://texture_name"
string texture_resource
# An image to be loaded into the rendering engine as the texture for this marker.
# This will be used iff texture_resource is set to embedded.
sensor_msgs/CompressedImage texture
# Location of each vertex within the texture; in the range: [0.0-1.0]
UVCoordinate[] uv_coordinates

RViz将通过嵌入格式完全支持纹理渲染。

对于熟悉``mesh_resource``的人来说,应该会熟悉``resource_retriever``。这将允许程序员选择从哪里加载数据,可以是本地文件或网络文件。为了能够记录在rosbag中的所有数据,包括了嵌入纹理图像的能力。

**网格**以类似的方式进行了修改,以添加嵌入原始网格文件的能力,用于记录和修改。Meshfile消息有两个字段:

# The filename is used for both debug purposes and to provide a file extension
# for whatever parser is used.
string filename

# This stores the raw text of the mesh file.
uint8[] data

尚不支持嵌入式“Meshfile”消息的实现。

相关PR: ros2/common_interfaces#153 ros2/rviz#719

为SolidPrimitive添加了“PRISM”类型

“SolidPrimitive”消息添加了新的“PRISM”类型,并附带适当的元数据。有关详细信息,请参阅`ros2/common_interfaces#167 <https://github.com/ros2/common_interfaces/pull/167>`_。

rmw

将“struct”类型名称后缀从“_t”更改为“_s”

为了避免在生成代码文档时出现“struct”类型名称和其“typedef”别名的重复错误,所有“struct”类型名称的后缀从“_t”更改为“_s”。保留了带有“_t”后缀的别名。因此,此更改仅对使用完整的“struct”类型说明符(即“struct type_name_t”)的代码产生了破坏性更改。

详细信息请参见 ros2/rmw#313

rmw_connextdds

默认使用Connext 6。

默认情况下,Humble Hawksbill 使用 Connext 6.0.1 作为 rmw_connextdds 的 DDS 实现。仍然可以使用 Connext 5.3.1 和 rmw_connextdds,但必须重新编译源代码。

rcl

将“struct”类型名称后缀从“_t”更改为“_s”

为了避免在生成代码文档时出现“struct”类型名称和其“typedef”别名的重复错误,所有“struct”类型名称的后缀从“_t”更改为“_s”。保留了带有“_t”后缀的别名。因此,此更改仅对使用完整的“struct”类型说明符(即“struct type_name_t”)的代码产生了破坏性更改。

详细信息请参见 ros2/rcl#932

添加了 ROS_DISABLE_LOANED_MESSAGES 环境变量。

此环境变量可用于禁用借用消息支持,无论 rmw 是否支持它们。有关详细信息,请参阅指南:禁用零拷贝借用消息

rclcpp

为发布者和订阅者支持类型适配

在定义类型适配器之后,发布者和订阅者可以直接使用自定义的数据结构,这有助于减少程序员的额外工作和潜在的错误源。在处理复杂数据类型时特别有用,比如将 OpenCV 的 cv::Mat 转换为 ROS 的 sensor_msgs/msg/Image 类型。

以下是将 std_msgs::msg::String 转换为 std::string 的类型适配器示例:

template<>
struct rclcpp::TypeAdapter<
   std::string,
   std_msgs::msg::String
>
{
  using is_specialized = std::true_type;
  using custom_type = std::string;
  using ros_message_type = std_msgs::msg::String;

  static
  void
  convert_to_ros_message(
    const custom_type & source,
    ros_message_type & destination)
  {
    destination.data = source;
  }

  static
  void
  convert_to_custom(
    const ros_message_type & source,
    custom_type & destination)
  {
    destination = source.data;
  }
};

以下是如何使用类型适配器的示例:

using MyAdaptedType = TypeAdapter<std::string, std_msgs::msg::String>;

// Publish a std::string
auto pub = node->create_publisher<MyAdaptedType>(...);
std::string custom_msg = "My std::string"
pub->publish(custom_msg);

// Pass a std::string to a subscription's callback
auto sub = node->create_subscription<MyAdaptedType>(
  "topic",
  10,
  [](const std::string & msg) {...});

要了解更多信息,请参阅 发布者示例订阅者示例,以及更复杂的 演示示例。有关详细信息,请参阅 REP 2007

Client::asnyc_send_request(request) 返回一个 std::future 而不是 std::shared_future

此更改已在 rclcpp#1734 中实施。这会破坏API,因为``std::future::get()``方法会提取future中的值。这意味着,如果该方法被第二次调用,它将抛出异常。对于``std::shared_future``来说,情况不同,因为它的``get()``方法返回一个``const &``。示例:

auto future = client->async_send_request(req);
...
do_something_with_response(future.get());
...
do_something_else_with_response(future.get());  // this will throw an exception now!!

应该更新为:

auto future = client->async_send_request(req);
...
auto response = future.get();
do_something_with_response(response);
...
do_something_else_with_response(response);

如果需要共享的future,可以使用``std::future::share()``方法。

向``Publisher``添加了``wait_for_all_acked``方法

这个新方法将阻塞,直到发布者队列中的所有消息被匹配的订阅者确认或指定的超时时间过期。它只对可靠的发布者有用,因为在尽力传输的QoS情况下没有确认。示例:

auto pub = node->create_publisher<std_msgs::msg::String>(...);
...
pub->publish(my_msg);
...
pub->wait_for_all_acked(); // or pub->wait_for_all_acked(timeout)

有关更完整的示例,请参见 此处

从``NodeBase``和``Node``类中移除了``get_callback_groups``方法

``for_each_callback_group()``方法替代了``get_callback_groups()``方法,提供了一种线程安全的访问``callback_groups_``向量的方式。``for_each_callback_group()``接受一个函数作为参数,遍历存储的回调组,并调用传递的函数来处理有效的回调组。

更多详细信息,请参考此`pull request <https://github.com/ros2/rclcpp/pull/1723>`_。

Waitable``类中的``add_to_wait_set``方法将返回类型从``bool``更改为``void

之前,派生自``Waitable``的类在无法将元素添加到等待集时返回false,因此调用者必须检查此返回值并抛出或处理错误。现在,此错误处理应直接在``add_to_wait_set``方法中完成,必要时抛出异常。如果没有发生错误,则不需要返回任何内容。因此,这是对``Waitable``的下游使用造成了破坏性变更。

有关更多详细信息,请参阅`ros2/rclcpp#1612 <https://github.com/ros2/rclcpp/pull/1612>`__。

``NodeBaseInterface``类中的``get_notify_guard_condition``方法的返回类型已更改

现在``rclcpp``使用``GuardCondition``类对``rcl_guard_condition_t``进行封装,因此``get_notify_guard_condition``返回一个对节点的``rclcpp::GuardCondition``的引用。因此,这对于``NodeBaseInterface``和``NodeBase``的下游使用来说是一个破坏性变更。

有关更多详细信息,请参阅`ros2/rclcpp#1612 <https://github.com/ros2/rclcpp/pull/1612>`__。

向``Clock``添加了``sleep_until``和``sleep_for``方法

ros2/rclcpp#1814ros2/rclcpp#1828 中添加了两个新方法,允许在特定的时钟上进行休眠。``Clock::sleep_until``将暂停当前线程,直到时钟达到特定时间。``Clock::sleep_for``将暂停当前线程,直到时钟从调用该方法时起经过一定的时间。如果``Context``被关闭,两种方法都会提前唤醒。

rclcpp_lifecycle

发布者的激活和停用转换将自动触发

之前,用户需要重写``LifecylceNode::on_activate()``和``LifecylceNode::on_deactivate()``方法,并在``LifecyclePublisher``上调用同名方法来实际进行过渡。现在,``LifecylceNode``提供了这些方法的默认接口,已经自动完成了这个过程。在这里可以查看``lifecycle_talker``节点的实现 here

rclpy

管理节点

在rclpy中添加了对Lifecycle节点的支持。可以在`这里 <https://github.com/ros2/demos/tree/humble/lifecycle_py>`__找到完整的演示。

向``Publisher``添加了``wait_for_all_acked``方法

类似于添加到rclcpp的功能。

向``Clock``添加了``sleep_until``和``sleep_for``方法

添加了两个新的方法,允许在特定时钟上进行睡眠,详见 ros2/rclpy#858ros2/rclpy#864``sleep_until``会挂起当前线程,直到时钟到达特定时间。``sleep_for``会挂起当前线程,直到时钟从调用该方法时经过一定的时间。两种方法都会在``Context``关闭时提前唤醒。

ros1_bridge

由于Ubuntu Jammy及更高版本没有官方的ROS 1分发版本,``ros1_bridge``现在与Ubuntu打包的ROS 1版本兼容。有关如何使用``ros1_bridge``与Jammy软件包的更多详细信息,请参阅:doc:如何使用指南

ros2cli

``ros2``命令默认禁用输出缓冲

在此版本之前,运行如下命令

ros2 echo /chatter | grep "Hello"

直到输出缓冲区满时,不会打印任何数据。用户可以通过设置``PYTHONUNBUFFERED=1``来解决此问题,但这不太友好。

现在,所有``ros2``命令默认进行行缓冲,因此像上述命令一样,只要打印了换行符,命令就会起作用。要禁用此行为并使用默认的Python缓冲规则,请使用选项``--use-python-default-buffering``。有关更多信息,请参阅`原始问题<https://github.com/ros2/ros2cli/issues/595>`__和`拉取请求<https://github.com/ros2/ros2cli/pull/659>`__。

使用``--times/--once/-1``选项时,``ros2 topic pub``将等待一个匹配的订阅。

当使用``--times/--once/-1``标志时,``ros2 topic pub``将等待找到一个匹配的订阅,然后开始发布。这样可以避免在ros2cli节点发现匹配的订阅之前开始发布,从而导致一些最初的消息丢失。当使用可靠的QoS配置文件时,这尤其令人意外。

可以使用``-w/--wait-matching-subscriptions``标志来配置在开始发布之前等待的匹配订阅数量,例如:

ros2 topic pub -1 -w 3 /chatter std_msgs/msg/String "{data: 'foo'}"

等待三个匹配的订阅才开始发布。

-w``也可以独立于--times/--once/-1``使用,但只有在与它们组合时默认为一,否则``-w``的默认值为零。

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

``ros2 param dump``的默认输出已更改。

  • --print 选项用于 dump 命令,已经被 deprecated

    默认情况下,它会输出到标准输出:

    ros2 param dump /my_node_name
    
  • --output-dir 选项用于 dump 命令,已经被 deprecated

    要将参数转储到文件中,请运行:

    ros2 param dump /my_node_name > my_node_name.yaml
    

ros2 param set 现在接受更多的 YAML 语法

以前,如果尝试将字符串 "off" 设置为字符串类型的参数是不起作用的。这是因为 ros2 param set 将命令行参数解释为 YAML,并且 YAML 将 "off" 视为布尔类型。从 https://github.com/ros2/ros2cli/pull/684 开始,ros2 param set 现在接受 YAML 转义序列 "!!str off",以确保该值被视为字符串。

ros2 pkg create 可以自动生成一个 LICENSE 文件

如果在执行 ros2 pkg create 时传递了 --license 标志,并且许可证是已知的许可证之一,ros2 pkg create 将自动在包的根目录中生成一个 LICENSE 文件。要获取已知许可证的列表,请运行 ros2 pkg create --license ? <package_name>。有关更多信息,请参阅相关的 拉取请求

robot_state_publisher

添加了 frame_prefix 参数

ros/robot_state_publisher#159 中添加了一个新的参数 frame_prefix。该参数是一个字符串,会添加到 robot_state_publisher 发布的所有帧名称之前。类似于 ROS 1 中原始 tf 库中的 tf_prefix,可以使用该参数多次发布相同的机器人描述,但使用不同的帧名称。

删除了已弃用的 use_tf_static 参数

已从`robot_state_publisher`中删除了不推荐使用的`use_tf_static`参数。这意味着静态变换将无条件地发布到`/tf_static`主题,并且静态变换将以`transient_local`的质量服务进行发布。这是默认行为,也是`tf2_ros::TransformListener`类在之前预期的行为,因此大多数代码不需要更改。任何依赖于`robot_state_publisher`定期发布静态变换到`/tf`的代码都需要更新为订阅`/tf_static`作为`transient_local`订阅。

rosidl_cmake

已弃用`rosidl_target_interfaces()`

CMake函数`rosidl_target_interfaces()`已弃用,调用时会发出CMake警告。想要在生成消息/服务/动作的同一ROS软件包中使用它们的用户应该调用`rosidl_get_typesupport_target()`,然后使用`target_link_libraries()`使目标依赖于返回的typesupport目标。有关更多详细信息,请参阅https://github.com/ros2/rosidl/pull/606,并查看https://github.com/ros2/demos/pull/529,了解使用新函数的示例。

geometry2

TF2Error::NO_ERROR等的弃用

tf2``库使用一个叫做``TF2Error``的枚举来返回错误。不幸的是,其中一个枚举值叫做``NO_ERROR,这与Windows上的一个宏冲突。为了解决这个问题,在``TF2Error``中创建了一组新的枚举值,每个值都以``TF2``为前缀。以前的枚举值仍然可用,但现在已被弃用,如果使用将打印弃用警告。所有使用``TF2Error``枚举值的代码都应该更新为使用新的以``TF2``为前缀的错误值。详细信息请参阅https://github.com/ros2/geometry2/pull/349。

更直观的静态变换发布器命令行参数

static_transform_publisher``程序以前接受的参数形式如下:``ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 1 foo bar。前三个数字是平移的x、y和z坐标,接下来的四个数字是四元数的x、y、z和w分量,最后两个参数是父帧和子帧的ID。虽然这种方式可以工作,但存在一些问题:

  • 用户必须指定*所有*的参数,即使只设置一个数字

  • 阅读命令行以确定它发布的内容是困难的

为了解决这两个问题,命令行处理方式已更改为使用标志,并且除了``--frame-id``和``--child-frame-id``之外的所有标志都是可选的。因此,上述命令行可以简化为:ros2 run tf2_ros static_transform_publisher --frame-id foo --child-frame-id bar 要仅更改平移 x,命令行将是:ros2 run tf2_ros static_transform_publisher --x 1.5 --frame-id foo --child-frame-id bar

在此版本中仍允许使用旧式参数,但已被弃用并将打印警告。它们将在未来的版本中移除。更多详细信息,请参阅 https://github.com/ros2/geometry2/pull/392

变换监听器的自旋线程不再执行节点回调

tf2_ros::TransformListener 不再在提供的节点对象上自旋。相反,它创建一个回调组以在内部创建的实体上执行回调。这意味着如果在创建变换监听器时设置了参数 spin_thread=true,您不能再依赖于自己的回调函数被执行。您必须在节点上调用 spin 函数(例如 rclcpp::spin),或将节点添加到自己的执行器中。

相关拉取请求:geometry2#442

rosbag2

新的回放和录制控制

已经添加了几个拉取请求来增强用户对包回放的控制能力。拉取请求 931 添加了指定开始播放时间戳的功能。由于拉取请求 789,现在可以通过指定的时间间隔延迟回放的开始。

与此相关的是,rosbag2 已经增加了用户在回放过程中控制的新方法。拉取请求 847 在终端上为暂停、恢复和播放下一条消息添加了键盘控制功能。还可以通过拉取请求 905904 以暂停状态启动回放,这使得用户可以方便地启动回放,然后逐条消息进行调试,例如在调试管道时。拉取请求 836 添加了一个在包内进行寻址的接口,允许用户在回放过程中在包内进行移动。

最后,录制中添加了一种新的快照模式,通过拉取请求 851 实现。这种模式对于事件记录很有用,它允许录制开始填充缓冲区,但在调用服务之前不开始写入数据到磁盘。

突发模式回放

虽然实时播放来自包文件的数据是包文件最常见的用例,但在某些情况下,您希望尽快获取包中的数据。通过拉取请求`977 <https://github.com/ros2/rosbag2/pull/977>`_,``rosbag2``获得了从包中“突发”数据的能力。在突发模式下,数据以最快的速度进行播放。这在机器学习等应用中非常有用。

零拷贝播放

默认情况下,如果可以使用借用的消息,播放消息将作为借用的消息进行发布。这有助于减少数据的拷贝次数,因此对于发送大数据有更大的好处。拉取请求`981 <https://github.com/ros2/rosbag2/pull/981>`_为播放添加了``--disable-loan-message``选项。

等待确认

这个新选项将等待所有发布的消息被所有订阅者确认,或者在播放终止之前等待超时(以毫秒为单位)。特别是在短时间内发送大尺寸的消息的情况下。只有当发布者的QOS配置文件为RELIABLE时,此选项才有效。拉取请求`951 <https://github.com/ros2/rosbag2/pull/951>`_为播放添加了``--wait-for-all-acked``选项。

包文件编辑

rosbag2 正在采取措施实现对包文件的编辑,例如删除特定主题的所有消息或将多个包文件合并为一个。Pull request 921 添加了包文件重写功能和 ros2 bag convert 命令。

其他变化

Pull request 925 使 rosbag2 在记录时忽略"叶子主题"(没有发布者的主题)。这些主题将不再自动添加到包文件中。

已知问题

  • 在`在 Ubuntu 22.04 Jammy 主机上安装 ROS 2 <../../humble/Installation/Ubuntu-Install-Debians.html>`__ 之前,重要的是在安装 ROS 2 包之前更新您的系统。特别需要确保 systemdudev 更新到最新版本,否则安装 ros-humble-desktop``(依赖于 ``libudev1)可能会导致系统关键包被删除。详细信息可以在 ros2/ros2#1272Launchpad #1974196 中找到。

  • 当 ROS 2 apt 仓库可用时,无法安装 Ubuntu 上的 ROS 1 包。有关更多信息,请参阅 Ubuntu Jammy 上的 ros1_bridge 文档。

  • 一些主要的 Linux 发行版已经开始修补 Python,将软件包安装到 /usr/local,这破坏了 ament_package 和使用 colcon 构建的一些部分。特别是,在 Ubuntu Jammy 上使用从 pip 安装的 setuptools 将导致此问题,因此不推荐这样做。目前有一个 提议的解决方案 需要进一步测试才能广泛发布。

  • 拆分大小或持续时间的 ROS 2 包文件无法正确播放。只有最后一个记录的包文件会被播放。建议避免按大小或持续时间拆分包文件。详细信息可以在 ros2/rosbag2#966 中找到。

发布时间线

周一,2022年3月21日 - Alpha + RMW 冻结

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

周一,2022年4月4日 - 冻结

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

周一,2022年4月18日 - 分支

从Rolling Ridley分支。 ``rosdistro``已重新开放,用于ROS Base [1]_软件包的Rolling PRs。开发重心从``ros-rolling-*``软件包转移到``ros-humble-*``软件包。

2022年4月25日(星期一)- Beta版本

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

2022年5月16日(星期一)- 正式候选版本

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

2022年5月19日(星期四)- 发行版冻结

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

周一,2022年5月23日 - 正式发布

发布公告。rosdistro 重新开放接受 Humble 的 PR。

1(1,2,3)

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

2(1,2)

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