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("参数删除成功!")