Quiero hacer un dron autónomo que pueda encontrar el camino hacia la meta y hacia atrás, evitando todos los obstáculos sin golpear a nadie. Decidí comenzar con una red neuronal y una cámara web. Y entonces este proyecto resultó

La esencia del proyecto es una red neuronal, o más bien el marco imageai escrito en python bajo keras, encuentra a una persona en la imagen y entrega las coordenadas de su caja. Más a lo largo de la horizontal encontramos el centro del bloque y movemos la cámara allí (naturalmente, dejando algo de histéresis para que la cámara no salte hacia adelante y hacia atrás). Luego, encontramos el segundo centro, pero ya verticalmente, le agregamos varias decenas de píxeles, de modo que cuando una persona está de pie, la cámara capturará su rostro. También quería adjuntar reconocimiento facial, pero la cámara web es barata y, por lo tanto, no tiene una función de enfoque automático.
Para el proyecto tomó
STM32f4discovery - placa de depuración
MT415 un par de controladores de motor
2 motores paso a paso
PSU 24 V 2.5 A
ImageAI
Describiré brevemente el código de Python
Inicializando imageai. Seleccione el tipo de red neuronal - yolo y el tamaño de la imagen - flash. Cuando el flash, la imagen se reduce a un tamaño pequeño (no recuerdo cuál) y debido a esto, la red se acelera.
detector = ObjectDetection() detector.setModelTypeAsYOLOv3() detector.setModelPath("yolo.h5") detector.loadModel(detection_speed="flash")
Funciones para enviar un personaje al microcontrolador para un paso a lo largo del eje horizontal y vertical
def step(): i = 1 u = 0 while i: while u!=1: u = ser.write( b'v') u=0 ff=ser.read(1) print(1111) if ff==b'B': i=0 def step_y(): i = 1 u = 0 while i: while u!=1: u = ser.write( b'V') u=0 ff=ser.read(1)
La función que recibe la posición del borde izquierdo y derecho del cuadro en la entrada encuentra el centro y decide en qué dirección es necesario girar para que el objeto esté en el medio de la cámara. Nuevamente, los caracteres de control se envían a micras.
def rotate_x(left, right): center = (right - left)/2 + left u = 0 if center < 320: i=1 while i: while u!=1: u = ser.write( b'r') u=0 ff=ser.read(1)
La función de control vertical es casi la misma. Las diferencias se describen arriba.
En Maine, ya recibimos dos objetos de la red neuronal de la red. La primera es una imagen con la posición pintada del objeto, y la segunda es una matriz de objetos detectados con sus coordenadas.
detected_copy, detections = detector.detectObjectsFromImage(input_image=frame, input_type ="array", output_type = "array") for eachObject in detections: if eachObject["name"] == "person": str1 = eachObject["box_points"] str2= str(str1) n = 1 for i in range(5): if str2[i] in [","]: detect1 = int(str2[1:i])
Ahora el código para MK
Función para recibir datos a través de un puerto com virtual.
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) {
Gestión de controladores paso a paso. Si paso == 1, entonces tomamos un impulso y obtenemos un paso. La dirección se establece en la variable dir
if(step == 1) { GPIOC->ODR &= ~(1<<0); HAL_Delay(1); GPIOC->ODR |= 1<<0; HAL_Delay(1); i++; if(i == 1) { i = 0; step = 0; } } if(dir == 1) { GPIOC->ODR |= 1<<1; } else { GPIOC->ODR &= ~(1<<1); } if(step1 == 1) { GPIOC->ODR &= ~(1<<2); HAL_Delay(1); GPIOC->ODR |= 1<<2; HAL_Delay(1); i1++; if(i1 == 1) { i1 = 0; step1 = 0; } } if(dir1 == 1) { GPIOC->ODR |= 1<<3; } else { GPIOC->ODR &= ~(1<<3); }
Bueno, eso es básicamente todo.
Enlace a la fuente¡Muchas gracias a Artem Lisin por su ayuda para escribir el programa en Python!