Humble Hawksbill (humble)

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

支持的平台

Humble Hawksbill 主要支持以下平台:

第 1 层平台:

  • Ubuntu 22.04 (Jammy):“amd64”和“arm64”

  • Windows 10 (Visual Studio 2019):“amd64”

第 2 层平台:

  • RHEL 8:“amd64”

第 3 层平台:

  • Ubuntu 20.04 (Focal):“amd64”

  • macOS:“amd64”

  • Debian Bullseye:“amd64”

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

安装

Install 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/ament_cmake#377 中的 ament_cmake_gen_version_h 中添加了一个新的 CMake 函数,用于生成带有软件包版本信息的标头。 以下是最简单的用例:

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

布尔替换

新替换 NotSubstitution、AndSubstitution 和 OrSubstitution 提供了一种执行逻辑运算的便捷方式,例如

<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#249 和 ros2/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 has a --launch-prefix argument

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

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

ros2 topic echo has a --flow-style argument

这允许用户强制使用 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_resource、texture、uv_coordinates 和 mesh_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 <https://github.com/ros2/rcl/pull/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) {...});

要了解更多信息,请参阅 publisher 和 subscription 示例,以及更复杂的 demo。 有关更多详细信息,请参阅 REP 2007。

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

此更改已在 rclcpp#1734 中实现。 这会破坏 API,因为 std::future::get() 方法会从未来中提取值。 这意味着,如果第二次调用该方法,它将引发异常。 这不会发生在 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()”方法。

向“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)

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

从“NodeBase”和“Node”类中删除了“get_callback_groups”方法

for_each_callback_group() 方法已通过提供线程安全的方式来访问 callback_groups_ 向量,从而取代了 get_callback_groups()。 for_each_callback_group() 接受一个函数作为参数,遍历存储的回调组,并将传递的函数调用为有效的回调组。

有关更多详细信息,请参阅此 pull request。

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 的引用。 因此,这对于“NodeBaseInterface”和“NodeBase”的下游使用来说是一个重大变化。

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

sleep_until 和 sleep_for 方法已添加到 Clock

在 ros2/rclcpp#1814 和 ros2/rclcpp#1828 中添加了两种新方法,允许在特定时钟上休眠。 Clock::sleep_until 将暂停当前线程,直到时钟达到特定时间。 Clock::sleep_for 将暂停当前线程,直到时钟从调用该方法时开始前进一定时间。 如果“上下文”关闭,这两种方法都会提前唤醒。

rclcpp_lifecycle

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

之前,用户需要重写“LifecylceNode::on_activate()”和“LifecylceNode::on_deactivate()”,并调用“LifecyclePublisher”上名称类似的方法,才能真正实现转换。 现在,“LifecylceNode”提供了这些方法的默认接口,这些方法已经可以做到这一点。 请参阅“此处<https://github.com/ros2/demos/tree/humble/lifecycle>”中“lifecycle_talker”节点的实现。

rclpy

托管节点

向 rclpy 添加了生命周期节点支持。

完整的演示可以在`此处<https://github.com/ros2/demos/tree/humble/lifecycle_py>`__找到。

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

类似于向 rclcpp 添加的功能。

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

在 ros2/rclpy#858 和 ros2/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 默认输出已更改

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

如果将 --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 参数

已从“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。

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 添加了指定开始播放的时间戳的功能。 由于拉取请求 789,现在可以将播放开始延迟指定的间隔。

相关地,rosbag2 为用户提供了在播放过程中控制播放的新方法。 拉取请求 847 添加了键盘控件,用于在终端播放期间暂停、恢复和播放下一条消息。 也可以开始播放由于拉取请求 905 和 904 而暂停,这使用户可以轻松启动播放,然后逐步浏览消息,例如在调试管道时。 拉取请求 836 添加了用于在包内查找的界面,允许用户在播放期间在包内移动。

最后,在拉取请求 851 中为录制添加了新的快照模式。 此模式对于事件录制很有用,允许录制开始填充缓冲区,但在调用服务之前不开始将数据写入光盘。

突发模式播放

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

零拷贝播放

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

等待确认

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

包编辑

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

其他更改

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

已知问题

确保 systemd 和 udev 更新到最新可用版本*特别*重要,否则安装依赖于 libudev1 的 ros-humble-desktop 可能会导致删除系统关键软件包。 详细信息可在 ros2/ros2#1272 和 Launchpad #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 使用。