00001 #!/usr/bin/env python 00002 # coding=utf-8 00003 ''' 00004 跟踪的检测节点怎么写: 00005 1. 如果不同机器人的检测节点检测到了可疑机器人进入到了自己的探测区域,那么就会更新parameter server中和tf发布有关的参数; 00006 2. 相应的跟踪机器人会更新parameter server中的跟tf有关的参数,这样的话,跟踪就会启动; 00007 3. 跟踪发出的速度消息通过一个suppressor去抑制下层的navigation发出的消息; 00008 4. 当可疑机器人逃逸,跟踪失败之后,当前跟踪机器人会继续之前的巡逻任务。 00009 00010 ''' 00011 00012 __author__ = 'Minglong Li' 00013 00014 import rospy 00015 import math 00016 import tf 00017 import geometry_msgs.msg 00018 from nav_msgs.msg import Odometry 00019 00020 class Robot_follower(object): 00021 def __init__(self, name): 00022 self.listener = tf.TransformListener() 00023 def robot_listener(self): 00024 ''' 00025 rospy.wait_for_service('spawn') 00026 spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn) 00027 spawner(4, 2, 0, 'turtle2') 00028 ''' 00029 robot_vel_pub = rospy.Publisher('robot_0/cmd_vel', geometry_msgs.msg.Twist, queue_size=1) 00030 00031 rate = rospy.Rate(10.0) 00032 while not rospy.is_shutdown(): 00033 try: 00034 (trans,rot) = self.listener.lookupTransform('/robot_3', '/robot_0', rospy.Time(0)) 00035 except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException): 00036 continue 00037 angular = 4 * math.atan2(trans[1], trans[0]) 00038 linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2) 00039 cmd = geometry_msgs.msg.Twist() 00040 cmd.linear.x = linear 00041 cmd.angular.z = angular 00042 robot_vel_pub.publish(cmd) 00043 00044 rate.sleep() 00045 00046 00047 if __name__ == '__main__': 00048 rospy.init_node('robot_follower') 00049 robot_follower = Robot_follower(rospy.get_name()) 00050 robot_follower.robot_listener() 00051 rospy.spin() 00052