ROS机器人之话题(一)

 将消息发布到话题上

首先建立一个basic包(名称自己定)其命令为:

1、创建功能包,应用catkin_create_pkg命令

     cd  ~/catkin_ws/src                      #切换到代码空间,也就是工作空间的src目录

 catkin_create_pkg  basic  std_msgs  rospy   roscpp     #创建功能包,并指定有三个功能包依赖

每次创建完包都要记得编译

catkin_make                        #编译  

source   devel/setup.bash                   #设置环境变量

然后在basic 包下声明一个话题,名称为topic_publisher.py

基本代码

 1#!/usr/bin/env python
 2 import rospy
 3 from std_msgs.msg import Int32
 4 rospy.init_node('topic_publisher')
 5 pub = rospy.Publisher('counter',Int32)             
 6 rate = rospy.Rate(2)
 7 count = 0
 8 while not rospy.is_shutdown():
 9     pub.publish(count)
10     count += 1
11     rate.sleep()

1.#!/usr/bin/env python

这是所谓的shebang(工作环境),告诉系统这是一个pythin文件,应该传给python解释器,但是在linux系统下需要给他增加权限:chmod u+x topic_publisher.py

2.import rospy

负责导入我们的基本功能

3.from std_msgs_msg import Int32

使用32位的整数,这在ROS的标准消息包std_msgs中有定义,为了导入正常,需要从<包名>.msg导入,这是定义存储的地方。

因为我们使用的是来自其他包的信息,我们需要在package.xml文件中加入一个依赖:<depend package="std_msgs" />

如果没有这个依赖可能节点无法运行(我没加也运行好了)

4.初始化节点,用Publisher声明

pub=rospy.Publiisher('counter',Int32)

赋予话题一个名字(counter),消息类型Int32

5在话题上发布消息

rate=rospy.Rate(2)

count=0

while not rospy.is_shutdown():

pub.pubulish(count)

count+=1

rate.sleep()

设置速率,每秒发两次,如果节点已经被关闭则is_shutdown()函数返回一个True,反之返回一个Flase.

检查一切是否工作正常首先打开一个终端启动:roscore

再打开另一个终端运行:rostopic list     这是查看当前系统中可用的话题

qqtsj@qqtsj-Nitro-AN515-51:~/catkin_ws$ rostopic list
/counter
/rosout
/rosout_agg

再打开一个终端运行上述节点:rostopic basic topic_publisher.py

运行如果出现以下错误

qqtsj@qqtsj-Nitro-AN515-51:~/catkin_ws/src$ rosrun basic topic_publisher.py 
/home/qqtsj/catkin_ws/src/basic/src/topic_publisher.py:5: SyntaxWarning: The publisher should be created with an explicit keyword argument 'queue_size'. Please see http://wiki.ros.org/rospy/Overview/Publishers%20and%20Subscribers for more information.
  pub = rospy.Publisher('counter',Int32)

则在pub = rospy.Publisher('counter',Int32) 中Int32后面加上queue_size = 'number',就可以了。

再进一步,你可以使用rostopic echo来查看话题上发布消息

qqtsj@qqtsj-Nitro-AN515-51:~/catkin_ws$ rostopic echo counter -n 5
data: 815
---
data: 816
---
data: 817
---
data: 818
---
data: 819
---

-n 5选项告诉rostopic只打印出五条信息 ,不加这个,他将会一直打印下去。

也可用:rostopic hz counter   去检验我们发布消息的速率

qqtsj@qqtsj-Nitro-AN515-51:~/catkin_ws/src/basic$ rostopic hz counter
subscribed to [/counter]
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00000s window: 2
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00004s window: 4
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00005s window: 6
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00005s window: 8
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00008s window: 10
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00017s window: 12
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00015s window: 14
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00014s window: 16
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00013s window: 18
average rate: 2.000
        min: 0.500s max: 0.500s std dev: 0.00013s window: 20
^Caverage rate: 2.000

Ctrl+c终止运行

有发布就有订阅

订阅一个话题

topic_subscriber.py

订阅一个counter话题并打印他们接收到消息的最小节点

 1 #!/usr/bin/env python                                                  
 2 import rospy               
 3 from std_msgs.msg import Int32
 4 def callback(msg): 
 5     print msg.data          
 6 rospy.init_node('topic_subscriber')
 7 sub=rospy.Subscriber('counter',Int32,callback)
 8 rospy.spin()  

确保发布者节点仍在运行并且仍在counter话题上发布消息,然后在另一个终端启动订阅者节点

如图

qqtsj@qqtsj-Nitro-AN515-51:~/catkin_ws/src/basic$ rosrun basic topic_subscriber.py 
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

Ctrl+c 终止运行

这样完成了话题消息的发送和订阅

原文地址:https://www.cnblogs.com/tanshengjiang/p/11768173.html