Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Robot de seguimiento de línea basado en inteligencia artificial (AI)

Componentes y suministros

Arduino Nano
× 1
Esclavo maestro del transceptor RF inalámbrico Bluetooth Seeed
× 1
Módulo de sensor infrarrojo infrarrojo de Amazon Web Services Luz fotoeléctrica reflectante
× 1
Sony Servo de rotación continua
× 1
Batería de 4,8 voltios para Android
× 1

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Después de desarrollar el robot Pick &Place basado en Arduino, la idea era desarrollar un robot de seguimiento de línea basado en inteligencia artificial artificial. Desarrollar un robot de seguimiento de línea simple fue bueno para el principiante, justo lo que necesitaba para agregar algún tipo de sensores infrarrojos en lugar de servomotores en mi proyecto reciente. "La idea era poner a prueba mis habilidades en nivel avanzado ".

Aunque fue una tarea difícil, algún tipo de investigación en línea me ayudó mucho.

¿Por qué es necesario un robot de seguimiento de línea basado en IA?

Cuando se trata de IA es la tecnología reciente la que tiene el potencial de cambiar el entorno mundial y, por lo tanto, la vida humana efectiva.Un sueño que puede hacerse realidad poniendo inteligencia a nuestros robots para comprender los problemas de la vida real y resolverlos en consecuencia, ese sueño solo puede hacerse realidad a través de Inteligencia artificial por eso todo el mundo habla de ello.

  • Se puede utilizar en la línea de montaje / producción.
  • Autobuses de recogida de pasajeros.

Aunque mi robot prototipo puede ser un poco inteligente, es solo el comienzo para que mueva mis proyectos hacia la IA. Por lo tanto, aquí trataré de explicar paso a paso el desarrollo del robot de seguimiento de línea utilizando Inteligencia Artificial en un lenguaje bastante simple. Debido a la falta de recursos, no construiré un robot, pero puedo explicar muy bien que cómo puedes construirlo haciendo algún tipo de investigación. Intentaré proporcionar códigos precisos que funcionarán en tu IDE de Arduino, para que puedas puede desarrollar su primer robot de IA con bastante facilidad.

Puedes apoyarme en Patreon desde aquí :http://bit.ly/31NfQ6A

"Puede encontrar el aparato de tarifas más baratas en los EE. UU. en la descripción de este video, simplemente haga clic en video . "

Ahora pasemos al proyecto "¡Un robot de seguimiento de línea basado en IA!".

USO DE SENSORES DE INFRARROJOS

Nuestro El proyecto incluye 7 sensores infrarrojos como se muestra en el diagrama.

  • 5 para control PID
  • 1 para detección a la izquierda
  • otro para la detección del lado derecho.

Función de 5 sensores de control PID :Estos 5 sensores se utilizarán para generar una salida digital alta o baja (1, 0) respectivamente.

El sensor centrado con relación a la línea negra solo ese sensor producirá ALTO (1). El resultado igualmente posible de ese sensor podría ser:-

  • 10000
  • 11000
  • 01000
  • 01100
  • 00100
  • 00110
  • 00010
  • 00011
  • 00001
  • 00000
  • 11111

Ahora vienen otros dos sensores para los posibles resultados izquierdo y derecho son

Sensor de extremo izquierdo:salida analógica alta o baja

Sensor de extremo izquierdo:salida analógica alta o baja

Para almacenar el valor de 5 sensores, creemos una variable de matriz.

  en LFSensor [5] ={1,1,1,1,1};  

Para almacenar el valor de los sensores izquierdo y derecho usaremos integer

  int farleft_sensor =0;  

Como sabemos, tenemos 5 sensores que se pueden usar para almacenar la ruta izquierda y la derecha es tomada por un robot en una matriz. Entonces

  LFSensor [0] =digitalRead (lineFollowSensor0); 
LFSensor [1] =digitalRead (lineFollowSensor1);
LFSensor [2] =digitalRead (lineFollowSensor2);
LFSensor [ 3] =digitalRead (lineFollowSensor3);
LFSensor [4] =digitalRead (lineFollowSensor4);
farRightSensor =analogRead (farRightSensorPin);
farLeftSensor =analogRead (farLeftSensorPin);

REGLA DE LABERINTO PARA IZQUIERDA:

