您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.

潇洒的迪亚德马塔 (帅气)

Dashing Diademata 是 ROS 2 的第四个版本。

支持的平台

Dashing Diademata 主要支持以下平台:

1 级平台:

  • Ubuntu 18.04(仿生): amd64arm64

  • Mac macOS 10.12(Sierra)

  • Windows 10(Visual Studio 2019)

二级平台:

  • Ubuntu 18.04(仿生): arm32

三级平台:

  • Debian Stretch (9): amd64, arm64arm32

  • OpenEmbedded Thud (2.6) / webOS OSE: arm32x86

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

安装

安装 Dashing Diademata

ROS 2 发布的新功能

我们想重点介绍几项功能和改进:

  • 组件 现在是编写节点的推荐方式。它们既可以独立使用,也可以在进程中组成,而且这两种方式都完全支持来自 启动 文件

  • "(《世界人权宣言》) 进程内通信 (仅适用于 C++)方面进行了改进--既减少了延迟,又最大限度地减少了副本。

  • Python 客户端库已经更新,与大部分 C++ 客户端库相匹配,并在内存使用和性能方面进行了一些重要的错误修复和改进。

  • 参数现在完全可以替代 动态重新配置 包括范围或只读等限制。

  • 通过依靠(一个子集) IDL 4.2 现在可以在信息生成管道中使用 .idl 文件(在 .msg / .srv / .行动 文件)。这一改动支持普通字符串的可选 UTF-8 编码和多字节字符串的 UTF-16 编码(请参阅 宽弦设计文章).

  • 命令行工具 行动部件.

  • 支持 "最后期限"、"生命周期 "和 "生活质量 "服务设置。

  • 移动 2 阿尔法版本.

请参阅 潇洒元票 在 GitHub 上,其中包含更多信息,以及提供更多详细信息的特定票单参考。

水晶版本发布后的变化

声明参数

从 Dashing 开始,参数的行为发生了一些变化,这也导致了一些新的 API 和其他 API 的废弃。请参见 rclcpprclpy 有关 API 更改的更多信息,请参阅下面的章节。

获取和设置未声明的参数

从 Dashing 开始,在访问或设置参数之前必须先声明参数。

在 "潇洒 "之前,您可以调用 get_parameter(name) 并获取一个值(如果该值之前已被设置)或一个 参数未设置.您还可以拨打 set_parameter(name、 值) 在任何时候,即使该参数之前未被设置。

从 Dashing 开始,在获取或设置参数之前,您需要先声明参数。如果试图获取或设置未声明的参数,要么会出现异常(如 ParameterNotDeclaredException),要么在某些情况下会以各种方式得到不成功的结果(详情请查看特定函数)。

不过,您可以通过使用 允许未声明参数 选项。这样做可能是为了暂时避免修改代码,或者是为了满足一些不常见的用例。例如,"全局参数服务器 "或 "参数黑板 "可能希望允许外部节点在自身上设置新参数,而无需首先声明这些参数,因此它可以使用 允许未声明参数 选项来实现。不过,在大多数情况下,我们并不推荐使用该选项,因为它会降低参数 API 其他部分的安全性,从而避免出现参数名称错误和 "先使用后设置 "逻辑错误。

请注意,使用 允许未声明参数 会让你获得大部分旧的行为,特别是针对 "get "和 "set "方法的行为,但它不会将所有与参数相关的行为变化恢复到 ROS Crystal 的状态。为此,您还需要设置 从覆盖自动声明参数 选项 下文将在 使用 YAML 文件进行参数配置.

使用参数描述符声明参数

在使用参数前声明参数的另一个好处是可以同时声明参数描述符。

现在,在声明参数时,您可以包含一个自定义的 参数描述符 以及名称和默认值。默认值 参数描述符 定义为 rcl_interfaces/msg/ParameterDescriptor 并包含以下元数据 描述 等约束条件 只读整数范围.在设置参数时,这些约束条件可用于拒绝无效值,和/或作为外部工具的提示,告知给定参数的有效值。参数 只读 约束将防止参数的值在声明后发生变化,并防止参数未声明。

