Tabla de contenido:

IRobot Create-Mars Expedition Rover Mark I: 4 pasos
IRobot Create-Mars Expedition Rover Mark I: 4 pasos

Video: IRobot Create-Mars Expedition Rover Mark I: 4 pasos

Video: IRobot Create-Mars Expedition Rover Mark I: 4 pasos
Video: Mars Sample Return: Bringing Mars Rock Samples Back to Earth 2024, Mes de julio
Anonim
IRobot Create-Mars Expedition Rover Mark I
IRobot Create-Mars Expedition Rover Mark I

Este instructivo le enseñará cómo configurar iRobot Create utilizando la codificación MatLab. Su robot tendrá la capacidad de buscar minerales distinguiendo formas, maniobrar en terrenos accidentados mediante el uso de sensores de acantilado y tiene la capacidad de ser controlado manualmente a través de una transmisión en vivo.

Paso 1: Suministros

Suministros
Suministros

Para este proyecto, necesitará un iRobot Create, que es una versión programable del robot aspirador Roomba. El robot viene equipado con todos los sensores necesarios para este proyecto, específicamente sensores de golpes, sensores de desnivel y sensores de "golpes ligeros". También necesitará una Raspberry Pi y una cámara de video, que se utilizan para la comunicación inalámbrica, la programación en vivo y la transmisión de video en vivo. Por último, necesitará un soporte impreso en 3D para la Raspberry Pi y la cámara.

Paso 2: Desarrolle la codificación para satisfacer el resultado deseable

Desarrolle la codificación para satisfacer el resultado deseable
Desarrolle la codificación para satisfacer el resultado deseable

Una vez que haya conectado su Roomba, deberá crear un código Matlab que le dará las salidas deseadas después de las entradas deseadas.

El código se puede ver aquí:

% Proyecto Roomba% Brenten Arnold (barnol15); Julianne Korn (qdp218); Mike Heal (mheal)% 4/11/19% Descripción del problema: Crea un vehículo para ayudar a los humanos durante la exploración / habitación% de Marte. % Método de solución: Busque materia orgánica (verde) mediante el uso de% parachoques de luz, sensores de acantilado y una cámara para verificar la materia orgánica. Permita que% el rover navegue por terreno accidentado mediante el uso de parachoques, sensores de% de desnivel y sensores de altura de las ruedas. Permita que los humanos controlen el rover desde una distancia segura y busquen minerales manualmente. opciones = {'VIDA', 'TERRENO BRUTO', 'CONTROL DE USUARIO'}; % Tres opciones en el menú de diálogo Configuración = menú ('', opciones) si Configuración> 0% Si se elige la opción, pregunte por las opciones de confirmación del usuario 2 = {'Sí', 'No'}% Cree una matriz de celdas para "sí" o "No "elección Confirmar = menú (['Usted eligió"' opciones {Configuración} '"modo.'], opciones2)% Confirmar la opción de configuración del usuario si Confirmar == 1 si Configuración == 1% Compruebe si se eligió la configuración" VIDA "i = 0 while i == 0 r.setLEDDigits (num2str ('LIFE'))% Muestra 'LIFE' en el LED para i = 1: 100 r.setDriveVelocity (0.05)% Mueve roomba hacia adelante a 0.05 m / sy = r.getCliffSensors % Recuperar y almacenar los valores del sensor de desnivel en la estructura de celda "y" l = r.getLightBumpers% Recuperar y almacenar los valores de los golpes de luz en la estructura "f" si l.izquierda> 100% Verifique si el parachoques de la luz izquierda está cubierto r.moveDistance (-0.05)% Mover roomba hacia atrás 0.05 metros r.turnAngle (20)% Girar roomba 20 grados CCW img = r.getImage% Obtener imagen de la cámara rasberry pie en roomba rect = [100 0 150 150]; img = imcrop (img, rect)% recortar la imagen para enfocarla en el centro rojo = media (media (img (:,:, 1)))% intensidad media de rojo verde = media (media (img (:,:, 2)))% intensidad media de verde azul = media (media (img (:,:, 3)))% intensidad media de azul si verde> rojo && verde> azul% Compruebe si la planta está en la imagen d = msgbox (['¡Vida encontrada! ']); % Muestra un cuadro de mensaje que dice "¡Vida encontrada!" esperar (d); end elseif l.izquierdaFront> 100% La comprobación es izquierda / el parachoques de la luz delantera está cubierto r.moveDistance (-0,05)% Mover roomba hacia atrás 0,05 metros img = r.getImage% Obtener imagen de la cámara rasberry pie en roomba y almacenar en la variable 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% recortar la imagen para enfocarla en el centro rojo = media (media (img (:,:, 1)))% intensidad media de rojo verde = media (media (img (:,:, 2)))% intensidad media de verde azul = media (media (img (:,:, 3)))% intensidad media de azul si verde> rojo && verde> azul% Compruebe si la planta está en la imagen d = msgbox (['¡Vida encontrada! ']); % Muestra un cuadro de mensaje que dice "¡Vida encontrada!" esperar (d); end elseif l.leftCenter> 100% Verifique si el parachoques de la luz izquierda / central está cubierto r.moveDistance (-0.05)% Mover roomba hacia atrás 0.05 metros img = r.getImage% Obtener imagen de la cámara rasberry pie en roomba y almacenar en la variable 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% recortar imagen para enfocar en el centro rojo = media (media (img (:,:, 1)))% intensidad media de rojo verde = media (media (img (:,:, 2)))% intensidad media de verde azul = media (media (img (:,:, 3)))% intensidad media de azul si verde> rojo && verde> azul% Compruebe si la planta está en la imagen d = msgbox (['¡Vida encontrada! ']); % Muestra un cuadro de mensaje que dice "¡Vida encontrada!" esperar (d); end elseif l.rightCenter> 100% Verifique si el parachoques de la luz derecha / central está cubierto r.moveDistance (-0.05)% Mover roomba hacia atrás 0.05 metros img = r.getImage% Obtener imagen de la cámara rasberry pie en roomba y almacenar en la variable 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% recortar la imagen para enfocarla en el centro rojo = media (media (img (:,:, 1)))% intensidad media de rojo verde = media (media (img (:,:, 2)))% intensidad media de verde azul = media (media (img (:,:, 3)))% intensidad media de azul si verde> rojo && verde> azul% Compruebe si la planta está en la imagen d = msgbox (['¡Vida encontrada! ']); % Muestra un cuadro de mensaje que dice "¡Vida encontrada!" esperar (d); end elseif l.rightFront> 100% Verifique si el parachoques de luz derecho / delantero está cubierto r.moveDistance (-0.05)% Mover roomba hacia atrás 0.05 metros img = r.getImage% Obtener imagen de la cámara rasberry pie en roomba y almacenar en la variable 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% recortar la imagen para enfocarla en el centro rojo = media (media (img (:,:, 1)))% intensidad media de rojo verde = media (media (img (:,:, 2)))% intensidad media de verde azul = media (media (img (:,:, 3)))% intensidad media de azul si verde> rojo && verde> azul% Compruebe si la planta está en la imagen d = msgbox (['¡Vida encontrada! ']); % Muestra un cuadro de mensaje que dice "¡Vida encontrada!" esperar (d); end elseif l.right> 100% Verifique si el parachoques de la luz derecha está cubierto r.moveDistance (-0.05)% Mover roomba hacia atrás 0.05 metros r.turnAngle (-20)% Girar roomba 20 grados CW img = r.getImage% Obtener imagen de cámara de tarta de frambuesa en roomba y almacenar en la variable 'img' rect = [100 0 150 150]; img = imcrop (img, rect)% recortar imagen para enfocar en el centro rojo = media (media (img (:,:, 1)))% intensidad media de rojo verde = media (media (img (:,:, 2)))% intensidad media de verde azul = media (media (img (:,:, 3)))% intensidad media de azul si verde> rojo && verde> azul% Compruebe si la planta está en la imagen d = msgbox (['¡Vida encontrada! ']); % Muestra un cuadro de mensaje que dice "¡Vida encontrada!" esperar (d); end elseif y.leftFront <1500% Verifique si la parte izquierda / delantera de roomba está fuera del acantilado r.moveDistance (-0.1, 0.05)% Mueva roomba hacia atrás 0.1 metros a 0.05 m / s r.turnAngle (-5)% Gire roomba 5 grados CW elseif y.rightFront <1500% Verifique si la parte derecha / frontal de roomba está fuera del acantilado r.moveDistance (-0.1, 0.05)% Mueva roomba hacia atrás 0.1 metros a 0.05 m / s r.turnAngle (5)% Gire roomba 5 grados CCW elseif y.izquierda <1000% Compruebe si el lado izquierdo de roomba está fuera del acantilado r.moveDistance (-0.05, 0.05)% Mueva roomba hacia atrás 0.05 metros a 0.05 m / s r.turnAngle (-10)% Gire roomba 10 grados CW elseif y.right0% Ejecutar si se presiona el botón si Continuar == 1 i = 0% Continuar buscando vida else i = 1% Fin del modo de VIDA end end end elseif Configuración == 2% Verifique si se eligió la configuración "TERRENO ÁSPERO" i = 0 while i == 0 r.setLEDDigits (num2str ('RGH'))% Visualización 'Rough' en la pantalla LED para i = 1: 1000 r.setDriveVelocity (0.05)% Establece la velocidad de la unidad roomba en 0.05 m / sx = r.getBumpers% Recupera y almacena los valores del sensor de parachoques en la estructura "x" y = r.get CliffSensors% Recupere y almacene los valores del sensor de desnivel en la estructura "y" si x.right == 1% Verifique si el parachoques derecho está presionado r.turnAngle (10)% Gire roomba 10 grados CCW elseif x.left == 1% Verifique si está a la izquierda bumper is presionado r.turnAngle (-10)% Gire roomba 10 grados CW elseif x.front == 1% Compruebe si el parachoques delantero está presionado r.turnAngle (20)% Gire roomba 20 grados CCW elseif x.rightWheelDrop == 1% Compruebe si la rueda derecha ha caído r.turnAngle (-20)% Gire roomba 20 grados CW elseif x.leftWheelDrop == 1% Compruebe si la rueda izquierda ha bajado r.turnAngle (20)% Gire roomba 20 grados CCW elseif y.leftFront < 1500% Verifique si la parte delantera izquierda de roomba está fuera del acantilado r.moveDistance (-0.05, 0.05)% Mueva roomba hacia atrás 0.05 metros a 0.05 m / s r.turnAngle (-5)% Gire roomba 5 grados CW si no y.rightFront < 1500% Compruebe si la parte delantera derecha de roomba está fuera del acantilado r.moveDistance (-0.05, 0.05)% Mueva roomba hacia atrás 0.05 metros a 0.05 m / s r.turnAngle (5)% Gire roomba 5 grados CCW si no y.izquierda <1000 % Verifique si la parte izquierda o f roomba está fuera del acantilado r.moveDistance (-0.05, 0.05)% Mueva roomba hacia atrás 0.05 metros a 0.05 m / s r.turnAngle (-10)% Gire roomba 10 grados CW elseif y.right0 if Continue == 1 i = 0 % Continuar terreno accidentado else i = 1% Finalizar terreno accidentado end end end else% Modo manual i = 0 r.setLEDDigits (num2str ('USER'))% Mostrar 'USER' en la pantalla LED d = msgbox (['Teclas de flecha - Moverse; S - Detener Rover; ESC - Control de usuario final; A - Localizar recurso ']); esperar (d); while i == 0 r.showCamera% Abrir la transmisión en vivo de la cámara de tarta de frambuesa en una ventana separada D = getkey (1)% Recuperar la tecla presionada por el usuario, almacenar el valor ASCII como variable D si D == 30% Verificar si la flecha "arriba" tiene presionado r.setDriveVelocity (0.1)% Enviar roomba hacia adelante a 0.2 m / s elseif D == 28% Verifique si se presionó la flecha "izquierda" r.setDriveVelocity (0)% Evite que roomba se mueva hacia adelante o hacia atrás r.turnAngle (15, 0.05)% Gire roomba 45 grados CCW a 0.05 m / s elseif D == 31% Compruebe si se presionó la flecha "hacia abajo" r.setDriveVelocity (-0.1)% Mueva roomba hacia atrás a 0.2 m / s elseif D == 29% Verifique si se presiona la flecha "derecha" r.setDriveVelocity (0)% Evite que roomba se mueva hacia adelante o hacia atrás r.turnAngle (-15, 0.05)% Gire roomba 45 grados CW a 0.05 m / s elseif D == 27% Verifique si se presionó la tecla "esc" (escape) i = 1% Cambiar el valor de la variable "i" para salir del bucle d = msgbox ('Saliendo del "Control de usuario"')% Informe al usuario que se está saliendo del modo manual si no D == 115% Compruebe si se ha pulsado la tecla "s" r.setDriveVelocity (0)% Detener roomba de avanzando o retrocediendo elseif D == 97% Compruebe si se ha pulsado "a" image = r.getImage; imwrite (imagen, 'imagen.png') W = Clasificar (imagen) K = modo (W) si K == 3 d = msgbox ('Recurso encontrado')% Mostrar si se detectó un recurso rectangular waitfor (d); % Espere a que el usuario cierre el cuadro de mensaje "d" elseif K == 0 d = msgbox ('No es un recurso:(')% Muestra si no se detecta un recurso rectangular waitfor (d);% Espere a que el usuario cierre el cuadro de mensaje "d" end else d = msgbox ('No es una entrada de clave válida.')% Se muestra si el usuario cierra el menú "elegir configuración" waitfor (d);% Espera a que el usuario cierre el cuadro de mensaje "d" end waitfor (d);% Espera el usuario cerrará el cuadro de mensaje "d" end end end else d = msgbox ('Adiós')% Se despide si las opciones están cerradas end waitfor (d);

Paso 3: prueba

Pruebas
Pruebas

Una vez que se haya escrito su código, deberá probar su Roomba. Aunque su código puede parecer correcto, muchos de sus valores, especialmente para el color o la forma, deberán cambiarse para reconocer correctamente los objetos que le gustaría que su Roomba identificara.

Paso 4: observar los resultados visuales

Observe las salidas visuales
Observe las salidas visuales
Observe las salidas visuales
Observe las salidas visuales

Será muy evidente si ha programado correctamente su Roomba en función de sus resultados visuales.

Los resultados incluyen:

  • Detección de formas: la capacidad del Roomba para distinguir correctamente las formas para encontrar los minerales correctos.
  • Maniobras en terreno accidentado: evita acantilados o áreas oscuras
  • Modo manual: transmisión en vivo y la capacidad de controlar el Roomba
  • Imágenes: Imágenes de minerales
  • ¡Vida encontrada !: Un cuadro de texto MatLab que indica que su planta ha identificado vida orgánica.

Ese es el final de nuestro tutorial, ¡disfruta de tu nuevo Mars Expedition Rover!

Recomendado: