首页 > 编程语言 >ROS话题通讯编写发布者(publisher)与订阅者(subscriber) Python

ROS话题通讯编写发布者(publisher)与订阅者(subscriber) Python

时间:2024-05-09 23:22:20浏览次数:23  
标签:publisher ros 函数 Python subscriber 源码 rospy 发布者 ROS

学习参考:ROS/Tutorials/WritingPublisherSubscriber(python) - ROS Wiki

本文主要为了加强学习记忆,不是供人参考学习,如果想要学习点击链接系统学习;

 

在自己创建的工作空间下的src目录下创建一个新的功能包,在功能包中创建scripts文件夹,在内部放置.py源码;

 

下面剖析发布者源码书写大致格式:

 import 引入所要使用的包;这里运用python编码引入rospy进行编译,同时还有从std_msg包中调用String消息类型;

 

定义发布者函数:def talker():

注意下面的声明

*****这是在定义talker函数与ros的接口:

pub = rospy.Publisher('chatter',String,queue_size=10)

定义了一个pub发布器变量,pub是ros中的Publisher(发布者) 使用String消息类型,发布到chatter话题中,缓存发布队列长度为10;

 

*****这里是初始化节点:
rospy.init_node('talker',anonymous=True)

这一步很重要,它告诉ROS我的节点命名为talker,在运行这一步之前,ROS无法与ROS Master进行通讯,传递不了消息,至于后面那个anonymous作用直接上图解释:

 

 

设置一个ros中的频率对象;

rate = ros.rate(10)  rate为一个自定义的频率对象,设定频率为10hz;后续可以使用对象中的方法。

 

 

再来剖析这一段

 这里就是使用一个循环,循环条件中的函数 rospy.is_shutdown()监听你是否输入ctrl+c 输入就退出循环没有就进入循环体

自定义一个String消息类型变量hello_str ,这个rospy的书写格式是啥子我也不太清楚还是python可以这样写,但是其中意思也很容易明白,rospy.get_time()就是获取时间,时间是具体现实的生活时间还是说运行开始计时的我也不清楚,感觉是时间戳,无所谓大概什么意思知道就行,那个%就是将这个string类型时间放入%s中,相当于给hellow_str赋值为 "hello world +runtime"

rospy.longinfo()函数就直接上截图了,大致就是一个存储发布日志的:

 上面定义了pub作为ros中的发布器对象,调用对象中的方法发布消息:

pub.publish(hello_str)

至于那个rate变量的作用也展示出来了

使用rate变量中的休眠函数,这个相当于一个暂停,如果没有这个会往死里发布消息,但是发布了消息对于的机器可能需要时间做出反应,所以给一点缓冲时间进行下一次发布而不是往死里发布;这个循环体就解读完毕了

 

再来下面这段代码

 这里就是相当于运行主函数了,主函数内部试运行talker()函数,如果talker()函数不能正常运行就会进入到except中进入rospy的中断异常;

上面是编写发布者源码大致流程,在scripts文件夹内部放入.py源码后要在功能包中的CakeList.txt中修改一些内容,像上面的情况要修改的直接上图,是为了执行编译依赖

 其实也可以大致理解一下,就是编译安装python 编译项目在 scripts文件夹下的talker.py文件,下面那个怎么解读我就不清楚了后面再学;保存后就是最终的创建发布者完成;

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

订阅者(subscriber)创建:

因为是处于刚学的状态我还不确定对于一个话题中的订阅者与发布者的创建是否强制放在一个包中,但是依据之前所说数据都是传输到ROS Master中进行中转的所以感觉不一定是要放置在同一功能包中只要是使用相同话题就行,但是为了好分类一般都应该是塞一个功能包内;

那么我们就进入刚刚的工作空间进入src文件夹下再进入相同的功能包中的scripts放入我们编写的订阅者.py源码;

 

还是一样剖析订阅者源码格式:

 

第一步都是导入包rospy包,后续使用其中的东西,std_msg包中的String消息类型

 

先不管那个call_back()函数就是回调函数,先剖析listener()函数

那么listener内部第一个函数就是初始化节点

rospy.init_node('listener',anonymous=True),上面也说了这东西啥意思,有这个初始节点声明节点名为listener,后面那个是放置生成多个冲突,如果发现生成多个会在名字后面加入编号后缀防止冲突;如果不想生成多个只限定使用一个就把True改为False就好