下面是一个链接,供参考 参数描述符 截至撰写本报告时,我们已收到该消息:

https://github.com/ros2/rcl_interfaces/blob/0aba5a142878c2077d7a03977087e7d74d40ee68/rcl_interfaces/msg/ParameterDescriptor.msg#L1

使用 YAML 文件进行参数配置

从 Dashing 开始,YAML 配置文件中的参数,如通过命令行参数传递给节点的参数 参数:=仅用于在声明参数时覆盖参数的默认值。

在 Dashing 之前,通过 YAML 文件传递的任何参数都会在节点上隐式设置。

从 Dashing 开始,情况就不再是这样了,因为需要声明参数才能在节点上显示给外部观察者,如 玫瑰2 停止 清单.

可以使用 从覆盖自动声明参数 选项。如果将该选项设置为 在构建节点时,"...... "将自动在输入 YAML 文件中声明所有参数。这可用于避免对现有代码进行重大修改,或服务于特定用例。例如,"全局参数服务器 "可能希望在启动时获得任意参数,而这些参数是无法提前声明的。但在大多数情况下,我们并不推荐使用此选项,因为它可能会导致在 YAML 文件中设置参数,并假设节点将使用该参数,即使节点实际上并未使用该参数。

我们希望将来能有一个检查器,如果你向节点传递了一个它不期望的参数,它会向你发出警告。

YAML 文件中的参数将继续影响首次声明时的参数值。

ament_cmake

CMake 函数 ament_index_has_resource 返回的是 .截至 此版本 如果资源已找到,则返回前缀路径,否则返回 .

如果您要在 CMake 条件中使用返回值,就像这样:

ament_index_has_resource(变异 ...)
如果(${变异})

您需要更新条件,以确保它将字符串值视为 :

如果(变异)

rclcpp

改变行为 节点::get_node_names()

功能 NodeGraph::get_node_names()因此也 节点::get_node_names()现在返回一个 std::vector<std::string>; 包含包含命名空间的完全限定的节点名称,而不仅仅是节点名称。

改变了向节点传递选项的方式

的扩展参数(除名称和名称空间外)。 rclcpp::Node() 构造函数替换为 rclcpp::NodeOptions 结构。参见 ros2/rclcpp#622 选项的结构和默认值的详细信息。

的任何扩展参数。 rclcpp::Node() 像这样

汽车 背景 = rclcpp::背景::默认上下文::获取全球默认上下文();
标准::病媒<;标准::字符串>; 参数;
标准::病媒<;rclcpp::参数>; 参数 = { rclcpp::参数("use_sim_time";, ) };
汽车 网站 = 标准::共享<;rclcpp::节点>;("foo_node";, "bar_namespace";, 背景, 参数, 参数);

您需要更新才能使用 节点选项 结构

标准::病媒<;标准::字符串>; 参数;
标准::病媒<;rclcpp::参数>; 参数 = { rclcpp::参数("use_sim_time";, ) };
rclcpp::节点选项 节点选项;
节点选项.论点(参数);
节点选项.参数覆盖(参数);
汽车 网站 = 标准::共享<;rclcpp::节点>;("foo_node";, "bar_namespace";, 节点选项);

创建出版商和订阅的更改

在 Dashing 中,创建出版商和订阅有一些新变化:

  • QoS 设置现在使用新的 rclcpp::QoS 类,API 鼓励用户至少指定历史深度。

  • 选项现在以对象形式传递,即 rclcpp::PublisherOptionsrclcpp::SubscriptionOptions.

所有更改都向后兼容(无需更改代码),但有几种现有的调用样式已被弃用。我们鼓励用户更新为新的签名。


过去,在创建发布者或订阅时,您可以不指定任何 QoS 设置(例如,只提供发布者的主题名称),也可以指定一个 "qos 配置文件 "数据结构(类型为 rmw_qos_profile_t)的所有设置。现在,您必须使用新的 rclcpp::QoS 对象来指定 QoS 和至少 QoS 的历史设置。这鼓励用户在使用 KEEP_LAST而不是默认为一个可能合适也可能不合适的值。

在 ROS 1 中,这被称为 队列大小 在 C++ 和 Python 中都是必需的。我们正在修改 ROS 2 API,以恢复这一要求。


此外,以前在创建发布者或订阅时可以传递的任何选项,现在都封装在一个 rclcpp::PublisherOptionsrclcpp::SubscriptionOptions 类。这使得签名更短、使用更方便,并能在不破坏 API 的情况下添加新的未来选项。


某些用于创建发布者和订阅者的签名已被弃用,新增的签名可让您使用新的 rclcpp::QoS 和出版商/订阅选项类。

这些是新的和推荐的 API:

模板<;
  类型 留言T,
  类型 分配器T = 标准::分配器<;空白>;,
  类型 出版商T = ::rclcpp::出版商<;留言T, 分配器T>>;
标准::共享_ptr<;出版商T>;
创建出版商(
   标准::字符串 及样品; topic_name,
   rclcpp::服务质量 及样品; 优先权,
   PublisherOptionsWithAllocator<;分配器T>; 及样品; 选项 =
  PublisherOptionsWithAllocator<;分配器T>;()
);

模板<;
  类型 留言T,
  类型 回调T,
  类型 分配器T = 标准::分配器<;空白>;,
  类型 订阅T = rclcpp::订阅<;
    类型 rclcpp::订阅类型::has_message_type<;回调T>::类型, 分配器T>>;
标准::共享_ptr<;订阅T>;
创建订阅(
   标准::字符串 及样品; topic_name,
   rclcpp::服务质量 及样品; 优先权,
  回调T &&; 回调,
   带分配器的订阅选项<;分配器T>; 及样品; 选项 =
  带分配器的订阅选项<;分配器T>;(),
  类型 rclcpp::消息内存策略::消息内存策略<;
    类型 rclcpp::订阅类型::has_message_type<;回调T>::类型, 分配器T
  >::SharedPtr
  msg_mem_strat = nullptr);

而这些都是被废弃的:

模板<;
  类型 留言T,
  类型 分配器T = 标准::分配器<;空白>;,
  类型 出版商T = ::rclcpp::出版商<;留言T, 分配器T>>;
[[弃用("使用 create_publisher(const std::string &, const rclcpp::QoS &, ...) 代替";)]]
标准::共享_ptr<;出版商T>;
创建出版商(
   标准::字符串 及样品; topic_name,
  size_t qos_history_depth,
  标准::共享_ptr<;分配器T>; 分配器);

模板<;
  类型 留言T,
  类型 分配器T = 标准::分配器<;空白>;,
  类型 出版商T = ::rclcpp::出版商<;留言T, 分配器T>>;
[[弃用("使用 create_publisher(const std::string &, const rclcpp::QoS &, ...) 代替";)]]
标准::共享_ptr<;出版商T>;
创建出版商(
   标准::字符串 及样品; topic_name,
   rmw_qos_profile_t 及样品; qos_profile = rmw_qos_profile_default,
  标准::共享_ptr<;分配器T>; 分配器 = nullptr);

模板<;
  类型 留言T,
  类型 回调T,
  类型 分配 = 标准::分配器<;空白>;,
  类型 订阅T = rclcpp::订阅<;
    类型 rclcpp::订阅类型::has_message_type<;回调T>::类型, 分配>>;
[[弃用(
  "使用 create_subscription(const std::string &, const rclcpp::QoS &, CallbackT, ...) 代替";
)]]
标准::共享_ptr<;订阅T>;
创建订阅(
   标准::字符串 及样品; topic_name,
  回调T &&; 回调,
   rmw_qos_profile_t 及样品; qos_profile = rmw_qos_profile_default,
  rclcpp::回调组::回调组::SharedPtr  = nullptr,
  bool 忽略本地出版物 = 错误,
  类型 rclcpp::消息内存策略::消息内存策略<;
    类型 rclcpp::订阅类型::has_message_type<;回调T>::类型, 分配>::SharedPtr
  msg_mem_strat = nullptr,
  标准::共享_ptr<;分配>; 分配器 = nullptr);

