一.理论模型
参数服务器在ROS中主要用于实现不同节点之间的数据共享。
参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。参数服务器,一般适用于存在数据共享的一些应用场景。
导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径
上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:
- 路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数
参数服务器,一般适用于存在数据共享的一些应用场景。
1 概念与作用
概念:以共享的方式实现不同节点之间数据交互的通信模式。
作用:存储一些多节点共享的数据,类似于全局变量。
2 理论模型
参数服务器实现是最为简单的,该模型如下图所示,该模型中涉及到三个角色:
- ROS Master (管理者)
- Talker (参数设置者)
- Listener (参数调用者)
流程:
- Talker设置参数:通过 RPC 向参数服务器发送参数(包括参数名与参数值),ROS Master 将参数保存到参数列表中
- Listener获取参数:通过 RPC 向参数服务器发送参数查找请求,请求中包含要查找的参数名
- 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函数阻止报错