ros2 基础学习11-参数的定义及示例

42 篇文章 2 订阅
42 篇文章 1 订阅

话题、服务、动作,不知道这三种通信机制大家是否已经了解清楚,本节我们再来介绍一种ROS系统中常用的数据传输方式——参数。

类似C++编程中的全局变量,可以便于在多个程序中共享某些数据,参数是ROS机器人系统中的全局字典,可以运行多个节点中共享数据。

ros2 的参数定义和基本使用和ros1 基本一致,如果了解ros1 参数的 这节 就随便看看就可以了。在java 开发中 类似 全局字典表的功能

通信模型

比如在机器视觉识别的时候,有很多参数都会影响视觉识别的效果。

在这里插入图片描述
在NodeA相机驱动节点中,就需要考虑很多问题,相机连接到哪个usb端口,使用的图像分辨率是多少,曝光度和编码格式分别是什么,这些都可以通过参数设置,我们可以通过配置文件或者程序进行设置。

NodeB节点中也是一样,图像识别使用的阈值是多少,整个图像面积很大,那个部分是我们关注的核心区域,识别过程是否需要美颜等等,就像我们使用美颜相机一样,我们可以通过滑动条或者输入框设置很多参数,不同参数设置后,都会改变执行功能的一些效果。

这就是参数的作用。

全局字典

在ROS系统中,参数是以全局字典的形态存在的,什么叫字典?就像真实的字典一样,由名称和数值组成,也叫做键和值,合成键值。或者我们也可以理解为,就像编程中的参数一样,有一个参数名 ,然后跟一个等号,后边就是参数值了,在使用的时候,访问这个参数名即可。

可动态监控

在ROS2中,参数的特性非常丰富,比如某一个节点共享了一个参数,其他节点都可以访问,如果某一个节点对参数进行了修改,其他节点也有办法立刻知道,从而获取最新的数值。这在参数的高级编程中,大家都可能会用到。

案例一:小海龟例程中的参数

在小海龟的例程中,仿真器也提供了不少参数,我们一起来通过这个例程,熟悉下参数的含义和命令行的使用方法。

启动两个终端,分别运行小海龟仿真器和键盘控制节点:

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

在这里插入图片描述
查看参数列表
当前系统中有哪些参数呢?我们可以启动一个终端,并使用如下命令查询:

ros2 param list

在这里插入图片描述
参数查询与修改
如果想要查询或者修改某个参数的值,可以在param命令后边跟get或者set子命令:

ros2 param describe turtlesim background_b   # 查看某个参数的描述信息
ros2 param get turtlesim background_b        # 查询某个参数的值
ros2 param set turtlesim background_b 10     # 修改某个参数的值

参数文件保存与加载
一个一个查询/修改参数太麻烦了,不如试一试参数文件,ROS中的参数文件使用yaml格式,可以在param命令后边跟dump子命令,将某个节点的参数都保存到文件中,或者通过load命令一次性加载某个参数文件中的所有内容:

ros2 param dump turtlesim >> turtlesim.yaml  # 将某个节点的参数保存到参数文件中
ros2 param load turtlesim turtlesim.yaml     # 一次性加载某一个文件中的所有参数

在这里插入图片描述

案例二:参数编程

接下来就要开始写程序了,在程序中设置参数和读取参数都比较简单,一两句函数就可以实现,我们先来体验一下这几个函数的使用方法。

运行效果
启动一个终端,先运行第一句指令,启动param_declare节点,终端中可以看到循环打印的日志信息,其中的“mbot”就是我们设置的一个参数值,参数名称是“robot_name”,通过命令行修改这个参数,看下终端中会发生什么?

ros2 run learning_parameter param_declare
ros2 param set param_declare robot_name turtle

在这里插入图片描述
代码解析
我们来看下在代码中,如何声明、创建、修改一个参数的值。

关键代码
learning_parameter/param_declare.py

import rclpy                                     # ROS2 Python接口库
from rclpy.node   import Node                    # ROS2 节点类

class ParameterNode(Node):
    def __init__(self, name):
        super().__init__(name)                                    # ROS2节点父类初始化
        self.timer = self.create_timer(2, self.timer_callback)    # 创建一个定时器(单位为秒的周期,定时执行的回调函数)
        self.declare_parameter('robot_name', 'mbot')              # 创建一个参数,并设置参数的默认值

    def timer_callback(self):                                      # 创建定时器周期执行的回调函数
        robot_name_param = self.get_parameter('robot_name').get_parameter_value().string_value   # 从ROS2系统中读取参数的值

        self.get_logger().info('Hello %s!' % robot_name_param)     # 输出日志信息,打印读取到的参数值

        new_name_param = rclpy.parameter.Parameter('robot_name',   # 重新将参数值设置为指定值
                            rclpy.Parameter.Type.STRING, 'mbot')
        all_new_parameters = [new_name_param]
        self.set_parameters(all_new_parameters)                    # 将重新创建的参数列表发送给ROS2系统

def main(args=None):                                 # ROS2节点主入口main函数
    rclpy.init(args=args)                            # ROS2 Python接口初始化
    node = ParameterNode("param_declare")            # 创建ROS2节点对象并进行初始化
    rclpy.spin(node)                                 # 循环等待ROS2退出
    node.destroy_node()                              # 销毁节点对象
    rclpy.shutdown()                                 # 关闭ROS2 Python接口

完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:

entry_points={
    'console_scripts': [
     'param_declare          = learning_parameter.param_declare:main',
    ],
},

以上是重要的两步,如果你自己要测试验证下需要你新增功能包learning_parameter,然后将代码放在功能包下,然后编译后再运行上面的节点可测试。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ROS的launch文件中,可以使用arg标签定义参数,并将其传递给节点或其他launch文件。arg标签的语法如下: ```xml <arg name="参数名称" default="默认值"/> ``` 其中,name属性表示参数的名称,default属性表示参数的默认值。使用该标签可以定义多个参数,并将其传递给节点或其他launch文件。 例如,以下是一个使用arg标签定义参数示例: ```xml <launch> <!-- 定义参数 --> <arg name="foo" default="bar"/> <!-- 启动节点 --> <node name="my_node" pkg="my_package" type="my_node.py"> <!-- 传递参数 --> <param name="foo_param" value="$(arg foo)"/> </node> </launch> ``` 在上述示例中,arg标签定义了一个名为"foo"的参数,并将其默认值设置为"bar"。在启动节点时,使用param标签将参数传递给节点,并使用"$(arg foo)"的方式获取参数的值。 如果需要在命令行中传递参数,可以使用以下方式运行launch文件: ```bash $ roslaunch my_package my_launch_file.launch foo:=value ``` 在上述命令中,"foo:=value"表示将名为"foo"的参数的值设置为"value"。在launch文件中,可以使用$(arg foo)的方式获取该参数的值。 除了使用arg标签定义参数外,还可以使用rosparam命令在终端中设置参数的值,并在launch文件中使用param标签获取该参数的值。例如,可以使用以下命令设置名为"foo"的参数的值: ```bash $ rosparam set foo value ``` 在launch文件中,可以使用以下方式获取该参数的值: ```xml <param name="foo_param" value="$(arg foo)"/> ``` 以上是ROS launch文件中定义参数的几种方式,开发者可以根据实际需要选择适合的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海聊智造

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值