8th ROS通信之话题通信的实现(续)(Python实现方法)

前篇:  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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是刃小木啦~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值