ROS2初级知识(5):参数如何管理?

发布于:2023-02-05 ⋅ 阅读:(915) ⋅ 点赞:(0)

一、ROS2参数基本概念

        参数是节点的配置值。您可以将参数视为节点设置。节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。在 ROS 2 中,每个节点都维护自己的参数。有关参数的更多背景信息,请参阅概念文档。

        要说ROS2的参数,最好需要对照ROS1的参数管理,比较两者,才能彻底搞清楚各自的参数特点。

二、开启演示方式

启动两个 turtlesim 节点,/turtlesim 和 /teleop_turtle。

打开一个新终端并运行:

ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

2.1 指令列出参数

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

ros2  param list

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

/teleop_turtle:
  qos_overrides./parameter_events.publisher.depth
  qos_overrides./parameter_events.publisher.durability
  qos_overrides./parameter_events.publisher.history
  qos_overrides./parameter_events.publisher.reliability
  scale_angular
  scale_linear
  use_sim_time
/turtlesim:
  background_b
  background_g
  background_r
  qos_overrides./parameter_events.publisher.depth
  qos_overrides./parameter_events.publisher.durability
  qos_overrides./parameter_events.publisher.history
  qos_overrides./parameter_events.publisher.reliability
  use_sim_time

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

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

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

ros2 param get

2.2 参数信息显示语句

        显示当前参数的类型和值,用下列语句:

ros2 param get <node_name> <parameter_name>

        让我们找出 /turtlesim 的参数 background_g 的当前值:

ros2 param get /turtlesim background_g

返回:

Integer value is: 86

        现在您知道 background_g 包含一个整数值。

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

2.3 设置参数值 

本文指出,设定参数有两个方式:

  1. 用set命令运行中改变
  2. 在服务调用时传入

在运行中改变参数值,用如下指令:

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

比如:这里我们改变 /turtlesim的背景颜色:

ros2 param set /turtlesim background_r 150

返回执行后结果:

Set parameter successful

目标的背景颜色已经改变如下:

三、 在程序内部定义参数

class TeleopTurtle
{
   ... ...
    rclcpp::Node::SharedPtr nh_;                       定义节点指针
    double linear_, angular_, l_scale_, a_scale_;      定义本地变量()

TeleopTurtle::TeleopTurtle():
  linear_(0),  angular_(0),  l_scale_(2.0),  a_scale_(2.0)
{
  nh_ = rclcpp::Node::make_shared("teleop_turtle");
  nh_->declare_parameter("scale_angular", rclcpp::ParameterValue(2.0));
  nh_->declare_parameter("scale_linear", rclcpp::ParameterValue(2.0));
  nh_->get_parameter("scale_angular", a_scale_);
  nh_->get_parameter("scale_linear", l_scale_);

}

        (一)以上代码的第一层解读,包含以下信息:

        1)class TeleopTurtle是一个封装类,是我们与未来的节点交换数据的中心。

        2)  rclcpp::Node::SharedPtr nh_;在class TeleopTurtle内部,至少有一个Node结构,将来可以与之通话。

         3) nh_ = rclcpp::Node::make_shared("teleop_turtle");这句话将节点实例化,注意,千万别把class TeleopTurtle误认为是节点。

  (二)以上代码的第二层解读:

        1)double linear_, angular_, l_scale_, a_scale_;接口变量,这些变量有两个好处:其一、外界可以改变它们,其二、class TeleopTurtle封装类可以将它们传递到Node节点中。

        2)nh_->declare_parameter("scale_angular", rclcpp::ParameterValue(2.0));将接口类内的属性变量,传递到Node节点内部。

(三)以上代码的第三层解读:

        1)nh_->set_parameter("scale_angular", a_scale_);通过get_parameter语句,将接口类中的属性变量值,传递给节点Node内的参数变量。

        2)nh_->get_parameter("scale_angular", a_scale_)同样的语法,可以获取节点内参数到接口类的对象中。

四、ros2 参数转储

        您可以使用以下命令查看节点的所有当前参数值:

ros2 param dump <node_name>

        该命令默认打印到标准输出 (stdout),也可以将参数值重定向到文件中以保存。要将您当前的 /turtlesim 参数配置保存到文件 turtlesim.yaml 中,请输入命令:

ros2 param dump /turtlesim > turtlesim.yaml

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

/turtlesim:
  ros__parameters:
    background_b: 255
    background_g: 86
    background_r: 150
    qos_overrides:
      /parameter_events:
        publisher:
          depth: 1000
          durability: volatile
          history: keep_last
          reliability: reliable
    use_sim_time: false

如果您想在将来重新加载具有相同参数的节点,则转储参数会派上用场。

五、ros2 参数加载

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

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 qos_overrides./parameter_events.publisher.depth failed: parameter 'qos_overrides./parameter_events.publisher.depth' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.durability failed: parameter 'qos_overrides./parameter_events.publisher.durability' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.history failed: parameter 'qos_overrides./parameter_events.publisher.history' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.reliability failed: parameter 'qos_overrides./parameter_events.publisher.reliability' cannot be set because it is read-only
Set parameter use_sim_time successful

重要提示:只读参数只能在启动时修改,之后不能修改,这就是“qos_overrides”参数出现警告的原因。

六、在节点启动时加载参数文件

        要使用您保存的参数值启动同一个节点,请使用:

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 窗口应该像往常一样出现,但带有您之前设置的紫色背景。

在这种情况下,参数在启动时被修改,因此指定的只读参数也将生效。

七、总结

        ROS2的参数机制,与ROS1有重大不同。ROS2的参数不再是【全局变量】、【参数服务】的概念,而是所有参数都归属于具体节点,访问的时候一定是带节点namespace进行访问。

本文含有隐藏内容,请 开通VIP 后查看