Humble Hawksbill (humble)

Humble Hawksbill 是 ROS 2 的第八个版本。 以下是自上一个版本以来 Humble Hawksbill 中重要变化和功能的重点介绍。 有关自 Galactic 以来所有变化的列表,请参阅“长格式变更日志 <Humble-Hawksbill-Complete-Changelog>”。

支持的平台

Humble Hawksbill 主要支持以下平台:

第 1 层平台:

  • Ubuntu 22.04 (Jammy): amd64 and arm64

  • Windows 10 (Visual Studio 2019): amd64

二级平台:

  • RHEL 8: amd64

第 3 层平台:

  • Ubuntu 20.04 (Focal): amd64

  • macOS: amd64

  • Debian Bullseye: amd64

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

安装

安装 Humble Hawksbill

补丁版本 1 中的更改(2022-11-23)

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

此 ROS 2 版本中的新功能

ament_cmake_gen_version_h

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

ament_cmake_gen_version_h 中添加了一个新的 CMake 函数,用于生成带有软件包版本信息的标头`ament/ament_cmake#377 <https://github.com/ament/ament_cmake/pull/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 装置来管理启动服务的生命周期。

查看 `package README 了解详细信息和示例。<https://github.com/ros2/launch/tree/humble/launch_pytest>`_

相关 PR:ros2/launch#528

允许使用匹配目标操作可调用

使用目标操作对象进行匹配的事件处理程序现在也可以使用可调用对象进行匹配。

相关 PR:ros2/launch#540

评估 Python 表达式时访问数学模块

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

<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 将值附加到现有环境变量。

  • 相关 PR:ros2/launch#543

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

  • 相关 PR:ros2/launch#515

launch_ros

将 ROS 参数传递给节点操作

它现在可以直接提供 ROS 特定的节点参数,而无需使用带有前导 --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>
  <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>
  <set_parameter name="foo" value="bar" />
  <log message="Parameter foo has value $(param foo)" />
</launch>

相关 PR:ros2/launch_ros#297

新操作

SROS2 安全区支持证书撤销列表

证书撤销列表 (CRL) 是一种概念,其中特定证书可以在其到期之前被撤销。 从 Humble 开始,现在可以将 CRL 放入 SROS2 安全区并使其得到遵守。 有关如何使用它的示例,请参阅`SROS2 教程 <https://github.com/ros2/sros2/blob/humble/SROS2_Linux.md#certificate-revocation-lists>`__。

内容过滤主题

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

RMW Content Filtered Topics support

rmw_fastrtps

supported

rmw_connextdds

supported

rmw_cyclonedds

not supported

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

相关设计 PR:ros2/design#282

ros2cli

ros2 launch 有一个 --launch-prefix 参数

这允许将前缀传递给启动文件中的所有可执行文件,这在许多调试情况下都很有用。 有关更多信息,请参阅相关的 pull request,以及 tutorial

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

ros2 topic echo 有一个 --flow-style 参数

这允许用户强制使用 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 文档

ros2 topic echo 可以根据消息内容过滤数据

这允许用户仅打印出与特定 Python 表达式匹配的主题数据。 例如,使用以下参数将仅打印出以“foo”开头的字符串消息:

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

有关更多信息,请参阅 pull request

rviz2

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

我们添加了 使用 UV 坐标将通过 URI 定义的纹理应用于任意三角形列表的功能

现在我们可以从纹理贴图中创建渐变拉动,而不是默认的灰度。

这将启用标记的复杂着色。 要使用此功能,您应该使用 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 摄像机插件中名为“远平面距离”的新配置属性允许配置渲染距离。

../_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

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) {...});

要了解更多信息,请参阅 publishersubscription 示例,以及更复杂的 demo。 有关更多详细信息,请参阅`REP 2007 <https://ros.org/reps/rep-2007.html>`_。

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);

如果需要共享未来,可以使用“std::future::share()”方法。