ver este video para entender la regla del laberinto de la mano izquierda

En resumen, la Regla de la mano izquierda se puede describir como:

  • Coloque su mano izquierda en la pared.
  • Empiece a caminar hacia adelante
  • En cada intersección y en todo el laberinto, mantenga su mano izquierda tocando la pared a su izquierda.
  • Eventualmente, llegarás al final del laberinto. Probablemente no irá por el camino más corto y directo, pero lo logrará.

Entonces, la clave aquí es identificar las intersecciones , definiendo qué curso tomar en base a las reglas anteriores. Específicamente, en nuestro tipo de laberinto 2D, podemos encontrar 8 tipos diferentes de intersecciones (ver la primera imagen de arriba):

Mirando la imagen, podemos darnos cuenta de que las posibles acciones en las intersecciones son:

En una " Cruz "

  • Vaya a la izquierda o
  • Vaya a la derecha o
  • Siga recto
  • En una " Cruz "Ir a la izquierda, o Ir a la derecha, o Ir directamente

En una " T ":

  • Vaya a la izquierda o
  • Ir a la derecha
  • En una " T ":Ir a la izquierda o Ir a la derecha

En " Solo a la derecha ":

  • Ir a la derecha
  • En " Solo a la derecha ":Ir a la derecha

En " Solo a la izquierda ":

  • Ir a la izquierda
  • En " Solo a la izquierda ":Ir a la izquierda

En " Recta o izquierda ":

  • Vaya a la izquierda o
  • Siga recto
  • En " Recta o izquierda ":Vaya a la izquierda o siga recto

En " Recto o derecho ":

  • Vaya a la derecha o
  • Siga recto
  • En " Recto o derecho ":Vaya a la derecha o siga recto

En un " callejón sin salida ":

  • Regresar ("giro en U")
  • En un " callejón sin salida ":Regresar (" Vuelta en U ")

En " Fin del laberinto ":

  • Deténgase
  • En " Fin del laberinto ":Detener

Pero, aplicando la "Regla de la mano izquierda", las acciones se reducirán a una opción cada una:

  • En una "cruz":ve a la izquierda
  • En una "T":ve a la izquierda
  • En "Solo a la derecha":vaya a la derecha
  • En "Solo a la izquierda":ve a la izquierda
  • En "Recta o izquierda":Vaya a la izquierda
  • En "Recta o derecha":siga recto
  • En un "callejón sin salida":retroceda ("giro en U")
  • En el "final del laberinto":deténgase

¡Estamos casi alli! "¡Cálmate!"

Cuando el robot llega a un "Callejón sin salida" o al "Fin de un Laberinto", es fácil identificarlos, porque no existen situaciones ambiguas (ya hemos implementado esas acciones en el Robot Seguidor de Línea, ¿recuerdas?). El problema es cuando el robot encuentra una "LÍNEA", por ejemplo, porque una línea puede ser una "Cruz" (1) o una "T" (2). Además, cuando llega a un "GIRO IZQUIERDA o DERECHA", puede ser un giro simple (opciones 3 o 4) u opciones para ir directamente (5 o 6). Para descubrir exactamente qué tipo de intersección es el robot, se debe dar un paso adicional:el robot debe correr una "pulgada extra" y ver qué sigue (vea la segunda imagen de arriba, como ejemplo).

Entonces, en términos de flujo, las posibles acciones ahora se pueden describir como:

En un "FINAL MUERTO":

  • Regresar ("giro en U")
  • En un "FINAL MUERTO":Regrese ("Vuelta en U")

En una "LÍNEA":

  • Ejecute una pulgada adicional
  • Si hay una línea:es una "Cruz" ==> Ir a la IZQUIERDA
  • Si no hay línea:es una "T" ==> Ir a la IZQUIERDA
  • Si hay otra línea:es el "Fin del laberinto" ==> DETENER
  • En una "LÍNEA": Ejecute una pulgada adicional Si hay una línea:Es una "Cruz" ==> Ir a la IZQUIERDA Si no hay línea:es una "T" ==> Ir a la IZQUIERDA Si hay otra línea:es el "Fin del Laberinto" ==> DETENER

