コード例 #1
0
        def movimiento():
            global x, y, z

            movimiento = FM()

            x = float(ejex.get())
            y = float(ejey.get())
            z = float(ejez.get())

            movimiento.data = [x, y, z]
            print(movimiento.data)
            pub1.publish(movimiento)
            x = 0
            y = 0
            z = 0
            rate.sleep()
            ex = str(x)
            ey = str(y)
            ez = str(z)
            ejex.set(ex)
            ejey.set(ey)
            ejez.set(ez)
            movimiento.data = [x, y, z]
コード例 #2
0
def conversion():
    #Iniciamos el nodo y declaramos las suscripciones y publicaciones de topics
    rospy.init_node('conversion', anonymous=True)
    pub = rospy.Publisher('/UR3_1/inputs/move_pose', FM, queue_size=10)
    rospy.Subscriber("UR3_1/outputs/pose", FM, callback1)
    rospy.Subscriber("configuracion", String, callback2)
    rospy.Subscriber("movimiento", FM, callback3)
    rate = rospy.Rate(10)  # 10hz

    while not rospy.is_shutdown():

        global iteracion

        #Si no hemos recibido ningun dato de movimiento no movemos el robot
        if (iteracion == True):

            print("NUEVO MOVIMIENTO")

            iteracion = False
            global j, ro, longitud
            Dt = longitud

            #-------------Vamos a transformar la orientacion recibida del robot--------------------
            #-------------en otra forma de orientacion que podemos manejar mas adelante------------

            #Primero calculamos el ANGULO y el EJE del vector de orientacion que recibimos
            angle = math.sqrt(ox * ox + oy * oy + oz * oz)
            axis = [ox / angle, oy / angle, oz / angle]

            #Creamos una matriz de orientacion a partir del angulo y el eje anteriores
            a = np.hstack((axis, (angle, )))
            Rm = matrix_from_axis_angle(a)

            #Obtenemos el Eje Z de nuestra matriz, que es el que necesitamos para los calculos
            z = Rm[2]
            #Guardamos la posicion del robot en la variable P
            P = [xi, yi, zi]

            #-------------Una vez tenemos posicion y orientacion vamos a calcular la nueva--------------------
            #-------------posicion y orientacion segun el movimiento que queremos para la herramienta------------

            #Para la primera vez que realizamos las operaciones vamos a tomar
            #una serie de valores determinados
            if (j == 0):
                fi = float(
                    fulcro / Dt
                )  #Calculamos fi con el valor inicial recibido por la interfaz
                Pf = P + fi * Dt * z  #El punto de fulcro lo calculamos al principio y no cambia
                print(Pf)

            #La posicion inicial de la herramienta se calcula a partir de los valores de posicion del robot mas la orientacion
            Pt = P + Dt * z

            #Nueva posicion de la punta con el incremento del Phantom
            Ptn = [Pt[0] + Ph1, Pt[1] + Ph2, Pt[2] + Ph3]

            #Nueva direccion en el eje z de la herramienta
            zn = Pf - Ptn

            #Distancia del punto de fulcro a la nueva posicion de la pinza
            Mzn = math.sqrt(zn[0] * zn[0] + zn[1] * zn[1] + zn[2] * zn[2])
            ro = Dt - Mzn

            #Nueva posicion del efector final del robot
            Pn = Pf + ro * zn / Mzn

            # El eje Z ya lo tnemos, pero lo hacemos unitario
            znn = [-zn[0] / Mzn, -zn[1] / Mzn, -zn[2] / Mzn]

            #-------------Para calcular la orientacion vamos a calcular los angulos de Euler--------------------
            #-------------a partir del eje Z de la matriz, el cual ya tenemos, y una vez tengamos---------------
            #-------------los amgulos, llamamos a la funcion que nos calcula la matriz de orientacion-----------

            b = math.atan2(math.sqrt(znn[0]**2 + znn[1]**2), znn[2])
            a = 0
            g = math.atan2((znn[1] / math.sin(b)), (-znn[0] / math.sin(b)))

            M = eulerZYZ([a, b, g])

            #Pasamos la orientacion a axis-angle, que es la que entiende nuestro simulador
            a = axis_angle_from_matrix(M)
            orientacion = [a[0] * a[3], a[1] * a[3], a[2] * a[3]]

            r = Pn - Ptn
            print("Incremento", [Ph1, Ph2, Ph3])
            print(" ")
            print('Nueva posicion efector Pn', Pn)
            print('Nueva posicion herramienta Ptn', Ptn)
            print(' ')
            print("Comprobaciones")
            print(' ')
            print('Actual posicion herramienta Pt', Pt)
            print('Longitud herramienta Dt',
                  math.sqrt(r[0] * r[0] + r[1] * r[1] + r[2] * r[2]))
            print(' ')
            print(' ')

            #Creamos la variable que contiene la posicion y orientacion que le vamos a dar a nuestro robot
            pose = FM()
            pose.data = [
                Pn[0], Pn[1], Pn[2], orientacion[0], orientacion[1],
                orientacion[2]
            ]
            #pose.data = [Pn[0], Pn[1], Pn[2], ox, oy, oz]

            #Publicamos la pose
            pub.publish(pose)

            #Aumentamos la iteracion
            j = j + 1

    rate.sleep()

    rospy.spin()