wait_for_all_acked 方法已添加到 Publisher

此新方法将阻塞,直到发布者队列中的所有消息都被匹配的订阅确认或指定的超时到期。

它仅对可靠的发布者有用,因为在尽力而为的 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)

有关更完整的示例,请参见 `这里<https://github.com/ros2/examples/blob/humble/rclcpp/topics/minimal_publisher/member_function_with_wait_for_all_acked.cpp>`__

get_callback_groups 方法已从 NodeBaseNode 类中删除

for_each_callback_group() 方法已通过提供线程安全的方式来访问 callback_groups_ 向量,从而取代了 get_callback_groups()

for_each_callback_group() 接受一个函数作为参数,遍历存储的回调组,并将传递的函数调用为有效的函数。

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

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

之前,从 Waitable 派生的覆盖 add_to_wait_set 的类在无法将元素添加到等待集时返回 false,因此调用者必须检查此返回值并抛出或处理错误。 此错误处理现在应直接在``add_to_wait_set`` 方法,必要时抛出。 如果没有发生错误,则不需要返回任何内容。 因此,这对于 Waitable 的下游使用来说是一个重大变化。

有关更多详细信息,请参阅 ros2/rclcpp#1612

get_notify_guard_condition 方法返回类型从 NodeBaseInterface 类更改

现在 rclcpp 使用 GuardCondition 类包装器包装 rcl_guard_condition_t,因此 get_notify_guard_condition 返回对节点的 rclcpp::GuardCondition 的引用。 因此,这对于 NodeBaseInterfaceNodeBase 的下游使用来说是一个重大变化。

有关更多详细信息,请参阅 ros2/rclcpp#1612

Clock 中添加了 sleep_untilsleep_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 节点的实现<https://github.com/ros2/demos/tree/humble/lifecycle>`__。

rclpy

托管节点

向 rclpy 添加了生命周期节点支持。 完整的演示可以在`此处<https://github.com/ros2/demos/tree/humble/lifecycle_py>`__找到。

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

类似于 rclcpp 中添加的功能。

Clock 中添加了 sleep_untilsleep_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 软件包一起使用的更多详细信息,请参阅 操作指南

ros2cli

ros2 命令默认禁用输出缓冲

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

ros2 echo /chatter | grep "Hello"

在输出缓冲区已满之前不会打印任何数据。 用户可以通过设置“PYTHONUNBUFFERED=1”来解决这个问题,但这不太方便用户使用。 相反,所有“ros2”命令现在都默认进行行缓冲,因此只要打印了换行符,上述命令就会立即起作用。 要禁用此行为并使用默认的 python 缓冲规则,请使用选项“–use-python-default-buffering”。 有关更多信息,请参阅“原始问题<https://github.com/ros2/ros2cli/issues/595>”和“pull 请求<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 使用,但与它们结合使用时默认为 1,否则 -w 默认值为 0。

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

ros2 param dump 默认输出已更改

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

ros2 param dump /my_node_name
  • dump 命令的 --output-dir 选项已 depreceded

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

    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文件

如果将 --license 标志传递给 ros2 pkg create,并且许可证是已知许可证之一,则 ros2 pkg create 现在将在包的根目录中自动生成 LICENSE 文件。

有关已知许可证的列表,请运行 ros2 pkg create --license ? <package_name>

有关更多信息,请参阅相关的 pull request

robot_state_publisher

添加了 frame_prefix 参数

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

删除已弃用的 use_tf_static 参数

已弃用的 use_tf_static 参数已从 robot_state_publisher 中删除。 这意味着静态转换无条件发布到 /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

rviz2

geometry2

TF2Error::NO_ERROR 等的弃用

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

static_transform_publisher 的更直观的命令行参数

static_transform_publisher 程序过去接受的参数如下:ros2 run tf2_ros static_transform_publisher 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 <https://github.com/ros2/rosbag2/pull/931>`_ 增加了指定开始播放的时间戳的功能。 由于拉取请求`789 <https://github.com/ros2/rosbag2/pull/789>`_,现在可以将播放开始时间延迟指定的间隔。

