Tabla de contenido:

Gesture Hawk: Robot controlado por gestos con la mano utilizando una interfaz basada en procesamiento de imágenes: 13 pasos (con imágenes)
Gesture Hawk: Robot controlado por gestos con la mano utilizando una interfaz basada en procesamiento de imágenes: 13 pasos (con imágenes)

Video: Gesture Hawk: Robot controlado por gestos con la mano utilizando una interfaz basada en procesamiento de imágenes: 13 pasos (con imágenes)

Video: Gesture Hawk: Robot controlado por gestos con la mano utilizando una interfaz basada en procesamiento de imágenes: 13 pasos (con imágenes)
Video: Excelsior | Exandria Unlimited: Calamity | Episode 1 2024, Noviembre
Anonim
Gesture Hawk: robot controlado por gestos con la mano que utiliza una interfaz basada en procesamiento de imágenes
Gesture Hawk: robot controlado por gestos con la mano que utiliza una interfaz basada en procesamiento de imágenes

Gesture Hawk se presentó en TechEvince 4.0 como una sencilla interfaz hombre-máquina basada en el procesamiento de imágenes. Su utilidad radica en el hecho de que no se requieren sensores adicionales o dispositivos portátiles, excepto un guante, para controlar el automóvil robótico que funciona con el principio de conducción diferencial. En este instructivo, lo guiaremos a través del principio de funcionamiento detrás del seguimiento de objetos y la detección de gestos utilizados en el sistema. El código fuente de este proyecto se puede descargar de Github a través del enlace:

Paso 1: COSAS REQUERIDAS:

COSAS REQUERIDAS
COSAS REQUERIDAS
COSAS REQUERIDAS
COSAS REQUERIDAS
COSAS REQUERIDAS
COSAS REQUERIDAS
COSAS REQUERIDAS
COSAS REQUERIDAS
  1. Controlador de motor L298N
  2. Motores DC
  3. Chasis de coche robot
  4. Arduino Uno
  5. Baterías LiPo
  6. Cable USB Arduino (largo)
  7. Biblioteca OpenCV con Python

Paso 2: PRINCIPIO DE FUNCIONAMIENTO:

PRINCIPIO DE FUNCIONAMIENTO
PRINCIPIO DE FUNCIONAMIENTO

Gesture Hawk es un sistema de procesamiento de tres fases como puede ver en el diagrama anterior.

Paso 3: CAPTURA DE ENTRADA Y PROCESAMIENTO:

CAPTURA DE ENTRADA Y PROCESAMIENTO
CAPTURA DE ENTRADA Y PROCESAMIENTO

La captura de entrada se puede entender en las categorías más amplias que se dan en el diagrama anterior.

Para extraer la forma de la mano del entorno, necesitamos usar enmascaramiento o filtrado de un color definido (en este caso, azul violeta). Para hacer eso, necesita convertir la imagen de formato BGR a HSV que se puede hacer usando el siguiente fragmento de código.

hsv = cv2.cvtColor (marco, cv2. COLOR_BGR2HSV)

Ahora, el siguiente paso es encontrar el rango deseado de parámetros de HSV para extraer la mano a través de una máscara o un filtro. Para ello, la mejor forma es utilizar las barras de seguimiento para encontrar un rango adecuado. Aquí está la captura de pantalla de una barra de seguimiento utilizada para este proyecto.

Paso 4:

Imagen
Imagen

Paso 5:

Aquí, hay un fragmento de código que se proporciona a continuación para crear una barra de seguimiento para la construcción de máscaras:

importar cv2

importar numpy como npdef nothing (x): pass cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, nada) cv2.createTrackbar ('l_S ',' imagen ', 50, 255, nada) cv2.createTrackbar (' l_V ',' imagen ', 50, 255, nada) cv2.createTrackbar (' h_H ',' imagen ', 130, 255, nada) cv2. createTrackbar ('h_S', 'imagen', 255, 255, nada) cv2.createTrackbar ('h_V', 'imagen', 255, 255, nada) while (1): _, frame = img.read ()

hsv = cv2.cvtColor (frame, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'image') lS = cv2.getTrackbarPos ('l_S', 'image') lV = cv2.getTrackbarPos ('l_V', 'imagen') hH = cv2.getTrackbarPos ('h_H', 'imagen') hS = cv2.getTrackbarPos ('h_S', 'imagen') hV = cv2.getTrackbarPos ('h_V', 'imagen') lower_R = np. array ([lH, lS, lV]) upper_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, high_R) res = cv2.bitwise_and (marco, marco, máscara = máscara) cv2.imshow ('imagen', res) k = cv2.waitKey (1) & 0xFF si k == 27: romper cv2.destroyAllWindows ()

Paso 6: PARTE DE PROCESAMIENTO:

PARTE DE PROCESAMIENTO
PARTE DE PROCESAMIENTO

Bueno, tenemos la forma geométrica de una mano, ahora es el momento de explotarla y utilizarla para descubrir el gesto de la mano.

Casco convexo:

A través de un casco convexo, intentamos ajustar un polígono aproximado a través de puntos extremos presentes en la forma. La imagen presente a la izquierda muestra el polígono aproximado que se le había asignado a la forma con los puntos convexos marcados en rojo.

Los puntos convexos son aquellos puntos de la forma que están más alejados de un lado de este polígono aproximado. Pero, el problema con el casco convexo es que durante su cálculo, obtendremos una matriz de todos los puntos convexos, pero lo que necesitamos es el punto convexo de punta azul. Le diremos por qué es necesario.

Para encontrar este punto convexo, necesitamos aplicar la fórmula de la distancia perpendicular para encontrar la distancia del punto convexo con el lado más cercano. Observamos que el punto puntiagudo azul posee la distancia máxima desde el lado y así obtenemos este punto.

Paso 7:

Imagen
Imagen

Paso 8:

Imagen
Imagen

A continuación, necesitamos encontrar la inclinación de la línea que une la punta del pulgar (o el punto extremo) a este punto convexo con la horizontal.

Paso 9:

Imagen
Imagen

En el caso anterior, el ángulo α debe estar entre 0 y 90 grados si el gesto es para girar a la izquierda. Eso es tan (α) debería ser positivo.

Paso 10:

Imagen
Imagen

En el caso anterior, el ángulo α debe estar entre 180 y 90 grados si el gesto es para girar a la derecha. Eso es tan (α) debería ser negativo.

Por lo tanto, si Tan α es positivo, girar a la izquierda. Si Tan α es negativo, entonces gire a la derecha. Ahora es el momento de ver cómo detectar el comando de parada más importante.

Aquí, se examina una proporción específica (encontrada por acierto y ensayo) y, en casos máximos, esta proporción de distancias permanece en este rango particular.

Paso 11:

Imagen
Imagen

Por último, el gesto de movimiento hacia adelante se analiza mediante la función matchShape () en OpenCV. Esta función compara la forma de dos contadores, en este caso, entre el ejemplo de entrenamiento en la derecha en la imagen de arriba con el contorno en el lado izquierdo de la imagen de arriba. Devuelve un valor que va de 0 a 2 o 3, según la variación presente en la forma de dos contornos. Para el mismo contorno idéntico, devuelve 0.

ret = cv2.matchShapes (cnt1, cnt2, 1, 0.0)

Aquí, cn1 y cnt2 son los dos contornos que se van a comparar.

Paso 12: CONTROL DE MOVIMIENTO:

CONTROL DE MOVIMIENTO
CONTROL DE MOVIMIENTO

PySerial:

Usamos la biblioteca PySerial de python para convertir los datos procesados en datos en serie para comunicarlos a Arduino Uno a través del cable USB Arduino. Una vez que opencv detectó un gesto en particular, creamos una variable temporal, digamos "x", le asignamos un valor único y lo convertimos en una entrada en serie usando la siguiente línea de comando: -

importar número de serie para importar la biblioteca Pyserial

serial. Serial ('', baudrate = '9600', timeout = '0') # configurando la salida serial.. PORT NAME es el nombre del puerto por el cual ocurrirá la transmisión de datos.

serial.write (b'x ') # x es el alfabeto enviado al puerto … b es convertir esta cadena en bytes.

Procesamiento Arduino:

Ahora arduino está codificado de tal manera que cada serie x diferente se asigna linealmente a cierta acción responsable de un movimiento suave del robot (digamos que la detección del gesto izquierdo activará los motores de la derecha para girar a la izquierda). Podemos controlar el movimiento de cada rueda tanto de traslación como de rotación cambiando el código correctamente.

Controlador de motor L298N: -

El controlador de motor se utiliza como mediador entre el motor y la fuente de alimentación, ya que los motores no se pueden alimentar directamente debido a las clasificaciones de bajo voltaje. La batería Li-Po está conectada a su terminal de entrada de 12 V y conectamos la toma de 5 V de arduino a la toma de entrada de 5 V del controlador del motor, finalmente conectando la tierra de Li-Po y el arduino en una toma de tierra común del controlador del motor.

Ahora los terminales de los motores están conectados en los enchufes dados. Finalmente, conectamos los terminales de entrada para el motor a los enchufes de salida PWM de arduino, lo que nos permite decidir con precisión los aspectos de rotación y traslación del movimiento.

Recomendado: