• ROS2——参数(十二)


    ROS2机器人操作系统


    前言

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

    一、参数概念

    全局字典

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

    可动态监控

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

    二、使用案例

    1.小海龟例程中的参数

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

    $ ros2 run turtlesim turtlesim_node
    $ ros2 run turtlesim turtle_teleop_key
    
    • 1
    • 2

    在这里插入图片描述

    查看参数列表

    当前系统中有哪些参数呢?我们可以启动一个终端,并使用如下命令查询:

     ros2 param list
    
    • 1

    在这里插入图片描述

    参数查询与修改

    如果想要查询或者修改某个参数的值,可以在param命令后边跟get或者set子命令:

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

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

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

    2.参数编程

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

    运行效果

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

    $ ros2 run learning_parameter param_declare
    $ ros2 param set param_declare robot_name turtle
    
    • 1
    • 2

    在这里插入图片描述

    代码解析

    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接口
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    微机原理与系统设计笔记6 | 存储器系统设计
    STM32实战总结:HAL之I2C
    服务service
    C. 3SUM Closure(规律搜寻)
    vue中,封装组件demo
    gstream 录制音频
    把微信变成找券返利机器人,淘宝客查券返利小助手自动赚佣金实现方法分享
    多模态大模型总结
    nodejs+wasm+rust debug及性能分析
    Gitee——详细教程如何将远程仓库与本地仓库建立链接
  • 原文地址:https://blog.csdn.net/qq_51963216/article/details/125620888