ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试

节点间需要有数据交互,而ros所要解决的问题就是数据该如何交互。

一、通讯原理图

ros在设计Node间通讯机制的时候,考虑的是很周全的。

 ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第1张图片

 Publisher:发送消息的,Subscriber:接收消息的,Topic:中转消息的。

”多对多“通讯:多个发送者对应一个频段,多个解收者对应这个频段。

理解:Topic通讯和广播通讯很类似。

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第2张图片

广播站发送到指定的一个频段上去,收音机也是去指定的频段收听。因此,广播站好比是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两下,

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第3张图片

 我们会发现有rqt_topic和rqt_Publisherros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第4张图片

 由于左边Publisher要发消息,所以我们用rqt_topic接收

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第5张图片

 回车后会出现一个GUI界面,然后在我们编码编的主题名称前打勾,开始调试。

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第6张图片

 ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第7张图片

 后面的数字会累加。

五、topic通讯-命令行调试Publisher

先输入命令:rostopic  tap一下

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第8张图片

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第9张图片

 选择echo(打印命令),即输入命令:rostopic  echo  /hello  就开始接收并按照4hz打印。

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第10张图片

 补充:①topic_name命名可以配合斜线命名,如下图所示:

#命名'/a/b/c/d'
topic_name = '/hello/itcast

 ②可以输入命令:rostopic  info  /hello/itcast   查询消息的类型

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第11张图片

 ③可以输入命令:rostopic  hz  /hello/itcast  可以统计当前发数据的频率,统计过程中会有个均值计算。

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第12张图片

④ 可以输入命令:rostopic  type  /hello/itcast  主要显示主题消息的数剧类型

⑤ 可以输入命令:rostopic  bw  /hello/itcast   查询当前节点发送数据的带宽

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第13张图片

六、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终止接收)ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第14张图片

 七、topic通讯-调试subscriber

①GUI调试:在发送端命令行,

输入命令:rosrun rqt_    tap两下 会出现一些提示

再输入命令:rosrun  rqt_publisher  rqt_publisher  显示出GUI界面

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第15张图片

 选好配置后需要在对应后面填上想要发送的内容后,接收端会收到相应的消息。ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第16张图片

 点击绿色按钮就发送一次,如果点对号就按照频率发送ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第17张图片

 ②命令行调试:

在发送端命令行输入命令:rostopic  pub  /(接受端名称)   之后按两次tab,系统就会自动补齐数据类型,再按两下出现data:''可输入发送信息'',再点回车调试,观察现象(只发一次)

如果想要多发几次,可以输入命令:rostopic  pub   --help   看看系统指导再上面那个命令后面填上对应的命令,如-r  5  就是发送频率为5hz

ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试_第18张图片

你可能感兴趣的:(ros基础,linux)