码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-03-14 00:46:09      阅读:467      评论:0      收藏:0      [点我收藏+]

标签:--   col   路径规划   属性   机器视觉   2.7   相同   time   没有   

参考资料:

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
    上次回调所用的时间(结束-开始)

 

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

标签:--   col   路径规划   属性   机器视觉   2.7   相同   time   没有   

原文地址:https://www.cnblogs.com/hg-love-dfc/p/10525747.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!