Tabla de contenido:

Robo-Technician: 8 pasos
Robo-Technician: 8 pasos

Video: Robo-Technician: 8 pasos

Video: Robo-Technician: 8 pasos
Video: What does the SMT operator’s workplace look like. FUJI NXT III series 2024, Mes de julio
Anonim
Robo-técnico
Robo-técnico

Imagina por un segundo que eres uno de los astronautas que aterriza en Marte. Tiene un millón de cosas que hacer, muestras que tomar, experimentos que realizar, datos que recopilar, pero una o dos veces al día debe recorrer la habitación y / o los módulos de investigación en los que vive y trabaja para inspeccionarlos. Es necesario, alguien tiene que asegurarse de que la cosa esté en buen estado, que todas las miles de piezas y partes estén funcionando y en su lugar. Pero, ¿qué pasaría si hubiera un ayudante automatizado para relevarlo de algunas de esas tareas? ¿Qué pasaría si hubiera un pequeño robot que pudiera moverse dentro de los módulos para asegurarse de que todo estuviera en su lugar, funcionando y seguro?

Robo-Technician al rescate.

Esencialmente, este código controla al Robo-Technician ya que sigue un camino de color claro en el suelo. Seguirá este camino hasta que encuentre un cruce en el camino o un giro, lo que le pedirá que se tome una foto para procesar la imagen y permitirle al Robo-Technician tomar una decisión sobre a dónde ir a continuación. Los sensores de golpes ligeros y golpes protegen al Robo-Technician de daños, y los sensores de golpes controlan cuándo se tomará una foto de diagnóstico. En conjunto, el Robo-Technician está diseñado para hacer zoom en los módulos de Mar, liberando el tiempo de los astronautas mientras realizan la tarea básica de inspección, solo solicitando la participación humana cuando encuentra algo mal.

Nuevamente como advertencia, este es un trabajo en progreso. El código, tal como existe, funciona pero tiene contratiempos, especialmente porque hay varios programas que se superponen. Además, para que este proyecto funcione en una misión real a Marte, se necesitaría construir un robot para ese propósito específico, así que nuevamente supongo que esta es una construcción de "prueba de concepto".

Hay algunas cosas que necesitará para que esto funcione. Necesitará un programa costoso, paquetes de soporte para ese programa y un poco de experiencia en codificación. Como soy estudiante y se ha proporcionado parte del código de la planta baja (para el raspberry pi), no hablaré específicamente sobre la configuración. Puede encontrar todos los enlaces para ese código base a continuación. Vayamos a la lista de materiales.

Hardware

  • Raspberry Pi (usamos una versión 3)
  • iRobot ®
  • algún tipo de dispositivo de sujeción para mantener la Raspberry Pi conectada al Robo-Technician
  • Cámara Raspberry Pi (no importa de qué tipo, siempre que tenga un buen enfoque automático y resolución de imagen)
  • algún tipo de soporte o funda para mantener la cámara mirando hacia adelante en el Robo-Technician
  • un material para usar como tira, blanco (o de color muy claro), que se sujeta al suelo de forma segura. Debe ser un poco más ancho que el espacio entre los dos sensores de acantilado frontales.
  • 4 carteles con texto muy grande (con las palabras IMAGEN, DERECHA, ATRÁS e IZQUIERDA impresas en ellos)
  • Hojas de papel de colores (al menos tres y preferiblemente rojo, verde y azul)

Software

  • Matlab (se usaron 2018a y 2017b y parecen hacer poca diferencia)
  • Paquete de soporte Raspberry Pi para Matlab
  • Código de Raspberry Pi para la conexión a Matlab (enlace al código fuente que se proporciona a continuación)
  • Caja de herramientas de procesamiento de imágenes para Matlab (prácticamente no puede hacer este proyecto sin la caja de herramientas)
  • OPCIONAL: Matlab Mobile instalado en su teléfono, que explicaré más adelante

Paso 1: configuración del hardware

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Este es el enlace para el código base para garantizar que iRobot® pueda comunicarse con Matlab, junto con un tutorial básico. Como dije antes, no cubriré esta parte específica ya que el tutorial ya está muy bien diseñado. Mencionaré que una vez que haya seguido los pasos en el enlace, puede usar el comando "doc" de Matlab para revisar la información incluida. Específicamente:

doc roomba

Y un punto más muy importante.

Cuando descargue los archivos del enlace anterior, PÓNGALOS EN LA CARPETA QUE DESCRIBÍ ARRIBA, ya que Matlab requiere que los archivos generados por el usuario estén en la carpeta de trabajo actual.

Con eso fuera del camino, pasemos al código.

Paso 2: encontrar todos esos sensores

