图1 框架
运行代码
demo01_pub_p.py
#! /usr/bin/env python
#1 line 添加释伴行
'''
1.导包
2.初始化ROS节点
3.创建发布者对象
4.编写发布逻辑并发布数据
'''
import rospy
from std_msgs.msg import String #发布的消息类型
if __name__ == "__main__":
#初始化ROS节点
rospy.init_node("sanDai")
#创建发布对象 ,话题名称che
pub = rospy.Publisher("che",String,queue_size=10)
#创建数据
msg = String()#此时数据为空
#指定发布频率 此处1hz
rate = rospy.Rate(1)
#设置计数器
count = 0
#使用循环发布数据
rospy.sleep(3)#除了c++外,python也有数据丢失问题:
#1.先启动发布,再启动订阅 ,数据丢失较严重(丢5条):因为发布者已经注册并发布消息一段时间了,订阅者才订阅到数据;
#2.先启动订阅,再启动发布,数据不太严重(丢1条):老师:可能发布是软启动,发布者在注册过程中就已经发布第一条消息了
#但订阅者需要在发布者注册成功后才能订阅消息
#解决方法:在发布者注册成功后,先休眠3s,才发布消息。
while not rospy.is_shutdown():
count+= 1
msg.data = "hello"+str(count)
#发布数据
pub.publish(msg)
rospy.loginfo("发布的数据:%s",msg.data)#日志输出
rate.sleep()#调用rate = rospy.Rate(1),启动休眠功能,每隔1秒醒一次,发布数据
demo02_sub_p.py
#! /usr/bin/env python
#1.导包
import rospy
from std_msgs.msg import String
"""
订阅流程实现:
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.实例化 订阅者 对象
sub = rospy.Subscriber("che",String,doMsg,queue_size=10)
#4.处理订阅的消息(回调函数)(回调函数处理数据)
#5.设置循环调用回调函数#否则会订阅失败
rospy.spin()
注意:
1.添加可执行权限
chmod +x *.py
2.CMakeLists.txt编译
catkin_install_python(PROGRAMS
scripts/demo01_pub_p.py
scripts/demo02_sub_p.py
scripts/demo03_pub_person_p.py
scripts/demo04_sub_person_p.py
scripts/tools.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
ctrl+shift+b
参考资料:
1.ROS机器人入门(赵虚左老师ROS1_noetic)