参数
概述
ROS 2 中的参数与各个节点相关联。 参数用于在启动时(和运行时)配置节点,而无需更改代码。 参数的生命周期与节点的生命周期相关(尽管节点可以实现某种持久性以在重新启动后重新加载值)。
参数通过节点名称、节点命名空间、参数名称和参数命名空间进行寻址。 提供参数命名空间是可选的。
每个参数由一个键、一个值和一个描述符组成。 键是一个字符串,值是以下类型之一:“bool”、“int64”、“float64”、“string”、“byte[]”、“bool[]”、“int64[]”、“float64[]”或“string[]”。 默认情况下,所有描述符都是空的,但可以包含参数描述、值范围、类型信息和其他约束。
有关 ROS 参数的动手教程,请参阅 了解参数。
参数背景
声明参数
默认情况下,节点需要*声明*其生命周期内将接受的所有参数。 这样,参数的类型和名称在节点启动时就有明确的定义,从而减少以后出现错误配置的可能性。 有关从节点声明和使用参数的教程,请参阅 在类中使用参数(C++) 或 在类中使用参数(Python)。
对于某些类型的节点,并非所有参数都会提前知道。
在这些情况下,可以将 allow_undeclared_parameters
设置为 true
来实例化节点,这将允许在节点上获取和设置参数,即使它们尚未声明。
参数类型
ROS 2 节点上的每个参数都具有概述中提到的预定义参数类型之一。 默认情况下,在运行时尝试更改声明参数的类型将失败。 这可以防止常见的错误,例如将布尔值放入整数参数中。
如果参数需要多种不同类型,并且使用该参数的代码可以处理它,则可以更改此默认行为。
声明参数时,应使用 ParameterDescriptor
进行声明,并将 dynamic_typing
成员变量设置为 true
。
参数回调
ROS 2 节点可以注册三种不同类型的回调,以便在参数发生变化时收到通知。 所有三个回调都是可选的。
第一个称为“预设参数”回调,可以通过从节点 API 调用 add_pre_set_parameters_callback
来设置。
此回调传递了正在更改的 Parameter
对象列表,并且不返回任何内容。
调用它时,它可以修改 Parameter
列表以更改、添加或删除条目。
例如,如果“parameter2”应该在“parameter1”更改时随时更改,则可以使用此回调来实现。
第二个回调称为“设置参数”回调,可以通过从节点 API 调用“add_on_set_parameters_callback”来设置。 回调传递一个不可变的“Parameter”对象列表,并返回“rcl_interfaces/msg/SetParametersResult”。 此回调的主要目的是让用户能够检查即将对参数进行的更改并明确拒绝更改。
Note
重要的是,“设置参数”回调没有副作用。 由于可以链接多个“设置参数”回调,因此单个回调无法知道后续回调是否会拒绝更新。 例如,如果单个回调要更改其所在的类,则它可能会与实际参数不同步。 要在成功更改参数后获取回调,请参阅下面的下一种回调类型。
第三种回调类型称为“设置后参数”回调,可以通过从节点 API 调用“add_post_set_parameters_callback”进行设置。 回调传递一个不可变的“Parameter”对象列表,但不返回任何内容。 此回调的主要目的是让用户能够对已成功接受的参数的更改做出反应。
ROS 2 演示有一个“示例 <https://github.com/ros2/demos/blob/rolling/demo_nodes_cpp/src/parameters/set_parameters_callback.cpp>`__,其中包含所有这些回调的使用情况。
与参数交互
ROS 2 节点可以通过节点 API 执行参数操作,如 在类中使用参数(C++) 或 在类中使用参数(Python) 中所述。 外部进程可以通过节点实例化时默认创建的参数服务执行参数操作。 默认创建的服务包括:
/node_name/describe_parameters
: Uses a service type ofrcl_interfaces/srv/DescribeParameters
. Given a list of parameter names, returns a list of descriptors associated with the parameters./node_name/get_parameter_types
: Uses a service type ofrcl_interfaces/srv/GetParameterTypes
. Given a list of parameter names, returns a list of parameter types associated with the parameters./node_name/get_parameters
: Uses a service type ofrcl_interfaces/srv/GetParameters
. Given a list of parameter names, returns a list of parameter values associated with the parameters./node_name/list_parameters
: Uses a service type ofrcl_interfaces/srv/ListParameters
. Given an optional list of parameter prefixes, returns a list of the available parameters with that prefix. If the prefixes are empty, returns all parameters./node_name/set_parameters
: Uses a service type ofrcl_interfaces/srv/SetParameters
. Given a list of parameter names and values, attempts to set the parameters on the node. Returns a list of results from trying to set each parameter; some of them may have succeeded and some may have failed./node_name/set_parameters_atomically
: Uses a service type ofrcl_interfaces/srv/SetParametersAtomically
. Given a list of parameter names and values, attempts to set the parameters on the node. Returns a single result from trying to set all parameters, so if one failed, all of them failed.
运行节点时设置初始参数值
运行节点时,可以通过单独的命令行参数或 YAML 文件设置初始参数值。 有关如何设置初始参数值的示例,请参阅 直接从命令行设置参数。
启动节点时设置初始参数值
通过 ROS 2 启动工具运行节点时,也可以设置初始参数值。 有关如何通过启动指定参数的信息,请参阅 this document。
在运行时操作参数值
ros2 param
命令是与已在运行的节点的参数交互的一般方法。
ros2 param
使用如上所述的参数服务 API 来执行各种操作。
有关如何使用“ros2 param”的详细信息,请参阅:doc:本操作指南。
从 ROS 1 迁移
启动文件迁移指南 解释了如何将 param
和 rosparam
启动标签从 ROS 1 迁移到 ROS 2。
YAML 参数文件迁移指南 解释了如何将参数文件从 ROS 1 迁移到 ROS 2。
在 ROS 1 中,“roscore” 就像一个全局参数黑板,所有节点都可以从中获取和设置参数。 由于 ROS 2 中没有中央“roscore”,因此该功能不再存在。 ROS 2 中推荐的方法是使用与使用它们的节点紧密相关的每个节点参数。 如果仍然需要全局黑板,可以为此目的创建一个专用节点。 ROS 2 在“ros-rolling-demo-nodes-cpp”包中附带一个名为“parameter_blackboard”的黑板;它可以通过以下方式运行:
ros2 run demo_nodes_cpp parameter_blackboard
parameter_blackboard
的代码位于 这里。