Encontrar todos esos sensores
Encontrar todos esos sensores
Encontrar todos esos sensores
Encontrar todos esos sensores

Tómese un segundo y realice una inspección del iRobot®. Es bueno saber dónde están para que tenga una idea de las entradas que recibe el Robo-Technician, y podrá averiguar por qué la cosa está girando en círculos en lugar de seguir la ruta que configurará (esto podría o podría no haber sucedido). Obviamente, verá el gran sensor de golpes físicos en la parte delantera. Los sensores de acantilado son un poco más difíciles de ver, tendrá que darle la vuelta y buscar las cuatro ventanas de plástico transparente cerca del borde frontal. Los sensores de golpes de luz están aún más ocultos, pero por ahora será suficiente con decir que el vivo en la banda negra brillante corre alrededor del frente del iRobot®, que está en la parte frontal de la barra física del sensor de golpes.

Hay sensores de caída de rueda, pero no se utilizan en este proyecto, por lo que pasaremos a probar los sensores.

Paso 3: Prueba para establecer parámetros

Prueba para establecer parámetros
Prueba para establecer parámetros

Antes de que podamos enviar al Robo-Technician para que haga su trabajo, necesitamos descubrir sus peculiaridades específicas y rangos de sensores. Dado que cada iRobot® es un poco diferente y cambia a lo largo de la vida del robot, necesitamos averiguar cómo leen los sensores en las áreas en las que operará. La forma más fácil de hacerlo es configurar su ruta de color claro (Usé tiras de papel de impresora blanco, pero cualquier color claro servirá) en la superficie que operará el Robo-Technician.

Inicie Matlab y abra un nuevo script. Guarde el script EN LA MISMA CARPETA QUE DESCRIBÍ ANTERIORMENTE y asígnele el nombre que desee (trate de que sea breve, ya que el nombre de este archivo será el nombre de la función). Encienda el robot y use la configuración de la variable roomba del tutorial, escribiendo los comandos en la ventana de comandos.

Asegúrese de que la Raspberry Pi esté conectada al iRobot® y que su computadora esté conectada a la misma conexión a Internet. Pasará menos tiempo tirando de su cabello tratando de descubrir por qué Matlab no se conecta

r = roomba (número que configuró)

La variable "r" en esta circunstancia no es necesaria, puedes llamarla como quieras, pero hace la vida más fácil usar una variable de una sola letra.

Una vez que la ruta esté configurada y el roomba se haya conectado correctamente, coloque el futuro Robo-Technician donde uno o dos de los sensores de acantilado estén sobre la parte superior de la ruta. Obviamente, eso significa que los otros dos o tres están sobre la superficie que eligió.

Ahora inicie los sensores de prueba con el comando:

r.testSensors

Tenga en cuenta que la "r" es la variable que definió anteriormente, por lo que si no es 'r' cambie la 'r'. a lo que decidiste. Esto abrirá la pantalla del sensor de prueba con un montón de información.

Para este proyecto, céntrese en las secciones de parachoques, parachoques y acantilados. Mueva al Robo-Technician asegurándose de observar cómo cambian los sensores en las diferentes superficies, o qué tan cerca debe estar un objeto para que cambien los valores de ligthBumper, etc. Tenga en cuenta estos números (o anótelos) porque los necesita para configurar sus parámetros en un segundo.

Paso 4: Iniciar el código

Primero, estarás construyendo una función. Lo llamé "ruta", pero de nuevo, el nombre no es necesario, pero de ahora en adelante me referiré a él como "ruta".

La parte superior del código está configurando algunas opciones de entrada del usuario. Crea algunas listas que se usarán en el listdlg y luego muestra un cuadro de diálogo de lista. Esto permite al usuario seleccionar qué color de ruta desea seguir, lo que entra en juego más tarde.

list = {'Rojo', 'Azul', 'Verde'}

problist = {'Siniestro, Guardar imagen', 'Componente fuera de lugar, Guardar imagen', 'Esperado, Continuar'} pathcolor = listdlg ('PromptString', 'Seleccionar un color de ruta', … 'Modo de selección', 'único', 'ListString', list) prob = 0; driv = ;

Las variables "prob" y "driv" deben declararse aquí, ya que se usarán dentro del bucle while principal de la función, pero nuevamente, si desea cambiar el nombre de cualquiera de estas variables o cambiar las selecciones de la lista, está bien siempre que eres consistente en el resto del código.

Paso 5: Parte superior del ciclo while: sensores de golpes físicos

La parte superior del ciclo while contiene la lógica del sensor de impacto físico. Básicamente, cuando el Robo-Technician choca con algo, se detiene (o para el sensor de impacto frontal retrocede 0,1 metros), luego se posiciona para tomar una foto. Veamos primero la parte de control de velocidad y posición.

