diff --git a/KickP.py b/KickP.py new file mode 100644 index 00000000..25c94510 --- /dev/null +++ b/KickP.py @@ -0,0 +1,64 @@ +import rospy,sys +from utils.geometry import Vector2D +from utils.functions import * +from krssg_ssl_msgs.msg import point_2d +from krssg_ssl_msgs.msg import BeliefState +from krssg_ssl_msgs.msg import gr_Commands +from krssg_ssl_msgs.msg import gr_Robot_Command +from krssg_ssl_msgs.msg import BeliefState +from role import GoToBall, GoToPoint, KickToPointP +from multiprocessing import Process +from kubs import kubs +from krssg_ssl_msgs.srv import bsServer +from math import atan2,pi +from utils.functions import * +pub = rospy.Publisher('/grsim_data',gr_Commands,queue_size=1000) + +BOT_ID=int(sys.argv[1]) +x=float(sys.argv[2]) +y=float(sys.argv[3]) + +xx=int(x) +yy=int(y) +target=Vector2D(x,y) + +def function(id_,state): + kub = kubs.kubs(id_,state,pub) + kub.update_state(state) + print(kub.kubs_id) + g_fsm = KickToPointP.KickToPoint(target) + # g_fsm = GoToPoint.GoToPoint() + g_fsm.add_kub(kub) + # g_fsm.add_point(point=kub.state.ballPos,orient=normalize_angle(pi+atan2(state.ballPos.y,state.ballPos.x-3000))) + g_fsm.add_theta(theta=normalize_angle(atan2(target.y - state.ballPos.y,target.x - state.ballPos.x))) + g_fsm.get_pos_as_vec2d(target) + #g_fsm.as_graphviz() + #g_fsm.write_diagram_png() + print('something before spin') + g_fsm.spin() + # + + + +#print str(kub.kubs_id) + str('***********') +rospy.init_node('node',anonymous=False) +start_time = rospy.Time.now() +start_time = 1.0*start_time.secs + 1.0*start_time.nsecs/pow(10,9) + +# rospy.Subscriber('/belief_state', BeliefState, BS_callback, queue_size=1000) + +while True: + state = None + rospy.wait_for_service('bsServer',) + getState = rospy.ServiceProxy('bsServer',bsServer) + try: + state = getState(state) + except rospy.ServiceException, e: + print("Error ",e) + if state: + print('lasknfcjscnajnstate',state.stateB.homePos) + function(BOT_ID,state.stateB) + print('chal ja') + # break +rospy.spin() + diff --git a/role/Dribble_Kick.py b/role/Dribble_Kick.py new file mode 100644 index 00000000..249c9119 --- /dev/null +++ b/role/Dribble_Kick.py @@ -0,0 +1,372 @@ +from enum import Enum +import behavior +import rospy +from role import GoToPoint +import math +import kubs +from utils import math_functions +from utils.functions import * +from utils.state_functions import * +from utils.config import * +from velocity.run import * +from krssg_ssl_msgs.srv import * +import krssg_ssl_msgs.msg +import _turnAround_, _GoToPoint_ + +start_time = None +DIST_THRESH = 75 +dboxp = Vector2D((abs(OUR_DBOX_X)-(DBOX_HEIGHT/2)),0) + +class DribbleKick(behavior.Behavior): + """docstring for Dribble-and-Kick-into-Goal""" + class State(Enum): + + normal = 1 + movetoball = 2 + align = 3 + dribble = 4 + goal = 5 + + def __init__(self,target): + + super(DribbleKick,self).__init__() + + self.name = "Dribble_Kick" + + self.goal_point = target + + self.go_at = None + + self.target_point = None + + self.dbox = dboxp + + self.power = 0 + + self.approachball = False + + self.turn = False + + self.goto_dribble = False + + self.approachdbox = False + + self.readytogoal = False + + self.theta = 0 + + self.behavior_failed = False + + + #States:- + self.add_state(DribbleKick.State.normal, behavior.Behavior.State.running) + + self.add_state(DribbleKick.State.movetoball, behavior.Behavior.State.running) + + self.add_state(DribbleKick.State.align, behavior.Behavior.State.running) + + self.add_state(DribbleKick.State.dribble, behavior.Behavior.State.running) + + self.add_state(DribbleKick.State.goal, behavior.Behavior.State.running) + + + #Transition Functions:- + self.add_transition(behavior.Behavior.State.start, + DribbleKick.State.normal,lambda: True,'immediately') + + self.add_transition(DribbleKick.State.normal, + DribbleKick.State.movetoball, lambda: self.reachball(),'far_away_from_ball') + + self.add_transition(DribbleKick.State.movetoball, + DribbleKick.State.align, lambda: self.alignnow(),'Aligning_') + + self.add_transition(DribbleKick.State.align, + DribbleKick.State.dribble, lambda: self.goto_dribble,'Dribbling_') + + self.add_transition(DribbleKick.State.dribble, + DribbleKick.State.goal, lambda: self.readytogoal, 'Goaling!') + + self.add_transition(DribbleKick.State.goal, + behavior.Behavior.State.completed, lambda: self.done(),'Ball inside Goal') + + #Behavior - Failed !!! + self.add_transition(DribbleKick.State.movetoball, + behavior.Behavior.State.failed, lambda: self.behavior_failed, 'failed') + + self.add_transition(DribbleKick.State.align, + behavior.Behavior.State.failed, lambda: self.behavior_failed, 'failed') + + self.add_transition(DribbleKick.State.dribble, + behavior.Behavior.State.failed, lambda: self.behavior_failed, 'failed') + + + def add_kub(self,kub): + self.kub = kub + + def add_theta(self,theta): + self.theta = theta + + def get_pos_asvec2d(self, point2d): + return Vector2D(int(point2d.x),int(point2d.y)) + + def add_target_theta(self,theta): + self.theta = theta + + def point_on_D_Box(self): + return self.get_pos_asvec2d(self.dbox) + + def bot_moving(self): + if abs(self.kub.state.homeVel[self.kub.kubs_id].x) != 0 or abs(self.kub.state.homeVel[self.kub.kubs_id].y) != 0: + return True + return False + + def kicking_power(self): + return math.sqrt(dist(self.goal_point,self.kub.state.ballPos)/6400.0)*5.0 + +#LAMBDA FUNCTIONS:- + def reachball(self): + ballpos = self.kub.state.ballPos + theta = angle_diff(ballpos, self.point_on_D_Box()) + go_at = getPointBehindTheBall(ballpos, theta, -2) + return not(self.turn) and not(self.goto_dribble) and go_at.dist(self.get_pos_asvec2d(self.kub.get_pos())) >= DISTANCE_THRESH*0.25 and self.approachball + + def alignnow(self): + ballpos = self.kub.state.ballPos + theta = angle_diff(ballpos, self.point_on_D_Box()) + go_at = getPointBehindTheBall(ballpos, theta, -2) + return not (go_at.dist(self.get_pos_asvec2d(self.kub.get_pos())) >= DISTANCE_THRESH*0.25) and self.turn and not(self.goto_dribble) + + def done(self): + ballpos = self.get_pos_asvec2d(self.kub.state.ballPos) + condition = (ballpos.x >= 4500) and (ballpos.y > -300) and (ballpos.y < 300) + return condition + +# STATE FUNCTIONS:- + def on_enter_normal(self): + pass + + def execute_normal(self): + self.approachball=True + + def on_exit_normal(self): + pass + + def on_enter_movetoball(self): + print("Entered movetoball") + self.theta = normalize_angle(angle_diff(self.kub.state.ballPos,self.point_on_D_Box())) + self.power = 0 + self.go_at = getPointBehindTheBall(self.kub.state.ballPos, self.theta, -2) + _GoToPoint_.init(self.kub, self.go_at, 0) + + def execute_movetoball(self): + + print("Executing MOVETOBALL ... ") + start_time = rospy.Time.now() + start_time = 1.0*start_time.secs + 1.0*start_time.nsecs/pow(10,9) + print "----------------------------------------------------------------" + + generatingfunction = _GoToPoint_.execute(start_time, BOT_RADIUS, True) + + for gf in generatingfunction: + self.kub,target_point = gf + # self.target_point = getPointBehindTheBall(self.kub.state.ballPos,self.theta) + theta = angle_diff(self.kub.state.ballPos, self.point_on_D_Box()) + print(self.theta) + #print theta,"------------------------" + self.go_at = getPointBehindTheBall(self.kub.state.ballPos, theta, -1.5) + # #print vicinity_points(self.go_at,target_point,thresh=BOT_BALL_THRESH) + # if(dist(self.go_at,self.kub.get_pos())0 else -1) + + if abs(vw) > MAX_w and READY_TO_DRIBBLE==False: + vw = (vw/abs(vw))*MAX_w + + if vw!=0: + print("TURNING") + #print("vw Hoon Main =",vw) + #print("BOT THETA:",data.homePos[BOT_ID].theta) + print "\nAngle Remaining : ",theta_lft + else: + print("DONE !!") + break + + print "Omega Return: ",vw + print READY_TO_DRIBBLE + print "___________________________________________________________________" + self.kub.reset() + self.kub.turn(vw) + self.kub.execute() + + try: + prev_state = getState(prev_state).stateB + except rospy.ServiceException, e: + print("Error :: ROS ", e) + # print(kub.state) + self.kub.update_state(prev_state) + if not(prev_state == self.kub.state): + prev_state = self.kub.state + + self.turn = False + self.goto_dribble = True + print("HO GYA ALIGN !! ---------------------------------------") + + def on_exit_align(self): + print("EXITING ALIGN... goto_dribble:",self.goto_dribble) + self.goto_dribble = True #Now, Ready to dribble after aligning + self.approachball = False + self.turn = False + + + def on_enter_dribble(self): + print("Enter DRIBBLE------------------------------") + self.go_at = self.point_on_D_Box() + ballpos = self.kub.state.ballPos + #self.theta = normalize_angle(angle_diff(self.point_on_D_Box(), self.get_pos_asvec2d(self.goal_point))) + self.theta = angle_diff(ballpos, self.get_pos_asvec2d(self.goal_point)) + print "Required Rotation while dribble: ",self.theta + print "Goal Point: ",self.goal_point + self.kub.reset() + self.approachball = False + self.kub.dribbler = True + self.kub.execute() + _GoToPoint_.init(self.kub, self.go_at, 0) + + + def execute_dribble(self): + + print("Executing DRIBBLE ... ") + start_time = rospy.Time.now() + start_time = 1.0*start_time.secs + 1.0*start_time.nsecs/pow(10,9) + print "----------------------------------------------------------------" + self.kub.dribbler = True + self.kub.execute() + + generatingfunction = _GoToPoint_.execute(start_time, BOT_RADIUS*2.0, False) + + for gf in generatingfunction: + self.kub,target_point = gf + # self.target_point = getPointBehindTheBall(self.kub.state.ballPos,self.theta) + print "--------------------------------------------------" + ballPos=self.kub.state.ballPos + print(ballPos) + print "--------------------------------------------------" + theta = angle_diff(self.kub.state.ballPos, self.goal_point) + print(self.theta) + self.kub.dribbler = True + #self.kub.execute() + #self.kub.kick(self.power) + #print theta,"------------------------" + #self.go_at = getPointBehindTheBall(self.kub.state.ballPos, theta, -2) + # #print vicinity_points(self.go_at,target_point,thresh=BOT_BALL_THRESH) + # if(dist(self.go_at,self.kub.get_pos())= DIST_THRESH*0.85 + print "##########################" + return go_at.dist(self.get_pos_as_vec2d(self.kub.get_pos())) >= DIST_THRESH*1.00 - def turnaround(self): - return not self.bot_moving() #and not self.facing_the_target() and self.near_targetBall_line() and self.one_more() - - def turnAroundDirect(self): - return not self.setstance() and not self.bot_moving() def GoAndKickDirect(self): - return self.facing_the_target() and not self.setstance() + return not self.setstance() def goandkick(self): print("facing_the_target : ", self.facing_the_target()) @@ -126,7 +111,11 @@ def bot_moving(self): return True return False + def kicking_power(self): + return math.sqrt(dist(self.target_point,self.kub.state.ballPos)/6400.0)*5.0 + def ball_nearby(self, thresh = BOT_RADIUS*1.5): + if bot_in_front_of_ball(self.kub, thresh): return True else : @@ -135,7 +124,7 @@ def ball_nearby(self, thresh = BOT_RADIUS*1.5): def facing_the_target(self): print(" theta1 : ", self.theta) print(" bot theta : ", self.kub.get_theta()) - if vicinity_theta( self.theta, normalize_angle(self.kub.get_theta()), thresh=0.30 ): + if vicinity_theta( self.theta, self.kub.get_theta(), thresh=0.30 ): return True else : return False @@ -144,118 +133,61 @@ def at_ball_pos(self): error = 10 return vicinity_points(self.kub.get_pos(),self.kub.state.ballPos,thresh=BOT_BALL_THRESH+error) - - # def on_enter_setStance(self): - # global start_time - # start_time = rospy.Time.now() - # start_time = start_time.secs + 1.0*start_time.nsecs/pow(10,9) - - def on_enter_setStance(self): - print("entered setstance") - theta = angle_diff(self.target_point, self.kub.state.ballPos) - self.go_at = getPointToGo(self.kub.state.ballPos, theta) - _GoToPoint_.init(self.kub, self.go_at, self.theta) - pass - def reset(self): global start_time start_time = rospy.Time.now() start_time = 1.0*start_time.secs + 1.0*start_time.nsecs/pow(10,9) + def on_enter_normal(self): + pass + def execute_normal(self): pass - # def execute_setStance(self): - # global start_time - # t = rospy.Time.now() - # t = t.secs + 1.0*t.nsecs/pow(10,9) - # #print(" t - start = ",t-start_time) - # theta = angle_diff(self.target_point, self.kub.state.ballPos) - # go_at = getPointToGo(self.kub.state.ballPos, theta) - # #print("goo", go_at) - # [vx, vy, vw, REPLANNED] = Get_Vel(start_time, t, self.kub.kubs_id, Vector2D(go_at.x, go_at.y), self.kub.state.homePos, self.kub.state.awayPos, True) - # #vx, vy, vw, replanned - # #print("-------------------REPLANNED = ",REPLANNED) - # if(REPLANNED): - # self.reset() - - # # print("kubs_id = ",kub.kubs_id) - # curPos = self.kub.get_pos() - # #if vicinity_points(go_at, curPos, 4) == False: - # try: - # #print("vx = ",vx) - # #print("vy = ",vy) - # self.kub.move(vx, vy) - # #print(vw) - # #print("homePos") - # self.kub.turn(vw) - # self.kub.execute() - # except Exception as e: - # print("In except",e) - # pass - # print("exiting") + def on_exit_normal(self): + pass + def getPointToGo1(self,point, theta): + x = point.x - (1.5 * BOT_RADIUS) * (math.cos(theta)) + y = point.y - (1.5 * BOT_RADIUS) * (math.sin(theta)) + return Vector2D(int(x), int(y)) + + def on_enter_setStance(self): + print("entered setstance hello") + self.theta = normalize_angle(angle_diff( self.kub.state.ballPos,self.target_point)) + self.power = self.kicking_power() + self.go_at = self.getPointToGo1(self.kub.state.ballPos, self.theta) + _GoToPoint_.init(self.kub, self.go_at, self.theta) + pass + def execute_setStance(self): global DIST_THRESH - print("executing setstance") + print("executing setstance fnfnfj") start_time = rospy.Time.now() - start_time = 1.0*start_time.secs + 1.0*start_time.nsecs/pow(10,9) + start_time = 1.0*start_time.secs + 1.0*start_time.nsecs/pow(10,9) + print "-----------------------##########-" generatingfunction = _GoToPoint_.execute(start_time,DIST_THRESH,True) + for gf in generatingfunction: self.kub,target_point = gf # self.target_point = getPointBehindTheBall(self.kub.state.ballPos,self.theta) theta = angle_diff(self.target_point, self.kub.state.ballPos) - self.go_at = getPointToGo(self.kub.state.ballPos, theta) - if not vicinity_points(self.go_at,target_point,thresh=BOT_BALL_THRESH): - self.behavior_failed = True - break - - - def on_enter_turnAround(self): - print("entered turnAround") - print(self.get_pos_as_vec2d(self.kub.get_pos()).dist(self.get_pos_as_vec2d(self.kub.state.ballPos))) - self.theta = normalize_angle(angle_diff(self.kub.state.ballPos,self.target_point)) - _turnAround_.init(self.kub, self.theta ) - pass - - # def execute_turnAround(self): - # print("TURNING") - # #print(data.homePos[BOT_ID].theta) - # #print(theta) - # theta = angle_diff(self.target_point, self.kub.state.ballpos) - # totalAngle = theta - # MAX_w = (MAX_BOT_OMEGA+MIN_BOT_OMEGA)/1.2 - # # theta_left = float(homePos[kub_id].theta-totalAngle) - # theta_lft = normalize_angle(normalize_angle(self.kub.state.homePos[self.kub.kubs_id].theta)-totalAngle)*-1.0+3.1412 - # vw = (theta_lft/2*math.pi)*MAX_w - # # print "totalAngle",radian_2_deg(totalAngle) - # # print "theta_left ",radian_2_deg(theta_lft),theta_lft - # # print "homePos theta ",radian_2_deg(normalize_angle(homePos[kub_id].theta)) - # # print "omega ",vw - # if abs(vw)<1*MIN_BOT_OMEGA: - # vw = 1*MIN_BOT_OMEGA*(1 if vw>0 else -1) - - # if abs(theta_lft)= 5.0*MAX_BOT_OMEGA: - # case = 1 - # ramp_upt = 5.0 - # ramp_dnt = 5.0 - # ramp_rampt = (theta_lft-5.0*MAX_BOT_OMEGA)*1.0/MAX_BOT_OMEGA - # elif theta_lft >= 2.5*MAX_BOT_OMEGA: - # case = 2 - # ramp_upt = 0.0 - # ramp_dnt = 5.0 - # ramp_rampt = (theta_lft-2.5*MAX_BOT_OMEGA)*1.0/MAX_BOT_OMEGA - # else: - # case = 3 - # ramp_rampt = 0.0 - # ramp_dnt = sqrt(2.0*theta_lft/MAX_BOT_OMEGA_ACC)*1.0 - # mvw = sqrt(2.0*theta_lft*MAX_BOT_OMEGA_ACC)*1.0 - # ramp_upt = 0.0 - # planned = True - # print(case) - # print(ramp_rampt) - # print(ramp_upt) - # print(ramp_dnt) - # print(mvw) - if vx == 0 and vy == 0: - print("TURNING") + + + #READY TO TAKE STANCE + if vx == 0 and vy == 0 and d < 1.2*BOT_BALL_THRESH: + print(data.homePos[BOT_ID].theta) - print(theta) + print("Target Alignment : ",theta) totalAngle = theta MAX_w = (MAX_BOT_OMEGA+MIN_BOT_OMEGA)/1.2 - # theta_left = float(homePos[kub_id].theta-totalAngle) - theta_lft = normalize_angle(normalize_angle(data.homePos[BOT_ID].theta)-totalAngle)*-1.0+3.1412 - vw = (theta_lft/2*math.pi)*MAX_w - # print "totalAngle",radian_2_deg(totalAngle) - # print "theta_left ",radian_2_deg(theta_lft),theta_lft - # print "homePos theta ",radian_2_deg(normalize_angle(homePos[kub_id].theta)) - # print "omega ",vw - if abs(vw)<1*MIN_BOT_OMEGA: - vw = 1*MIN_BOT_OMEGA*(1 if vw>0 else -1) - - if abs(theta_lft)0 else -1) + + if abs(vw) > MAX_w and READY_TO_KICK==False: + vw = (vw/abs(vw))*MAX_w + + if vw!=0: + print("TURNING") + #print("vw Hoon Main =",vw) + print("BOT THETA: ",data.homePos[BOT_ID].theta) + print "\nAngle Remaining : ",theta_lft + else: + print("DONE !!") + + print "Omega Return: ",vw + print READY_TO_KICK + print "___________________________________________________________________" kub.reset() kub.turn(vw) kub.execute() - # if st == None: - # st = rospy.Time.now() - # st = 1.0*st.secs + 1.0*st.nsecs/pow(10,9) - # tnow = rospy.Time.now() - # tnow = 1.0*tnow.secs + 1.0*tnow.nsecs/pow(10,9) - # diff = tnow-st - # if case == 1: - # if diff <= 5.0: - # vw = (tnow-st)*MAX_BOT_OMEGA_ACC - # elif diff > 5.0 and diff <= 5.0+ramp_rampt: - # vw = MAX_BOT_OMEGA - # else: - # tim = 10.0+ramp_rampt-diff - # vw = tim*MAX_BOT_OMEGA_ACC - # elif case == 2: - # if diff <= ramp_rampt: - # vw = MAX_BOT_OMEGA - # else : - # tim = 5.0+ramp_rampt-diff - # vw = tim*MAX_BOT_OMEGA_ACC - # else : - # vw = mvw - MAX_BOT_OMEGA_ACC*diff - # if normalize_angle(homePos[BOT_ID].theta) < theta: - # vw = -1.0*vw - # print(vw) - # kub.reset() - # kub.turn(vw) - # kub.execute() + + if READY_TO_KICK : + print "\nAngle Remaining : ",theta_lft + print " ____________REACHED BALL, READY TO KICK____________\n" + rospy.signal_shutdown("=======ALIGNED======") + if __name__ == "__main__": - global start_time, st, planned, case, mvw + global start_time, st, planned, case case = -1 - mvw = 0.0 st = None planned = False print("here") + + #Begin the process: Driver, START MOVING + rospy.init_node('node_new',anonymous=False) start_time = rospy.Time.now() start_time = 1.0*start_time.secs + 1.0*start_time.nsecs/pow(10,9) + + pub = rospy.Publisher('/grsim_data', gr_Commands, queue_size=1000) print('testing...') - rospy.Subscriber('/belief_state', BeliefState, kp_callback, queue_size=1000) - rospy.Subscriber('/gui_params', point_SF, GUI_Callback, queue_size = 1000) + sub1 = rospy.Subscriber('/belief_state', BeliefState, kp_callback, queue_size=1000) + + sub2 = rospy.Subscriber('/gui_params', point_SF, GUI_Callback, queue_size = 1000) + + print("Ho gya align!!") rospy.spin() + + sub1.unregister() + sub2.unregister() + print "AB MAIN KARUNGA -------- KICKKK !!!" + +command="python KickP.py %s %s %s"%(BOT_ID,target.x,target.y) +print("______________________________________________________________") +print("/n",command,"/n") +print("______________________________________________________________\n") +os.system(command) + + + +#cmd = "date" +#returns output as byte string +#returned_output = subprocess.check_output(cmd) +#using decode() function to convert byte string to string +#print('Current date is:', returned_output.decode("utf-8")) diff --git a/velocity/run.py b/velocity/run.py index 09391357..35f1f9ef 100644 --- a/velocity/run.py +++ b/velocity/run.py @@ -30,7 +30,7 @@ def distance_(a, b): dy = a.y-b.y return sqrt(dx*dx+dy*dy) -def Get_Vel(start, t, kub_id, target, homePos_, awayPos_,avoid_ball=False): +def Get_Vel(start, t, kub_id, target, homePos_, awayPos_,avoid_ball=False, f=1.5): # print("Get_Vel: t - start = ",t-start) global expectedTraverseTime, REPLAN, v, errorInfo, pso, FIRST_CALL, homePos, awayPos, kubid, prev_target REPLAN = 0 @@ -53,7 +53,7 @@ def Get_Vel(start, t, kub_id, target, homePos_, awayPos_,avoid_ball=False): findPath(startPt, target, avoid_ball) FIRST_CALL = 0 - if distance < 1.5*BOT_BALL_THRESH: + if distance < f*BOT_BALL_THRESH: return [0,0,0,0] # print("ex = ",expectedTraverseTime) # print("t = ",t," start = ",start)