机器人操作系统入门(七)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
    上次回调所用的时间(结束-开始)

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

时间: 2024-08-06 18:30:05

机器人操作系统入门(七)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 第四章 ROS通信架构(二) 一.Service 服务 //适用于临时的.非周期

Alljoyn瘦客户端库介绍(官方文档翻译)

Alljoyn瘦客户端库介绍(1) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设备加入AllJoyn系统整体架构中.1.1目的 本文档介绍了如何使一个受限于功耗.计算能力和内存的设备(嵌入式设备)加入AllJoyn分布式系统.具体而言,本文档包括了对AllJoyn面向嵌入式系统的方面的介绍,并着重描述了基于AllJoyn的系统的各个组件是如何与嵌入式设备协作以构建一个基于接近式

XMPP客户端库Smack 4.0.6版开发之一

一.Smack库概述 Smack是一个开源.易用的XMPP/Jabber客户端库,它使用Java语言开发,由Jive Software开发. Smack的优点是编程简单. Smack的缺点是其API并非为大量并发用户设计,每个客户都要1个线程,占用资源相对较,因此用Smack做模拟测试时,1台机器只能模拟有限(数千个)客户. 截止2014年11月27日,Smack库已经发展到4.0.6版. 最新的好消息是Smack在4.1.0版后将直接支持Android系统,而无需再使用以前的Smack移植版a

XMPP客户端库Smack 4.0.6版开发之三

XMPP客户端库Smack 4.0.6版开发之三 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 六.建立连接的例子 XMPPConnection类用于创建一个到XMPP服务器的连接,代码例子如下: // 创建一个到jabber.org服务器的连接 AbstractXMPPConnection conn1 = new XMPPTCPConnection("username", "password", "jabb

Golang的一个简单实用的http客户端库httpc

httpc简介 httpc这是一个发起http请求的客户端库.它具有的特色包括:简单易用.易于扩展.支持链式调用.支持多种格式的处理等.特别适合用来调用restfull风格的接口. 项目地址 https://coding.net/u/recallsong/p/httpc/git 下载 go get git.coding.net/recallsong/httpc.git Api文档 查看Api文档 我们也可以利用godoc工具在本地查看api文档: godoc -http=:9090 在浏览器中查

Python爬虫入门七之正则表达式

在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我

转 Python爬虫入门七之正则表达式

静觅 » Python爬虫入门七之正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容就易如反掌了. 正则表达式的大致匹配过程是:1.依次拿出表达式和文本中的字符比较,2.如果每一个

[WebGL入门]七,context的初始化

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 非常重要的初始化 从这次开始,开始着手WebGL的处理.首先是WebGL的初始化,完成渲染前的所有准备.前面的文章也给过HTML的雏形,还记得吧,像下面的代码这样. <html> <head> <title>WebGL TEST</title> <s

Exchange Server2013 系列七:客户端访问服务器高可用性部署实战

杜飞 在前面的文章中我们介绍了客户端访问服务器的高可用性技术,从这篇文章开始,我们就来看一个详细的高可用性部署方案. 首先,看一下我们的服务器列表: 编号 服务名 IP地址 功能 1 HYV01 IP:10.41.3.6 \16  网关:10.41.1.254 宿主机 2 HYV02 IP:10.41.4.6 \16  网关:10.41.1.254 宿主机 3 DF-DC01 IP:10.41.4.210\16 网关:10.41.1.254 DNS:10.41.4.210   10.41.4.2