En "GIRO A LA DERECHA":

  • Ejecute una pulgada adicional
  • si hay una línea:es una recta o derecha ==> ir RECTA
  • Si no hay línea:es solo a la derecha ==> Ir a la DERECHA
  • En "GIRO A LA DERECHA": Corre una pulgada adicional si hay una línea:es una recta o derecha ==> ir RECTA Si no hay línea:es solo una derecha ==> ir a la DERECHA

En un "GIRO A LA IZQUIERDA":

  • Ejecute una pulgada adicional
  • si hay una línea:es una recta o IZQUIERDA ==> Ve a la IZQUIERDA
  • Si no hay línea:es solo IZQUIERDA ==> Ir a IZQUIERDA
  • En un "GIRO A LA IZQUIERDA": Corre una pulgada adicional si hay una línea:Es una recta o IZQUIERDA ==> Ir a la IZQUIERDA Si no hay línea:es una IZQUIERDA solamente ==> Ir a la IZQUIERDA

Tenga en cuenta que, de hecho, en caso de un "GIRO A LA IZQUIERDA", puede saltarse la prueba, porque tomará a la IZQUIERDA de todos modos. Dejé la explicación más genérica solo por claridad. En el código real, omitiré esta prueba.

Aquí hay algunos problemas que pueden surgir al realizar este proyecto.

Tema relacionado

RESOLUCIÓN DE PROBLEMAS DEL CONTROLADOR Arduino

ver este video para resolver el problema del controlador Arduino:


Código

  • RoBot_Maze_Solve_2
  • Funciones
  • Funciones generales.
  • sensorFuntions
  • RobotDefines.h
  • MotorFuntions
