• 11.ROS编程学习:参数管理机制python实现


    学习参考:赵虚左的课程、古月的ROS机器人开发实践、约瑟夫的精通ROS机器人编程

    一、增

    创建scripts文件夹,创建demo01_param_set_p.py 

    demo01_param_set_p.py 

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("param_set_p")
    6. rospy.set_param("zhonglei","huang")
    7. rospy.set_param("banjing",0.20)
    8. rospy.loginfo("参数添加成功")

    对比c++,不在需要句柄,同时程序非常简洁。

    rospy.set_param("zhonglei","huang")

    通过句点表示法调用rospy下的set_param函数,第一个参数为键名,第二个参数为键值。

    给scripts文件夹内python文件添加可执行权限

    chmod +x *.py

    CMakeList.txt配置

    1. catkin_install_python(PROGRAMS
    2. scripts/demo01_param_set_p.py
    3. DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    4. )

    启动ROS Master,运行代码

    1. roscore
    2. rosrun parameter_server demo01_param_set_p.py

    检查参数服务器参数添加情况

    rosparam list

    ros参数服务器参数列出。 

     

     查询键名所对应的键值

    rosparam get 键名
    rosparam get banjing

     二、改

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("param_set_p")
    6. rospy.set_param("zhonglei","huang")
    7. rospy.set_param("banjing",0.20)
    8. rospy.set_param("banjing",0.88)
    9. rospy.loginfo("参数添加成功")

    通过覆盖的形式进行修改。

    1. rosrun parameter_server demo01_param_set_p.py
    2. rosparam get banjing

     三、读

    创建demo01_param_get_p.py,其中添加可执行权限与配置CMakeList.txt与之前流程相同。

    1.第一种方法get_param

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("get_param_p")
    6. banjing1 = rospy.get_param("banjing",0.30)
    7. banjing2 = rospy.get_param("banjing_1",0.40)
    8. rospy.loginfo("banjing:%.2f",banjing1)
    9. rospy.loginfo("banjing_1:%.2f",banjing2)

    其中读取利用get_param函数,第一个参数为读取键名,第二个参数是没找到键名时给的默认值。

    banjing是之前添加的参数服务器参数,所以能读取到键值,banjing_1为不存在的键名,故其键值由于get_param函数的第二个参数,取默认值0.40。

    2.第二种方法 get_param_cached

    从缓存查询,当键已经被查询过,这个函数可以直接从缓存查询,提高效率。

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("get_param_p")
    6. banjing1 = rospy.get_param("banjing",0.30)
    7. banjing2 = rospy.get_param("banjing_1",0.40)
    8. rospy.loginfo("banjing:%.2f",banjing1)
    9. rospy.loginfo("banjing_1:%.2f",banjing2)
    10. banjing3 = rospy.get_param_cached("banjing",0.30)
    11. banjing4 = rospy.get_param_cached("banjing_1",0.40)
    12. rospy.loginfo("banjing:%.2f",banjing3)
    13. rospy.loginfo("banjing_1:%.2f",banjing4)

    其函数使用与第一种方法相同。结果也相同。

     3.第三种方法get_param_name

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("get_param_p")
    6. banjing1 = rospy.get_param("banjing",0.30)
    7. banjing2 = rospy.get_param("banjing_1",0.40)
    8. rospy.loginfo("banjing:%.2f",banjing1)
    9. rospy.loginfo("banjing_1:%.2f",banjing2)
    10. banjing3 = rospy.get_param_cached("banjing",0.30)
    11. banjing4 = rospy.get_param_cached("banjing_1",0.40)
    12. rospy.loginfo("banjing:%.2f",banjing3)
    13. rospy.loginfo("banjing_1:%.2f",banjing4)
    14. names = rospy.get_param_names()
    15. for name in names:
    16. rospy.loginfo("name = %s",name)

    关键部分

    1. names = rospy.get_param_names()
    2. for name in names:
    3. rospy.loginfo("name = %s",name)

    读取所有的键名,并存入一个列表,其中这个案例充分证明了python的优越性。如下是c++实现,代码可读性对比显然易见。

    1. ros::NodeHandle n;
    2. std::vector names;
    3. n.getParamNames(names);
    4. for (auto &&name : names)
    5. {
    6. ROS_INFO("遍历到的元素:%s",name.c_str());
    7. }

    结果:

    4.第4种方法has_param

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("get_param_p")
    6. banjing1 = rospy.get_param("banjing",0.30)
    7. banjing2 = rospy.get_param("banjing_1",0.40)
    8. rospy.loginfo("banjing:%.2f",banjing1)
    9. rospy.loginfo("banjing_1:%.2f",banjing2)
    10. banjing3 = rospy.get_param_cached("banjing",0.30)
    11. banjing4 = rospy.get_param_cached("banjing_1",0.40)
    12. rospy.loginfo("banjing:%.2f",banjing3)
    13. rospy.loginfo("banjing_1:%.2f",banjing4)
    14. names = rospy.get_param_names()
    15. for name in names:
    16. rospy.loginfo("name = %s",name)
    17. flag1 = rospy.has_param("banjing")
    18. flag2 = rospy.has_param("banjing_1")
    19. if flag1:
    20. rospy.loginfo("banjing存在")
    21. else:
    22. rospy.loginfo("banjing不存在")
    23. if flag2:
    24. rospy.loginfo("banjing_1存在")
    25. else:
    26. rospy.loginfo("banjing_1不存在")

    关键部分

    1. flag1 = rospy.has_param("banjing")
    2. flag2 = rospy.has_param("banjing_1")
    3. if flag1:
    4. rospy.loginfo("banjing存在")
    5. else:
    6. rospy.loginfo("banjing不存在")
    7. if flag2:
    8. rospy.loginfo("banjing_1存在")
    9. else:
    10. rospy.loginfo("banjing_1不存在")

    has_param参数为键名,返回值为代表着查询成功与否的布尔类型。

    结果:

     符合预期。

    5.第5种方法search_param

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("get_param_p")
    6. banjing1 = rospy.get_param("banjing",0.30)
    7. banjing2 = rospy.get_param("banjing_1",0.40)
    8. rospy.loginfo("banjing:%.2f",banjing1)
    9. rospy.loginfo("banjing_1:%.2f",banjing2)
    10. banjing3 = rospy.get_param_cached("banjing",0.30)
    11. banjing4 = rospy.get_param_cached("banjing_1",0.40)
    12. rospy.loginfo("banjing:%.2f",banjing3)
    13. rospy.loginfo("banjing_1:%.2f",banjing4)
    14. names = rospy.get_param_names()
    15. for name in names:
    16. rospy.loginfo("name = %s",name)
    17. flag1 = rospy.has_param("banjing")
    18. flag2 = rospy.has_param("banjing_1")
    19. if flag1:
    20. rospy.loginfo("banjing存在")
    21. else:
    22. rospy.loginfo("banjing不存在")
    23. if flag2:
    24. rospy.loginfo("banjing_1存在")
    25. else:
    26. rospy.loginfo("banjing_1不存在")
    27. key1 = rospy.search_param("banjing")
    28. key2 = rospy.search_param("banjing_1")
    29. rospy.loginfo("查询到key1为%s",key1)
    30. rospy.loginfo("查询到key2为%s",key2)

    关键部分

    1. key1 = rospy.search_param("banjing")
    2. key2 = rospy.search_param("banjing_1")
    3. rospy.loginfo("查询到key1为%s",key1)
    4. rospy.loginfo("查询到key2为%s",key2)

    search_param函数返回值为查询的键名,存在时返回键名,不存在时返回None。

    结果:

     四、删

    创建demo01_param_del_p.py,其中添加可执行权限,CMakeList.txt与之前流程相同。 

     相较于c++的实现,如果没学过python的异常操作,c++实现更容易。

    demo01_param_del_p.py

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("del_param_p")
    6. rospy.delete_param("banjing")
    7. rospy.loginfo("删除成功")
    8. try:
    9. rospy.delete_param("banjing")
    10. except Exception as e:
    11. rospy.loginfo("被删除的参数不存在")

    第一次删除成功删除,第二次删除由于键已经被删除,找不到键,故采用异常操作,目的是报错了程序仍能继续进行。 

    结果:

     将刚刚的zhonglei键也删除掉

    1. #! /usr/bin/env python
    2. # -*- coding: UTF-8 -*-
    3. import rospy
    4. if __name__ == "__main__":
    5. rospy.init_node("del_param_p")
    6. # rospy.delete_param("banjing")
    7. # rospy.loginfo("删除成功")
    8. try:
    9. rospy.delete_param("banjing")
    10. except Exception as e:
    11. rospy.loginfo("被删除的参数不存在")
    12. try:
    13. rospy.delete_param("zhonglei")
    14. except Exception as e:
    15. rospy.loginfo("被删除的参数不存在")

    结果:banjing刚刚已经被删了,报出异常。zhonglei没有被删,为存在状态了,没有报异常。

     查询参数服务器参数

    rosparam list

     只剩下系统自带的参数了。

  • 相关阅读:
    Linux-shell编程入门基础
    永久关机windows系统自动更新
    常用的一些高阶函数
    PCL 基于全局最大一致点集进行点云配准
    vue3面试题:2022 最新前端 Vue 3.0 面试题及答案(持续更新中……)
    java 操作 milvus 2.1.4
    node包依赖下载管理
    狂神说笔记 快速入门Nginx
    [bug总结]: Feign调用GET请求找不到请求体实体类
    Dubbo配置基础V1.0.0
  • 原文地址:https://blog.csdn.net/wzfafabga/article/details/127432682