将消息发布到话题上
首先建立一个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 终止运行
这样完成了话题消息的发送和订阅