RoBot_Maze_Solve_2 C / C ++
 / * --------------------------------------------- --------------------- 7 sensores Smart Robot - Maze Solver y Line Follower con controlador PID programable a través de BT ==> Movimiento básico basado en Nano Mouse Robot, desarrollado por Michael Backus (http://www.akrobotnerd.com/) ==> Seguimiento de línea basado en http://samvrit.tk/tutorials/pid-control-arduino-line-follower-robot/?ckattempt=1==> CRÉDITO a Patrick McCabe por el código de resolución de ruta, visite patrickmccabemakes.com !! Marcelo Jose Rovai - 23 de abril de 2016 - Visite:http://mjrobot.org---------------- -------------------------------------------------- - * / # incluye  #include "robotDefines.h" Comando de cadena; Dispositivo de cadena; // Módulo BT # incluye  SoftwareSerial BT1 (10, 11); // El pin 10 es Rx y el pin 11 es Tx // ----------------------------------- ---------- configuración vacía () {Serial.begin (9600); BT1.begin (9600); pinMode (ledPin, SALIDA); pinMode (buttonPin, INPUT_PULLUP); // sensores de seguimiento de línea pinMode (lineFollowSensor0, INPUT); pinMode (lineFollowSensor1, ENTRADA); pinMode (lineFollowSensor2, ENTRADA); pinMode (lineFollowSensor3, ENTRADA); pinMode (lineFollowSensor4, ENTRADA); // servos leftServo.attach (5); rightServo.attach (3); BT1.print ("comprobar las constantes PID que se enviarán al robot"); Serial.print ("comprobar las constantes PID que se enviarán al robot"); BT1.println ('\ n'); while (digitalRead (buttonPin) &&! mode) {checkBTcmd (); // verifica si se recibe un comando del control remoto BT manualCmd (); comando =""; } checkPIDvalues ​​(); modo =DETENIDO; estado =0; // 1er paso} void loop () {ledBlink (1); BT1.println ("Iniciar primera pasada"); Serial.println ("Iniciar primera pasada"); readLFSsensors (); mazeSolve (); // Primera pasada para resolver el laberinto ledBlink (2); BT1.println ("Finalizar primera pasada"); Serial.println ("Finalizar primera pasada"); while (digitalRead (buttonPin) &&! mode) {checkBTcmd (); // verifica si se recibe un comando del control remoto BT manualCmd (); comando =""; } BT1.println ("Iniciando la segunda pasada"); Serial.println ("Iniciando la segunda pasada"); pathIndex =0; estado =0; mazeOptimization (); // ejecuta el laberinto lo más rápido posible ledBlink (3); BT1.println ("Finalizar la segunda pasada"); Serial.println ("Finalizar segunda pasada"); while (digitalRead (buttonPin) &&! mode) {checkBTcmd (); // verifica si se recibe un comando del control remoto BT manualCmd (); comando =""; } modo =DETENIDO; estado =0; // 1er paso pathIndex =0; pathLength =0;} 
Funciones C / C ++
 void mazeSolve (void) {while (! status) {readLFSsensors (); cambiar (modo) {caso NO_LINE:motorStop (); goAndTurn (IZQUIERDA, 180); recIntersection ('B'); descanso; caso CONT_LINE:runExtraInch (); readLFSsensors (); if (modo! =CONT_LINE) {goAndTurn (IZQUIERDA, 90); recIntersection ('L');} // o es una "T" o una "Cruz"). En ambos casos, va a la IZQUIERDA else mazeEnd (); descanso; case RIGHT_TURN:runExtraInch (); readLFSsensors (); if (modo ==NO_LINE) {goAndTurn (DERECHA, 90); recIntersection ('R');} else recIntersection ('S'); descanso; case LEFT_TURN:goAndTurn (IZQUIERDA, 90); recIntersection ('L'); descanso; case FOLLOWING_LINE:nextLine (); descanso; }}} // --------------------------------------------- recIntersection vacío (dirección de caracteres) {ruta [longitud de ruta] =dirección; // Almacena la intersección en la variable de ruta. pathLength ++; simplifyPath (); // Simplifica la ruta aprendida.} // ---------------------------------------- ------ void mazeEnd (vacío) {motorStop (); BT1.print ("El final ==> Ruta:"); for (int i =0; i "); Serial.println (pathLength); estado =1; mode =STOPPED;} // ------------------------------------------- --- void nextLine (void) {// readLFSsensors (); calcularPID (); motorPIDcontrol (); } // ----------------------------------------------- ------------------------------------------- // Simplificación de ruta. La estrategia es que cada vez que nos encontramos con una secuencia // xBx, podemos simplificarla eliminando el callejón sin salida. Por // ejemplo, LBL -> S, porque una sola S pasa por alto el callejón sin salida // representado por LBL.void simplifyPath () {// solo simplifica la ruta si el penúltimo turno fue una 'B' si ( pathLength <3 || path [pathLength-2]! ='B') return; int totalAngle =0; int i; for (i =1; i <=3; i ++) {switch (path [pathLength-i]) {case 'R':totalAngle + =90; descanso; caso 'L':totalAngle + =270; descanso; caso 'B':totalAngle + =180; descanso; }} // Obtenga el ángulo como un número entre 0 y 360 grados. totalAngle =totalAngle% 360; // Reemplaza todos esos giros con uno solo. switch (totalAngle) {caso 0:ruta [rutaLongitud - 3] ='S'; descanso; caso 90:ruta [pathLength - 3] ='R'; descanso; caso 180:ruta [pathLength - 3] ='B'; descanso; caso 270:ruta [pathLength - 3] ='L'; descanso; } // La ruta ahora es dos pasos más corta. pathLength - =2; } // ----------------------------------------------- ----------------------------------------------- void mazeOptimization ( void) {while (! status) {readLFSsensors (); cambiar (modo) {caso FOLLOWING_LINE:nextLine (); descanso; caso CONT_LINE:if (pathIndex> =pathLength) mazeEnd (); else {mazeTurn (ruta [índice de ruta]); pathIndex ++;} descanso; case LEFT_TURN:if (pathIndex> =pathLength) mazeEnd (); else {mazeTurn (ruta [índice de ruta]); pathIndex ++;} descanso; case RIGHT_TURN:if (pathIndex> =pathLength) mazeEnd (); else {mazeTurn (ruta [índice de ruta]); pathIndex ++;} descanso; }}} // --------------------------------------------- -------- void mazeTurn (char dir) {switch (dir) {case 'L':// Gire a la izquierda goAndTurn (IZQUIERDA, 90); descanso; case 'R':// Gire a la derecha goAndTurn (DERECHA, 90); descanso; case 'B':// Dar marcha atrás goAndTurn (DERECHA, 800); descanso; case 'S':// Ir directamente runExtraInch (); descanso; }} 
Funciones generales. C / C ++
 void ledBlink (int times) {for (int i =0; i  0) {Serial.print ("Comando recibido de BT ==>"); Serial.println (dispositivo); comando =dispositivo; dispositivo =""; // Resetea la variable BT1.flush (); }} // ---------------------------------------------- -------------------------- void manualCmd () {switch (comando [0]) {case 'g':mode =FOLLOWING_LINE; descanso; caso 's':motorStop (); // apaga ambos motores break; caso 'f':motorForward (); descanso; caso 'r':motorTurn (DERECHA, 30); motorStop (); descanso; caso 'l':motorTurn (IZQUIERDA, 30); motorStop (); descanso; caso 'b':motorBackward (); descanso; caso 'p':Kp =comando [2]; descanso; caso 'i':Ki =comando [2]; descanso; caso 'd':Kd =comando [2]; descanso; }} // ---------------------------------------------- -------------------------- void sendBTdata (int data) // envía datos a BT {digitalWrite (ledPin, HIGH); BT1.print ("Datos de Arduino"); BT1.print (datos); BT1.print ("xx"); BT1.println ('\ n'); digitalWrite (ledPin, BAJO);} // ---------------------------------------- ---------------- void calculatePID () {P =error; I =I + error; D =error-previousError; PIDvalue =(Kp * P) + (Ki * I) + (Kd * D); previousError =error;} // ------------------------------------------- ------------- void checkPIDvalues ​​() {BT1.print ("PID:"); BT1.print (Kp); BT1.print ("-"); BT1.print (Ki); BT1.print ("-"); BT1.println (Kd); Serial.print ("PID:"); Serial.print (Kp); Serial.print ("-"); Serial.print (Ki); Serial.print ("-"); Serial.println (Kd); } // ----------------------------------------------- void testLineFollowSensors () {int LFS0 =digitalRead (lineFollowSensor0); int LFS1 =digitalRead (lineFollowSensor1); int LFS2 =digitalRead (lineFollowSensor2); int LFS3 =digitalRead (lineFollowSensor3); int LFS4 =digitalRead (lineFollowSensor4); Serial.print ("LFS:L 0 1 2 3 4 R ==>"); Serial.print (LFS0); Serial.print (""); Serial.print (LFS1); Serial.print (""); Serial.print (LFS2); Serial.print (""); Serial.print (LFS3); Serial.print (""); Serial.print (LFS4); Serial.print ("==>"); Serial.print ("P:"); Serial.print (P); Serial.print ("I:"); Serial.print (I); Serial.print ("D:"); Serial.print (D); Serial.print ("PID:"); Serial.println (PIDvalue);} 
sensorFuntions C / C ++
 // --------------------------------------------- ---------------- / * leer valores de sensores de línea Valor de error de matriz de sensores 0 0 0 0 1 4 0 0 0 1 1 3 0 0 0 1 0 2 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0-1 0 1 0 0 0-2 1 1 0 0 0-3 1 0 0 0 0 -4 1 1 1 1 1 0 Robot encontró línea continua - pruebe si hay una intersección o un final of maze0 0 0 0 0 0 Robot no encontró línea:girar 180o * / void readLFSsensors () {LFSensor [0] =digitalRead (lineFollowSensor0); LFSensor [1] =digitalRead (lineFollowSensor1); LFSensor [2] =digitalRead (lineFollowSensor2); LFSensor [3] =digitalRead (lineFollowSensor3); LFSensor [4] =digitalRead (lineFollowSensor4); farRightSensor =analogRead (farRightSensorPin); FarLeftSensor =analogRead (farLeftSensorPin); if ((LFSensor [0] ==1) &&(LFSensor [1] ==1) &&(LFSensor [2] ==1) &&(LFSensor [3] ==1) &&(LFSensor [4] ==1 )) {modo =CONT_LINE; error =0;} else if ((LFSensor [0] ==0) &&(farRightSensor "); Serial.print (farRightSensor); Serial.print ("modo:"); Serial.print (modo); Serial.print ("error:"); Serial.println (error); } // ----------------------------------------------- ------------ void readLateralSensors (void) {} ​​
RobotDefines.h C / C ++
 int mode =0; # define STOPPED 0 # define FOLLOWING_LINE 1 # define NO_LINE 2 # define CONT_LINE 3 # define POS_LINE 4 # define RIGHT_TURN 5 # define LEFT_TURN 6const int power =250; const int iniMotorPower =250; const int adj =0; float adjTurn =8; int extraInch =200; int adjGoAndTurn =800; const int ledPin =13; const int buttonPin =9; // LFSensor más a la izquierda es "0" const int lineFollowSensor0 =12; const int lineFollowSensor1 =18; const int lineFollowSensor2 =17; const int lineFollowSensor3 =16; const int lineFollowSensor4 =19; const int farRightSensorPin =0; // Pin analógico A0const int farLeftSensorPin =1; // Pin analógico A0const int THRESHOLD =150; int farRightSensor =0; int farLeftSensor =0; int LFSensor [5] ={0, 0, 0, 0, 0}; // PID controllerfloat Kp =50; float Ki =0; float Kd =0; float error =0, P =0, I =0, D =0, PIDvalue =0; float previousError =0, previousI =0; #define RIGHT 1 # define LEFT -1Servo leftServo; Servo rightServo; // ------------------------------------------------ - // Definiciones y variables específicas de la Fase 2 del laberinto (optimización) unsigned char dir; // La variable de ruta almacenará la ruta que ha tomado el robot:// 'L' para la izquierda // 'R' para la derecha // 'S' para la recta (en línea recta a través de una intersección) // 'B' para la espalda (Cambio de sentido) char path [100] =""; unsigned char pathLength =0; // la longitud del pathint pathIndex =0; unsigned int status =0; // resolviendo =0; llegar al final =1 
MotorFuntions C / C ++
 void motorStop () {leftServo.writeMicroseconds (1500); rightServo.writeMicroseconds (1500); retraso (200);} // ------------------------------------------ --- void motorForward () {leftServo.writeMicroseconds (1500 - (potencia + adj)); rightServo.writeMicroseconds (1500 + potencia);} // -------------------------------------- ------- void motorBackward () {leftServo.writeMicroseconds (1500 + potencia); rightServo.writeMicroseconds (1500 - potencia);} // -------------------------------------- ------- void motorFwTime (tiempo int sin firmar) {motorForward (); tiempo de retardo); motorStop ();} // ------------------------------------------- --void motorBwTime (tiempo int sin firmar) {motorBackward (); tiempo de retardo); motorStop ();} // ------------------------------------------- ----- void motorTurn (dirección int, grados int) {leftServo.writeMicroseconds (1500 - (iniMotorPower + adj) * dirección); rightServo.writeMicroseconds (1500 - dirección iniMotorPower *); delay (round (adjTurn * grados + 20)); motorStop ();} // ------------------------------------------- -------- void motorPIDcontrol () {int leftMotorSpeed ​​=1500 - (iniMotorPower + adj) - PIDvalue; int rightMotorSpeed ​​=1500 + iniMotorPower - PIDvalue; // La velocidad del motor no debe exceder la restricción del valor máximo de PWM (leftMotorSpeed, 1000, 2000); restringir (rightMotorSpeed, 1000, 2000); leftServo.writeMicroseconds (leftMotorSpeed); rightServo.writeMicroseconds (rightMotorSpeed); //Serial.print (PIDvalue); //Serial.print ("==> Izquierda, Derecha:"); //Serial.print (leftMotorSpeed); //Serial.print (""); //Serial.println (rightMotorSpeed);} // -------------------------------------- ------------- void runExtraInch (void) {motorPIDcontrol (); retraso (pulgada extra); motorStop ();} // ------------------------------------------- -------- void goAndTurn (dirección int, grados int) {motorPIDcontrol (); retraso (adjGoAndTurn); motorTurn (dirección, grados);} 

Esquemas


Proceso de manufactura

  1. Robot evitador de paredes basado en Raspberry Pi - FabLab NerveCentre
  2. Un robot móvil con evitación de obstáculos basada en la visión
  3. Robot "artístico" en NPE
  4. Automatización:Línea de robot rediseñada
  5. Bosch agrega inteligencia artificial a la industria 4.0
  6. Línea de robot SCARA ampliada
  7. ¿La inteligencia artificial es ficción o moda?
  8. La inteligencia artificial ayuda al robot a reconocer objetos al tacto
  9. Robots de inteligencia artificial
  10. Ventajas y desventajas de la inteligencia artificial
  11. Big Data vs Inteligencia Artificial