参数

概述

在ROS 2中,参数与单个节点关联。参数用于在启动时(以及运行时)配置节点,而无需更改代码。参数的生命周期与节点的生命周期相关联(尽管节点可以实现某种持久性以在重新启动后重新加载值)。

参数通过节点名称、节点命名空间、参数名称和参数命名空间来进行标识。提供参数命名空间是可选的。

每个参数由一个键、一个值和一个描述符组成。键是一个字符串,值是以下类型之一:boolint64float64stringbyte[]bool[]int64[]float64[]string[]。默认情况下,所有描述符都为空,但可以包含参数描述、值范围、类型信息和其他约束。

有关ROS参数的实际教程,请参阅 理解参数

参数背景

声明参数

默认情况下,节点需要在其生命周期内 声明 所有将接受的参数。这样,参数的类型和名称在节点启动时就得到了明确定义,从而降低了后期配置错误的机会。请参阅 在类中使用参数(C++)在类中使用参数(Python) 以获取有关如何声明和使用节点参数的教程。

对于某些类型的节点,不是所有参数都能提前知道。在这种情况下,可以使用``allow_undeclared_parameters``设置为``true``来实例化节点,即使参数没有被声明,也允许在节点上进行参数的获取和设置。

参数类型

ROS 2节点上的每个参数都有预定义的参数类型,如概述中所述。默认情况下,尝试在运行时更改已声明参数的类型将失败。这可以防止常见的错误,例如将布尔值放入整数参数中。

如果一个参数需要具有多种不同的类型,并且使用该参数的代码可以处理它,可以更改此默认行为。在声明参数时,应使用具有``dynamic_typing``成员变量设置为``true``的``ParameterDescriptor``进行声明。

参数回调

ROS 2节点可以注册两种不同类型的回调以在参数发生更改时得到通知。这两种回调都是可选的。

第一种称为"设置参数"回调,可以通过从节点API中调用``add_on_set_parameters_callback``来设置。回调会传递一个不可变的``Parameter``对象列表,并返回一个``rcl_interfaces/msg/SetParametersResult``。这个回调的主要目的是让用户有能力检查即将发生的参数更改并明确拒绝更改。

注解

“设置参数”回调必须没有副作用很重要。由于可以链接多个“设置参数”回调,因此单个回调无法知道后续的回调是否会拒绝更新。例如,如果单个回调对其所在的类进行更改,可能会与实际参数不同步。要在参数成功更改后获取回调,请参阅下面的下一种回调类型。

第二种类型的回调称为"参数事件"回调,可以通过从参数客户端API中调用``on_parameter_event``来设置。回调会传递一个``rcl_interfaces/msg/ParameterEvent``对象,并且不返回任何内容。此回调将在输入事件中的所有参数已被声明、更改或删除之后调用。这个回调的主要目的是让用户有能力对已成功接受的参数更改做出反应。

与参数交互

ROS 2节点可以通过节点API执行参数操作,如 在类中使用参数(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启动工具运行节点时,还可以设置初始参数值。请参阅 此文档 以获取有关如何通过启动指定参数的信息。

运行时操作参数值

``ros2 param``命令是与已经在运行的节点交互的通用方式。``ros2 param``使用如上所述的参数服务API执行各种操作。请参阅 此操作指南 以了解如何使用``ros2 param``的详细信息。

从ROS 1迁移

The Launch file migration guide explains how to migrate param and rosparam launch tags from ROS 1 to ROS 2.

The YAML parameter file migration guide explains how to migrate parameter files from ROS 1 to ROS 2.

在 ROS 1 中,roscore 的作用类似于全局参数黑板,所有节点都可以获取和设置参数。由于 ROS 2 中没有中央 roscore,这个功能不再存在。ROS 2 中推荐的方法是使用与使用它们的节点密切相关的每个节点参数。如果仍然需要全局黑板,可以为此创建一个专用节点。ROS 2 中附带了一个名为 parameter_blackboard 的节点,位于 ros-humble-demo-nodes-cpp 包中;可以使用以下命令运行:

ros2 run demo_nodes_cpp parameter_blackboard

parameter_blackboard 的代码在 此处