节点间需要有数据交互,而ros所要解决的问题就是数据该如何交互。
一、通讯原理图
ros在设计Node间通讯机制的时候,考虑的是很周全的。
Publisher:发送消息的,Subscriber:接收消息的,Topic:中转消息的。
”多对多“通讯:多个发送者对应一个频段,多个解收者对应这个频段。
理解:Topic通讯和广播通讯很类似。
广播站发送到指定的一个频段上去,收音机也是去指定的频段收听。因此,广播站好比是Publisher,收音机好比是subscribe,收听频段好比是topic,广播站不停地向外发布广播信息,不关心谁去接收,多个收音机可以去同一个频段收听广播,收听到的内容是一样的。但广播站只有一个发送者。
二、topic通信-环境配置流程:
①先创建一个Topic包(package)
②加载ros环境,打开clion
③在clion里面,删去杂项,建好python存放文件scripts,最后配置好python环境。
以上操作前面心得已经详述。
三、topic通信-publisher创建
publisher 隶属于节点,它是节点的一种功能,所以写代码还是写一个节点,只不过需要为这个节点赋予一中发消息的能力。
先在scripts里建一个叫publisher_node.py的文件,配置好头代码。
#!/usr/bin/env python
#coding:utf-8
import rospy
from std_msgs.msg import String
if __name__ == '__main__':
#创建节点
rospy.init_node('publisher_node')
#topic name:主题名称,起到的作用是唯一标识
topic_name = 'hello'
#data_class :数据类型(规定发送与接受方说的话一样,只不过在这里是以数据的形式)
#字符串(暂时使用)
#数据大(如图片),queue_size的值调的小,反之则大。
publisher = rospy.Publisher(topic_name,String,queue_size=100)
count = 0
rate = rospy.Rate(4)
while not rospy.is_shutdown():
#往外发送数据
msg = String()
msg.data = 'hello topic {}' .format(count)
publisher.publish(msg)
rate.sleep()
count += 1
四、topic通信-GUI调试Publisher
要调试它Publisher,那么需要模拟出来Subscriber来接收消息,怎么模拟呢,在这里ros提供了图形化工具叫rqt。
在调试端,输入命令:rosrun rqt_ 然后tap两下,
我们会发现有rqt_topic和rqt_Publisher
由于左边Publisher要发消息,所以我们用rqt_topic接收
回车后会出现一个GUI界面,然后在我们编码编的主题名称前打勾,开始调试。
后面的数字会累加。
五、topic通讯-命令行调试Publisher
先输入命令:rostopic tap一下
选择echo(打印命令),即输入命令:rostopic echo /hello 就开始接收并按照4hz打印。
补充:①topic_name命名可以配合斜线命名,如下图所示:
#命名'/a/b/c/d'
topic_name = '/hello/itcast
②可以输入命令:rostopic info /hello/itcast 查询消息的类型
③可以输入命令:rostopic hz /hello/itcast 可以统计当前发数据的频率,统计过程中会有个均值计算。
④ 可以输入命令:rostopic type /hello/itcast 主要显示主题消息的数剧类型
⑤ 可以输入命令:rostopic bw /hello/itcast 查询当前节点发送数据的带宽
六、topic通讯-Subscriber的创建
#!/usr/bin/env python
#coding:utf-8
import rospy
from std_msgs.msg import String
def topic_callback(msg):
print msg
if __name__ == '__main__':
#创建节点
rospy.init_node('subscriber_node')
#订阅topic消息,subscriber
#和发送的名字相同
topic_name = 'hello'
#data_class:数据类型
#与发送端类型相同,暂时用,String
#callback是异步回调
subscriber = rospy.Subscriber(topic_name,String,topic_callback)
rospy.spin()
左边是发送端,右边是接收端,(ctrl+c终止接收)
七、topic通讯-调试subscriber
①GUI调试:在发送端命令行,
输入命令:rosrun rqt_ tap两下 会出现一些提示
再输入命令:rosrun rqt_publisher rqt_publisher 显示出GUI界面
选好配置后需要在对应后面填上想要发送的内容后,接收端会收到相应的消息。
点击绿色按钮就发送一次,如果点对号就按照频率发送
②命令行调试:
在发送端命令行输入命令:rostopic pub /(接受端名称) 之后按两次tab,系统就会自动补齐数据类型,再按两下出现data:''可输入发送信息'',再点回车调试,观察现象(只发一次)
如果想要多发几次,可以输入命令:rostopic pub --help 看看系统指导再上面那个命令后面填上对应的命令,如-r 5 就是发送频率为5hz