关于ROS 2中的参数 [待校准@10066]

概述

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

参数按节点名称、节点命名空间、参数名称和参数命名空间寻址。其中是否提供参数命名空间是可选的。 [Alyssa@10068]

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

有关ROS参数的动手教程,请参阅: doc:理解ROS 2参数[Alyssa@10070]

参数背景

声明参数

默认情况下,节点需要 声明 在其生命周期内将接受的所有参数。这样可以在节点启动时很好地定义参数的类型和名称,从而减少之后配置错误的机会。请参阅: 文档: ../Tutorials/Using-Parameters-In-A-Class-CPP`或: 文档:../Tutorials/Using-Parameters-In-A-Class-Python` ,以上文档均为声明和使用节点参数的教程。 [Alyssa@10073]

对于某些类型的节点,并非所有参数都会提前知道。在这些情况下,可以通过将 allow_undeclared_parameters 设置为 true 来实例化节点,这将允许在节点上获取和设置参数,即使它们尚未声明。 [Alyssa@10074]

参数类型 [待校准@10075]

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

如果需要一个参数是多个不同的类型,并且使用该参数的代码可以处理它,则可以更改此默认行为。声明该参数时,应使用 dynamic_typing 成员变量设置为 true参数描述符(ParameterDescriptor) 进行声明。 [Alyssa@10077]

参数回调函数 [Alyssa@10078]

ROS 2节点可以注册两种不同的回调类型,以便在参数发生更改时通知。有两种类型的回调的原因是为了有机会在参数更改发生之前进行干预,以及有机会在参数更改发生之后做出反应。节点可以同时注册两个回调类型,也可以不注册。这两种类型如下所述。 [Alyssa@10079]

第一种类型被称为 "set parameter" 调用,可以通过调用 add_on_set_parameters_callback 来安装。这个回调函数应该接受一个 Parameter 对象列表,并返回一个 rcl_interfaces/msg/SetParametersResult 。在节点上声明或更改参数之前,将调用此回调函数。这种回调函数的主要目的是使用户能够检查即将对参数进行的更改,并显示的拒绝该更改。 [Alyssa@10080]

注解

重要的是 "set parameter" 回调函数没有副作用。由于可以链接多个 "set parameter" 回调函数,因此单个回调函数无法知道后续的回调函数是否会拒绝更新。例如,如果单个回调函数要对其所在的类进行更改,它可能会与实参不同步。要在成功更改参数 返回回调函数,请参阅下面的下一种回调类型。 [Alyssa@10081]

第二种类型的回调函数被称为 "on parameter event" 回调,可以通过调用 on_parameter_event 来安装。这种回调函数应该接受一个 rcl_interfaces/msg/ParameterEvent 对象,并且不返回任何内容。在声明、更改或删除所有参数后,将调用此回调函数。这种回调函数的主要目的是使用户能够对已成功接受的参数的更改做出反应。 [Alyssa@10082]

与参数交互

ROS 2节点可以通过节点APIs执行参数操作,可参考以下文档: 在类 (c ++) 中使用参数 [待校准@9209] 或: doc:在类中使用参数 (Python) [待校准@9249]。外部进程可以通过在实例化节点时默认创建的参数服务来执行参数操作。默认情况下创建的服务为: [Alyssa@10084]

  • /node_name/describe_parameters: 使用 rcl_interfaces/srv/DescribeParameters 的服务类型。给定参数名称列表,返回与参数关联的描述符列表。 [待校准@10085]

  • /node_name/get_parameter_types: 使用 rcl_interfaces/srv/GetParameterTypes 的服务类型。给定参数名称列表,返回与参数关联的参数类型列表。 [待校准@10086]

  • /node_name/get_parameters: 使用 rcl_interfaces/srv/GetParameters 的服务类型。给定参数名称列表,返回与参数关联的参数值列表。 [待校准@10087]

  • /node_name/list_parameters: 使用 rcl_interfaces/srv/ListParameters 的服务类型。给定参数前缀的可选列表,返回具有该前缀的可用参数的列表。如果前缀为空,则返回所有参数。 [待校准@10088]

  • /node_name/set_parameters: 使用 rcl_interfaces/srv/SetParameters 的服务类型。给定参数名称和值列表,尝试在节点上设置参数。返回尝试设置每个参数的结果列表; 其中一些可能成功,一些可能失败。 [待校准@10089]

  • /node_name/set_parameters_atomically: 使用 rcl_interfaces/srv/SetParametersAtomically 的服务类型。给定参数名称和值列表,尝试在节点上设置参数。尝试设置所有参数后返回一个结果,因此如果一个参数失败,则所有参数都失败。 [Alyssa@10090]

运行节点时设置初始参数值

在运行节点时,可以通过单个命令行参数或通过YAML文件设置初始参数值。有关如何设置初始参数值的示例,请参见 直接从命令行设置参数[待校准@10092]

设置启动(launch)节点时的初始参数值 [Alyssa@10093]

当通过ROS 2 launch机制运行节点时,也可以设置初始参数值。有关如何通过launch指定参数的信息,请参见 此文档[Alyssa@10094]

在运行时操作参数值

ros2 param 命令是与已经在运行的节点的参数交互的一般方式。ros2 param 使用如上所述的参数服务API来执行各种操作。有关如何使用 ros2 param 的详细信息,请参见 the how-to guide[Alyssa@10096]

从ROS 1迁移

Launch文件迁移指导 解释了如何将 paramrosparam launch标签从ROS 1迁移到ROS 2。 [Alyssa@10098]

YAML 参数文件迁移指导 解释了如何将参数文件从ROS 1迁移到ROS 2。 [Alyssa@10099]

在ROS 1中, roscore 就像一个全局参数黑板(blackboard),所有节点都可以在此处获取并设置参数。由于ROS 2中没有核心 roscore ,该功能不再存在。ROS 2中推荐的方法是使用每个节点的参数,这些参数与使用它们的节点紧密相关。如果仍然需要全局黑板(blackboard),则可以为此目的创建专用节点。ROS 2在 ros-foxy-demo-nodes-cpp 包中附带一个叫做 ``parameter_blackboard``的节点 ; 它可以如下运行: [Alyssa@10100]

ros2 run demo_nodes_cpp parameter_blackboard

parameter_blackboard 的代码参考 这里[Alyssa@10101]