您正在阅读的是开发版本的文档。有关最新发布的版本,请访问 Jazzy.
参数
概述
ROS 2 中的参数与单个节点相关联。参数用于在启动时(和运行时)配置节点,而无需更改代码。参数的生命周期与节点的生命周期息息相关(不过节点可以实现某种持久性,以便在重启后重新加载参数值)。
参数通过节点名称、节点命名空间、参数名称和参数命名空间来寻址。提供参数命名空间是可选的。
每个参数由一个键、一个值和一个描述符组成。键是字符串,值是以下类型之一: bool
, int64
, 浮点64
, 字符串
, byte[]
, bool[]
, int64[]
, float64[]
或 字符串[]
.默认情况下,所有描述符都是空的,但可以包含参数描述、值范围、类型信息和附加约束。
有关 ROS 参数的实践教程,请参阅 了解参数.
参数背景
声明参数
默认情况下,节点需要 声明 在其生命周期内将接受的所有参数。这样,在节点启动时就能很好地定义参数的类型和名称,从而减少以后错误配置的机会。参见 在类中使用参数(C++) 或 在类中使用参数(Python) 以获取有关声明和使用节点参数的教程。
对于某些类型的节点,并非所有参数都能提前知道。在这种情况下,可以使用 允许未声明参数
设为 真
,这样即使没有声明参数,也可以在节点上获取和设置参数。
参数类型
ROS 2 节点上的每个参数都有一个 "概述 "中提到的预定义参数类型。默认情况下,在运行时更改已声明参数类型的尝试会失败。这就避免了一些常见错误,例如将布尔值放入整数参数中。
如果一个参数需要有多种不同类型,并且使用该参数的代码可以处理它,则可以更改这种默认行为。在声明参数时,应使用 参数描述符
与 动态排版
成员变量设置为 真
.
参数回调
ROS 2 节点可以注册三种不同类型的回调,以便在参数发生变化时获得通知。这三种回调都是可选的。
第一个回调被称为 "预设参数 "回调,可通过调用 add_pre_set_parameters_callback
从节点 API 调用。该回调通过一个 参数
并不返回任何内容。调用它时,可以修改 参数
列表来更改、添加或删除条目。例如,如果 参数2
只要 参数1
变化,可以通过此回调来实现。
第二个回调称为 "设置参数 "回调,可通过调用 add_on_set_parameters_callback
从节点 API 调用。回调将传递一个不可变的 参数
对象,并返回一个 rcl_interfaces/msg/SetParametersResult
.该回调的主要目的是让用户能够检查即将对参数进行的更改,并明确拒绝更改。
备注
重要的是,"设置参数 "回调不会产生任何副作用。由于可以连锁多个 "设置参数 "回调,因此单个回调无法知道后面的回调是否会拒绝更新。例如,如果单个回调对它所在的类进行了更改,它可能会与实际参数不同步。要获取回调 后 参数已成功更改,请参阅下面的下一类回调。
第三种回调被称为 "后置参数 "回调,可以通过调用 add_post_set_parameters_callback
从节点 API 调用。回调将传递一个不可变的 参数
对象,不会返回任何内容。该回调的主要目的是让用户能够对已成功接受的参数变化做出反应。
ROS 2 演示有一个 范例 的所有回调。
与参数互动
ROS 2 节点可通过节点应用程序接口执行参数操作,详情见 在类中使用参数(C++) 或 在类中使用参数(Python).外部进程可以通过参数服务执行参数操作,这些服务在节点实例化时默认创建。默认创建的服务有
/node_name/describe_parameters
:服务类型rcl_interfaces/srv/DescribeParameters
.给定参数名列表,返回与参数相关的描述符列表。/node_name/get_parameter_types
:服务类型rcl_interfaces/srv/GetParameterTypes
.给定参数名列表,返回与参数相关的参数类型列表。/node_name/get_parameters
:服务类型rcl_interfaces/srv/GetParameters
.给定参数名列表,返回与参数相关的参数值列表。/node_name/list_parameters
:服务类型rcl_interfaces/srv/ListParameters
.如果给定一个可选的参数前缀列表,则返回带有该前缀的可用参数列表。如果前缀为空,则返回所有参数。/node_name/set_parameters
:服务类型rcl_interfaces/srv/SetParameters
.给定参数名称和值的列表,尝试在节点上设置参数。尝试设置每个参数的结果会返回一个列表;其中有些可能成功,有些可能失败。/node_name/set_parameters_atomically
:服务类型rcl_interfaces/srv/SetParametersAtomically
.给定参数名称和值的列表,尝试在节点上设置参数。尝试设置所有参数后会返回一个结果,因此如果一个参数设置失败,则所有参数均失败。
运行节点时设置初始参数值
运行节点时,可通过单个命令行参数或 YAML 文件设置初始参数值。参见 直接从命令行设置参数 以了解如何设置初始参数值的示例。
启动节点时设置初始参数值
通过 ROS 2 启动工具运行节点时,也可以设置初始参数值。参见 本文件 以了解如何通过启动来指定参数。
运行时操纵参数值
"(《世界人权宣言》) 玫瑰2 停止
命令是与已运行节点的参数交互的一般方法。
玫瑰2 停止
使用上述参数服务 API 执行各种操作。请参见 本指南 了解如何使用 玫瑰2 停止
.
从 ROS 1 迁移
"(《世界人权宣言》) 启动文件迁移指南 解释了如何迁移 停止
和 rosparam
将标签从 ROS 1 发射到 ROS 2。
"(《世界人权宣言》) YAML 参数文件迁移指南 解释了如何将参数文件从 ROS 1 移植到 ROS 2。
在 ROS 1 中 玫瑰核
就像一个全局参数黑板,所有节点都可以在这里获取和设置参数。由于没有中央 玫瑰核
在 ROS 2 中,这种功能已不复存在。ROS 2 中推荐的方法是使用与使用节点密切相关的节点参数。如果仍然需要全局黑板,可以为此创建一个专用节点。ROS 2 的 ros-rolling-demo-nodes-cpp
名为 参数黑板
;它可以与
ros2 run demo_nodes_cpp parameter_blackboard
的代码 参数黑板
是 这里.