ROS参数服务器增删改查实操Python
ROS参数服务器增删改查实操Python
- 环境准备
- 参数服务器新增(修改)参数
- 参数服务器获取参数
- 参数服务器删除参数
ROS通信机制包括话题通信、服务通信和参数服务器三种通信方式,各原理及代码实现如下表
功能 | 博客链接 | 说明 |
---|---|---|
VScode配置 ROS 环境 | VScode创建ROS项目 ROS集成开发环境 | 使用VScode使用配置了ROS开发环境,实现ROS开发的第一步 |
话题通信理论 | ROS话题通信流程理论 | 介绍了话题通信机制的原理 |
ROS话题通信机制实操C++ | ROS话题通信机制实操C++ | 手把手的用C++实现了话题通信机制 |
ROS话题通信机制实操Python | ROS话题通信机制实操Python | 手把手的用Python实现了话题通信机制 |
ROS话题通信流程自定义msg格式 | ROS话题通信流程自定义msg格式 | 介绍了如何准备话题通信机制自定义msg数据格式,及相关配置 |
ROS话题通信机制自定义msg实战C++ | ROS话题通信机制自定义msg实战C++ | 手把手的用C++实现了话题通信机制自定义msg数据通信 |
ROS话题通信机制自定义msg实战Python | ROS话题通信机制自定义msg实战Python | 手把手的用Python实现了话题通信机制自定义msg数据通信 |
服务通信理论 | ROS服务通信流程理论 | 介绍了服务通信机制的原理 |
ROS服务通信自定义srv | ROS服务通信自定义srv | 介绍了如何准备服务通信机制自定义srv数据格式,及相关配置 |
ROS服务通信机制实操C++ | ROS服务通信机制实操C++ | 手把手的用C++实现了服务通信机制 |
ROS服务通信机制实操Python | ROS服务通信机制实操Python | 手把手的用Python实现了话题通信机制 |
参数服务器理论 | ROS参数服务器理论模型 | 介绍了参数服务器的原理 |
ROS参数服务器增删改查实操C++ | ROS参数服务器增删改查实操C++ | 用 C++ 实现了参数服务器的的增删改查操作 |
ROS参数服务器增删改查实操Python | ROS参数服务器增删改查实操Python | 用 Python 实现了参数服务器的的增删改查操作 |
环境准备
-
在plumbing_param_server功能包下新建一个scripts文件夹
-
在scripts文件夹添加.py文件
-
编辑配置文件
修改 plumbing_param_server功能包下的CMakeLists.txt,找到catkin_install_python,修改成如图所示:
-
给.py文件添加可执行文件
进入到 scripts 文件下,打开Terminal,执行 chmod +x *.py 对demo_param_set_p.py、 demo_param_get_p.py 、 demo_param_del_p.py文件添加可执行的权限
参数服务器新增(修改)参数
-
新增参数方法
调用set_param函数rospy.set_param("键","值")
-
代码实现
#! /usr/bin/env python3 import rospy"""参数服务器操作之新增与修改(二者API一样)_Python实现: """if __name__ == "__main__":rospy.init_node("param_set_p")# 设置各种类型参数rospy.set_param("p_int",10) # 整形类型rospy.set_param("p_double",3.14) # 浮点类型rospy.set_param("p_bool",True) # bool类型rospy.set_param("p_string","hello python") # 字符串类型rospy.set_param("p_list",["hello","haha","xixi"]) # 列表rospy.set_param("p_dict",{"name":"hulu","age":8}) # 字典# 修改rospy.set_param("p_int",100) # 修改参数值,和新增一样,设置不同的值即可
修改参数值,和新增一样,设置不同的值即可
参数服务器获取参数
-
查询参数
-
rospy.get_param(“键”, “默认值”)
键存在,返回对应的键的值,否则返回默认值,默认值可以不设置val = rospy.get_param("p_int", 0.5)
-
rospy.get_param_cached(“键”, “默认值”)
是对rospy.get_param的优化,如果之前查询过,就会有缓存,rospy.get_param_cached会优先查询缓存,如果缓存没有,再去参数中查找,这样就提高了查询效率。
键存在,返回对应的键的值,否则返回默认值val = rospy.get_param_cached("p_int", 0.5)
-
rospy.get_param_names()
获取所有参数服务器中的键names = rospy.get_param_names() for name in names:rospy.loginfo("name = %s",name)
-
rospy.has_param(“键”)
判断某个键是否存在,存在返回true,否则返回falseflag = rospy.has_param("p_int") if (flag):rospy.loginfo("p_int键存在") else:rospy.loginfo("p_int键不存在")
-
rospy.search_param(“键”)
查询某个键是否存在,如果存在返回键名,否则返回空key = rospy.search_param("p_int") rospy.loginfo("搜索的键 = %s",key)
-
-
代码实现
#! /usr/bin/env python3 import rospy"""参数服务器操作之查询_Python实现: get_param(键,默认值)当键存在时,返回对应的值,如果不存在返回默认值get_param_cached(键,默认值)当键存在时,返回对应的值,如果不存在返回默认值get_param_names获取所有参数服务器中的键has_param(键)判断某个键是否存在,存在返回true,否则返回falsesearch_param查询某个键是否存在,如果存在返回键名,否则返回空 """if __name__ == "__main__":rospy.init_node("get_param_p")# 1.get_paramint_value = rospy.get_param("p_int",10000)double_value = rospy.get_param("p_double")bool_value = rospy.get_param("p_bool")string_value = rospy.get_param("p_string")p_list = rospy.get_param("p_list")p_dict = rospy.get_param("p_dict")rospy.loginfo("获取的数据:%d,%.2f,%d,%s",int_value,double_value,bool_value,string_value)for ele in p_list:rospy.loginfo("ele = %s", ele)rospy.loginfo("name = %s, age = %d",p_dict["name"],p_dict["age"])# 2.get_param_cachedint_cached = rospy.get_param_cached("p_int")rospy.loginfo("缓存数据:%d",int_cached)# 3.get_param_namesnames = rospy.get_param_names()for name in names:rospy.loginfo("name = %s",name)rospy.loginfo("-"*80)# 4.has_paramflag = rospy.has_param("p_int")rospy.loginfo("包含p_int吗?%d",flag)# 5.search_paramkey = rospy.search_param("p_int")rospy.loginfo("搜索的键 = %s",key)
参数服务器删除参数
-
删除参数
rospy.delete_param(“键”)
键存在时,可以删除成功,键不存在时,会抛出异常try:rospy.delete_param("p_int") except Exception as e:rospy.loginfo("删除的参数不存在")
-
代码实现
#! /usr/bin/env python3 import rospy"""参数服务器操作之删除_Python实现:rospy.delete_param("键")键存在时,可以删除成功,键不存在时,会抛出异常 """if __name__ == "__main__":rospy.init_node("delete_param_p")try:rospy.delete_param("p_int")except Exception as e:rospy.loginfo("删除的参数不存在")