Пример #1
0
# Conexión de hardware y determinación de punto objetivo
# --------------------------------------------------------------
print("\tConectando cámara...")
camara = cv2.VideoCapture(1)

print("\tConectando mano...")
mano = mf.Mano(camara, pos_inicial_pulgar="arriba")

print("\tListo!\n")
print("---------------------------------------------------------------------")
print("\tPosiciona el objeto (rojo). Luego, presiona enter.")
print("---------------------------------------------------------------------")
_ = input()

# Posición objetivo
imagen = mf.take_picture(camara)
# filtrada = mf.color_filter(imagen, "red")
# [r_objetivo, _] = mf.get_centroid(filtrada, method="contorno")

# Posición objetivo ahora es el contorno, no el centroide
r_objetivo = mf.determinar_contacto(imagen, "indice")

print("\n\tPunto objetivo: {}".format(r_objetivo))

# --------------------------------------------------------------
# Control
# --------------------------------------------------------------
ctrl = controladores.Ctrl_ERC(
    dedo="indice",
    cantidad_motores=cantidad_motores,
    tercer_servo_auto=True,
Пример #2
0
def main(args):
    print("Iniciando...")
    # Argumentos
    guardar_ex = args.explorar
    guardar = args.guardar
    extension = args.cargar

    # =================================================
    # Inicialización hardware e instanciación controlador
    camara = cv2.VideoCapture(1)
    mano = mf.Mano(camara)
    ctrl = controladores.Ctrl_Pulgar()

    if guardar_ex:
        # Comienzo de la exploración exhaustiva
        print("Exploración exhaustiva...")
        ctrl.explorar_ex(camara, mano)

        # Guardar las primitivas y terminar
        primitivas = mf.primitivas_np2list(ctrl.primitivas.copy())
        mf.guardar_datos("pulgar", primitivas)
        return

    # else:
    datos = mf.cargar_datos("pulgar", extension)
    # si no se pudo cargar datos, termina
    if datos == None:
        return
    else:
        ctrl.primitivas = datos
        primitivas_base = len(datos)

    print(
        "---------------------------------------------------------------------"
    )
    print("\tPosiciona el objeto (rojo). Luego, presiona enter.")
    print(
        "---------------------------------------------------------------------"
    )
    _ = input()

    # =================
    # Posición objetivo
    imagen = mf.take_picture(camara)
    r_objetivo = mf.determinar_contacto(imagen, "pulgar", offset_hor=15)
    print("Posición objetivo: {}".format(r_objetivo))
    print(r_objetivo)

    # ============================
    # Primer movimiento de la mano
    print("Calculando...")

    # Hay contacto yema-objeto?
    imagen = mf.take_picture(camara)
    contacto, dist = mf.hay_contacto(imagen, "pulgar", kernel=[5, 7])

    if not (contacto or (dist < 7)):
        ctrl.mover(r_objetivo, camara, mano)

        # OJO: la función mover del pulgar está pensado para
        # mover el dedo sólo una vez y desde la posición inicial
        # del dedo. Se asume que es suficiente, ya que su control
        # es más sencillo (sólo se estima un servo). Luego hay que
        # verificar si se alcanzó el objetivo (hay_contacto) y
        # entrar en control_fino de ser necesario (muy probable,
        # ya que el objetivo de primer movimiento no es el objeto
        # sino un punto cercano a su contorno.

        ctrl.ajuste_fino(camara, mano)

    if guardar:
        print("[DEBUG] Primitivas:\n")
        print(ctrl.primitivas)

        primitivas_trayectoria = ctrl.primitivas[primitivas_base:]
        primitivas_trayectoria = mf.primitivas_np2list(primitivas_trayectoria)

        # OJO: Las magnitudes, diferencias y posiciones se están
        # guardando como listas en lugar de numpy arrays.
        datos = {
            "dedo": "pulgar",
            "r_objetivo": [int(r_objetivo[0]),
                           int(r_objetivo[1])],
            "primitivas": primitivas_trayectoria,
        }

        mf.guardar_datos(
            nombre="pulgar",
            datos=datos,
            directory="trayectorias_1_dedo/",
        )
Пример #3
0
    def ajuste_fino(self, camara, mano):
        """Mueve el segundo servo del dedo en saltos de 1 o 3 grados
            hasta que haya contacto entre la yema y el objeto."""
        # Caso pulgar: sólo mover servo 2, cerrándose (sumando)
        # Primitiva temporal guarda el "movimiento fino"

        while True:
            # Hay contacto yema-objeto?
            imagen = mf.take_picture(camara)
            contacto, dist = mf.hay_contacto(imagen, "pulgar", kernel=[5, 7])

            # Si se alcanza el objetivo, termina
            if contacto or (dist < 7):
                print("Objetivo alcanzado por dedo pulgar")
                break

            else:
                # Un aumento de x grados se logra con -x/m
                grados = 1

            print("[DEBUG] {} grados más...".format(grados))

            # Nueva primitiva temporal
            primitiva_temp = {}

            # Posición actual de la yema en la imagen
            ri = mano.actualizar_yema(camara, "pulgar")
            primitiva_temp["pos_inicial"] = ri

            # Posición actual del dedo
            dedo_pos = mano.entregar_dedo_pos("pulgar")

            # Actualización servo 2
            magnitud = grados / self.m_n2a
            dedo_pos[1] += int(magnitud)

            primitiva_temp["magnitud"] = magnitud

            # Compensación servo 3
            magnitud = -grados / self.m_n2a
            dedo_pos[2] += int(magnitud)

            # Ajuste y movimiento
            _, _, _ = mano.ajustar_dedo("pulgar", dedo_pos)
            mano.mover()

            # Posición final de la yema en la imagen
            rf = mano.actualizar_yema(camara, "pulgar")
            primitiva_temp["pos_final"] = rf

            # Diferencia en la imagen
            primitiva_temp["diferencia"] = rf - ri

            # Guardar primitiva y borrar para no sobreescribir
            primitiva_temp["ajuste_fino"] = True
            self.primitivas.append(primitiva_temp)
            del primitiva_temp

        # Un último movimiento (de 1°)
        primitiva_temp = {}

        # Posición actual de la yema en la imagen
        ri = mano.actualizar_yema(camara, "pulgar")
        primitiva_temp["pos_inicial"] = ri

        magnitud = 1 / self.m_n2a
        primitiva_temp["magnitud"] = int(magnitud)
        dedo_pos = mano.entregar_dedo_pos("pulgar")
        dedo_pos[1] += int(magnitud)
        _, _, _ = mano.ajustar_dedo("pulgar", dedo_pos)
        mano.mover()

        # Posición final de la yema en la imagen
        rf = mano.actualizar_yema(camara, "pulgar")
        primitiva_temp["pos_final"] = rf

        # Diferencia en la imagen
        primitiva_temp["diferencia"] = rf - ri

        # Guardar la última primitiva
        primitiva_temp["ajuste_fino"] = True
        self.primitivas.append(primitiva_temp)
Пример #4
0
    def ajuste_fino(self, camara, mano):
        """Para mover los dedos luego de que se considere
        alcanzado el objetivo (en primera instancia). Esta
        función asegura el contacto entre yema y objeto."""
        # Caso índice: sólo mover servo 1, cerrándose (restando)

        while True:
            # Hay contacto yema-objeto?
            imagen = mf.take_picture(camara)
            contacto, dist = mf.hay_contacto(imagen, self.dedo)

            # Si se alcanza el objetivo, termina
            if contacto:
                print("Objetivo alcanzado por dedo {}".format(self.dedo))
                break

            if dist > 7:
                # Un aumento de x grados se logra con -x/m
                grados = 3

            else:
                # Un aumento de x grados se logra con -x/m
                grados = 1

            print("[DEBUG] {} grados más...".format(grados))

            # Nueva primitiva temporal
            primitiva_temp = {}

            # Posición actual de la yema en la imagen
            ri = mano.actualizar_yema(camara, "indice")
            primitiva_temp["pos_inicial"] = ri

            # Posición actual del dedo
            dedo_pos = mano.entregar_dedo_pos(self.dedo)

            # Actualización servo 1
            magnitud = -grados / self.m_n2a_s1
            dedo_pos[0] += int(magnitud)

            primitiva_temp["magnitud"] = magnitud

            # Compensación tercer servo
            magnitud = grados / self.m_n2a_s2
            dedo_pos[2] += int(magnitud)

            # Ajuste y movimiento
            _, _, _ = mano.ajustar_dedo(self.dedo, dedo_pos)
            mano.mover()

            # Posición final de la yema en la imagen
            rf = mano.actualizar_yema(camara, "indice")
            primitiva_temp["pos_final"] = rf

            # Diferencia en la imagen
            primitiva_temp["diferencia"] = rf - ri

            # Guardar primitiva y borrar para no sobreescribir
            primitiva_temp["ajuste_fino"] = True
            self.primitivas.append(primitiva_temp)
            del primitiva_temp

        # Un último movimiento (de 1°)
        primitiva_temp = {}

        # Posición actual de la yema en la imagen
        ri = mano.actualizar_yema(camara, "indice")
        primitiva_temp["pos_inicial"] = ri

        magnitud = -1 / self.m_n2a_s1
        dedo_pos = mano.entregar_dedo_pos(self.dedo)
        dedo_pos[0] += int(magnitud)
        _, _, _ = mano.ajustar_dedo(self.dedo, dedo_pos)
        mano.mover()

        # Posición final de la yema en la imagen
        rf = mano.actualizar_yema(camara, "indice")
        primitiva_temp["pos_final"] = rf

        # Diferencia en la imagen
        primitiva_temp["diferencia"] = rf - ri

        # Guardar la última primitiva
        primitiva_temp["ajuste_fino"] = True
        self.primitivas.append(primitiva_temp)
Пример #5
0
# La idea es separar dos objetos que se ven del mismo
# color en la imagen (dos yemas verdes)

import mis_funciones as mf
import numpy as np
import cv2

camara = cv2.VideoCapture(1)

for i in range(20):
    image = mf.take_picture(camara)

    filtrada = mf.color_filter(image, "green")
    r = mf.get_centroid(filtrada)

    # Máscara para obtener uno de los dos objetos
    mask_izq = np.zeros(filtrada.shape[:2], dtype="uint8")
    mask_izq[:, :r[0]] = 255
    mask_der = cv2.bitwise_not(mask_izq)

    objeto_izq = cv2.bitwise_and(filtrada, mask_izq)
    objeto_der = cv2.bitwise_and(filtrada, filtrada, mask=mask_der)

    print("Foto #{:02d}".format(i))
    #    cv2.imshow("mask_izq", mask_izq)
    #    cv2.imshow("mask_der", mask_der)
    #    cv2.imshow("Foto", image)
    cv2.imshow("Objeto Izquierdo", objeto_izq)
    cv2.imshow("Objeto Derecho", objeto_der)
    cv2.waitKey(1000)
Пример #6
0
def main(args):
    print("Iniciando...")
    # Argumentos
    guardar = args.guardar
    extension_indice = args.cargar_indice
    extension_pulgar = args.cargar_pulgar

    # =================================================
    # Inicialización hardware e instanciación controlador
    camara = cv2.VideoCapture(1)
    mano = mf.Mano(
        camara,
        pos_inicial_pulgar="arriba",
        pos_inicial_indice="estirado",
    )

    ctrl_indice = controladores.Ctrl_ERC(
        dedo="indice",
        tercer_servo_auto=True,
    )

    ctrl_pulgar = controladores.Ctrl_Pulgar()

    # NO HAY EXPLORACION EXHAUSTIVA EN ESTE SCRIPT
    # Cargar datos de primitivas en ambos dedos

    datos_indice = mf.cargar_datos("indice", extension_indice)
    datos_pulgar = mf.cargar_datos("pulgar", extension_pulgar)
    # si no se pudo cargar datos, termina
    if (datos_pulgar == None) or (datos_indice == None):
        print("No se pudo cargar datos...")
        return
    else:
        ctrl_indice.primitivas = datos_indice
        ctrl_pulgar.primitivas = datos_pulgar
        primitivas_base_indice = len(datos_indice)
        primitivas_base_pulgar = len(datos_pulgar)

    print(
        "---------------------------------------------------------------------"
    )
    print("\tPosiciona el objeto (rojo). Luego, presiona enter.")
    print(
        "---------------------------------------------------------------------"
    )
    _ = input()

    # =================
    # Posición objetivo
    imagen = mf.take_picture(camara)
    r_objetivo_pulgar = mf.determinar_contacto(imagen, "pulgar", offset_hor=15)

    r_objetivo_indice = mf.determinar_contacto(imagen, "indice")
    print("Posición objetivo indice: {}".format(r_objetivo_indice))
    print("Posición objetivo pulgar: {}".format(r_objetivo_pulgar))

    if (r_objetivo_indice == False) or (r_objetivo_indice == False):
        return 0

    # ============================
    # Primer movimiento de la mano
    print("Calculando...")

    # ===============================================
    # Hay contacto yema-objeto?
    imagen = mf.take_picture(camara)
    contacto, dist = mf.hay_contacto(imagen, "pulgar", kernel=[5, 7])

    # Mover pulgar al objetivo aproximado
    if not (contacto or (dist < 7)):
        ctrl_pulgar.mover(r_objetivo_pulgar, camara, mano)

    # Mover indice al objetivo aproximado
    while not ctrl_indice.flags["_alcanzado_"]:
        # Ya no se necesita el flag de singular
        _ = ctrl_indice.calcular_primitiva(
            r_objetivo_indice,
            camara,
            mano,
        )

        # Verificación de objetivo alcanzado por medio de hay_contacto
        imagen = mf.take_picture(camara)
        _, dist = mf.hay_contacto(imagen, "indice")

        if dist < 30:
            break

        # Si no se pudo calcular la primitiva: explorar (paso = 1)
        if ctrl_indice.flags["_explorar_"]:
            ctrl_indice.explorar(camara, mano)

        estado = ctrl_indice.evaluar_estado(r_objetivo_indice)
        print("Estado: {}".format(estado))

    # Mover pulgar al objetivo final (contorno del objeto)
    print(" ")
    print("Ajustando dedo pulgar...")
    ctrl_pulgar.ajuste_fino(camara, mano)

    # Mover indice al objetivo final (contorno del objeto)
    print(" ")
    print("Ajustando dedo indice...")
    ctrl_indice.ajuste_fino(camara, mano)

    if guardar:
        # print("[DEBUG] Primitivas:\n")
        # print(ctrl.primitivas)

        primitivas_tray_indice = ctrl_indice.primitivas[
            primitivas_base_indice:]
        primitivas_tray_indice = mf.primitivas_np2list(primitivas_tray_indice)

        primitivas_tray_pulgar = ctrl_pulgar.primitivas[
            primitivas_base_pulgar:]
        primitivas_tray_pulgar = mf.primitivas_np2list(primitivas_tray_pulgar)

        # OJO: Las magnitudes, diferencias y posiciones se están
        # guardando como listas en lugar de numpy arrays.
        datos_pulgar = {
            "dedo": "pulgar",
            "r_objetivo":
            [int(r_objetivo_pulgar[0]),
             int(r_objetivo_pulgar[1])],
            "primitivas": primitivas_tray_pulgar,
        }

        datos_indice = {
            "dedo": "indice",
            "r_objetivo":
            [int(r_objetivo_indice[0]),
             int(r_objetivo_indice[1])],
            "tercer_servo_auto": ctrl_indice.tercer_servo_auto,
            "cantidad_motores": ctrl_indice.cantidad_motores,
            "primitivas": primitivas_tray_indice,
        }

        mf.guardar_datos(
            nombre="indice_pulgar",
            datos=[datos_indice, datos_pulgar],
            directory="trayectorias_2_dedos/",
        )

    camara.release()
Пример #7
0
def main(args):
    guardar_ex = args.explorar
    guardar = args.guardar
    extension = args.cargar

    # Cantidad de motores
    if args.motores == None:
        cantidad_motores = 2
    else:
        cantidad_motores = int(args.motores)


    # --------------------------------------------------------------
    # Conexión de hardware y determinación de punto objetivo
    # --------------------------------------------------------------
    print("\tConectando cámara...")
    camara = cv2.VideoCapture(1)

    print("\tConectando mano...")
    mano = mf.Mano(camara, 
                    pos_inicial_pulgar="arriba",
                    pos_inicial_indice="estirado",
                    )
    # Controlador
    ctrl = controladores.Ctrl_ERC(dedo="indice",
                                cantidad_motores=cantidad_motores, 
                                tercer_servo_auto=True,
                                )

    if guardar_ex:
        # Comienzo de la exploración exhaustiva
        print("Exploración exhaustiva...")
        ctrl.explorar_ex(camara, mano)

        # Guardar las primitivas y terminar
        primitivas = mf.primitivas_np2list(ctrl.primitivas.copy())
        mf.guardar_datos("indice", primitivas)
        return

    # Cargar datos anteriores
    datos = mf.cargar_datos("indice", extension)
    # si no se pudo cargar datos, termina
    if datos == None:
        print("[ERROR]: No se pudo cargar datos. Revisar existencia de archivo")
        print("Programa terminado!")
        return
    else:
        ctrl.primitivas = datos
        primitivas_base = len(datos)

    print("\tListo!\n")
    print("---------------------------------------------------------------------")
    print("\tPosiciona el objeto (rojo). Luego, presiona enter.")
    print("---------------------------------------------------------------------")
    _ = input()

    # Posición objetivo
    imagen = mf.take_picture(camara)
    # filtrada = mf.color_filter(imagen, "red")
    # [r_objetivo, _] = mf.get_centroid(filtrada, method="contorno")

    # Posición objetivo ahora es el contorno, no el centroide
    r_objetivo = mf.determinar_contacto(imagen, "indice")

    print("\n\tPunto objetivo: {}".format(r_objetivo))

    # Loop de cálculo de primitivas
    while not ctrl.flags["_alcanzado_"]: 
        # Ya no se necesita el flag de singular
        _ = ctrl.calcular_primitiva(r_objetivo, camara, mano)

        estado = ctrl.evaluar_estado(r_objetivo)
        print("Estado: {}".format(estado))

        # Verificar si la yema está cerca del objeto
        imagen = mf.take_picture(camara)
        _, dist = mf.hay_contacto(imagen, "indice")

        if dist < 30:
            break

        # Si no se pudo calcular la primitiva: explorar (paso = 1)
        if ctrl.flags["_explorar_"]:
            ctrl.explorar(camara, mano)

            estado = ctrl.evaluar_estado(r_objetivo)
            print("Estado: {}".format(estado))

            # Verificar si la yema está cerca del objeto
            imagen = mf.take_picture(camara)
            _, dist = mf.hay_contacto(imagen, "indice")

            if dist < 30:
                break

    # ========================================================
    # Ajuste "fino"
    print(" ")
    print("Ajustando dedo...")
    ctrl.ajuste_fino(camara, mano)

    # ========================================================
    # Guardar datos al finalizar
    if guardar:
        # JSON no permite guardar arreglos de numpy por lo que 
        # hay que convertirlos a lista antes de guardarlos.

        primitivas = ctrl.primitivas[primitivas_base:]
        primitivas = mf.primitivas_np2list(primitivas)

        # OJO: Las magnitudes, diferencias y posiciones se están
        # guardando como listas en lugar de numpy arrays.
        datos = {"dedo": ctrl.dedo,
                "r_objetivo": [int(r_objetivo[0]),int(r_objetivo[1])],
                "tercer_servo_auto": ctrl.tercer_servo_auto,
                "cantidad_motores": ctrl.cantidad_motores,
                "primitivas": primitivas
                }

        mf.guardar_datos(nombre="indice", 
                      datos=datos,
                      directory="trayectorias_1_dedo/",
                      )

    camara.release()