ROS 2DashingDiademata (代号'dashing'; 2019年5月31日) [待校准@4458]

Dashing Diademata is the fourth release of ROS 2.

支持的平台 [待校准@1608]

[需手动修复的语法]DashingDiademata主要在以下平台上受支持: [待校准@4460]

一级平台: [待校准@4382]

2级平台: [待校准@4383]

3级平台: [待校准@4464]

有关RMW实现、编译器/解释器版本和系统依赖版本的更多信息,请参见 REP 2000[待校准@4467]

此ROS 2版本中的新功能 [待校准@4317]

我们想强调的一些特性和改进: [待校准@4470]

  • [需手动修复的语法] Components 是现在推荐的写你的节点的方式。它们可以独立使用,也可以在一个过程中组成,两种方式都完全支持 launch 文件。 [待校准@4471]

  • [需手动修复的语法] intra-process communication (仅C++) 已经得到了改进 -- 无论是在延迟方面还是在最小化副本方面。 [待校准@4472]

  • Python客户端库已更新,以匹配大多数cequivalent等效库,并且一些重要的错误修复和改进已落在内存使用和性能方面。 [待校准@4473]

  • 参数现在完成替代 dynamic_reconfigure 从ROS 1含约束喜欢范围或只读。 [待校准@4474]

  • 通过依赖消息生成管道的 (一个子集) IDL 4.2 ,现在可以使用 .idl 文件 (除了 .msg / .srv / .action 文件)。这变化支持可选UTF-8编码普通string以及UTF-16编码多字节strings (见 wide strings design article )。 [待校准@4475]

  • actionscomponents 有关的命令行工具。 [待校准@4476]

  • 支持截止日期、寿命和活力服务质量设置。 [待校准@4477]

  • 移动2 alpha release[待校准@4478]

请参阅GitHub上的 Dashing meta ticket ,其中包含更多信息以及对特定票证的参考以及其他详细信息。 [待校准@4479]

自Crystal发布以来的变化 [待校准@4480]

声明参数 [待校准@4481]

从Dashing开始的参数行为发生了一些变化,这也导致了一些新的API's and the deprecation of other API'。有关API更改的更多信息,请参见下面的 rclcpprclpy 部分。 [待校准@4482]

获取和设置未声明的参数 [待校准@4483]

从Dashing开始,参数现在需要在访问或设置之前声明。 [待校准@4484]

在Dashing之前,您可以调用 get_parameter(name) 并获得一个值 (如果之前已经设置过) 或 PARAMETER_NOT_SET 类型的参数。您也可以在任何时候调用 “set_parameter (名称、值)”,即使该参数之前未设置。 [待校准@4485]

从Dashing开始,您需要先声明一个参数,然后才能获取或设置它。如果尝试获取或设置未声明的参数,则会引发异常,例如parameternotdeclaredexexception,或者在某些情况下,您将通过多种方式获得不成功的结果 (有关更多详细信息,请参阅特定功能)。 [待校准@4486]

但是,您可以在创建节点时使用 allow_undeclared_parameters 选项来获得旧的行为 (主要是,请参阅下一段中的注释)。您可能希望这样做是为了暂时避免代码更改,或者为了实现一些不常见的用例。例如, "global parameter server" 或 "parameter blackboard" 可能希望允许外部节点在不首先声明它们的情况下为自身设置新参数,因此它可以使用 allow_undeclared_parameters 选项来实现这一点。但是,在大多数情况下,不建议使用此选项,因为它会使参数API的其余部分对参数名称拼写错误和 "use before set" 逻辑错误等错误的安全性降低。 [待校准@4487]

请注意,使用 allow_undeclared_parameters 将为您提供 "get" 和 "set" 方法的大多数旧行为规范调用,但是,它不会将与参数相关的所有行为更改恢复为ROSCrystal的状态。为此,你还需要将 automatically_declare_parameters_from_overrides 选项设置为 true ,这在下面的 Parameter Configuration using a YAML File 中有所描述。 [待校准@4488]

用参数描述符声明参数 [待校准@4489]

在使用参数之前声明参数的另一个好处是,它允许您同时声明参数描述符。 [待校准@4490]

现在,在声明参数时,您可以包括自定义 ParameterDescriptor 以及名称和默认值。 ParameterDescriptor 被定义为 rcl_interfaces/msg/ParameterDescriptor 中的一条信息,它包含了像 description 这样的元数据和像 read_onlyinteger_range 这样的约束。这些约束可用于在设置参数时拒绝无效值和/或作为对给定参数有效的外部工具的提示。 read_only 约束将防止参数值在声明后发生变化,并防止未声明。 [待校准@4491]

作为参考,以下是截至撰写本文时 ParameterDescriptor 信息的链接: [待校准@4492]

https://github.com/ros2/rcl_interfaces/blob/0aba5a142878c2077d7a03977087e7d74d40ee68/rcl_interfaces/msg/ParameterDescriptor.msg # L1 [待校准@4493]

使用YAML文件的参数配置 [待校准@4494]

从Dashing开始,YAML配置文件中的参数,例如通过命令行参数 “__params传递给节点: ='',仅用于在声明参数时覆盖参数的默认值。 [待校准@4495]

在Dashing之前,您通过YAML文件传递的任何参数都将在节点上隐式设置。 [待校准@4496]

由于Dashing,情况不再如此,因为参数需要声明,以便在节点上出现给外部观察者,如 ros2 param list[待校准@4497]

在创建节点时,可以使用 automatically_declare_parameters_from_overrides 选项来实现旧的行为。如果设置为 true ,此选项将在构造节点时自动调用y声明输入YAML文件中的所有参数。这可用于避免对现有代码进行重大更改或服务特定用例。例如,一种 "global parameter server" 可能想要在launch上播种任意参数,这是它不可能提前宣布的。但是,在大多数情况下,不建议使用此选项,因为它可能会导致在YAML文件中设置参数,并假设节点将使用它,即使节点实际上没有使用它。 [待校准@4498]

将来,我们希望有一个检查器,如果您将参数传递给它不期望的节点,它会警告您。 [待校准@4499]

首次声明参数时,YAML文件中的参数将继续影响参数的值。 [待校准@4500]

[需手动修复的语法]ament _ cmake [待校准@4501]

CMake功能 ament_index_has_resource 返回 TRUEFALSE 。从 this release 开始,它返回前缀路径,以防找到re源文件或 FALSE[待校准@4502]

如果您在CMake条件中使用返回值,如下所示: [待校准@4503]

ament_index_has_resource(var ...)
if(${var})

您需要更新条件以确保它将string值视为 TRUE : [待校准@4504]

if(var)

ROS C++客户端库(rclcpp) [小鱼@4505]

“节点::get_node_names()” 的行为更改 [待校准@4506]

函数 “nodegraph::get_node_names() , and therefore also ``Node::get_node_names(), now returns a std::vector<std::string> 包含完全限定的节点名称及其名称空间,而不仅仅是节点名称。 [待校准@4507]

更改了将选项传递到节点的方式 [待校准@4508]

扩展参数 (超越名称和命名空间) 到 rclcpp::Node()乙甲rclcpp::NodeOptions structure. See ros2/rclcpp#622 ,以获取有关选项的结构和默认值的详细信息。 [待校准@4509]

如果您将任何扩展参数用于 “rclcpp::Node()”,如下所示: [待校准@4510]

auto context = rclcpp::contexts::default_context::get_global_default_context();
std::vector<std::string> args;
std::vector<rclcpp::Parameter> params = { rclcpp::Parameter("use_sim_time", true) };
auto node = std::make_shared<rclcpp::Node>("foo_node", "bar_namespace", context, args, params);

您需要更新才能使用 NodeOptions 结构 [待校准@4511]

std::vector<std::string> args;
std::vector<rclcpp::Parameter> params = { rclcpp::Parameter("use_sim_time", true) };
rclcpp::NodeOptions node_options;
node_options.arguments(args);
node_options.parameter_overrides(params);
auto node = std::make_shared<rclcpp::Node>("foo_node", "bar_namespace", node_options);

创建发布者和订阅的更改 [待校准@4512]

在创建出版商和订阅方面有一些变化,这在Dashing是新的: [待校准@4513]

  • 现在使用新的 “rclcpp::QoS” 类传递QoS设置,并且API鼓励用户至少指定历史深度。 [待校准@4514]

  • 选项现在作为对象传递,即“rclcpp:: 发布选项 `` and `` rclcpp:: 订阅选项”。 [待校准@4515]

所有更改都向后兼容 (不需要更改代码),但已弃用了几种现有的调用样式。鼓励用户更新新签名。 [待校准@4516]


过去,在创建发布者或订阅时,您不能指定任何QoS设置 (例如g.只需为出版商提供话题名称) 或者你可以指定一个 "qos profile" 数据结构 ( rmw_qos_profile_t 类型),所有设置都已经设置好了。现在,您必须使用新的 “rclcpp::QoS” 对象来指定您的QoS以及至少QoS的历史设置。这鼓励用户在使用 KEEP_LAST 时指定历史深度,而不是将其默认为可能合适或不合适的值。 [待校准@4517]

在ROS 1中,这被称为 queue_size ,在c ++ 和Python中都需要它。我们正在更改ROS 2 API以恢复此要求。 [待校准@4518]


此外,任何选项可以以前通过创建期间出版社或订阅现已封装在 ''rclcpp: PublisherOptions `` and `` rclcpp: SubscriptionOptions'' 类分别。这允许更短的签名、更方便的使用以及添加新的未来选项而不破坏API。 [待校准@4519]


现在不推荐使用一些用于创建发布者和订阅者的签名,并且添加了新签名以允许您使用新的 “rclcpp:: qos” 和发布者/订阅选项类。 [待校准@4520]

这些是新的和推荐的API: [待校准@4521]

template<
  typename MessageT,
  typename AllocatorT = std::allocator<void>,
  typename PublisherT = ::rclcpp::Publisher<MessageT, AllocatorT>>
std::shared_ptr<PublisherT>
create_publisher(
  const std::string & topic_name,
  const rclcpp::QoS & qos,
  const PublisherOptionsWithAllocator<AllocatorT> & options =
  PublisherOptionsWithAllocator<AllocatorT>()
);

template<
  typename MessageT,
  typename CallbackT,
  typename AllocatorT = std::allocator<void>,
  typename SubscriptionT = rclcpp::Subscription<
    typename rclcpp::subscription_traits::has_message_type<CallbackT>::type, AllocatorT>>
std::shared_ptr<SubscriptionT>
create_subscription(
  const std::string & topic_name,
  const rclcpp::QoS & qos,
  CallbackT && callback,
  const SubscriptionOptionsWithAllocator<AllocatorT> & options =
  SubscriptionOptionsWithAllocator<AllocatorT>(),
  typename rclcpp::message_memory_strategy::MessageMemoryStrategy<
    typename rclcpp::subscription_traits::has_message_type<CallbackT>::type, AllocatorT
  >::SharedPtr
  msg_mem_strat = nullptr);

这些是不推荐使用的: [待校准@4522]

template<
  typename MessageT,
  typename AllocatorT = std::allocator<void>,
  typename PublisherT = ::rclcpp::Publisher<MessageT, AllocatorT>>
[[deprecated("use create_publisher(const std::string &, const rclcpp::QoS &, ...) instead")]]
std::shared_ptr<PublisherT>
create_publisher(
  const std::string & topic_name,
  size_t qos_history_depth,
  std::shared_ptr<AllocatorT> allocator);

template<
  typename MessageT,
  typename AllocatorT = std::allocator<void>,
  typename PublisherT = ::rclcpp::Publisher<MessageT, AllocatorT>>
[[deprecated("use create_publisher(const std::string &, const rclcpp::QoS &, ...) instead")]]
std::shared_ptr<PublisherT>
create_publisher(
  const std::string & topic_name,
  const rmw_qos_profile_t & qos_profile = rmw_qos_profile_default,
  std::shared_ptr<AllocatorT> allocator = nullptr);

template<
  typename MessageT,
  typename CallbackT,
  typename Alloc = std::allocator<void>,
  typename SubscriptionT = rclcpp::Subscription<
    typename rclcpp::subscription_traits::has_message_type<CallbackT>::type, Alloc>>
[[deprecated(
  "use create_subscription(const std::string &, const rclcpp::QoS &, CallbackT, ...) instead"
)]]
std::shared_ptr<SubscriptionT>
create_subscription(
  const std::string & topic_name,
  CallbackT && callback,
  const rmw_qos_profile_t & qos_profile = rmw_qos_profile_default,
  rclcpp::callback_group::CallbackGroup::SharedPtr group = nullptr,
  bool ignore_local_publications = false,
  typename rclcpp::message_memory_strategy::MessageMemoryStrategy<
    typename rclcpp::subscription_traits::has_message_type<CallbackT>::type, Alloc>::SharedPtr
  msg_mem_strat = nullptr,
  std::shared_ptr<Alloc> allocator = nullptr);

template<
  typename MessageT,
  typename CallbackT,
  typename Alloc = std::allocator<void>,
  typename SubscriptionT = rclcpp::Subscription<
    typename rclcpp::subscription_traits::has_message_type<CallbackT>::type, Alloc>>
[[deprecated(
  "use create_subscription(const std::string &, const rclcpp::QoS &, CallbackT, ...) instead"
)]]
std::shared_ptr<SubscriptionT>
create_subscription(
  const std::string & topic_name,
  CallbackT && callback,
  size_t qos_history_depth,
  rclcpp::callback_group::CallbackGroup::SharedPtr group = nullptr,
  bool ignore_local_publications = false,
  typename rclcpp::message_memory_strategy::MessageMemoryStrategy<
    typename rclcpp::subscription_traits::has_message_type<CallbackT>::type, Alloc>::SharedPtr
  msg_mem_strat = nullptr,
  std::shared_ptr<Alloc> allocator = nullptr);

QoS传递方式的变化最有可能影响用户。 [待校准@4523]

出版商的典型变化如下: [待校准@4524]

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

并且对于订阅: [待校准@4525]

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

如果你不知道现在使用什么深度,也不在乎 (也许只是原型制作),那么我们建议使用 10 ,因为这是之前的默认设置,应该保留现有的行为。 [待校准@4526]

关于如何选择合适的深度的更深入的文档即将发布。 [待校准@4527]

这是一个稍微涉及更多的更改的示例,以避免新弃用的API: [待校准@4528]

- // Creates a latched topic
- 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",
+   // Transient local is similar to latching in ROS 1.
+   rclcpp::QoS(1).transient_local());

有关更多示例和详细信息,请参阅引入QoS更改的拉取请求 (和连接的拉取请求): [待校准@4529]

因声明参数更改而发生的更改 [待校准@4534]

有关实际行为变化的详细信息,请参见上面的 Declaring Parameters[待校准@4535]

在 “rclcpp:: node” 的接口中有几个新的API调用: [待校准@4536]

  • 声明给定名称、可选默认值、可选描述符并返回实际设置的值的参数的方法: [待校准@4537]

    const rclcpp::ParameterValue &
    rclcpp::Node::declare_parameter(
      const std::string & name,
      const rclcpp::ParameterValue & default_value = rclcpp::ParameterValue(),
      const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor =
      rcl_interfaces::msg::ParameterDescriptor());
    
    template<typename ParameterT>
    auto
    rclcpp::Node::declare_parameter(
      const std::string & name,
      const ParameterT & default_value,
      const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor =
      rcl_interfaces::msg::ParameterDescriptor());
    
    template<typename ParameterT>
    std::vector<ParameterT>
    rclcpp::Node::declare_parameters(
      const std::string & namespace_,
      const std::map<std::string, ParameterT> & parameters);
    
    template<typename ParameterT>
    std::vector<ParameterT>
    rclcpp::Node::declare_parameters(
      const std::string & namespace_,
      const std::map<
        std::string,
        std::pair<ParameterT, rcl_interfaces::msg::ParameterDescriptor>
      > & parameters);
    
  • 取消声明参数并检查是否已声明参数的方法: [待校准@4538]

    void
    rclcpp::Node::undeclare_parameter(const std::string & name);
    
    bool
    rclcpp::Node::has_parameter(const std::string & name) const;
    
  • 一些以前不存在的便利方法: [待校准@4539]

    rcl_interfaces::msg::SetParametersResult
    rclcpp::Node::set_parameter(const rclcpp::Parameter & parameter);
    
    std::vector<rclcpp::Parameter>
    rclcpp::Node::get_parameters(const std::vector<std::string> & names) const;
    
    rcl_interfaces::msg::ParameterDescriptor
    rclcpp::Node::describe_parameter(const std::string & name) const;
    
  • 一种设置调用的新方法,可以在参数更改时调用该方法,从而使您有机会拒绝它: [待校准@4540]

    using OnParametersSetCallbackType =
      rclcpp::node_interfaces::NodeParametersInterface::OnParametersSetCallbackType;
    
    OnParametersSetCallbackType
    rclcpp::Node::set_on_parameters_set_callback(
      OnParametersSetCallbackType callback);
    

还有几种不推荐使用的方法: [待校准@4541]

template<typename ParameterT>
[[deprecated("use declare_parameter() instead")]]
void
rclcpp::Node::set_parameter_if_not_set(
  const std::string & name,
  const ParameterT & value);

template<typename ParameterT>
[[deprecated("use declare_parameters() instead")]]
void
rclcpp::Node::set_parameters_if_not_set(
  const std::string & name,
  const std::map<std::string, ParameterT> & values);

template<typename ParameterT>
[[deprecated("use declare_parameter() and it's return value instead")]]
void
rclcpp::Node::get_parameter_or_set(
  const std::string & name,
  ParameterT & value,
  const ParameterT & alternative_value);

template<typename CallbackT>
[[deprecated("use set_on_parameters_set_callback() instead")]]
void
rclcpp::Node::register_param_change_callback(CallbackT && callback);

记忆策略 [待校准@4542]

接口 “rclcpp:: 内存策略” 在各种方法签名中使用了tyscopf WeakNodeVector 。从Dashing开始,该类型已被更改为 WeakNodeList ,并且在各种方法中具有该参数的类型。任何自定义内存策略都需要更新以匹配修改后的界面。 [待校准@4543]

相关的API变化可以在 ros2/rclcpp#741 中找到。 [待校准@4544]

rclcpp_components [待校准@4545]

在Dashing中实施组合物的正确方法是使用 rclcpp_components 包。 [待校准@4546]

为了正确实现运行时组合,必须对节点进行以下更改: [待校准@4547]

节点必须具有采用 “rclcpp:: nodeoptions'” 的构造函数: [待校准@4548]

class Listener: public rclcpp::Node {
  Listener(const rclcpp::NodeOptions & options)
  : Node("listener", options)
  {
  }
};

需要更新cregistration注册宏 (如果存在) 以使用 rclcpp_components 等效项。如果不存在,则必须在一个翻译单元中添加注册宏。 [待校准@4549]

// Insert at bottom of translation unit, e.g. listener.cpp
#include "rclcpp_components/register_node_macro.hpp"
// Use fully-qualifed name in registration
RCLCPP_COMPONENTS_REGISTER_NODE(composition::Listener);

CMake注册宏 (如果存在) 需要更新。如果不存在,则必须将注册宏添加到项目的CMake中。 [待校准@4550]

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

有关组合物的更多信息,请参见 the tutorial [待校准@4551]

rclpy [待校准@4552]

更改创建发布者、订阅和QoS配置文件 [待校准@4553]

之前Dashing,你可以选择提供 QoSProfile 对象创建出版商或订阅。为了鼓励用户指定消息队列的历史深度,我们现在要求在创建发布者或订阅时给出深度值或 QoSProfile 对象。 [待校准@4554]

要创建发布者,您之前应该写: [待校准@4555]

node.create_publisher(Empty, 'chatter')
# Or using a keyword argument for QoSProfile
node.create_publisher(Empty, 'chatter', qos_profile=qos_profile_sensor_data)

在Dashing中,更喜欢以下提供深度值或 QoSProfile 对象作为第三个位置参数的API: [待校准@4556]

# Assume a history setting of KEEP_LAST with depth 10
node.create_publisher(Empty, 'chatter', 10)
# Or pass a QoSProfile object directly
node.create_publisher(Empty, 'chatter', qos_profile_sensor_data)

同样,对于订阅,您之前应该写过: [待校准@4557]

node.create_subscription(BasicTypes, 'chatter', lambda msg: print(msg))
# Or using a keyword argument for QoSProfile
node.create_subscription(BasicTypes, 'chatter', lambda msg: print(msg), qos_profile=qos_profile_sensor_data)

在Dashing中: [待校准@4558]

# Assume a history setting of KEEP_LAST with depth 10
node.create_subscription(BasicTypes, 'chatter', lambda msg: print(msg), 10)
# Or pass a QoSProfile object directly
node.create_subscription(BasicTypes, 'chatter', lambda msg: print(msg), qos_profile_sensor_data)

为了简化转换,不使用新API的用户将看到弃用警告。 [待校准@4559]

此外,我们还要求在构建 QoSProfile 对象时设置历史策略和/或深度。如果提供了 KEEP_LAST 的历史策略,那么还需要一个深度参数。例如,这些调用是有效的: [待校准@4560]

QoSProfile(history=QoSHistoryPolicy.RMW_QOS_POLICY_HISTORY_KEEP_ALL)
QoSProfile(history=QoSHistoryPolicy.RMW_QOS_POLICY_HISTORY_KEEP_LAST, depth=10)
QoSProfile(depth=10)  # equivalent to the previous line

这些调用将导致弃用警告: [待校准@4561]

QoSProfile()
QoSProfile(reliability=QoSReliabilityPolicy.RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT)
# KEEP_LAST but no depth
QoSProfile(history=QoSHistoryPolicy.RMW_QOS_POLICY_HISTORY_KEEP_LAST)

有关更多详细信息,请参阅与引入此更改相关的问题和请求: [待校准@4562]

因声明参数更改而发生的更改 [待校准@4534]

有关实际行为变化的详细信息,请参见上面的 Declaring Parameters 。这些变化与 rclcpp 的变化类似。 [待校准@4565]

这些是 rclpy.node.Node 接口中可用的新API方法: [待校准@4566]

  • 声明给定名称、可选默认值 (由 rcl_interfaces.msg.ParameterValue 支持) 和可选描述符的参数,返回实际设置的值: [待校准@4567]

    def declare_parameter(
        name: str,
        value: Any = None,
        descriptor: ParameterDescriptor = ParameterDescriptor()
    ) -> Parameter
    
    def declare_parameters(
      namespace: str,
      parameters: List[Union[
          Tuple[str],
          Tuple[str, Any],
          Tuple[str, Any, ParameterDescriptor],
      ]]
    ) -> List[Parameter]
    
  • 取消声明先前声明的参数并检查是否已预先声明参数: [待校准@4568]

    def undeclare_parameter(name: str) -> None
    
    def has_parameter(name: str) -> bool
    
  • 获取并设置参数描述符: [待校准@4569]

    def describe_parameter(name: str) -> ParameterDescriptor
    
    def describe_parameters(names: List[str]) -> List[ParameterDescriptor]
    
    def set_descriptor(
        name: str,
        descriptor: ParameterDescriptor,
        alternative_value: Optional[ParameterValue] = None
    ) -> ParameterValue
    
  • 获取可能尚未声明的参数的便捷方法: [待校准@4570]

    def get_parameter_or(name: str, alternative_value: Optional[Parameter] = None) -> Parameter
    

其他变化 [待校准@4571]

[需手动修复的语法]``rclpy.parameter.Parameter`` can now guess its type without explicitly setting it (as long as it's one of the supported ones by rcl_interfaces.msg.ParameterValue)。例如,此代码: [待校准@4572]

p = Parameter('myparam', Parameter.Type.DOUBLE, 2.41)

等同于以下代码: [待校准@4573]

p = Parameter('myparam', value=2.41)

此更改不会破坏现有的API。 [待校准@4574]

罗西德尔 [待校准@4575]

直到Crystal,每个信息生成器包都使用 ament_cmake 分机点 rosidl_generate_interfaces 进行了注册,并通过了一组 .msg / .srv / .action 文件。从Dashing开始,消息生成管道基于 .idl 文件。 [待校准@4576]

任何消息生成器包都需要使用新的扩展点 rosidl_generate_idl_interfaces 进行更改和注册,该扩展点只传递 .idl 文件。通常支持的语言C、C ++ 和Python的消息生成器以及用于自省、快速RTPS、Connext和OpenSplice的typesupport包已经更新 (请参阅 ros2/rosidl#334 )。调用 rosidl_generate_interfaces() 的CMake代码可以直接传递 .idl 文件,也可以传递 .msg / .srv / .action ,然后在传递给每个消息生成器之前,将其内部转换为 .idl 文件。 [待校准@4577]

[需手动修复的语法] .msg / .srv / .action 文件的格式不会在未来发展。[需手动修复的语法] .msg / .srv / .action 文件和 .idl 文件之间的映射在 this design article. A second design article 中描述,描述了 .idl 文件中支持的特征。为了利用任何新功能现有接口需要转换 (例如使用命令行工具 msg2idl / srv2idl / action2idl )。 [待校准@4578]

为了区分相同的类型名称,但具有不同的命名空间,内省结构现在包含一个替换包名称的命名空间字段 (请参阅 ros2/rosidl#335 )。 [待校准@4579]

char in的映射。味精文件 [待校准@4580]

ROS 1 char 已被弃用很长时间,并被映射到 uint8 。在ROS 2中,直到Crystal char 被映射到单个字符 (C/C ++ 中的 char ,Python中的长度为1的 str ),以提供更自然的映射。作为Dashing,ROS 1的语义已经恢复, char 再次映射到 uint8[待校准@4581]

rosidl_generator_cpp [待校准@4582]

为消息、服务和动作生成的C++ 数据结构为每个字段提供setter方法。直到Crystal每个setter返回指针的数据结构本身支持命名参数成语。从Dashing开始,这些设置器 return a reference ,因为这似乎是更常见的特征,也澄清了返回值不能是 nullptr[待校准@4583]

rosidl_generator_py [待校准@4584]

直到Crystal数组 (固定大小) 或序列 (动态大小,可选上边界) 字段消息存储 list 在Python。从Dashing乙开始,数值数组/序列的Python类型已更改: [待校准@4585]

  • 数值数组存储为 numpy.ndarray (选择 dtype 以匹配数值类型) [待校准@4586]

  • 一系列数值存储为 array.array (选择 typename 以匹配数值类型) [待校准@4587]

如前所述,非数字类型的数组/序列在Python中仍表示为 list[待校准@4588]

这一变化带来了许多好处: [待校准@4589]

  • 新的数据结构确保数组/序列中的每个项目都符合数值类型的值范围限制。 [待校准@4590]

  • 数值可以更有效地存储在内存中,从而避免每个项目的Python对象开销。 [待校准@4591]

  • 这两种数据结构的内存布局允许在单个操作中读取和写入数组/序列的所有项目,这使得从Python到Python的转换显著更快/更高效。 [待校准@4592]

launch [待校准@4593]

[需手动修复的语法] launch_testing 包裹赶上了在Bouncy Bolson进行的 launch 包裹重新设计。遗留的Python API已经移动到 launch.legacy 子模块中,因此已被弃用和删除。 [待校准@4594]

有关如何使用其新API的参考,请参阅 launch examples and documentation[待校准@4595]

有关如何使用新的 launch_testing API的参考,请参阅 demos tests[待校准@4596]

rmw [待校准@4597]

Crystal Clemmys 发布以来的变化: [待校准@4598]

  • [需手动修复的语法] rmw 中的新API, rmw_context_t 的fini函数: [待校准@4599]

  • [需手动修复的语法] rmw 的改造,现在通过 rmw_context_trmw_create_wait_set : [待校准@4601]

  • [需手动修复的语法] rmw 中新的api,用于为已发布和订阅的消息预分配空间: [待校准@4603]

  • [需手动修复的语法] rmw 的改性,现在分别通过 rmw_publisher_allocation_trmw_subscription_allocation_trmw_publishrmw_take 。请注意,这个论点可以是 NULLnullptr ,这保持了现有的Crystal行为。 [待校准@4609]

  • [需手动修复的语法] rmw_get_*_names_and_types* 函数返回的类型名称应具有完全限定的命名空间。例如,返回的类型名称应该是 rcl_interface/msg/Parameterrcl_interfaces/srv/GetParameters ,而不是 rcl_interfaces/Parameterrcl_interfaces/GetParameters[待校准@4612]

动作 [待校准@4613]

rviz [待校准@4624]

已知问题 [待校准@4348]

  • [需手动修复的语法] [ros2/rclcpp#715] 中存在不一致的参数YAML文件加载之间独立ROS 2节点由ROS 2节点。目前可用的变通办法记录在 issue comment [待校准@4626]

  • [需手动修复的语法] [ros2/rclpy#360] rclpy节点在Windows上使用OpenSplice时忽略 ctrl-c[待校准@4627]

  • [需手动修复的语法] [ros2/rosidl_typesupport_opensplice#30] 有bug嵌套消息内的服务或动作定义同名使用OpenSplice。 [待校准@4628]

  • [需手动修复的语法] [ros2/rclcpp#781]on_set_parameter_callback 内部呼叫 get_parameter / list_parameter 会导致Dashing僵局。这对于Eloquent来说是固定的,但是是一个ABI中断,所以还没有返回到Dashing。 [待校准@4629]

  • [需手动修复的语法] [ros2/rclcpp#912] 进程间通讯强制讯息当进程内通讯发生之间 ''std: 独特 _ ptr `` publisher and a single `` std:: 独特 _ ptr `` subscription (published `` std::unique _ ptr `` is internally being promoted to an `` 标准::shared_ptr '')。 [待校准@4630]

  • 没有记录QOS不可靠的 [ros2/rosbag2#125] 话题。 [待校准@4631]

  • [需手动修复的语法] [ros2/rclcpp#715] 可组合节点不能通过重新映射接收参数。向可组合节点提供参数可以使用 [this comment] 中描述的方法来完成。 [待校准@4632]

  • [需手动修复的语法] [ros2/rclcpp#893] “rclcpp:: 上下文 `` is not destroyed because of a reference cycle with `` rclcpp:: 图形列表”。这会导致内存泄漏。由于存在破坏ABI的风险,修复程序尚未返回。 [待校准@4633]

发布前的时间表 [待校准@4634]

发布前的几个里程碑: [待校准@4635]

4月8日星期一 (阿尔法) [待校准@4636]

核心包的第一个发行版本可用。从现在开始可以进行测试 (某些功能可能尚未登陆)。 [待校准@4637]

5月2日星期四 [待校准@4638]

核心包的API冻结 [待校准@4639]

5月6日星期一 (测试版) [待校准@4640]

核心包的更新发行版本可用。最新功能的附加测试。 [待校准@4641]

5月16日星期四 [待校准@4642]

功能冻结。在此之后,仅应进行错误修复发行版本。新包可以独立发布。 [待校准@4643]

5月20日星期一 (发布候选人) [待校准@4644]

核心包的更新发行版本可用。 [待校准@4645]

5月29日星期三 [待校准@4646]

项目完结,系统自动填充内容 rosdistro 回购协议中没有Dashing的PRs将被合并 (发布公告后重新开放)。 [待校准@4647]