模板<;
  类型 留言T,
  类型 回调T,
  类型 分配 = 标准::分配器<;空白>;,
  类型 订阅T = rclcpp::订阅<;
    类型 rclcpp::订阅类型::has_message_type<;回调T>::类型, 分配>>;
[[弃用(
  "使用 create_subscription(const std::string &, const rclcpp::QoS &, CallbackT, ...) 代替";
)]]
标准::共享_ptr<;订阅T>;
创建订阅(
   标准::字符串 及样品; topic_name,
  回调T &&; 回调,
  size_t qos_history_depth,
  rclcpp::回调组::回调组::SharedPtr  = nullptr,
  bool 忽略本地出版物 = 错误,
  类型 rclcpp::消息内存策略::消息内存策略<;
    类型 rclcpp::订阅类型::has_message_type<;回调T>::类型, 分配>::SharedPtr
  msg_mem_strat = nullptr,
  标准::共享_ptr<;分配>; 分配器 = nullptr);

服务质量传递方式的改变最有可能对用户产生影响。

出版商的典型变更是这样的:

- pub_ = create_publisher<std_msgs::msg::String>("chatter");
+ pub_ = create_publisher<std_msgs::msg::String>("chatter", 10);

订阅费

- sub_ = create_subscription<std_msgs::msg::String>("chatter", callback);
+ sub_ = create_subscription<std_msgs::msg::String>("chatter", 10, callback);

如果您不知道要使用什么深度,现在也不关心(也许只是原型设计),那么我们建议您使用 10,因为这是之前的默认设置,应保留现有行为。

有关如何选择适当深度的更深入文档即将发布。

这是一个稍有改动的示例,以避免使用新近废弃的 API:

- // 创建一个锁定主题
- rmw_qos_profile_t qos = rmw_qos_profile_default;
- qos.depth = 1;
- qos.durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
-
  model_xml_.data = model_xml;
  node_handle->declare_parameter("robot_description", model_xml);
  description_pub_ = node_handle->create_publisher<std_msgs::msg::String>(
- "robot_description", qos);
+ "robot_description"、
+ // 瞬态局部类似于 ROS 1 中的锁存。
+ rclcpp::QoS(1).transient_local());

有关更多示例和细节,请参阅引入 QoS 更改的拉取请求(及相关拉取请求):

因声明参数更改而产生的变化

有关实际行为改变的详细信息,请参阅 声明参数 以上。

rclcpp::Node的界面:

  • 方法声明参数,给定名称、可选默认值、可选描述符,并返回实际设置的值:

     rclcpp::参数值 及样品;
    rclcpp::Node::declare_parameter(
       标准::字符串 及样品; 名字,
       rclcpp::参数值 及样品; 默认值 = rclcpp::参数值(),
       rcl_interfaces::信息::参数描述符 及样品; 参数描述符 =
      rcl_interfaces::信息::参数描述符());
    
    模板<;类型 参数T>;
    汽车
    rclcpp::节点::declare_parameter(
       标准::字符串 及样品; 名字,
       参数T 及样品; 默认值,
       rcl_interfaces::信息::参数描述符 及样品; 参数描述符 =
      rcl_interfaces::信息::参数描述符());
    
    模板<;类型 参数T>;
    标准::病媒<;参数T>;
    rclcpp::节点::声明参数(
       标准::字符串 及样品; 命名空间_,
       标准::地图<;标准::字符串, 参数T>; 及样品; 参数);
    
    模板<;类型 参数T>;
    标准::病媒<;参数T>;
    rclcpp::节点::声明参数(
       标准::字符串 及样品; 命名空间_,
       标准::地图<;
        标准::字符串,
        标准::双人<;参数T, rcl_interfaces::信息::参数描述符>;
      >; 及样品; 参数);
    
  • 用于取消声明参数和检查参数是否已被声明的方法:

    空白
    rclcpp::Node::undeclare_parameter( 标准::字符串 及样品; 名字);
    
    bool
    rclcpp::Node::has_parameter( 标准::字符串 及样品; 名字) ;
    
  • 一些以前不存在的便捷方法:

    rcl_interfaces::信息::设置参数结果
    rclcpp::Node::set_parameter( rclcpp::参数 及样品; 规范);
    
    标准::病媒<;rclcpp::参数>;
    rclcpp::节点::获取参数( 标准::病媒<;标准::字符串>; 及样品; 姓名) ;
    
    rcl_interfaces::信息::参数描述符
    rclcpp::Node::describe_parameter( 标准::字符串 及样品; 名字) ;
    
  • 新方法可用于设置回调,该回调会在参数发生变化时被调用,从而为您提供拒绝参数变化的机会:

    使用 OnParametersSetCallbackType =
      rclcpp::节点接口::节点参数接口::OnParametersSetCallbackType;
    
    OnParametersSetCallbackType
    rclcpp::Node::set_on_parameters_set_callback(
      OnParametersSetCallbackType 回调);
    

此外,还有几种方法已被废弃:

