• 机器人操作系统入门(七)rospy客户端库


    参考资料:

    https://www.icourse163.org/course/ISCAS-1002580008?tid=1003713012  //中国大学MOOC

    https://www.bilibili.com/video/av23401751  //B站

    《ROS操作系统入门讲义》PDF下载

    链接:https://pan.baidu.com/s/1OCja2WLDRnjYXMrpnZ3-sQ 
    提取码:mziy

    第七章 rospy

    一、rospy VS roscpp

    1、位于 /opt/ros/kinetic/lib/python2.7/dist-packages/rospy       //可以视为一个python的模块

    2、区别

    (1)rospy没有一个NodeHandle,创建publisher、subscriber等操作都被直接封装成了rospy中的函数或类,调用起来简单直观

    (2)一些接口的命名不一致

    注:

    • 相比于C++的开发,用Python来写ROS程序开发效率大大提高
    • 但Python的执行效率较低,同样一个功能用Python运行的耗时会高于C++。因此我们开发SLAM、路径规划、机器视觉等方面的算法时,往往优先选择C++
    • ROS中绝大多数基本指令,例如 rostopic, roslaunch 都是用python开发的,简单轻巧

    二、ROS中Python代码的组织方式

    1、单独的python脚本:放于script/路径下   //适用于简单程序

    your_package

    ——scripts/

    ————your_script.py

    2、Python模块    //体量较大的程序

    your_package

    ——src/

    ————your_package/

    ——————_init_.py

    ——————modulefiles.py

    ——scripts/

    ————your_script.py

    ——setup.py

    注:

    三、rospy常用API

    1、Node相关

    2、Topic相关

    (1)函数

    (2)Publisher类

    (3)Subscriber类

    3、Service相关

    (1)函数

    (2)Service类(server)

    (3)ServiceProxy类(client)

    4、Param相关

    (1)函数

    5、时钟相关

    (1)函数

    (2)Time类

    (3)Duration类

    (4)Rate类

    四、topic in rospy

    1、自定义消息及模块生成

    (1)gps.msg的定义:

    string state  #工作状态
    float32 x  #x坐标  
    float32 y  #y坐标

    (2)消息模块生成:创建的msg在catkin_make之后会在~/catkin_ws/devel/lib/python2.7/dist-packages/topic_demo下生成msg模块(module);随后可以在python程序中通过 from topic_demo import gps 进行调用

    2、消息发布节点

    (1)topic_demo/scripts/pytalker.py:

    (2)与C++的区别

    • rospy中没有设计NodeHandle句柄,创建topic、service等等操作都直接用rospy里对应的方法
    • rospy中节点的初始化不一定得放在程序的开头,在Publisher建立后再初始化也没问题
    • 消息的创建更加简单,比如gps类型的消息可以直接用类似于构造函数的方式 gps(state,x,y) 来创建
    • 日志的输出方式不同:C++中是 ROS_INFO() ,而Python中是 rospy.loginfo()
    • 判断节点是否关闭的函数不同:C++用的是 ros::ok() 而Python中的接口是 rospy.is_shutdown()

     注:roscpp和rospy的接口并不一致;ROS2中解决了这个问题,不同的客户端库rclcpp和rclpy等都是基于共同的核心ROS客户端库rcl来开发的

    3、消息订阅节点

    (1)topic_demo/scripts/pylistener.py:

    (2)与C++区别:rospy里没有 spinOnce() ,只有spin()

    注:建立完talker和listener之后,经过 catkin_make ,就完成了python版的topic通信模型

    Python是解释性语言,不需要使用Cmake进行编译,可以直接运行,但是“message_generation”需要经过Cmake编译,生成msg类型

    五、service in rospy

    1、srv文件 Greeting.srv

    string name
    int32 age
    ---
    string feedback

    注:必须先修改CMakeLists.txt文件,随后catkin编译系统会自动构建自定义的msg、srv和action文件,生成对应的C++、Python、LISP等语言下可用的库或模块

    建立了一个msg或srv文件,不可以直接在程序中使用,必须在 CMakeLists.txt 中添加关于消息创建、指定消息/服务文件那几个宏命令

    2、提供服务节点(server)

    (1)service_demo/scripts/server_demo.py:

    (2)与C++区别:server端的处理函数  

    C++的handle_function()传入的参数是整个srv对象的request和response两部分,返回值是bool型,显示这次服务是否成功地处理

    Python的handle_function()传入的只有request,返回值是response

    3、服务请求节点(client)

    (1)service_demo/scripts/client_demo.py:

    六、param与time

    1、相比roscpp中有两套对param操作的API,rospy关于param的函数就显得简单多了,包括了增删查改等:

      rospy.get_param() , rospy.set_param() , rospy.has_param() , rospy.delete_param() , rospy.search_param() , rospy.get_param_names()

    2、param_demo:

    3、时钟:rospy中的关于时钟的操作和roscpp是一致的,都有Time、Duration和Rate三个类  //Time标识的是某个时刻,如22:00;而Duration表示的是时长,如一周;

    Time和Duration结构相同

    int32 secs  #秒
    int32 nsecs  #纳秒

    (1)创建Time和Duration:都是 _init_(self,secs=0, nsecs=0) ,指定秒和纳秒

    time_now1 = rospy.get_rostime() #当前时刻的Time对象 返回Time对象
    time_now2 = rospy.Time.now() #同上
    time_now3 = rospy.get_time() #得到当前时间,返回float 4单位秒
    time_4 = rospy.Time(5) #创建5s的时刻
    duration = rospy.Duration(3*60) #创建3min时长

    注:于Time、Duration之间的加减法和类型转换,和roscpp中的完全一致

    4、sleep

    duration.sleep() #挂起
    rospy.sleep(duration) #同上,这两种方式效果完全一致
    loop_rate = Rate(5) #利用Rate来控制循环频率
    while(rospy.is_shutdown()):
    loop_rate.sleep() #挂起,会考虑上次loop_rate.sleep的时间

    注:Rate类中的sleep主要用来保持一个循环按照固定的频率,会考虑上次sleep的时间,从而使整个循环严格按照指定的频率

    5、定时器Timer:不是用句柄来创建,而是直接 rospy.Timer(Duration, callback) ,第一个参数是时长,第二个参数是回调函数

    def my_callback(event):  #回调函数的传入值是 TimerEvent 类型
      print 'Timer called at ' + str(event.current_real)
    rospy.Timer(rospy.Duration(
    2), my_callback) #每2s触发一次callback函数 rospy.spin()  #触发回调函数

    注:TimerEvent 类型包括以下属性

    rospy.TimerEvent
        last_expected
        理想情况下为上一次回调应该发生的时间
        last_real
        上次回调实际发生的时间
        current_expected
        本次回调应该发生的时间
        current_real
        本次回调实际发生的时间
        last_duration
        上次回调所用的时间(结束-开始)
  • 相关阅读:
    Uploader 文件上传
    filters过滤器的使用
    Calendar中遇到的问题
    中科院之旅
    Python基础教程:列表推导式详解
    不会也要知道的,Python四种实现排序的方法
    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
    2021字节跳动校招秋招算法面试真题解题报告--leetcode206 反转链表,内含7种语言答案
    求协方差
    国外卡组织的 交换费-interchangefee(发卡行服务费) 和 银联对比
  • 原文地址:https://www.cnblogs.com/hg-love-dfc/p/10525747.html
Copyright © 2020-2023  润新知