Si probó todos los sensores en el Robo-Technician en los pasos anteriores, sabrá que los sensores de impacto tienen un valor lógico (0 o 1) con cero que representa la posición normal, no presionada del sensor. Téngalo en cuenta para el código.

while true% main while loop% recibe información del parachoques S = r.getBumpers si S.left ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

Esta es la parte básica de "si golpea algo, deténgase". Si los sensores detectan una colisión, pasa a la siguiente parte del código, que reajusta la posición del Robo-Technician para obtener una foto.

if S.left ~ = 0% if loop toma información del parachoques y alinea la cámara para la foto r.turnAngle (5) pause (0.5) img = r.getImage% toma la foto y muestra la imagen (img)% cuadro de diálogo prob = listdlg (' PromptString ',' Encontré un obstáculo inesperado, identifique '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pause (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Encontré un obstáculo inesperado, identifique'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) pause (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Encontré un obstáculo inesperado, identifíquelo'…, 'SelectionMode', 'single', 'ListString', problist) end

Básicamente, una vez tomada la imagen, aparecerá otro cuadro de diálogo con tres opciones. Las dos primeras opciones guardan la foto en una carpeta específica, que cubriré más adelante, mientras que la tercera opción simplemente cierra el cuadro de diálogo y continúa a través del bucle. Si no recuerda las opciones, consulte el paso anterior.

Ahora inserté una sección de código entre la parte del sensor de golpes y la parte para guardar fotos. Esto toma valores de lightBumper y establece la velocidad de manejo en 0.025 metros / segundo (muy lento), lo cual no es realmente necesario, pero reduce los golpes del Robo-Technician contra cosas y eventualmente desgasta los sensores físicos de golpes.

L = r.getLightBumpers si L.izquierda> 100 || L.izquierdaFrente> 100 || L.derechaFrente> 100 || L.right> 100 driv = 0.025 r.setDriveVelocity (0.025) else driv = 0.1 end

Esta sería la parte en la que entran en juego los valores que observó (y con suerte anotó) anteriormente

El "L. (lado y dirección del sensor)> 100" se basó en los valores que observé, así que si sus observaciones son diferentes, cambie estos números. La idea es que si el Robo-Technician detecta algo unos centímetros delante de él, se ralentizará, de lo contrario no es necesario.

La siguiente parte es donde se guardan las fotos para más adelante.

% si se seleccionó la primera o la segunda opción en el cuadro de diálogo prob, guarda la imagen si prob == 1% si el bucle genera información de archivo para la foto, escribe con la marca de tiempo t = clock; nombre base = sprintf ('\ img_% d_% d_% d_% d_% d.png', t (1), t (2), t (3), t (4), t (5)); carpeta = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (carpeta, nombre base); imwrite (img, fullFileName) cerrar Figura 1 pause (2) elseif prob == 2 t = clock; nombre base = sprintf ('\ img_% d_% d_% d_% d_% d.png', t (1), t (2), t (3), t (4), t (5)); carpeta = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (carpeta, nombre base); imwrite (img, fullFileName) cerrar Figura 1 pausa (2) final

Todos los nombres de archivo y las ubicaciones donde se guardan las fotos son opcionales. Elegí una carpeta que está anidada dentro de la carpeta de roomba que creé en el paso de introducción, pero puede estar en cualquier lugar que elija. Además, las fotos se guardan con la marca de tiempo, pero eso no es especialmente necesario (aunque sería hipotéticamente útil para una misión a Marte).

Con los sensores de golpes físicos cubiertos, podemos pasar a los sensores de acantilado y seguir el camino.

Paso 6: siguiendo el camino

El código para los sensores de desnivel está configurado para comparar los valores de los dos sensores frontales y laterales. Deberá cambiar estos valores (probablemente) en función de sus valores observados. Probablemente también necesitará editar estos valores después de algunas pruebas y cambiarlos según la luz ambiental, la hora del día (dependiendo de qué tan bien iluminada esté el área de prueba) o cuando las ventanas del sensor estén sucias.

Sin embargo, antes de llegar al código del sensor de acantilado, hay un segmento de código corto que inserté para eliminar algunos de los datos innecesarios de Matlab. Esta parte no es necesaria, pero la usé para reducir el almacenamiento requerido para ejecutar el programa.

borrar img borrar t borrar nombre base borrar fullFileName borrar carpeta

El siguiente segmento de código es el meollo del proyecto. Permite al Robo-Technician seguir el camino de color claro que se ha colocado en el suelo. En pocas palabras, intenta dirigirse a sí mismo para que los dos sensores de acantilado frontales estén por encima del umbral, en función de los valores observados, y permite que el programa comience los pasos de procesamiento de imágenes un poco más tarde.

C = r.getCliffSensors% si el bucle sigue una banda de color (blanco) si C.leftFront> 2000 && C.rightFront> 2000% guía de trayectoria recta r.setDriveVelocity (driv) elseif C.leftFront 2000% gira a la derecha si el robot va demasiado lejos left r.turnAngle (-2.5) elseif C.leftFront> 2000 && C.rightFront <2000% gira a la izquierda si el robot va demasiado a la derecha r.turnAngle (2.5) elseif C.leftFront <2000 && C.rightFront 100 || L.izquierdaFrente> 100 || L.derechaFrente> 100 || L.right> 100 img = r.getImage end% comprueba si hay una curva en la ruta si C.left> 2800 && C.right <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) marcador de posición de% final para reconocimiento de imagen de ruta disp ('OBTENIENDO IMAGEN') end end end

