class MoveDorna:
    def __init__(self):
        path = os.path.dirname(os.path.abspath(sys.argv[0]))
        path = path + "/config/dorna.yaml"
        # Objekt der Dorna-Klasse instanziieren
        self.robot = Dorna(path)
        # Verbindung mit dem Roboter herstellen
        self.robot.connect()

    # Homing-Prozess
    def home(self):
        proceed = False

        while not proceed:
            _input = input("Home Dorna? (y/n)")

            if _input == "y":
                proceed = True

            elif _input == "n":
                self.terminate()
                break

        if proceed:
            # Dorna in die Home-Position fahren
            self.robot.home(["j0", "j1", "j2", "j3"])
            print(self.robot.homed())
            print(self.robot.position())
            proceed = False

            while not proceed:
                _input = input("j3 und j4 auf 0 setzen? (y/n)")

                if _input == "y":
                    proceed = True

                elif _input == "n":
                    break

            if proceed:
                # Gelenke des Endeffektors nullen
                self.set_joint_j3_0()

    def set_joint_j3_0(self):
        self.robot.set_joint({"j3": 0})
        self.robot.set_joint({"j4": 0})

    # Endeffektor zu einer bestimmten Koordinate fahren
    def move_to_position(self):
        # Koordinate eingeben
        i = Input()
        output = i.input_values()
        x = output.get("x")
        y = output.get("y")
        z = output.get("z")
        # Koordinate berechnen
        position = JointValue(x, y, z)
        position_result = position.calc_joint_values()
        position_array = self.get_joints(position_result)

        print(position_array)
        proceed = True

        while proceed:
            _input = input("Bewegung ausführen? (y/n)")

            if _input == "n":
                proceed = False

            elif _input == "y":
                break

        if proceed:
            # Bewegung ausführen
            self.move_dorna(position_array)

    # Ablaufsteuerung zum Bälle einsammeln ausführen
    def collect_balls(self):
        n = eval(input("Anzahl der Bälle: "))
        balls_array = []
        out_of_range = False
        # Koordinaten der Bälle eingeben
        for j in range(n):
            print("Position des", j + 1, ". Balls:")
            i = Input()
            output = i.input_values()
            x = output.get("x")
            y = output.get("y")
            z = output.get("z")
            # Werte der Gelenke berechnen
            seven_above_ball = JointValue(x, y, z + 7)  # 7cm über dem Ball
            five_above_ball = JointValue(x, y, z + 5)   # 5cm über dem Ball
            one_above_ball = JointValue(x, y, z + 1)    # 1cm über dem Ball

            seven_above_ball_result = seven_above_ball.calc_joint_values()
            five_above_ball_result = five_above_ball.calc_joint_values()
            one_above_ball_result = one_above_ball.calc_joint_values()

            if five_above_ball == 1 or one_above_ball == 1:
                out_of_range = True
                break

            seven_above_ball_array = self.get_joints(seven_above_ball_result)
            five_above_ball_array = self.get_joints(five_above_ball_result)
            one_above_ball_array = self.get_joints(one_above_ball_result)

            balls_dict = {"1.": five_above_ball_array, "2.": one_above_ball_array, "3.": seven_above_ball_array}

            balls_array.append(balls_dict)

        print("Position des Behälters: ")
        # Koordinate des Behälters angeben
        i = Input()
        output = i.input_values()
        x = output.get("x")
        y = output.get("y")
        z = output.get("z")
        # Werte der Gelenke berechnen
        fifteen_above_container = JointValue(x, y, z + 15)  # 15cm über dem Behälter
        fifteen_above_container_result = fifteen_above_container.calc_joint_values()

        if five_above_ball == 1 or one_above_ball == 1:
            out_of_range = True

        fifteen_above_container_array = self.get_joints(fifteen_above_container_result)

        print(balls_array)
        balls_array_len = len(balls_array)

        if not out_of_range:
            for x in range(balls_array_len):
                print(balls_array[x])
            print(fifteen_above_container_array)
            proceed = True

            while proceed:
                _input = input("Bewegung ausführen? (y/n)")

                if _input == "n":
                    proceed = False

                elif _input == "y":
                    break

            if proceed:
                for i in range(n):
                    first = balls_array[i].get("1.")
                    second = balls_array[i].get("2.")
                    third = balls_array[i].get("3.")
                    # Ablaufsteuerung
                    self.open_gripper()
                    self.move_dorna(first)
                    self.move_dorna(second)
                    self.close_gripper()
                    self.move_dorna(third)
                    self.move_dorna(fifteen_above_container_array)
                    self.open_gripper()

                print("Bewegung ausgeführt.")

        else:
            print("Bewegung konnte nicht ausgeführt werden")

    def terminate(self):
        self.robot.terminate()

    def close_gripper(self):
        self.robot.set_io({"servo": 700})

    def open_gripper(self):
        self.robot.set_io({"servo": 0})

    def get_joints(self, height):
        j0 = height.get("j0")
        j1 = height.get("j1")
        j2 = height.get("j2")
        j3 = height.get("j3")

        return [j0, j1, j2, j3, 0]

    def move_dorna(self, position):
        self.robot.move({"movement": 0, "path": "joint", "joint": position})

    # Nullposition
    def zero(self):
        self.robot.move({"movement": 0, "path": "joint", "joint": [0, 0, 0, 0, 0]})
