class MissionPick(StandardMission): def __init__(self, name): self.name = name StandardMission.__init__(self, self.name, "/mission/pick", self.callback) self.vision = VisionCollector("drum") self.echo(self.name, "PICK GOLF SETUP FINISHED") self.state = False def callback(self, request): result = False self.state = request.data if (not self.ok_state()): return False self.fix_z(-0.5) self.reset_target("xy") self.wait_state("z", 0.1, 5) found_object = self.step_01() if (not found_object): self.echo(self.name, "Don't found object mission aborted") return False else: self.step_03() result = True return result def step_01(self): # find golf in a drum found_golf = False mode_control = 1 # mode control is survey around drum # 1 is left 2 is right 3 is up 4 is down value_x = 0 value_y = 0 count_change_mode = 0 count_found_golf = 0 limit_mode = 10 self.echo(self.name, "We command to hold for pick golf") self.hold_golf() self.echo(self.name, "We command finish") while (self.ok_state()): self.sleep(0.1) if (mode_control == 1): self.vision.analysis_all("blue", "left-right", 5) self.echo_vision(self.vision.echo_special()) if (self.vision.result["cx_1"] < -0.5): value_y = 0.1 elif (self.vision.result["cx_1"] > 0.0): value_y = -0.1 else: value_y = 0 if (abs(self.vision.result["cy_1"]) < 0.5): value_x = 0 else: value_x = math.copysign(0.05, self.vision.result["cy_1"]) elif (mode_control == 2): self.vision.analysis_all("blue", "left-right", 5) self.echo_vision(self.vision.echo_special()) if (self.vision.result["cx_2"] > 0.5): value_y = -0.05 elif (self.vision.result["cx_2"] < 0.0): value_y = 0.05 else: value_y = 0 if (abs(self.vision.result["cy_2"]) < 0.5): value_x = 0 else: value_x = math.copysign(0.05, self.vision.result["cy_2"]) self.echo( self.name + " Mode " + str(mode_control), "We command velocity x : y --> " + str(value_x) + " : " + str(value_y)) self.velocity({'x': value_x, 'y': value_y}) self.sleep(0.1) self.vision.analysis_all("golf", "sevinar", 5) self.echo_vision(self.vision.echo_data()) # This part will discus about data from vision if (self.vision.have_object()): count_found_golf = 0 self.echo(self.name, "Find golf move to center of golf") while (self.ok_state() and abs(count_found_golf) < 15): self.sleep(0.1) self.vision.analysis_all("golf", "sevinar", 5) if (self.vision.have_object()): count_found_golf += 1 self.velocity({ 'x': math.copysign(0.1, self.vision.center_y()), 'y': math.copysign(0.1, -1 * self.vision.center_x()) }) else: count_found_golf -= 0 self.echo(self.name, "Found golf is " + str(count_found_golf)) if (count_found_golf == 15): return True if (value_x == 0 and value_y == 0): count_change_mode += 1 self.echo(self.name, "count_change_mode " + str(count_change_mode)) if (count_change_mode == limit_mode): mode_control += 1 count_change_mode = 0 if (mode_control > 2): return False print("Finish loop") def step_02(self): # this part we will pick a ball self.echo(self.name, "We will start to pick ball") self.fix_z(-0.8) count_ok_depth = 0 value_x = 0 value_y = 0 self.free_xy(True) while (self.ok_state()): self.vision.analysis_all("golf", "sevinar", 5) self.echo_vision(self.vision.echo_data()) if (self.vision.center_x() < -0.5): value_y = -0.1 elif (self.vision.center_x() > -0.1): value_y = 0.1 else: value_y = 0 if (self.vision.center_y() < 0.1): value_x = 0.1 elif (self.vision.center_y() > 0.5): value_x = -0.1 else: value_x = 0 self.echo(self.name, " vel x : y is" + str(value_x) + " : " + str(value_y)) self.velocity({'x': value_x, 'y': value_y}) if (self.check_position("z", 0.15)): count_ok_depth += 1 else: count_ok_depth = 0 if (value_x == 0 and value_y == 0): self.echo(self.name, "Target on lock") if (count_ok_depth > 5): self.echo(self.name, "We will move down now ") start_time = time.time() diff_time = 0 self.velocity_z(-0.1) while (self.ok_state() and diff_time < 10): self.sleep(0.1) self.reset_target("xy") diff_time = time.time() - start_time self.echo(self.name, "Now time is " + diff_time) self.reset_velocity("z") self.fix_z(-0.5) self.free_xy(False) break self.echo(self.name, "Finish pick golf it ok?") def step_03(self): self.echo(self.name, "We will start to pick ball") current_fix_velocity = False value_x = 0 value_y = 0 self.fix_z(-0.8) self.wait_state("z", 0.1, 5) self.free_xy(True) while (self.ok_state()): self.sleep(0.05) self.vision.analysis_all("golf", "sevinar", 5) self.echo_vision(self.vision.echo_data()) if (self.vision.have_object()): if (self.vision.center_x() > -0.4): value_y = -0.2 else: value_y = 0.1 if (self.vision.center_y() < 0.3): value_x = -0.15 else: value_x = 0.10 self.echo( self.name, "Vel x : y are " + str(value_x) + " : " + str(value_y)) self.velocity({'x': value_x, 'y': value_y}) else: if (not current_fix_velocity): self.velocity_z(-0.03) current_fix_velocity = True value_y = 0.0 value_x = 0.0 self.velocity({'y': value_y, 'x': value_x}) self.echo( self.name, "Vel x : y are " + str(value_x) + " : " + str(value_y)) self.target_state()
class MissionQualification(StandardMission): def __init__(self, name): self.name = name StandardMission.__init__(self, self.name, "/mission/qualification", self.callback) self.vision = VisionCollector("qualification") self.state = False print("MISSION QUALIFICATION FINISHED SETUP") def callback(self, message): result = False if (message.data and self.state): self.echo(self.name, "Now mission qualification have running") return False elif (message.data): self.state = True else: self.state = False return False # This function will call by switch we must to reset data target self.reset_target("xy") self.reset_target("yaw") self.reset_velocity("xy") self.fix_z(-0.5) self.echo(self.name, "START MISSION QUALIFICATION") # This situation we don't know what picture we have to find but we known we have start # direct we will go forward until find the picture self.type_pier = 0 # -1 : 0 : 1 is single left : double pier : single right self.collect_state() self.velocity_xy(0.3, 0) count_have_object = 0 start_time = time.time() while (self.ok_state()): self.sleep(0.05) if ((time.time() - start_time) < 5): self.echo(self.name, "Now time is " + str(time.time() - start_time)) continue self.vision.analysis_all("qualification", "sevinar", 5) self.echo_vision(self.vision.echo_data()) if (self.vision.have_object()): count_have_object += 1 if (count_have_object == 6): break else: count_have_object = 0 self.echo( self.name, "distance : count_have_object are " + str(self.distance()) + str(count_have_object)) if (self.distance() > 4.5): self.reset_velocity("xy") self.velocity_xy(0.1, 0) # we want to ensure we find object 3 round and next we will move follow data self.reset_velocity("xy") self.fix_z(-0.3) self.vision.analysis_all("qualification", "servinar", 5) # we assign data of run_type is # 1 <== Found only single pier # 2 <== Found double pier <All GATE> # 3 <== Solution of last move form found single pier if (self.vision.num_object() == 2): self.run_type = 2 elif (self.vision.num_object() == 1): self.run_type = 1 else: self.run_type = 0 self.echo( self.name, "We will start do it on function type : " + str(self.run_type)) while (self.ok_state()): if (self.run_type == 1): self.type_1() elif (self.run_type == 2): self.type_2() elif (self.run_type == 3): self.type_3() else: break self.echo(self.name, "Finished run callback alway response TRUE") return True def type_1(self): if (self.type_pier == 0): self.vision.analysis_all("qualification", "sevinar", 5) self.echo_vision(self.vision.echo_specific()) if (self.vision.num_object() == 1): if (self.vision.center_x() < 0): self.echo(self.name, "I decide that pier is left pier") self.type_pier = -1 else: self.echo(self.name, "I decide that pier is right pier") self.type_pier = 1 elif (self.vision.num_object() == 2): self.type_pier = 0 self.echo(self.name, "What I found 2 pier why?") self.run_type = 2 return 0 count_not_single = 0 count_not_found = 0 while (self.ok_state()): self.sleep(0.05) self.vision.analysis_all("qualification", "sevinar", 5) self.echo_vision(self.vision.echo_data()) if (self.vision.num_object() == 1): count_not_single = 0 count_not_found = 0 if (abs(self.vision.center_x()) < 0.3): self.velocity({'x': 0.10}) self.echo( self.name, "type_1 object : " + str(self.type_pier) + " We decide to move forward") elif (self.vision.center_x() < 0): self.velocity({'y': 0.1}) self.echo( self.name, "type_1 object : " + str(self.type_pier) + " We decide to move left") elif (self.vision.center_x() > 0): self.velocity({'y': -0.1}) self.echo( self.name, "type_1 object : " + str(self.type_pier) + " We decide to move right") else: self.echo(self.name, "BUG ON LINE 127") self.run_type = 0 break self.echo_vision(self.vision.echo_specific()) if (self.vision.distance_x() > 0.1): self.echo( self.name, "Now over distance we have to chance to last move") self.run_type = 3 break elif (self.vision.num_object() == 2): self.velocity( {'y': math.copysign(0.1, self.vision.center_x() * -1)}) self.run_type = 2 self.type_pier = 0 break else: count_not_found += 1 self.echo(self.name, "type_1 not_found pier : " + str(count_not_found)) if (count_not_found == 5): self.run_type = 0 self.relative_xy(5, math.copysign(1.5, self.type_pier)) self.echo( self.name, "We decide to last move side is " + str(math.copysign(1.5, -1 * self.type_pier))) break def type_2(self): count_not_found = 0 count_not_doulbe = 0 current_fix_velocity = False while (self.ok_state()): self.sleep(0.1) self.vision.analysis_all("qualification", "sevinar", 5) self.echo_vision(self.vision.echo_data()) if (self.vision.num_object() == 2): count_not_doulbe = 0 count_not_found = 0 if (abs(self.vision.center_x()) < 0.10): if (not current_fix_velocity): self.velocity_xy(0.2, 0) current_fix_velocity = True self.echo(self.name, "type_2 we move direct by fix velocity") elif (self.vision.center_x() < 0): if (current_fix_velocity): current_fix_velocity = False self.reset_velocity("xy") self.velocity({'y': 0.1}) self.echo(self.name, "type_2 we move left") elif (self.vision.center_x() > 0): if (current_fix_velocity): current_fix_velocity = False self.reset_velocity("xy") self.velocity({'y': -0.1}) self.echo(self.name, "type_2 we move right") self.echo_vision(self.vision.echo_specific()) if (self.vision.distance_x() > 1.0): self.echo( self.name, "Now over distance we decide to only move forward") self.run_type = 0 if (not current_fix_velocity): self.velocity_xy(0.3, 0) self.echo(self.name, "We order contant velocity x is 0.3") current_fix_velocity = True break elif (self.vision.num_object() == 1): if (current_fix_velocity): current_fix_velocity = False self.reset_velocity("xy") count_not_doulbe += 1 self.echo( self.name, "Type 2 we found only single pier : " + str(count_not_doulbe)) if (count_not_doulbe == 5): self.echo(self.name, "We change to mode type 1 single pier") self.run_type = 1 self.type_pier = 0 break else: count_not_found += 1 self.echo(self.name, "Type 2 we not found pier : " + str(count_not_found)) if (count_not_found == 5): self.echo(self.name, "Last move") self.run_type = 0 self.type_pier = 0 if (not current_fix_velocity): self.velocity_xy(0.3, 0) self.echo(self.name, "I don't know what should I do FORWARD!") current_fix_velocity = True break def type_3(self): self.echo( self.name, "We move in last mode type_3 and type peir is " + str(self.type_pier)) # this step we will move side to don't find pier and # will move a little time befor move forward count_not_found = 0 while (self.ok_state()): self.sleep(0.1) self.vision.analysis_all("qualification", "sevinar", 5) self.echo( self.name, "Type 3 and move slide to don't have object : " + str(count_not_found)) self.velocity({'y': math.copysign(0.10, self.type_pier)}) if (self.vision.have_object()): count_not_found = 0 else: count_not_found += 1 if (count_not_found == 5): break start_time = time.time() self.echo(self.name, "Move side 3 second") while (self.ok_state()): self.sleep(0.1) diff_time = time.time() - start_time self.velocity({'y': math.copysign(0.10, self.type_pier)}) self.echo(self.name, "Type3 now move time is " + str(diff_time)) if (diff_time > 5): break self.echo(self.name, "Time out move forward") self.velocity_xy(0.3, 0) self.run_type = 0
class MissionGate(StandardMission): def __init__(self, name): self.name = name StandardMission.__init__(self, self.name, "/mission/gate", self.callback) self.vision = VisionCollector("gate") self.echo(self.name, "GATE SETUP FINISHED") self.state = False def callback(self, request): # Divide to 2 part move to center and direction result = False self.state = request.data if (not self.ok_state()): return False self.echo(self.name, "START MISSION GATE") count = 0 count += self.step_01() if (count != 0): result = self.step_02(count) self.fix_z(-0.5) return result def step_01(self): result = 0 count_unfound = 0 while (self.ok_state()): self.sleep(0.1) self.vision.analysis_all("gate", "sevinar", 5) self.echo_vision(self.vision.echo_data()) if (count_unfound == 5): break if (not self.vision.have_object()): count_unfound += 1 continue count_unfound = 0 if (self.vision.result['pos'] == 0): temp_center_x = self.vision.center_x() if (abs(temp_center_x) < 0.1): self.echo(self.name, "Found Pos : 0 and Move Forward") self.velocity({'x': 0.2}) elif (temp_center_x < 0): self.echo(self.name, "Found Pos : 0 and Move Left") self.velocity({'y': 0.1}) else: self.echo(self.name, "Found Pos : 0 and Move Right") self.velocity({'y': -0.1}) if (self.vision.area() > 0.6): self.collect_state() self.echo(self.name, "Area are over let play direct") self.velocity_xy(0.2, 0) self.sleep() self.relative_z(-0.3) result = 1 break elif (self.vision.result['pos'] == -1): self.echo(self.name, "Found Pos : -1 and Move Left") self.velocity({'y': 0.2}) elif (self.vision.result['pos'] == 1): self.echo(self.name, "Found Pos : 1 and Move Right") self.velocity({'y': -0.2}) return result def step_02(self, num_type): self.echo(self.name, "Welcome to step 2 check movement") if (num_type == 1): # have fix velocity while (self.ok_state()): self.sleep() distance = self.distance() self.echo(self.name, "Now distance " + str(distance)) if (distance > 2.5): self.reset_velocity("xy") self.relative_z(0.3) break count_ok = 0 while (not rospy.is_shutdown()): self.sleep() if (self.check_position("z", 0.15)): count_ok += 1 if (count_ok == 5): break else: count_ok = 0 self.echo(self.name, "Count ok depth is " + str(count_ok)) return True elif (num_type == 2): # non fix velocity count_ok = 0 while (self.ok_state()): self.sleep() if (self.check_position("xy", 0.1)): count_ok += 1 if (count_ok == 5): break else: count_ok = 0 self.echo(self.name, "Count ok xy is " + str(count_ok)) count_ok = 0 while (not rospy.is_shutdown()): self.sleep() if (self.check_position("z", 0.15)): count_ok += 1 if (count_ok == 5): break else: count_ok = 0 self.echo(self.name, "Count ok depth is " + str(count_ok)) return True else: return False
class MissionGate(StandardMission): def __init__(self, name): self.name = name StandardMission.__init__(self, self.name, "/mission/flare", self.callback) self.vision = VisionCollector("flare") print("FLARE FINISHED SETUP") def callback(self, message): # Divide to 2 part move to center and direction result = False self.echo(self.name, "START MISSION FLARE") result = self.step_01() if (result): result = self.step_02() return result def step_01(self): # play in far mode and try to find in near mode self.echo(self.name, "PLAY STEP ONE TO FIND FLAR IN FAR MODE") count_unfound = 0 while (not rospy.is_shutdown()): self.sleep(0.1) self.vision.analysis_all("flare", "far", 5) self.echo_vision(self.vision.echo_data()) if (self.vision.have_object()): count_unfound = 0 if (abs(self.vision.center_x()) < 0.3): self.velocity({'x': 0.1}) self.echo(self.name, "FARMODE Move FORWARD") elif (self.vision.center_x() < 0): self.velocity({'y': 0.08}) self.echo(self.name, "FARMODE MOVE LEFT") elif (self.vision.center_x() > 0): self.velocity({'y': -0.08}) self.echo(self.name, "FARMODE MOVE RIGHT") else: self.echo( self.name, "\tERROR IN LINE 59 =====================================" ) else: count_unfound += 1 self.echo(self.name, "WARNING UNFOUND : " + str(count_unfound)) if (count_unfound == 5): break self.vision.analysis_all("flare", "near", 5) if (self.vision.have_object()): self.echo(self.name, "FOUND IN NEAR MODE") self.reset_target("xy") break if (count_unfound == 5): return False else: return True def step_02(self): # play in near mode self.echo(self.name, "PLAY STEP TWO TO FIND FLAR AND TARGET DASH") count_unfound = 0 # this variable is about picture count_ok = 0 # this variable is about position haved_reset_target = False while (not rospy.is_shutdown()): self.sleep(0.1) self.vision.analysis_all("flare", "near", 5) self.echo_vision(self.vision.echo_data()) if (self.vision.have_object()): count_unfound = 0 if (abs(self.vision.center_x()) < 0.5): if (not haved_reset_target): self.reset_target("xy") self.echo(self.name, "NEARMODE Renew target") self.echo( self.name, "NEARMODE That center we will move direct if we can") if (self.check_position("xy", 0.05)): count_ok += 1 if (count_ok == 5): self.velocity_xy(0.2, 0) self.echo(self.name, "NEARMODE GO DIRECT") break else: count_ok = 0 elif (self.vision.center_x() < 0): self.velocity({'y': 0.05}) self.echo(self.name, "NEARMODE MOVE LEFT") elif (self.vision.center_x() > 0): self.velocity({'y': -0.05}) self.echo(self.name, "NEARMODE MOVE RIGHT") else: self.echo( self.name, "\tERROR IN LINE 112 =====================================" ) else: count_unfound += 1 if (count_unfound == 5): break while (not rospy.is_shutdown() and count_unfound < 5): self.sleep(0.1) self.vision.analysis_all("flare", "near", 5) self.echo_vision(self.vision.echo_data()) if (self.vision.have_object()): count_unfound = 0 else: count_unfound += 1 self.fix_z(-0.1) return True
class MissionDrum(StandardMission): def __init__(self, name): self.name = name StandardMission.__init__(self, self.name, "/mission/drop", self.callback) self.vision = VisionCollector("drum") self.state = False self.echo(self.name, "DROP BALL SEtuP FINISHER") def callback(self, request): result = False self.state = request.data if (not self.ok_state()): return False self.echo(self.name, "START MISSION DROP BALL") self.wait_state("yaw", 0.1, 5) self.step_01() return True def step_01(self): count_Time = False self.echo(self.name, "START AT STEP 01") value_x = 0 value_y = 0 start_time = 0 ever_drop = False self.velocity_z(-0.03) self.wait_state("z", 0.1, 5) current_fix_z = False while (self.ok_state()): self.vision.analysis_all("blue", "left-right", 5) self.echo_vision(self.vision.echo_special()) self.echo_vision(self.vision.echo_data()) if (abs(self.vision.center_x()) < 0.15): value_y = 0 else: value_y = math.copysign(0.1, -1 * self.vision.center_x()) if (abs(self.vision.center_y()) < 0.15): value_x = 0 else: value_x = math.copysign(0.1, self.vision.center_y()) # if( not self.vision.result["forward"] ): # value_x = -0.2 # elif( not self.vision.result["backward"] ): # value_x = 0.2 # else: # value_x = 0 self.echo( self.name, "I command velocity x : y are " + str(value_x) + " : " + str(value_y)) if (not count_Time): self.target_state() self.echo(self.name, "Node depth is " + str(self.temp_state[2])) if (self.temp_state[2] < -1.3): count_Time = True start_time = time.time() self.free_xy(True) else: diff_time = time.time() - start_time self.echo(self.name, "Count time for drop " + str(diff_time)) if (diff_time > 5): break elif (diff_time > 2 and not ever_drop): self.echo(self.name, "We have to command drop ball") self.fire_golf() else: continue self.velocity({'x': value_x, 'y': value_y}) self.reset_velocity("z") self.fix_z(-0.5) self.wait_state("z", 0.1, 5) self.free_xy(False) self.reset_target("xy")
class MissionQualification( StandardMission ): def __init__( self , name ): self.name = name StandardMission.__init__( self , self.name , "/mission/qualification" , self.callback ) self.vision = VisionCollector("qualification") print("QUALIFICATION FINISHED SETUP") def callback( self , message): # Divide to 2 part move to center and direction result = False self.temp_pier = 0 self.reset_target( "xy" ) self.reset_target( "yaw" ) self.fix_z( -0.3 ) self.echo( self.name , "START MISSION QUALIFICATION") self.collect_state() self.velocity_xy( 0.2 , 0 ) while( not rospy.is_shutdown() ): self.sleep( 0.1 ) self.vision.analysis_all( "qualification" , "sevinar" , 5 ) if( self.vision.have_object() ): self.echo( self.name , "Now have object ") break else: self.echo( self.name , "Never found and distance is " + str( self.distance()) ) self.reset_velocity("xy") self.run_type = 1 while( not rospy.is_shutdown() and not result ): if( self.run_type == 0 ): break elif( self.run_type == 1 ): self.move_forward() elif( self.run_type == 2 ): self.move_center() elif( self.run_type == 3 ): result = self.last_move() elif( self.run_type == 4 ): result = self.relative_move() return result def move_forward( self ): self.velocity_xy( 0.2 , 0 ) count_have_object = 0 count_out_center = 0 self.run_type = 0 while( not rospy.is_shutdown() ): self.sleep(0.05) self.vision.analysis_all( "qualification" , "sevinar" , 5 ) self.echo_vision( self.vision.echo_data() ) if( self.vision.num_object() == 2): count_have_object = 0 if( self.vision.center_x() < 0.2 ): self.echo( self.name , "MODE_FORWARD Move forward ok center") count_out_center = 0 else: count_out_center += 1 self.echo( self.name , "MODE_FORWARD Out center : " + str( count_out_center ) ) if( count_out_center == 5 ): self.run_type = 2 break if( self.vision.area() > 0.5 ): self.run_type = 3 break elif( self.vision.num_object() == 1 ): self.run_type = 4 break else: count_have_object += 1 self.echo( self.name , "MODE_FORWARD Count don't have object is " + str( count_have_object )) if( count_have_object == 5 ): self.run_type = 3 break self.reset_velocity( "xy" ) def move_center( self ): count_have_object = 0 while( not rospy.is_shutdown() ): self.sleep(0.05) self.vision.analysis_all( "qualification" , "sevinar" , 5 ) self.echo_vision( self.vision.echo_data() ) if( self.vision.num_object() == 2 ): count_have_object = 0 if( self.vision.center_x() < 0.2 ): self.run_type = 1 break elif( self.vision.center_x() < 0 ): self.velocity( {'y' , 0.1 } ) self.echo( self.name , "Now we move Left") elif( self.vision.center_x() > 0 ): self.velocity( {'y' , -0.1 } ) self.echo( self.name , "Now we move Right") elif( self.vision.num_object() == 1 ): self.run_type = 4 break else: count_have_object += 1 self.echo( self.name , "Count don't have object is " + str( count_have_object)) if( count_have_object == 5 ): self.run_type = 3 break def relative_move( self ): self.vision.analysis_all( "qualification" , "servinar" , 5 ) if( self.vision.center_x() < 0 ): self.echo( self.name , "Last move relative RIGHT") self.relative_xy( 3 , -1 ) else: self.echo( self.name , "Last move relative LEFT") self.relative_xy( 3 , 1 ) return True def last_move( self ): self.echo( self.name , "Last move forward by velocity_xy 0.3") self.velocity_xy( 0.3 , 0 ) return True