当前位置 博文首页 > txr152111的博客: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
新建文件夹和.py文件:
?
使用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)
在scripts路径下输入:? ?chmod +x *.py? ? ? ? (*.py是指对路径下所有的py文件添加可执行文件)
编译:Ctrl +Shift +B
运行:roscore? ??
? ? ? ? ??source ./devel/setup.bash?
测试消息:Che为话题名? ? ? ? ? ? ? ?rostopic echo 话题
rostopic echo Che? ?
#!/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()
#!/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()
在scripts路径下输入:? ?chmod +x *.py? ? ? ? (*.py是指对路径下所有的py文件添加可执行文件)
编译: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
先启动订阅者,再启动发布者,从这两个图中发现,订阅者订阅到的缺少数据,第一行没了。
这是因为发布者需要先注册,在注册的时候可能就发布了一条。
解决办法:
在发布之前加入一个休眠:?
rqt_graph
?
cs