Esempio n. 2
0
class Subscriber:
    def __init__(self):
        rospy.init_node("coordinates_subscriber")
        self.coordinates_sub = rospy.Subscriber("/coordinates", Coordinates,
                                                self.callback)
        self.coordinates_msg = Coordinates()

        path = os.path.dirname(os.path.abspath(sys.argv[0]))
        path = path + "/config/dorna.yaml"
        self.robot = Dorna(path)
        self.robot.connect()

    def home(self):
        proceed = False

        while not proceed:
            _input = input("Home Dorna? (y/n)")

            if _input == "y":
                proceed = True

            elif _input == "n":
                self.terminate()
                break

        if proceed:
            self.robot.home(["j0", "j1", "j2", "j3"])
            proceed = False

            while not proceed:
                _input = input("j3 auf 0 setzen? (y/n)")

                if _input == "y":
                    proceed = True

                elif _input == "n":
                    break

            if proceed:
                self.set_joint_j3_0()

    def set_joint_j3_0(self):
        self.robot.set_joint({"j3": 0})
        self.robot.set_joint({"j4": 0})

    def callback(self, msg):
        self.coordinates_msg = msg

    def collect_balls(self):
        container_coordinate = self.coordinates_msg.container_coordinates

        if len(container_coordinate) > 0:
            x_c = container_coordinate[0]
            y_c = container_coordinate[1]
            z_c = 0

            print("Behälterposition: ", x_c, y_c)

        ball_coordinate = self.coordinates_msg.ball_coordinates

        balls_array = []

        if len(ball_coordinate) > 0:
            for i in range(0, len(ball_coordinate), 2):

                x_b, y_b = ball_coordinate[i], ball_coordinate[i + 1]
                z_b = 0

                print("Ballposition: ", x_b, y_b)

                five_above_ball = JointValue(x_b, y_b, z_b + 5)
                one_above_ball = JointValue(x_b, y_b, z_b + 1)

                try:
                    five_above_ball_result = five_above_ball.calc_joint_values(
                    )
                    one_above_ball_result = one_above_ball.calc_joint_values()
                except ValueError:
                    print("Ball außerhalb des Bereiches")
                    continue

                five_above_ball_array = self.get_joints(five_above_ball_result)
                one_above_ball_array = self.get_joints(one_above_ball_result)

                balls_dict = {
                    "1.": five_above_ball_array,
                    "2.": one_above_ball_array,
                    "3.": five_above_ball_array
                }

                balls_array.append(balls_dict)

            ten_above_container = JointValue(x_c, y_c, z_c + 10)

            try:
                ten_above_container_result = ten_above_container.calc_joint_values(
                )
            except ValueError:
                print("Behälter außerhalb des Bereiches")

            ten_above_container_array = self.get_joints(
                ten_above_container_result)

            for i in balls_array:
                first = i.get("1.")
                second = i.get("2.")
                third = i.get("3.")

                self.open_gripper()
                self.move_dorna(first)
                self.move_dorna(second)
                self.close_gripper()
                self.move_dorna(third)
                self.move_dorna(ten_above_container_array)
                self.open_gripper()

        else:
            print("Konnte keine Bälle orten, versuche erneut")
            rospy.sleep(1)
            self.collect_balls()

    def terminate(self):
        self.robot.terminate()

    def close_gripper(self):
        self.robot.set_io({"servo": 675})

    def open_gripper(self):
        self.robot.set_io({"servo": 0})

    def move_dorna(self, position):
        self.robot.move({"movement": 0, "path": "joint", "joint": position})

    def get_joints(self, height):
        j0 = height.get("j0")
        j1 = height.get("j1")
        j2 = height.get("j2")
        j3 = height.get("j3")

        return [j0, j1, j2, j3, 0]