参数服务器

一.理论模型

参数服务器在ROS中主要用于实现不同节点之间的数据共享

参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。参数服务器,一般适用于存在数据共享的一些应用场景。

导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径

上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:

  • 路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数

参数服务器,一般适用于存在数据共享的一些应用场景。

1 概念与作用

概念:以共享的方式实现不同节点之间数据交互的通信模式。

作用:存储一些多节点共享的数据,类似于全局变量

2 理论模型

参数服务器实现是最为简单的,该模型如下图所示,该模型中涉及到三个角色:

  • ROS Master (管理者)
  • Talker (参数设置者)
  • Listener (参数调用者)

流程:

  1. Talker设置参数:通过 RPC 向参数服务器发送参数(包括参数名与参数值),ROS Master 将参数保存到参数列表中
  2. Listener获取参数:通过 RPC 向参数服务器发送参数查找请求,请求中包含要查找的参数名
  3. ROS Master 向 Listener 发送参数值:ROS Master 根据步骤2请求提供的参数名查找参数值,并将查询结果通过 RPC 发送给 Listener

注意:参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据

二. 参数操作(python)

需求:实现参数服务器参数的增删改查操作

1、参数服务器新增(修改)参数

新建功能包-->创建python文件

#! /usr/bin/env python
# coding=UTF-8

# 1.导包
import rospy
"""
    演示参数的新增与修改
    需求:在参数服务器中设置机器人属性,型号,半径
    实现:
        rospy.set_param()
"""

if __name__=="__main__":
# # 2.初始化ros节点
    rospy.init_node("param_set")
    # 3.新增参数
    rospy.set_param("type","wurenche")  #设置参数的键(类型),值(内容   无人车)
    rospy.set_param("radiys","0.15")
    rospy.set_param("p_int",10)
    rospy.set_param("p_double",3.14)

    #修改参数``
    rospy.set_param("radiys","1.5")  #修改即覆盖前面的值

查看新建的参数 

  

2、参数服务器获取参数

param_get.py文件

#! /usr/bin/env python
# coding=UTF-8
import rospy

"""
    参数服务器操作之查询_Python实现:    
        get_param(键,默认值)
            当键存在时,返回对应的值,如果不存在返回默认值

        get_param_cached     和get_param使用一致,效率更高

        get_param_names  获取所有键的名称

        has_param         判断某个键是否存在

        search_param    查找某个键是否存在,返回键名
"""


if __name__=="__main__":
     # 初始化ros节点
    rospy.init_node("get_param")
    # 1.get_param
    radius=rospy.get_param("radius",0.5) #参数的键,  默认值
    radius2 = rospy.get_param("radius_p2", 0.5)  # 如果服务器没有该参数,则给予默认值,创建该参数
    rospy.loginfo("radius = %.2f", radius)
    rospy.loginfo("radius2 = %.2f", radius2)

#2. get_param_cached    
    # radius3 = rospy.get_param_cached("radius_p3", 0.5)  # 读取缓存,效率更高 
    # radius4 = rospy.get_param_cached("radius_p4", 0.5) 
    # rospy.loginfo("radius3 = %.2f", radius3)
    # rospy.loginfo("radius4 = %.2f", radius4)

    # 3.get_param_names    获取所有键的名称
    names=rospy.get_param_names()
    for name in names:
        rospy.loginfo("name = %s", name)

    # 4.has_param      判断某个键是否存在
    flag1=rospy.has_param("raddius")
    if flag1:
        rospy.loginfo("radius存在")
    else:
        rospy.loginfo("radius存在")

    # 5. search_param     查找某个键是否存在,返回键名
    key=rospy.search_param("radius")

    rospy.loginfo("key = %s", key)

接着就是保存、编译、授予python权限、写CMake、启动roscore、添加环境(source)、运行

3、参数服务器删除参数

param_del.py文件

#! /usr/bin/env python
# coding=UTF-8
import rospy

"""
    参数服务器操作之删除_Python实现:
    rospy.delete_param("键")
    键存在时,可以删除成功,键不存在时,会抛出异常
"""

if __name__=="__main__":

    rospy.init_node("del_param")

    # 删除参数
    try:
        rospy.delete_param("radious")
    except Exception as e:
        rospy.loginfo("删除失败")

 同一个参数删除两次就会报错    try函数阻止报错

参考

https://zhuanlan.zhihu.com/p/439945586

http://www.autolabor.com.cn/book/ROSTutorials/di-2-zhang-ros-jia-gou-she-ji/24-can-shu-fu-wu-qi/233-can-shu-caozuo-b-python.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值