zoukankan      html  css  js  c++  java
  • 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 终止运行

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

  • 相关阅读:
    【并发】实现内存可见的两种方法比较:加锁和volatile变量
    HTTP2资料汇总
    微服务框架servicecomb
    【并发】使用synchronized获取互斥锁的几点说明
    【并发】通过同步保证内存可见性
    数据最终一致性方案设计
    Oracle中Constraint的状态参数initially与deferrable
    ORACLE GROUPING函数的使用
    Oracle INSERT WITH CHECK OPTION的用法
    ORACLE VERSIONS 用法
  • 原文地址:https://www.cnblogs.com/tanshengjiang/p/11768173.html
Copyright © 2011-2022 走看看