学习参考: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运行自己编写的节点了;