コード例 #3
0
ファイル: nodo.py プロジェクト: pablofr918/Pablofr918
def conversion():
    rospy.init_node('conversion', anonymous=True)
    pub = rospy.Publisher('/UR3_1/inputs/move_pose', FM, queue_size=10)
    rospy.Subscriber("UR3_1/outputs/pose", FM, callback1)
    rate = rospy.Rate(10)  # 10hz

    while not rospy.is_shutdown():

        #Introducimos el incremento de posiscion que queremos en cada eje
        Ph1 = float(raw_input("Introduce Ph1: "))
        Ph2 = float(raw_input("Introduce Ph2: "))
        Ph3 = float(raw_input("Introduce Ph3: "))
        #Ph = 0.05

        #Esto es para que se realicen los calculos solo en caso de introducir valores
        if not (Ph1 == 0):

            rate.sleep()
            #Convertimos la orientacion de la herramienta en matriz de orientacion para obtener
            #la direccion en el eje z
            angle = math.sqrt(ox * ox + oy * oy + oz * oz)
            axis = [ox / theta, oy / theta, oz / theta]

            a = np.hstack((axis, (angle, )))
            Rm = matrix_from_axis_angle(a)
            x = Rm[0]
            y = Rm[1]
            z = Rm[2]

            #Obtenemos el punto de fulcro y la posicion de la punta
            P = [xi, yi, zi]
            Pf = P + fi * Dt * z
            Pt = P + Dt * z

            #Nueva posicion de la punta con el incremento del Phantom
            Pd = Rh * Ks * np.array([[Ph1], [0], [0]])
            #Ptn = Pt + np.transpose(Pd)
            Ptn = Pt + [Ph1, Ph2, Ph3]

            #Nueva direccion en el eje z de la herramienta
            zn = Pf - Ptn

            #Distancia del punto de fulcro a la nueva posicion de la pinza
            Mzn = math.sqrt(zn[0] * zn[0] + zn[1] * zn[1] + zn[2] * zn[2])
            ro = Dt - Mzn

            #Nueva posicion del efector finalcdel robot
            Pn = Pf + ro * zn / Mzn

            Rm[2] = -zn
            r = Pn - Ptn
            print(math.sqrt(r[0] * r[0] + r[1] * r[1] + r[2] * r[2]))
            #a = axis_angle_from_matrix(Rm)
            #orientacion = [a[0]*a[3], a[1]*a[3], a[2]*a[3]]
            pose = FM()
            pose.data = [Pn[0], Pn[1], Pn[2], zn[0], zn[1], zn[2]]

            pub.publish(pose)

    rate.sleep()

    rospy.spin()