Exemplo n.º 1
0
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
Exemplo n.º 5
0
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