模板<;类型 参数T>;
[[弃用(使用 declare_parameter() 代替";)]]
空白
rclcpp::节点::如果未设置参数,则设置参数(
   标准::字符串 及样品; 名字,
   参数T 及样品; 价值);

模板<;类型 参数T>;
[[弃用("使用 declare_parameters() 代替";)]]
空白
rclcpp::节点::如果未设置参数,则设置参数(
   标准::字符串 及样品; 名字,
   标准::地图<;标准::字符串, 参数T>; 及样品; 价值观);

模板<;类型 参数T>;
[[弃用("使用 declare_parameter() 及其返回值来代替'";)]]
空白
rclcpp::节点::获取参数或设置参数(
   标准::字符串 及样品; 名字,
  参数T 及样品; 价值,
   参数T 及样品; 替代值);

模板<;类型 回调T>;
[[弃用("使用 set_on_parameters_set_callback() 代替";)]]
空白
rclcpp::节点::register_param_change_callback(回调T &&; 回调);

记忆策略

界面 rclcpp::memory_strategy::MemoryStrategy 是使用类型定义 弱节点向量 在各种方法签名中。从 Dashing 开始,该类型定义已改为 弱节点列表 以及各种方法中的参数类型。任何自定义内存策略都需要更新,以匹配修改后的接口。

相关的应用程序接口更改可在 ros2/rclcpp#741.

rclcpp_components

在 Dashing 中实现合成的正确方法是使用 rclcpp_components 包装

为了正确执行运行时合成,必须对节点进行以下更改:

节点必须有一个构造函数,该构造函数接收 rclcpp::NodeOptions:

 听众:  rclcpp::节点 {
  听众( rclcpp::节点选项 及样品; 选项)
  : 节点("listener";, 选项)
  {
  }
};

C++ 注册宏(如果存在)需要更新,以使用 rclcpp_components 等价。如果不存在,则必须在一个翻译单元中添加注册宏。

// 插入翻译单元的底部,例如 listener.cpp
#include "rclcpp_components/register_node_macro.hpp";
// 在注册时使用完全合格的名称
rclcpp_components_register_node(构成::听众);

需要更新 CMake 注册宏(如果存在)。如果不存在,则必须在项目的 CMake 中添加注册宏。

add_library(听众 src/listener.cpp)
rclcpp_components_register_nodes(听众 "composition::Listener";)

有关成分的更多信息,请参阅 教程

rclpy

创建发布者、订阅和 QoS 配置文件的更改

在 Dashing 之前,您可以选择提供一个 QoSProfile 对象。为了鼓励用户为消息队列指定历史深度,我们现在 要求 深度值或 QoSProfile 对象是在创建发布者或订阅时给出的。

要创建一个出版商,以前您需要写的是

网站.创建出版商(, '唠叨';)
# 或使用 QoSProfile 的关键字参数
网站.创建出版商(, '唠叨';, qos_profile=qos_profile_sensor_data)

在 Dashing 中,请首选以下提供深度值的应用程序接口或 QoSProfile 对象作为第三个位置参数:

# 假设历史记录设置为 KEEP_LAST,深度为 10
网站.创建出版商(, '唠叨';, 10)
# 或直接传递 QoSProfile 对象
网站.创建出版商(, '唠叨';, qos_profile_sensor_data)

同样,在订阅方面,以前您也会这样写:

网站.创建订阅(基本类型, '唠叨';, 羔羊 信息: 打印(信息))
# 或使用 QoSProfile 的关键字参数
网站.创建订阅(基本类型, '唠叨';, 羔羊 信息: 打印(信息), qos_profile=qos_profile_sensor_data)

在潇洒:

# 假设历史记录设置为 KEEP_LAST,深度为 10
网站.创建订阅(基本类型, '唠叨';, 羔羊 信息: 打印(信息), 10)
# 或直接传递 QoSProfile 对象
网站.创建订阅(基本类型, '唠叨';, 羔羊 信息: 打印(信息), qos_profile_sensor_data)

为了便于过渡,不使用新 API 的用户将看到弃用警告。

此外,我们还要求在构建 QoSProfile 设置了历史记录策略和/或深度的对象。如果历史记录策略为 KEEP_LAST 则还需要深度参数。例如,这些调用是有效的:

QoSProfile(历史=QoSHistoryPolicy.rmw_qos_policy_history_keep_all)
QoSProfile(历史=QoSHistoryPolicy.rmw_qos_policy_history_keep_last, 深度=10)
QoSProfile(深度=10)  # 相当于上一行

而这些调用会导致弃用警告:

QoSProfile()
QoSProfile(可靠性=QoSReliabilityPolicy.rmw_qos_policy_reliability_best_effort)
# KEEP_LAST,但没有深度
QoSProfile(历史=QoSHistoryPolicy.rmw_qos_policy_history_keep_last)

更多详情,请参阅与引入此更改相关的问题和拉取请求:

因声明参数更改而产生的变化

有关实际行为改变的详细信息,请参阅 声明参数 以上。这些变化与 rclcpp.

这些是 rclpy.node.Node 接口:

  • 给定一个名称、一个可选的默认值(由 rcl_interfaces.msg.ParameterValue) 和一个可选描述符,返回实际设置的值:

    捍卫 declare_parameter(
        名字: 字符串,
        价值: 任何 = ,
        描述符: 参数描述符 = 参数描述符()
    ) ->; 参数
    
    捍卫 声明参数(
      命名空间: 字符串,
      参数: 列表[工会[
          元组[字符串],
          元组[字符串, 任何],
          元组[字符串, 任何, 参数描述符],
      ]]
    ) ->; 列表[参数]
    
  • 取消声明之前声明的参数,并检查参数是否已事先声明:

    捍卫 未声明参数(名字: 字符串) ->; 
    
    捍卫 参数(名字: 字符串) ->; bool
    
  • 获取和设置参数描述符:

    捍卫 参数描述(名字: 字符串) ->; 参数描述符
    
    捍卫 描述参数(姓名: 列表[字符串]) ->; 列表[参数描述符]
    
    捍卫 设置描述符(
        名字: 字符串,
        描述符: 参数描述符,
        替代值: 可选[参数值] = 
    ) ->; 参数值
    
  • 一种方便的方法,用于获取可能尚未声明的参数:

    捍卫 获取参数或(名字: 字符串, 替代值: 可选[参数] = ) ->; 参数
    

其他变动

rclpy.parameter.Parameter 现在可以猜测其类型而无需明确设置(只要它是由 rcl_interfaces.msg.ParameterValue).例如,这段代码

p = 参数('myparam';, 参数.类型.双人, 2.41)

相当于这段代码:

p = 参数('myparam';, 价值=2.41)

这一更改不会破坏现有的 API。

rosidl

在 Crystal 之前,每个信息生成器软件包都使用 ament_cmake 延伸点 生成接口 并通过一套 .msg / .srv / .行动 文件从 Dashing 开始,信息生成管道基于 .idl 文件。

任何信息生成器软件包都需要进行更改,并使用新的扩展点进行注册 生成 IDL 接口 只通过 .idl 文件。通常支持的 C、C++ 和 Python 语言的消息生成器,以及内省、Fast RTPS、Connext 和 OpenSplice 的类型支持包都已更新(参见 ros2/rosidl#334).调用 rosidl_generate_interfaces() 可以通过 .idl 文件,或者直接将 .msg / .srv / .行动 然后在内部将其转换为 .idl 文件,然后再传给每个报文生成器。

的格式。 .msg / .srv / .行动 文件之间的映射关系。之间的映射 .msg / .srv / .行动 文件和 .idl 中描述。 本设计文章.A 第二篇设计文章 描述了 .idl 文件。要利用任何新功能,都需要对现有界面进行转换(例如使用命令行工具 msg2idl / srv2idl / action2idl).

为了区分具有不同命名空间的相同类型名称,反省结构体现在包含了一个命名空间字段,该字段取代了软件包名称(参见 ros2/rosidl#335).

.msg 文件中字符的映射

ROS 1 烧焦 早已被弃用,并被映射为 uint8.在 ROS 2 中,直到 Crystal 烧焦 被映射为一个字符 (烧焦 用 C / C++ 编写、 字符串 在 Python 中长度为 1),以提供更自然的映射。从 Dashing 开始,ROS 1 的语义已经恢复,并且 烧焦 映射到 uint8 又来了

rosidl_generator_cpp

为消息、服务和操作生成的 C++ 数据结构为每个字段提供了设置器方法。在 Crystal 之前,每个设置器都返回一个指向数据结构本身的指针,以启用命名参数习语。从 Dashing 开始,这些设置器 返回引用 的签名,因为这似乎是更常见的签名,而且它明确了返回值不能是一个 nullptr.

ROSIDL_GENERATOR_PY

直到 Crystal 之前,报文中的数组(固定大小)或序列(动态大小,可选择有上边界)字段都存储为 清单 在 Python 中。从 Dashing 开始,Python 的数组/数值序列类型发生了变化:

  • 数值数组存储为 numpy.ndarray (该 dtype 选择与数值类型相匹配)。

  • 数值序列被存储为一个 array.array (该 类型 选择与数值类型相匹配)。

和以前一样,非数字类型的数组/序列仍然表示为 清单 在 Python 中。

这一变化带来了许多好处:

  • 新数据结构确保数组/序列中的每个项目都符合数值类型的值域限制。

  • 数值可以更有效地存储在内存中,从而避免了为每个项目创建 Python 对象的开销。

  • 这两种数据结构的内存布局允许在一次操作中读写数组/序列的所有项目,这使得从 Python 到 Python 的转换速度和效率大大提高。

启动

"(《世界人权宣言》) 启动测试 软件包赶上了 启动 包的重新设计是在 Bouncy Bolson 中完成的。传统的 Python API 已移至 launch.legacy 子模块,因此已被弃用和移除。

参见 启动 例子文献资料 以参考如何使用其新的 API。

参见 演示测试 以参考如何使用新的 启动测试 应用程序接口。

rmw

以来的变化 Crystal Clemmys 释放:

  • 新的应用程序接口 rmw的菲尼函数 rmw_context_t:

  • 修改 rmw现在通过 rmw_context_trmw_create_wait_set:

  • 新的应用程序接口 rmw 用于为已发布和已订阅的信息预先分配空间:

  • 修改 rmw现在通过 rmw_publisher_allocation_trmw_subscription_allocation_trmw_publishrmw_take分别为请注意,这个参数可以是 NULLnullptr,它保留了现有的 Crystal 行为。

  • 返回的类型名称 rmw_get_*_names_and_types* 函数应该有一个完全限定的命名空间。例如 rcl_interfaces/Parameterrcl_interfaces/GetParameters,返回的类型名称应为 rcl_interface/msg/Parameterrcl_interfaces/srv/GetParameters.

行动

  • rclcpp_action::Client 签名:

    签名 rclcpp_action::Client::async_send_goal 发生了变化。现在,用户可以选择为 目标响应结果 使用新的 发送目标选项 结构。当行动服务器接受或拒绝目标时,会调用目标响应回调;当收到目标结果时,会调用结果回调。还为 rclcpp_action::Client::async_cancel_goalrclcpp_action::Client::async_get_result.

  • 更改目标过渡名称:

    重构了目标状态转换的名称,以反映设计文档。这将影响 rcl_action, rclcpp_actionrclpy.以下是事件名称更改列表 (旧名称 -> 新名称):

    • GOAL_EVENT_CANCEL -> GOAL_EVENT_CANCEL_GOAL

    • GOAL_EVENT_SET_SUCCEEDED -> GOAL_EVENT_SUCCEED

    • GOAL_EVENT_SET_ABORTED -> GOAL_EVENT_ABORT

    • GOAL_EVENT_SET_CANCELED -> GOAL_EVENT_CANCELED

  • CancelGoal.srv:

    A 返回代码 字段被添加到 取消目标 服务。这是为了更好地说明服务呼叫失败的原因。请参阅 拉取请求 以及相关问题的详细信息。

rviz

  • 插件应使用完全限定的类型名,否则会记录警告。对于 范例,使用类型 传感器_msgs/msg/图像 而不是 传感器_msgs/图像.湖泊 引入这一变化的公关 了解更多详情。

已知问题

  • [ros2/rclcpp#715] 独立 ROS 2 节点和组合 ROS 2 节点之间加载参数 YAML 文件的方式不一致。目前可用的解决方法在 问题评论

  • [ROS2/RCLPY#360] rclpy 节点忽略 按住-c 在 Windows 上使用 OpenSplice 时。

  • [ros2/rosidl_typesupport_opensplice#30] 使用 OpenSplice 时,存在一个错误,无法在同名的服务或操作定义中嵌套信息。

  • [ros2/rclcpp#781] 呼叫 获取参数/参数列表 从内部 参数设置回调 会导致 Dashing 出现死锁。Eloquent 已修复了这一问题,但由于存在 ABI 中断,因此尚未向 Dashing 移植。

  • [ros2/rclcpp#912] 当进程内通信在一个进程和另一个进程之间进行时,进程间通信会强制复制信息。 std::unique_ptr 出版商和一个 std::unique_ptr 订阅(出版 std::unique_ptr 内部晋升为 std::shared_ptr).

  • [ros2/rosbag2#125] 不记录 QOS 不可靠的主题。

  • [ros2/rclcpp#715] 可组合节点不能通过重映射接收参数。向可组合节点提供参数可以使用 [此评论].

  • [ros2/rclcpp#893] rclcpp::Context 的参照周期不会被破坏。 rclcpp::GraphListener.这会导致内存泄漏。由于存在破坏 ABI 的风险,因此尚未向后移植修复程序。

发布前的时间表

发布前的几个里程碑:

周一4 月 8 日(阿尔法)

第一批核心软件包已发布。从现在开始可以进行测试(某些功能可能还未上线)。

星期四五月二日

冻结核心软件包的应用程序接口

星期一5 月 6 日(测试版)

提供核心软件包的更新版本。对最新功能进行更多测试。

星期四5 月 16 日

功能冻结。在此之后,只能发布错误修复版本。新软件包可独立发布。

星期一5 月 20 日(候选发布)

提供核心软件包的更新版本。

星期三五月二十九日

Freeze rosdistro.潇洒走一回没有 PR rosdistro 将被合并(发布公告后重新开放)。