参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,类似于编程语言中的全局变量
参数服务器理论模型
ROS Master为管理者,Talker为参数设置者,Listener为参数调用者。
ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。
整个流程由以下步骤实现:
1.Talker 设置参数
Talker 通过 RPC 向参数服务器发送参数(包括参数名与参数值),ROS Master 将参数保存到参数列表中。
2.Listener 获取参数
Listener 通过 RPC 向参数服务器发送参数查找请求,请求中包含要查找的参数名。
3.ROS Master 向 Listener 发送参数值
ROS Master 根据步骤2请求提供的参数名查找参数值,并将查询结果通过 RPC 发送给 Listener。
注:参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据
参数可使用数据类型:
-
32-bit integers
-
booleans
-
strings
-
doubles
-
iso8601 dates
-
lists
-
base64-encoded binary data
-
字典
参数操作(Python)
1.参数服务器新增(修改)参数
#! /usr/bin?env python
import rospy
if __name__== "__main__":
#初始化ROS节点
rospy.init_node("param_set_p")
#新增参数
rospy.set_param("type_p","xioaHuangche")
rospy.set_param("radius_p",0.15)
#修改参数
rospy.set_param("radius_p",0.2)
2.参数服务器获取参数
#! /usr/bin/env python
import rospy
if __name__ == "__main__":
#初始化ROS节点
rospy.init_node("get_param_p")
#1. get_param
radius = rospy.get_param("radius_p",0.5)
radius2 = rospy.get_param("radius_xxx",0.5)
rospy.loginfo("radius = %.2f",radius)
rospy.loginfo("radius2 = %.2f",radius2)
#2. get_param_ached 效率更高,从缓存中查数据
radius3 = rospy.get_param_cached("radius_p",0.5)
radius4 = rospy.get_param_cached("radius_xxx",0.5)
rospy.loginfo("radius3 = %.2f",radius3)
rospy.loginfo("radius4 = %.2f",radius4)
#3. get_param_name 获取所有参数的键
names = rospy.get_param_names()
for name in names:
rospy.loginfo("name = %s",name)
#4. has_param
flag1 = rospy.has_param("radius_p")
if flag1:
rospy.loginfo("radius_p 存在")
else:
rospy.loginfo("radius_p 不存在")
flag2 = rospy.has_param("radius_xxx")
if flag2:
rospy.loginfo("radius_xxx 存在")
else:
rospy.loginfo("radius_xxx 不存在")
#4. search_param
key = rospy.search_param("radius_p")
rospy.loginfo("key = %s",key)
3.参数服务器删除参数
#! /usr/bin/env python
import rospy
if __name__ == "__main__":
rospy.init_node("delete_param_p")
try:
rospy.delete_param("p_int")
except Exception as e:
rospy.loginfo("删除失败")