Tenga en cuenta que los nombres de variable que elegí son opcionales, pero nuevamente creo que hace la vida más fácil usar variables de una sola letra cuando sea posible

Para explicar la sección central del código, cuando los dos sensores frontales se salen del borde del camino (cuando se trata de una intersección o cuando llega al final del camino), mira para ver si hay algo frente a él.. Deberá colocar un objeto en el suelo al final del camino o en cualquier intersección para que esto funcione.

Una vez que se toma la foto, utiliza el reconocimiento de imágenes para averiguar qué hacer. También hay un marcador de posición en esta sección de código:

% marcador de posición para el reconocimiento de imagen de ruta ('OBTENIENDO IMAGEN')

Usé esto por el momento porque quería hablar específicamente sobre el procesamiento de texto y color que ocurre, que es el siguiente paso.

Paso 7: procesamiento de imágenes

El procesamiento de imágenes consta de dos partes. Primero está el reconocimiento de color, que calcula la intensidad del color en la imagen para decidir si continuar o no con el reconocimiento de texto. Los cálculos de color se basan en la elección que se hizo en ese primer cuadro de diálogo al principio (utilicé rojo, azul, verde, pero puede elegir los colores que desee, siempre que los valores medios para la intensidad del color puedan ser reconocidos por el Cámara Raspberry Pi).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) rojo = media (media (imgb (:,:, 1))); g = media (media (imgb (:,:, 2))); b = media (media (imgb (:,:, 3)));

Este es el control de intensidad. Esto se utilizará en el siguiente segmento para decidir qué quiere hacer.

if red> g && red> b if pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img) if R. Words {1} == IMAGE || R. Palabras {2} == IMAGEN || R. Palabras {3} == IMAGEN t = reloj; nombre base = sprintf ('\ img_% d_% d_% d_% d_% d.png', t (1), t (2), t (3), t (4), t (5)); carpeta = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (carpeta, nombre base); imwrite (img, fullFileName) pause (2) elseif R. Words {1} == DERECHA || R. Palabras {2} == DERECHA || R. Palabras {3} == DERECHA r.turnAngle (-75) elseif R. Palabras {1} == IZQUIERDA || R. Palabras {2} == IZQUIERDA || R. Words {3} == IZQUIERDA r.turnAngle (75) elseif R. Words {1} == BACK || R. Palabras {2} == ATRÁS || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end

Este segmento decide si el color que se seleccionó en el primer cuadro de diálogo coincide con el color que ve la cámara. Si lo hace, ejecuta el reconocimiento de texto. Busca ver qué palabra (IMAGEN, ATRÁS, DERECHA o IZQUIERDA) aparece y luego gira (para derecha e izquierda), gira (para atrás) o toma una foto y la guarda de la misma manera que antes.

Solo proporcioné una sección del código para los diferentes colores

Para permitir que el código reconozca el azul y el verde, simplemente copie el código y cambie la verificación lógica en la parte superior del segmento y configure el "color de la ruta == (número)" para que corresponda con las selecciones de color del cuadro de diálogo superior (para el código tal como se muestra, el azul sería 2 y el verde sería 3).

Paso 8: el producto terminado

El producto terminado
El producto terminado

Ahora el Robo-Technician debería acercarse a los módulos de la misión a Marte e informar a los astronautas cuando algo esté fuera de lugar.

Recuerde, todos los valores del sensor de desnivel y del parachoques ligero deben cambiarse a los valores observados. Además, por experiencia, he encontrado que es mejor probar este proyecto en un piso de color oscuro y es aún mejor si ese piso no es reflectante. Esto hace que el contraste entre el camino y el piso aumente, lo que hace que sea más probable que el Robo-Technician lo siga correctamente.

Espero que hayas disfrutado preparando un pequeño ayudante para la misión a Marte y que te diviertas construyendo.

Recomendado: