您正在阅读的是旧版本但仍受支持的 ROS 2 文档。 Jazzy.
潇洒的迪亚德马塔 (帅气
)
Dashing Diademata 是 ROS 2 的第四个版本。
支持的平台
Dashing Diademata 主要支持以下平台:
1 级平台:
Ubuntu 18.04(仿生):
amd64
和arm64
Mac macOS 10.12(Sierra)
Windows 10(Visual Studio 2019)
二级平台:
Ubuntu 18.04(仿生):
arm32
三级平台:
Debian Stretch (9):
amd64
,arm64
和arm32
OpenEmbedded Thud (2.6) / webOS OSE:
arm32
和x86
有关 RMW 实现、编译器/解释器版本和系统依赖性版本的更多信息,请参见 REP 2000.
安装
ROS 2 发布的新功能
我们想重点介绍几项功能和改进:
组件 现在是编写节点的推荐方式。它们既可以独立使用,也可以在进程中组成,而且这两种方式都完全支持来自
启动
文件"(《世界人权宣言》) 进程内通信 (仅适用于 C++)方面进行了改进--既减少了延迟,又最大限度地减少了副本。
Python 客户端库已经更新,与大部分 C++ 客户端库相匹配,并在内存使用和性能方面进行了一些重要的错误修复和改进。
参数现在完全可以替代
动态重新配置
包括范围或只读等限制。通过依靠(一个子集) IDL 4.2 现在可以在信息生成管道中使用
.idl
文件(在.msg
/.srv
/.行动
文件)。这一改动支持普通字符串的可选 UTF-8 编码和多字节字符串的 UTF-16 编码(请参阅 宽弦设计文章).命令行工具
行动
和部件
.支持 "最后期限"、"生命周期 "和 "生活质量 "服务设置。
移动 2 阿尔法版本.
请参阅 潇洒元票 在 GitHub 上,其中包含更多信息,以及提供更多详细信息的特定票单参考。
水晶版本发布后的变化
声明参数
从 Dashing 开始,参数的行为发生了一些变化,这也导致了一些新的 API 和其他 API 的废弃。请参见 rclcpp
和 rclpy
有关 API 更改的更多信息,请参阅下面的章节。
获取和设置未声明的参数
从 Dashing 开始,在访问或设置参数之前必须先声明参数。
在 "潇洒 "之前,您可以调用 get_parameter(name)
并获取一个值(如果该值之前已被设置)或一个 参数未设置
.您还可以拨打 set_parameter(name、 值)
在任何时候,即使该参数之前未被设置。
从 Dashing 开始,在获取或设置参数之前,您需要先声明参数。如果试图获取或设置未声明的参数,要么会出现异常(如 ParameterNotDeclaredException),要么在某些情况下会以各种方式得到不成功的结果(详情请查看特定函数)。
不过,您可以通过使用 允许未声明参数
选项。这样做可能是为了暂时避免修改代码,或者是为了满足一些不常见的用例。例如,"全局参数服务器 "或 "参数黑板 "可能希望允许外部节点在自身上设置新参数,而无需首先声明这些参数,因此它可以使用 允许未声明参数
选项来实现。不过,在大多数情况下,我们并不推荐使用该选项,因为它会降低参数 API 其他部分的安全性,从而避免出现参数名称错误和 "先使用后设置 "逻辑错误。
请注意,使用 允许未声明参数
会让你获得大部分旧的行为,特别是针对 "get "和 "set "方法的行为,但它不会将所有与参数相关的行为变化恢复到 ROS Crystal 的状态。为此,您还需要设置 从覆盖自动声明参数
选项 真
下文将在 使用 YAML 文件进行参数配置.
使用参数描述符声明参数
在使用参数前声明参数的另一个好处是可以同时声明参数描述符。
现在,在声明参数时,您可以包含一个自定义的 参数描述符
以及名称和默认值。默认值 参数描述符
定义为 rcl_interfaces/msg/ParameterDescriptor
并包含以下元数据 描述
等约束条件 只读
或 整数范围
.在设置参数时,这些约束条件可用于拒绝无效值,和/或作为外部工具的提示,告知给定参数的有效值。参数 只读
约束将防止参数的值在声明后发生变化,并防止参数未声明。
下面是一个链接,供参考 参数描述符
截至撰写本报告时,我们已收到该消息:
使用 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::PublisherOptions
和rclcpp::SubscriptionOptions
.
所有更改都向后兼容(无需更改代码),但有几种现有的调用样式已被弃用。我们鼓励用户更新为新的签名。
过去,在创建发布者或订阅时,您可以不指定任何 QoS 设置(例如,只提供发布者的主题名称),也可以指定一个 "qos 配置文件 "数据结构(类型为 rmw_qos_profile_t
)的所有设置。现在,您必须使用新的 rclcpp::QoS
对象来指定 QoS 和至少 QoS 的历史设置。这鼓励用户在使用 KEEP_LAST
而不是默认为一个可能合适也可能不合适的值。
在 ROS 1 中,这被称为 队列大小
在 C++ 和 Python 中都是必需的。我们正在修改 ROS 2 API,以恢复这一要求。
此外,以前在创建发布者或订阅时可以传递的任何选项,现在都封装在一个 rclcpp::PublisherOptions
和 rclcpp::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_t
至rmw_create_wait_set
:
新的应用程序接口
rmw
用于为已发布和已订阅的信息预先分配空间:
修改
rmw
现在通过rmw_publisher_allocation_t
或rmw_subscription_allocation_t
至rmw_publish
和rmw_take
分别为请注意,这个参数可以是NULL
或nullptr
,它保留了现有的 Crystal 行为。
返回的类型名称
rmw_get_*_names_and_types*
函数应该有一个完全限定的命名空间。例如rcl_interfaces/Parameter
和rcl_interfaces/GetParameters
,返回的类型名称应为rcl_interface/msg/Parameter
和rcl_interfaces/srv/GetParameters
.
行动
对
rclcpp_action::Client
签名:签名 rclcpp_action::Client::async_send_goal 发生了变化。现在,用户可以选择为 目标响应 和 结果 使用新的 发送目标选项 结构。当行动服务器接受或拒绝目标时,会调用目标响应回调;当收到目标结果时,会调用结果回调。还为 rclcpp_action::Client::async_cancel_goal 和 rclcpp_action::Client::async_get_result.
更改目标过渡名称:
重构了目标状态转换的名称,以反映设计文档。这将影响
rcl_action
,rclcpp_action
和rclpy
.以下是事件名称更改列表 (旧名称 -> 新名称):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
已知问题
[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
将被合并(发布公告后重新开放)。