ROS通信机制:参数服务器

ROS通信机制:参数服务器

  参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场景如下:

导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径,上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节 点与本地路径规划节点都可以从参数服务器中调用这些参数

  参数服务器,一般适用于存在数据共享的一些应用场景。存储一些多节点共享的数据,类似编程语言中的全局变量。

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

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

  ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。

1、参数服务器的新增和修改

#! /usr/bin/env python

import rospy
"""
示例:服务器参数的新增与修改
需求:在参数服务器中设置机器人的属性、型号、半径
所用函数:rospy.set_param()


"""
if __name__=="__main__":
    #初始化ROS节点
    rospy.init_node("param_set")
    #新增参数,键值对(类似python字典语法)
    rospy.set_param("name","car")
    rospy.set_param("radius",0.15)

  之后正常修改配置文件CMakelist,增加文件可执行权限,ctrl+shift+B编译,再sourece后执行文件即可执行成功,由于该程序没有日志输出,所以终端没有任何显示。

我们可以通过ros命令来查看我们刚才设置的服务器参数和值

查看参数列表:rosparam list

获取参数值:rosparam get 键名

在这里插入图片描述

修改参数只需要用同样的函数输入键值然后传入新的参数即可。

2、参数服务器获取参数(参数查询)

可用函数:
(1)get_param(键,默认值)当该键存在时返回它的值,不存在时会返回第二个参数设定的默认值
(2)get_param_cached,和(1)相同,但是查询过会放在缓存中,下次不用反复到服务器查询,效率更高
(3)get_param_names。列出当前参数列表,包括自定义的和系统自带的
(4)has_param,查询某个参数是否存在,返回bool类型,是/否
(5)search_param,查询某个参数是否存在,存在则返回键名

#! /usr/lib/env python

import rospy

"""
示例:参数的查询
可用函数:
get_param(键,默认值)当该键存在时返回它的值,不存在时会返回第二个参数设定的默认值
get_param_cached
get_param_names
has_param
search_param
"""

if __name__=="__main__":
    rospy.init_node("get_param")
    radius = rospy.get_param("radius",0.5)
    radius22 = rospy.get_param("radius22",0.6)
    rospy.loginfo("radius的值是%.2f",radius)
    rospy.loginfo("radius22的值是%.2f",radius22)

    #get_param_cached 和get_param功能是完全一样的,但是cached查询过后会将结果放在缓存里,下次无需到服务器查询,效率更高。
    radius = rospy.get_param_cached("radius",0.5)
    radius22 = rospy.get_param_cached("radius22",0.6)
    rospy.loginfo("radius的值是%.2f",radius)
    rospy.loginfo("radius的值是%.2f",radius22)

    #get_param_names,列出当前系统中的参数列表,包括自定义的和系统自带的
    # names = rospy.get_param_names()
    # for name in names:
    #     rospy.loginfo = ("name=%s",name)

    #has_param,判断该参数是否存在
    flag1 = rospy.has_param("radius")
    if flag1:
        rospy.loginfo("radius 存在")
    else:
        rospy.loginfo("radius 不存在")

    #search_param,用于查询某个建是否存在,存在即返回键的名称
    key = rospy.search_param("radius")
    rospy.loginfo("key = %s",key)

在这里插入图片描述

3、参数服务器删除参数

使用函数:rospy.delete_param(“radius”)

  但是只使用这一句命令进行参数删除时,如果重复执行,就会报错,该参数不存在。故而这里用try:except,else语句进行处理,如果异常就输出该参数不存在,执行成功即输出该参数被成功删除。

#! /usr/lib/env python

import rospy
"""
示例:参数的删除
函数:delete_param()
"""
if __name__ == "__main__":
    rospy.init_node("delete_param")
    try:
        rospy.delete_param("radius")
    except Exception:
        rospy.loginfo("不存在该参数或该参数已经被删除过了")
    else:
        rospy.loginfo("参数删除成功!")

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45205599/article/details/128966136