相关地,rosbag2 为用户提供了新的方式来控制正在发生的播放。 拉取请求`847 <https://github.com/ros2/rosbag2/pull/847>`_ 添加了键盘控件,用于在终端播放期间暂停、恢复和播放下一条消息。 借助拉取请求 905904,还可以开始暂停播放,这使用户可以轻松启动播放,然后逐步浏览消息,例如在调试管道时。 拉取请求 836 添加了用于在包内查找的界面,允许用户在播放期间在包内移动。

最后,在拉取请求 851 中添加了一种新的快照模式来录制。 此模式适用于事件记录,允许记录开始填充缓冲区,但直到调用服务时才开始将数据写入光盘。

突发模式播放

虽然实时播放包中的数据是包文件最常见的用例,但在某些情况下,您希望包中的数据尽可能快。 通过拉取请求 977rosbag2 获得了从包中“突发”数据的能力。 在突发模式下,数据会尽可能快地播放。 这在机器学习等应用中很有用。

零拷贝播放

默认情况下,如果可以使用借出消息,则播放消息将作为借出消息发布。 这有助于减少数据副本的数量,因此发送大数据的好处更大。 拉取请求 981 添加了 --disable-loan-message 选项用于播放。

等待确认

此新选项将等待所有已发布的消息被所有订阅者确认或超时时间以毫秒为单位过去后,播放才会终止。 尤其适用于在短时间内发送大尺寸消息的情况。 此选项仅在发布者的 QOS 配置文件可靠时才有效。 拉取请求 951 为播放添加了 --wait-for-all-acked 选项。

包编辑

rosbag2 正在采取措施启用包编辑,例如删除一个主题的所有消息或将多个包合并为一个包。 拉取请求 921 添加了包重写和 ros2 bag convert 动词。

其他更改

拉取请求 925 使 rosbag2 在记录时忽略“叶主题”(没有发布者的主题)。 这些主题将不再自动添加到包中。

已知问题

  • 在 Ubuntu 22.04 Jammy 主机 <../../humble/Installation/Ubuntu-Install-Debians.html> 上安装 ROS 2 时,在安装 ROS 2 软件包之前更新系统非常重要。

确保“systemd”和“udev”更新为最新可用版本*尤其*重要,否则安装依赖于“libudev1”的“ros-humble-desktop”可能会导致删除系统关键软件包。 详细信息可在 ros2/ros2#1272Launchpad #1974196 中找到

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

  • 一些主要的 Linux 发行版已开始修补 Python 以将软件包安装到 /usr/local,这会破坏 ament_package 的某些部分并使用 colcon 进行构建。

特别是,使用从 pip 安装“setuptools”的 Ubuntu Jammy 会出现这种不当行为,因此不建议这样做。 目前有一个“建议的解决方案 <https://github.com/colcon/colcon-core/pull/512>” ,需要进一步测试才能广泛发布。

  • 按大小或持续时间拆分的 ROS 2 包无法正确播放。

仅播放最后一个录制的包。 建议避免按大小或持续时间拆分包。 详细信息可在“ros2/rosbag2#966 <https://github.com/ros2/rosbag2/issues/966>” 中找到。

发布时间表

2022 年 3 月 21 日星期一 - Alpha + RMW 冻结 ROS Base [1] 包的初步测试和稳定,以及 RMW 提供程序包的 API 和功能冻结。

星期一2022 年 4 月 4 日 - 冻结 Rolling Ridley 中 ROS Base [1] 软件包的 API 和功能冻结。 此后只应发布错误修复版本。 新软件包可以独立发布。

2022 年 4 月 18 日星期一 - 分支 Rolling Ridley 分支。 rosdistro 重新开放,用于 ROS Base [1] 软件包的滚动 PR。 Humble 开发从 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。