Untitled

 avatar
unknown
python
7 hours ago
6.4 kB
6
Indexable
<launch>
	<node pkg="turtlesim" name="turtlesim" type="turtlesim_node"/>
	<node pkg="rosservice" type="rosservice" name="deleteturtle1" args="call --wait /kill turtle1"/> 	

	<node pkg="rosservice" type="rosservice" name="createturtle2" args="call --wait /spawn 2 5 1.570796327 turtle2"/> 	
	<node pkg="rosservice" type="rosservice" name="createturtle3" args="call --wait /spawn 8 5 4.712388980 turtle3"/> 
	<node pkg="rosservice" type="rosservice" name="createturtle4" args="call --wait /spawn 5 2 3.141592654 turtle4"/> 	
	<node pkg="rosservice" type="rosservice" name="createturtle5" args="call --wait /spawn 5 8 0.0 turtle5"/> 

	
	<node pkg="beginner_tutorials" name="rotatetask2" type="rotate.py" args="2"/>
	<node pkg="beginner_tutorials" name="rotatetask3" type="rotate.py" args="3"/>
	<node pkg="beginner_tutorials" name="rotatetask4" type="rotate.py" args="4"/>
	<node pkg="beginner_tutorials" name="rotatetask5" type="rotate.py" args="5"/>
</launch>
#! /usr/bin/env python3



import rospy
import sys
import random
from geometry_msgs.msg import Twist
from turtlesim.msg import Pose
from std_msgs.msg import Int64
from math import pow, atan2, sqrt, pi, radians
PI = pi

nodeid=str(sys.argv[1])
nodename='turtle'+nodeid


class Turtlebot: 
	
	def recieve_event(self, msg):
		self.event = msg.data
		
	def update_event_pose(self, data):
		self.eventpose = data
	
	def _init_(self):
		rospy.init_node('turtletogoal', anonymous=True)
		self.pub = rospy.Publisher(nodename+'/cmd_vel', Twist, queue_size=10)
		self.sub = rospy.Subscriber(nodename+'/pose', Pose, self.update_pose)
		self.pose = Pose()
		self.rate = rospy.Rate(50)
		self.event = 0
		self.eventpose = Pose()
		self.eventpose.x = 5
		self.eventpose.y = 5
		
		#publish event and location, turtle2 is turtle1 because turtle1 gets killed at start
		if nodename == "turtle2": 
			self.eventPub = rospy.Publisher("/eventPub", Int64, queue_size = 10)
			self.eventLocation = rospy.Publisher("/eventLocation", Pose, queue_size = 10)
		#Subscribe to event and event location

		self.subEvent = rospy.Subscriber('/eventPub', Int64, self.recieve_event)
		self.subEventLocation = rospy.Subscriber('/eventLocation', Pose, self.update_event_pose)
		
	#######################################################################################

	
	def moveSquare(self,times = 5):
		for i in range (0,times):
			if nodename == "turtle2":
				self.event = random.randint(1, 2)
			for i in range (0,4):
				self.movetask2(8)
				rospy.sleep(0.2)
				self.rotate()
				rospy.sleep(0.2)
			if nodename == "turtle2" and self.event == 1:
				while not rospy.is_shutdown():
					self.eventPub.publish(self.event)
					self.eventLocation.publish(self.pose)
				timeout = rospy.Time.now() + rospy.Duration(5.0)
				while rospy.Time.now() < timeout:
					if self.event == 1:
						break
					self.rate.sleep()
			if self.event == 1:
				break
		self.move2goal()



	def normalize_angle(self, angle):
		while angle > pi:
			angle -= 2 * pi
		while angle < -pi:
			angle += 2 * pi
		return angle
		
		
	def update_pose(self, data):
		self.pose = data
		self.pose.x = round(self.pose.x, 4)
		self.pose.y = round(self.pose.y, 4)

	def euclidean_distance(self, goal_pose):
		return sqrt(pow((goal_pose.x - self.pose.x), 2)+pow((goal_pose.y - self.pose.y), 2))

	def linear_vel(self, goal_pose, constant=1.5):
		return constant * self.euclidean_distance(goal_pose)
		

	def steering_angle(self, goal_pose):
		return atan2(goal_pose.y-self.pose.y,goal_pose.x-self.pose.x)

	def angular_vel(self, goal_pose, constant=6):
		return constant * self.normalize_angle((self.steering_angle(goal_pose) - self.pose.theta))
		
		
				
	#######################################################################################

	def move2goal(self):
		
			
		goal_pose = self.eventpose		
			
		tolerance = 0.1

		vel_msg = Twist()
		while self.euclidean_distance(goal_pose) >= tolerance:
			vel_msg.linear.x = self.linear_vel(goal_pose)
			vel_msg.angular.z = self.angular_vel(goal_pose)
			self.pub.publish(vel_msg)
			self.rate.sleep()
			
			
		vel_msg.linear.x = 0
		vel_msg.angular.z = 0
		self.pub.publish(vel_msg)
	

		
	#######################################################################################	
	
	def rotate(self):
		vel_msg = Twist()
		angular_speed = 45*PI/180
		relative_angle = 90*PI/180
		t0 = rospy.Time.now().to_sec()
		current_angle = 0
		vel_msg.angular.z = -abs(angular_speed)
		while(current_angle < relative_angle):
			self.pub.publish(vel_msg)
			t1 = rospy.Time.now().to_sec()
			current_angle = angular_speed*(t1-t0)
			#self.rate.sleep() ################SİLLLLL
		    
		vel_msg.angular.z = 0
		self.pub.publish(vel_msg)
	
	
	
	#######################################################################################
		
	def movetask2(self,distance):
		vel_msg = Twist()
		vel_msg.linear.x = 5.0 
		vel_msg.angular.z = 0.0
		while self.pose.x == 0.0 and self.pose.y == 0.0 and not rospy.is_shutdown():
			rospy.sleep(0.01)
			self.rate.sleep()
		start_x = self.pose.x
		start_y = self.pose.y

		distance_moved = 0.0
		while not rospy.is_shutdown():
			self.pub.publish(vel_msg)
			distance_moved = sqrt(pow((self.pose.x - start_x), 2) + pow((self.pose.y - start_y), 2))
			if distance_moved >= distance:
				break
			self.rate.sleep()
		vel_msg.linear.x = 0.0
		self.pub.publish(vel_msg)

	#######################################################################################
    #####NOT USED RIGHT NOW
	def movetask(self,distance):
		vel_msg = Twist()
		speed = 0.8
		vel_msg.linear.x = speed
						
		currDist = 0
		t0 = rospy.Time.now().to_sec()
					
		while (currDist < distance):
			self.pub.publish(vel_msg)
			t1 = rospy.Time.now().to_sec()
			currDist = speed * (t1-t0)
			self.rate.sleep()
		#stop robot 
		vel_msg.linear.x = 0
		vel_msg.angular.z = 0
		self.pub.publish(vel_msg)
	
	#######################################################################################
		
		
if _name_ == "_main_":
	try:
		rospy.sleep(5)
		
		x = Turtlebot()
		#event = 2
			#x.movetask2(8)
			#rospy.sleep(0.2)
			#x.rotate()
			#rospy.sleep(0.2)
			
			
		x.moveSquare()
			

	except rospy.ROSInterruptException:
		pass

Editor is loading...
Leave a Comment