当前位置 博文首页 > txr152111的博客:8th ROS通信之话题通信的实现(续)(Python实现

    txr152111的博客:8th ROS通信之话题通信的实现(续)(Python实现

    作者:[db:作者] 时间:2021-09-01 22:19

    前篇:??7th ROS通信之话题通信的实现(最通俗版本)

    小提示:

    1.python中对齐要求的很严格,对齐逻辑一定要注意!!

    Python 提示‘Unindent amount does not match previous indent‘解决方法:

    这是因为我们的代码中混用了空格键TAB键?,只需要将代码中的空位处全部统一为空格或者TAB即可!!!

    2.py文本中有中文时,需要在上面添加“# -*- coding:UTF-8 -*-“? ?

    否则会报错:SyntaxError: Non-ASCII character '\xe5' in file

    3.运行python文件需要添加可执行权限:

    wood@wood:~/demoros_ws/src/plumbing_pub_sub/scripts$ chmod +x *.py

    chmod +x *.py

    1.发布者的实现

    1.1? 准备工作

    新建文件夹和.py文件:

    ?

    1.2 编写python代码

    使用python来实现消息发布:
    ? ? ? ? ? ? 1.导包
    ? ? ? ? ? ? 2.初始化ros节点
    ? ? ? ? ? ? 3.创建发布者对象
    ? ? ? ? ? ? 4.编写发布逻辑并发布出去

    基本框架的测试代码:

    #!/usr/bin/env python
    # -*- coding:UTF-8 -*-           
    import rospy
    
    from std_msgs.msg import String   #发布的消息的类型
    
    """
        使用python来实现消息发布:
                1.导包
                2.初始化ros节点
                3.创建发布者对象
                4.编写发布逻辑并发布出去
    """
    
    if __name__=="__main__":
             #   2.初始化ros节点
             rospy.init_node("SanDai")    #直接传入节点的名称,比如叫三呆
    
             #   3.创建发布者对象
             pub  = rospy.Publisher("Che",String,queue_size=10) 
    
             #  4.编写发布逻辑并发布出去
             #创建数据
             msg = String()
             #使用循环
             while not rospy.is_shutdown():
                  msg.data = "Hello"
                  pub.publish(msg)

    1.3 添加可执行权限

    在scripts路径下输入:? ?chmod +x *.py? ? ? ? (*.py是指对路径下所有的py文件添加可执行文件)

    ?1.4 修改CMakeLists.txt文件

    1.5? 编译与运行

    编译:Ctrl +Shift +B

    运行:roscore? ??

    ? ? ? ? ??source ./devel/setup.bash?

    测试消息:Che为话题名? ? ? ? ? ? ? ?rostopic echo 话题

    rostopic echo Che? ? 

    1.6 添加发布逻辑? ? ? ??

    • 设置发布频率
    • 加个发布的编号
    • 发布日志输出
    #!/usr/bin/env python
    # -*- coding:UTF-8 -*-           
    from typing import Counter
    import rospy
    
    from std_msgs.msg import String   #发布的消息的类型
    
    """
        使用python来实现消息发布:
                1.导包
                2.初始化ros节点
                3.创建发布者对象
                4.编写发布逻辑并发布出去
    """
    
    if __name__=="__main__":
             #   2.初始化ros节点
             rospy.init_node("SanDai")    #直接传入节点的名称,比如叫三呆
    
             #   3.创建发布者对象
             pub  = rospy.Publisher("Che",String,queue_size=10) 
    
             #  4.编写发布逻辑并发布出去
             #创建数据
             msg = String()
             #指定发布频率
             rate = rospy.Rate(1)
             #设置计数器
             count = 0
             #使用循环
             while not rospy.is_shutdown():
                  count+=1
                  msg.data = "Hello" + str(count)
                  rospy.loginfo("发布的数据是:%s",msg.data)
                  pub.publish(msg)
                  rate.sleep()

    ?2. 订阅方的实现

    2.1 准备工作

    2.2 代码内容

    #!/usr/bin/env python
    # -*- coding:UTF-8 -*-          
    import rospy
    
    from std_msgs.msg import String      #订阅的消息的类型
    
    """
        使用python来实现消息发布:
                1.导包
                2.初始化ros节点
                3.创建订阅者对象
                4.回调函数处理数据
                5. spin()
    """
    def doMsg(msg):
          rospy.loginfo("我订阅的数据:%s",msg.data)
    
    
    if __name__=="__main__":
             #   2.初始化ros节点
             rospy.init_node("HuaHua")    #直接传入节点的名称,比如叫花花
    
             #   3.创建订阅者对象
             pub  = rospy.Subscriber("Che",String,doMsg,queue_size=10) 
    
             #  4.回调函数处理
    
             #  5.spin()
             rospy.spin() 
             

    2.3 添加可执行权限

    在scripts路径下输入:? ?chmod +x *.py? ? ? ? (*.py是指对路径下所有的py文件添加可执行文件)

    2.4? 编辑配置文件

    3. 发布与订阅

    编译:Ctrl +Shift +B

    运行:

    roscore?
    source ./devel/setup.bash?
    rosrun plumbing_pub_sub demo01_pub_p.py
    source ./devel/setup.bash?
    rosrun plumbing_pub_sub demo02_sub_p.py

    ?4. 注意事项

    先启动订阅者,再启动发布者,从这两个图中发现,订阅者订阅到的缺少数据,第一行没了。

    这是因为发布者需要先注册,在注册的时候可能就发布了一条。

    解决办法:

    在发布之前加入一个休眠:?

    ?5. 查看计算图

    rqt_graph

    ?

    cs