参数
概述
ROS 2 中的参数与各个节点相关联。 参数用于在启动时(和运行时)配置节点,而无需更改代码。 参数的生命周期与节点的生命周期相关(尽管节点可以实现某种持久性以在重新启动后重新加载值)。
参数通过节点名称、节点命名空间、参数名称和参数命名空间进行寻址。 提供参数命名空间是可选的。
每个参数由一个键、一个值和一个描述符组成。 键是字符串,值是以下类型之一:“bool”、“int64”、“float64”、“string”、“byte[]”、“bool[]”、“int64[]”、“float64[]”或“string[]”。 默认情况下,所有描述符都是空的,但可以包含参数描述、值范围、类型信息和其他约束。
有关 ROS 参数的动手教程,请参阅 了解参数.
参数背景
声明参数
默认情况下,节点需要*声明*其生命周期内将接受的所有参数。 这样,参数的类型和名称在节点启动时就有了明确的定义,从而减少了以后配置错误的可能性。 参见 在类中使用参数 (C++) or 在类中使用参数 (Python) for tutorials on declaring and using parameters from a node.
对于某些类型的节点,并非所有参数都会提前知道。 在这些情况下,可以将“allow_undeclared_parameters”设置为“true”来实例化节点,这将允许在节点上获取和设置参数,即使它们尚未声明。
参数类型
ROS 2 节点上的每个参数都具有概述中提到的预定义参数类型之一。 默认情况下,在运行时更改已声明参数类型的尝试将失败。 这可以防止常见错误,例如将布尔值放入整数参数中。
如果参数需要多种不同类型,并且使用该参数的代码可以处理它,则可以更改此默认行为。 声明参数时,应使用“ParameterDescriptor”声明它,并将“dynamic_typing”成员变量设置为“true”。
参数回调
ROS 2 节点可以注册两种不同类型的回调,以便在参数发生变化时收到通知。 这两个回调都是可选的。
第一个称为“设置参数”回调,可以通过从节点 API 调用“add_on_set_parameters_callback”来设置。 回调传递一个不可变的“参数”对象列表,并返回“rcl_interfaces/msg/SetParametersResult”。 此回调的主要目的是让用户能够检查即将对参数进行的更改并明确拒绝更改。
Note
重要的是,“设置参数”回调没有副作用。 由于可以链接多个“设置参数”回调,因此单个回调无法知道后续回调是否会拒绝更新。 例如,如果单个回调要更改其所在的类,则它可能会与实际参数不同步。 要在成功更改参数后获取回调,请参阅下面的下一种回调类型。
第二种回调类型称为“on 参数事件”回调,可以通过从参数客户端 API 调用“on_parameter_event”来设置。 回调传递一个“rcl_interfaces/msg/ParameterEvent”对象,并且不返回任何内容。 在声明、更改或删除输入事件中的所有参数后,将调用此回调。 此回调的主要目的是让用户能够对已成功接受的参数的更改做出反应。
与参数交互
ROS 2 节点可以通过节点 API 执行参数操作,如中所述 在类中使用参数 (C++) or 在类中使用参数 (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 文件设置初始参数值。 参见 直接从命令行设置参数 for examples on how to set initial parameter values.
启动节点时设置初始参数值
通过 ROS 2 启动工具运行节点时也可以设置初始参数值。 参见 this document for information on how to specify parameters via launch.
在运行时操作参数值
ros2 param
命令是与已运行节点的参数交互的一般方法。
ros2 param
使用如上所述的参数服务 API 来执行各种操作。
请参阅 this how-to guide 有关如何使用“ros2 param”的详细信息。
从 ROS 1 迁移
The Launch file migration guide 解释如何将“param”和“rosparam”启动标签从 ROS 1 迁移到 ROS 2。
The YAML parameter file migration guide 解释如何将参数文件从 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” 的代码是 here.