ROS专题 · 2024年3月4日 0

ROS 2基础概念#8:参数(Parameter)| ROS 2学习笔记

ROS 2中的参数(Parameters)是一种用于在ROS 2系统中配置节点行为的重要机制。参数提供了一种在节点之间共享配置信息的标准化方式,能够在运行时动态地修改节点的行为。在本文中,我们将详细介绍ROS 2参数的概念、结构和使用方法。

参数概述

ROS 2参数允许开发者在节点中定义和使用配置参数,这些参数可以在节点启动时加载,也可以在运行时动态地修改。参数可以用于调整节点的行为、配置算法参数、设置传感器参数等。通过参数,可以使节点更加灵活、可配置,并且能够在不重新编译代码的情况下进行调整。

参数结构

ROS 2参数的结构包括以下几个关键部分:

  • 参数名称(Name):每个参数都有一个唯一的名称,用于在节点中标识和访问该参数。
  • 参数值(Value):参数可以是各种类型的值,包括整数、浮点数、字符串、布尔值、列表等。参数的值可以在节点启动时从参数服务器加载,也可以在运行时动态修改。
  • 参数描述(Description):参数还可以包含描述信息,用于帮助开发者理解参数的用途和含义。

使用方法

使用ROS 2参数通常需要以下步骤:

  1. 定义参数:在节点中定义需要的参数,并指定参数的名称、类型和描述信息。参数可以在节点的构造函数中初始化,也可以在节点的declare_parameter()方法中声明。
  2. 读取参数:节点可以使用get_parameter()方法来读取参数的值,以在运行时获取参数的当前值。
  3. 设置参数:节点可以使用set_parameter()方法来设置参数的值,以在运行时动态地修改参数。
  4. 监听参数变化:节点可以通过注册回调函数来监听参数值的变化,以便在参数值发生变化时执行相应的操作。

使用示例

下面是一个简单的示例,演示了如何在ROS 2中使用参数控制节点的行为:

  • 节点参数定义:
class MyNode(Node):
    def __init__(self):
        super().__init__('my_node')
        self.declare_parameter('rate', 1.0)  # 声明一个名为'rate'的参数,默认值为1.0

    def my_function(self):
        rate = self.get_parameter('rate').value  # 读取参数值
        rclpy.timer.Timer(self, rate, self.timer_callback)  # 使用参数控制定时器频率

    def timer_callback(self):
        self.get_logger().info('Timer callback executed')
  • 启动节点并设置参数:
ros2 run my_package my_node --ros-args -p rate:=2.0

命令行工具

在使用参数相关命令行工具前,先启动两个 turtlesim 节点, /turtlesim 和 /teleop_turtle

打开一个 Terminal 并运行:

ros2 run turtlesim turtlesim_node

打开另外一个 Terminal 并运行:

ros2 run turtlesim turtle_teleop_key

获取参数列表

要查看属于您的节点的参数列表,请打开一个新终端并输入命令:

ros2 param list

您将看到节点命名空间 /teleop_turtle/turtlesim,后面是每个节点的参数:

/teleop_turtle:
  scale_angular
  scale_linear
  use_sim_time
/turtlesim:
  background_b
  background_g
  background_r
  use_sim_time

每个节点都有参数 use_sim_time; 这并不是 /turtlesim 独有的。

根据它们的名称,/turtlesim 的参数似乎使用 RGB 颜色值确定 /turtlesim 窗口的背景颜色。

要确定参数的类型,您可以使用 ros2 param get

获取参数类型和当前值

要显示参数的类型和当前值,请使用以下命令:

ros2 param get <node_name> <parameter_name>

我们来看看 /turtlesim 的参数 background_g 的当前值:

ros2 param get /turtlesim background_g

将会得到如下的返回值:

Integer value is: 86

现在您知道 background_g 保存一个整数值。

如果您在 background_rbackground_b 上运行相同的命令,您将分别获得值 69 和 255。

设置参数值

如果在运行时需要设置或者改变参数值,请使用如下的命令:

ros2 param set <node_name> <parameter_name> <value>

让我们来改变一下 /turtlesim 的背景颜色:

ros2 param set /turtlesim background_r 150

将得到如下的返回信息:

Set parameter successful

你的 turtlesim 窗口的背景应该改变颜色:

../../../_images/set.png

使用 set 命令设置参数只会在当前会话中更改它们,而不是永久更改。 但是,您可以保存设置并在下次启动节点时重新加载它们。

保存参数值

您可以使用以下命令将节点的所有当前参数值保存到文件中以供以后使用:

ros2 param dump <node_name>

要保存 /turtlesim 参数的当前配置,请输入命令:

ros2 param dump /turtlesim

将得到如下的返回信息:

Saving to:  ./turtlesim.yaml

您将在运行 shell 的当前工作目录中找到一个新文件。如果打开该文件,您将看到以下内容:

turtlesim:
  ros__parameters:
    background_b: 255
    background_g: 86
    background_r: 150
    use_sim_time: false

如果您想将来使用相同的参数重新加载节点,保存的参数会派上用场。

加载参数值

您可以使用以下命令将参数从文件加载到当前正在运行的节点:

ros2 param load <node_name> <parameter_file>

要将使用 ros2 param dump 生成的 turtlesim.yaml 文件加载到 /turtlesim 节点的参数中,请输入以下命令:

ros2 param load /turtlesim ./turtlesim.yaml

将得到如下的返回信息:

Set parameter background_b successful
Set parameter background_g successful
Set parameter background_r successful
Set parameter use_sim_time successful

节点启动时加载参数

要使用保存的参数值启动某节点,请使用如下命令:

ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

这与您用于启动 turtlesim 的命令相同,添加了标志 --ros-args--params-file ,后跟您要加载的文件。

如果要停止正在运行的 turtlesim 节点,并尝试使用保存的参数重新加载它,使用:

ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml

Turtlesim 窗口应该像往常一样显示,但具有您之前设置的紫色背景。

结论

ROS 2参数为ROS 2系统提供了一种灵活、标准化的配置机制,能够使节点更易于配置和管理。通过参数,开发者可以在运行时动态地调整节点的行为,并且能够实现节点之间的参数共享和交互。参数的使用能够提高ROS 2系统的灵活性、可配置性和可维护性,使其更适用于各种不同的应用场景。