Ros小海龟发布/订阅程序
思路:
1.节点间话题通讯分为:发布者(Publisher)和订阅者(Subscriber),发布者在话题(通道)中发布消息(message),订阅者接收话题中的消息,并执行回调函数。
2.发布者:初始化并定义节点–>创建并初始化发布者–>设置发布频率–>设置发布消息内容–>发布
3.订阅者:初始化并定义节点–>调用订阅函数–>调用循环(消息回调处理函数)–>运行回调函数
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import time
import numpy as np
from geometry_msgs.msg import Twist
from turtlesim.msg import Pose
def circle(rate,publisher):
# 定义并设置话题中的消息信息
vel_msg = Twist()
vel_msg.linear.x = 1
vel_msg.angular.z =0.5
publisher.publish(vel_msg)
rate.sleep()
# 发布者发布消息
def square(rate,publisher):
msg_one=Twist()
msg_two=Twist()
msg_one.linear.x=4#m/s
msg_two.angular.z=np.pi#rad/s
publisher.publish(msg_one)
rate.sleep()
publisher.publish(msg_two)
rate.sleep()
def velocity_publisher():
#初始化节点
rospy.init_node('velocity_publisher',anonymous=True)
#创建发布者并初始化
#发布话题名name of topic:/turtle1/cmd_vel
#数据类型data_class:Twist
#消息长度message lenth=10
turtle_vel_pub=rospy.Publisher('/turtle1/cmd_vel',Twist,queue_size=10)
#发布频率
rate=rospy.Rate(2)#hz
#循环发送
while(not rospy.is_shutdown()):
begin=time.time()
#square(rate,turtle_vel_pub)
circle(rate,turtle_vel_pub)
end=time.time()
print('Time:{0}'.format(end-begin))
#回调函数
def poseCallback(msg):
print('pose_x:{0} pose_y:{1}'.format(msg.x,msg.y))
def pose_subscriber():
#节点初始化
rospy.init_node('pose_subscriber',anonymous=True)
#调用订阅函数
rospy.Subscriber('/turtle1/pose',Pose,poseCallback)
#消息回调处理函数(死循环)
rospy.spin()
if __name__=='__main__':
pose_subscriber()
velocity_publisher()