那么下面的ros.subscriber()函数也很好理解了,第一个就是订阅的话题在这里是'chatter',订阅的消息类型是String,那么根据上面内容推理第三个接口就是放置回调函数的,对于这个subscriber函数我感觉就是只有接收到ros master 中转的信息才会进行回调传参,回调函数中的data 就是string类型,然后通过rospy.loginfo书写日志。

还有一个rospy.spin()函数,其作用就也是监听是否退出这个节点,如果不退出就会一直运行,但是这种运行也发布者的不太一样,图解:

 最后就是主函数直接调用listener函数了;

这是订阅者源码编写大致格式,编写完后也一样在CMakeList.txt中增添编译项目文件路径

 

 

至于编译运行要回到工作空间中编译,编译完毕设置变量环境后就可以使用rosrun运行自己编写的节点了;

 

标签:publisher,ros,函数,Python,subscriber,源码,rospy,发布者,ROS
From: https://www.cnblogs.com/qianzhu/p/18183317

相关文章

  • 学习python步骤
    参考链接:https://zhuanlan.zhihu.com/p/693208513一、Python基础学习Python语言基础的路线可以分为以下几个阶段:Python3入门:了解Python3的安装方法、如何运行Python程序以及交互模式的使用,同时学习注释的添加方法。数据类型:掌握Python中的各种数据类型,包括数字、布尔值、......
  • PyCharm编辑器结合Black插件,轻松实现Python代码格式化
    1、简介使用Black对Python代码进行格式化,可使代码看起来更美观。但是,随着项目规模不断变大,对每个文件运行Black变得很繁琐。能否在文件保存后立即运行Black呢?本文就来介绍在PyCharm中实现这一目标的方法。2、安装Black首先,在虚拟环境中安装Black。$pipinstallblack ......
  • python教程6.6-发送邮件smtplib
    实现步骤: Python对SMTP⽀持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件,它对smtp协议进⾏了简单的封装。简单代码示例:发送html格式的邮件:在html中插入图片: ......
  • python学习----谁在说谎逻辑运算
    if__name__=='__main__':Li=[0,1]forainLi:forbinLi:forcinLi:zhang=(b==0)li=(c==0)wang=(a+b==0)if(zhang+li+wang==2anda+b+c=......
  • ubuntu22 python2 pyinstaller 打包报错:'NoneType' object has no attribute 'groups'
    前言最近有个需求,需要在ubnutu22上使用pyinstaller打包一个python2的文件。中间遇到了一些问题:pip2installpyinstaller报错解决方案:pip2installpyinstaller==3.6python2和python3的pyinstaller如何同时存在,我想把python2的pyinstaller命名为pyin......
  • python捕捉windows桌面
    使用mss模块截取屏幕图像#安装msspipinstallmssimportmss#获取屏幕尺寸withmss.mss()assct:monitor=sct.monitors[0]screen_width=monitor["width"]screen_height=monitor["height"]#设置捕获区域(这里设置为整个屏幕)monitor={"top":......
  • 如何使用python设计logo
    如何使用Python设计Logo一、引言在这篇文章中,将介绍如何使用Python来设计一个简单的Logo。将使用Python的第三方库PIL(PythonImagingLibrary)来实现这个功能。PIL是一个强大的图像处理库,可以帮助轻松地处理各种图像操作,如缩放、旋转、裁剪等。二、准备工作在开始设计Logo之前,......
  • 使用python中kivy库生成安卓APP
    kivy的安装官方推荐的方式是使用虚拟环境来进行安装和部署,关于虚拟环境的相关操作,在前面写过的一篇博客中有稍微详细一点的介绍,这里我们先给出操作步骤。假定我们已经在环境中用pip安装了virtualenv,那么我们先构建一个kivy的虚拟环境:[dechin@dechin-manjarokivy]$virtualenvk......
  • Python中私有变量和私有方法
    python的私有化是为了规划私有属性,避免非相关的访问【假如!我有老婆,你不能直接知道我老婆是谁,你只有问我才会知道,即我的私有属性只有我知道】在python中定义私有变量和私有方法只需要在变量名或函数名前加上"__"两个下划线在类内部的方法中使用时self.__变量名或函数名。实......
  • python中小数据池和编码
    ⼀.小数据池在说小数据池之前.我们先看⼀个概念.什么是代码块:根据提示我们从官⽅⽂档找到了这样的说法:APythonprogramisconstructedfromcodeblocks.AblockisapieceofPythonprogramtextthatisexecutedasaunit.Thefollowingareblocks:amodule,......