Skip to content

关于参数

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

参数通过节点名称、节点命名空间、参数名称和参数命名空间来寻址。参数命名空间是可选的。

每个参数由一个键(key)、一个值(value)和一个描述符(descriptor)组成。键是一个字符串,值是以下类型之一:bool、int64、float64、string、byte[]、bool[]、int64[]、float64[] 或 string[]。默认情况下,所有描述符都是空的,但可以包含参数描述、值范围、类型信息和额外的约束条件。

有关 ROS 参数的实践教程,请参见 理解 ROS 2 参数。

默认情况下,节点需要声明(declare)其生命周期内将要接受的所有参数。这是为了在节点启动时就明确定义参数的类型和名称,从而减少后续错误配置的可能性。有关从节点声明和使用参数的教程,请参见 在 C++ 类中使用参数 或 在 Python 类中使用参数。

对于某些类型的节点,并非所有参数都能提前知道。在这种情况下,节点可以在实例化时将 allow_undeclared_parameters 设置为 true,从而允许获取和设置尚未声明的参数。

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

如果一个参数需要支持多种不同的类型,并且使用该参数的代码能够处理这种情况,则可以更改此默认行为。在声明参数时,应使用一个 ParameterDescriptor,并将 dynamic_typing 成员变量设置为 true。

ROS 2 节点可以注册三种回调,在参数发生更改时收到通知。这三种回调都是可选的。

第一种被称为”pre set parameter”(预设参数)回调,可以通过从节点 API 调用 add_pre_set_parameters_callback 来设置。此回调接收一个正在更改的 Parameter 对象列表,不返回任何内容。当它被调用时,可以修改 Parameter 列表来更改、添加或删除条目。例如,如果 parameter2 应该在 parameter1 每次更改时也随之更改,则可以使用此回调来实现。

第二种被称为”set parameter”(设置参数)回调,可以通过从节点 API 调用 add_on_set_parameters_callback 来设置。此回调接收一个不可变(immutable)的 Parameter 对象列表,并返回一个 rcl_interfaces/msg/SetParametersResult。此回调的主要目的是让用户能够检查即将应用的参数更改,并明确决定是否接受。

注意:“set parameter” 回调不应产生副作用,这一点非常重要。由于多个”set parameter”回调可以被链接在一起,单个回调无法知道后续的回调是否会拒绝更新。例如,如果某个回调修改了其所在类的状态,该状态可能会与实际参数失去同步。要在参数成功更改之后获得回调,请参阅下面的第三种回调类型。

第三种回调被称为”post set parameter”(后置设置参数)回调,可以通过从节点 API 调用 add_post_set_parameters_callback 来设置。此回调接收一个不可变的 Parameter 对象列表,不返回任何内容。此回调的主要目的是让用户能够对已成功接受的参数更改做出反应。

ROS 2 demos 中有一个使用所有这些回调的 示例。

ROS 2 节点可以通过节点 API 执行参数操作,详见 在 C++ 类中使用参数 或 在 Python 类中使用参数。外部进程可以通过参数服务(parameter service)执行参数操作,这些服务在节点实例化时默认创建。默认创建的服务有:

  • /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 官方文档。

初始参数值也可以通过 ROS 2 launch 机制在运行节点时设置。有关如何通过 launch 指定参数的信息,请参见 这篇文档。

ros2 param 命令是交互式操作运行中节点参数的通用方式。ros2 param 使用上述参数服务 API 来执行各种操作。有关如何使用 ros2 param 的详细信息,请参见 这篇操作指南。

除了命令行界面之外,还可以在运行时使用 ROS 2 客户端库以编程方式操作参数。所有客户端库都提供了在节点运行时获取、设置和对参数更改做出反应的 API。

客户端库支持包括:

Launch 文件迁移指南 说明了如何将 ROS 1 中的 param 和 rosparam launch 标签迁移到 ROS 2。

迁移指南 说明了如何将参数从 ROS 1 迁移到 ROS 2。