Entrada destacada

Robots Autónomos: Navegación

Hay tres tipos de robots: teleoperados, automáticos y autónomos. La diferencia se encuentra en sus capacidades para procesar información del ambiente y usarla para dirigir sus movimientos.

Hay tres tipos de robots: teleoperados, automáticos y autónomos. La diferencia se encuentra en sus capacidades para procesar información del ambiente y usarla para dirigir sus movimientos.

Introducción

Un robot es una entidad artificial mecánica o virtual cuyo comportamiento es guiado por un programa computacional o un circuito lógico. Aunque en el pasado, los egipcios, griegos y chinos han construido robots, estos han carecido de un cerebro artificial para controlar el comportamiento del robot. Sólo después de la invención de las computadoras electrónicas en el siglo XX, se han construido robots programables capaces de ayudarnos en tareas industriales, en la medicina y en la agricultura.

Podemos clasificar a los robots entre tres grandes grupos: operados, automáticos y autónomos. Los robots operados requieren ser controlados por un humano, por ejemplo los robots teleoperados utilizados para realizar intervenciones quirúrgicas o exploración militar. Los robots automáticos realizan actividades pre-programadas en ambientes controlados, por ejemplo los robots manipuladores para ensamblar automóviles o los coches seguidores de línea. Los robots autónomos operan en ambientes naturales (no modificados) y son capaces de tomar decisiones propias en función de una meta dada, por ejemplo los robots mensajeros en hospitales o los automóviles de conducción autónoma. La tendencia es desarrollar algoritmos que otorguen cada vez más autonomía a los robots.

Una tarea elemental que deben realizar los robots es navegar a través del ambiente. Si algún día deseamos tener robots que construyan nuestros edificios y carreteras, que limpien nuestras calles, que siembren y cosechen nuestra comida, es necesario que naveguen en ambientes naturales. Los avances en la robótica han aumentado increíblemente durante los últimos 15 años. A continuación, revisaremos los principales avances y aplicaciones de la robótica autónoma y describiremos en que consiste el problema de la navegación autónoma.

Proyectos y empresas

En USA durante 2004 y 2005, varios vehículos compitieron para atravesar el desierto de Mojave en California recorriendo más de 200km en forma autónoma, siguiendo un mapa de coordenadas GPS y transitando por terracería; los vehículos fueron construidos por universidades como Stanford y Carnegie Mellon, y por empresas como Ensco y Velodyne Acoustics; el evento fue organizado por la DARPA (Defense Advanced Research Projects Agency, USA). En 2007, hubo otra competencia, pero en un ambiente urbano, lo cual representó un reto mayor. Los vehículos tuvieron que evitar chocar con otros carros, bicicletas, peatones o semáforos; tener la capacidad de dar vueltas en U cuando fuera necesario; y transitar bajo lluvia o niebla. En las competencias del 2005 y 2007, Stanley [1] y Boss [2] fueron los vehículos ganadores (ver Figura 1). Ambos vehículos constan de sensores laser para ubicar los obstáculos del alrededor, cámaras RGB para ubicar el camino, así como unidades de medición inercial (IMU) con un sistema de posicionamiento global (GPS) para localizar el robot respecto al recorrido que debe seguir.

A partir de estos resultados, la empresa Google fundó la división Google X que se encarga de hacer grandes avances tecnológicos, algunos de sus proyectos han sido Google Glass, unos lentes con cámara y conexión a internet, y Project Wing que es un proyecto para desarrollar drones de entrega de paquetes. El proyecto fundador fue desarrollar varios coches autónomos [3] que han sido probados en ciudades y autopistas de Nevada y California donde ya otorgan licencias de tránsito a vehículos autónomos. La desventaja de estos coches es que requieren el uso de un costoso sensor 3D y dependen de un sistema de ubicación GPS. Por eso, la universidad de Oxford ha desarrollado el vehículo RobotCar UK [4] que usa láseres y cámaras mucho más baratas, y se localiza mediante información visual-espacial del entorno; sin requerir GPS.

AutonomousCars

Figura 1. Algunos coches autónomos capaces de navegar en desiertos, ciudades y autopistas: a) Stanley, b) Boss, c) Google Driverless Car, d) RobotCar UK.

Un robot humanoide es un robot diseñado para asemejar el cuerpo y a los movimientos de un ser humano. Los robots humanoides evolucionarán hacia la autonomía, aunque actualmente estén limitados. El robot Asimo [5] se caracteriza por sus habilidades automáticas como brincar sobre un solo pie, correr, subir escaleras, destapar botellas, verter líquidos de un envase a otro. Sin embargo, la mayoría de esas actividades son preprogramadas por los humanos, no autónomas, es decir, que el robot pueda hallar y ejecutar los movimientos adecuados para cumplir la tarea por sí mismo. Otros humanoides como Atlas [6], Justin [7], los Reem [8], Charli [9] y HRP-4C [10] padecen del mismo mal (ver Figura 2). Pero ya hay avances en el planeamiento de movimiento, en el aprendizaje y en la percepción para otorgarles más autonomía. Algunos ejemplos son los algoritmos probados con los robots PR2 [13] y iCub [14]; pueden decidir cómo mover sus brazos para asir botellas, sin chocar con la mesa o con otros objetos. Motivada por el desastre de la Central Nuclear de Fukushima, la DARPA organizó la competencia Darpa Robotics Challenge [15]. El objetivo fue desarrollar robots semiautónomos para hacer tareas complejas en desastres naturales, por ejemplo abrir una puerta y entrar al edificio, caminar sobre escombros y manejar un automóvil, entre otros. Participaron equipos de Estados Unidos, Japón, Corea del Sur, Alemania e Italia, pero fue el robot Hubo de la mano del equipo KAIST, una universidad surcoreana, quien logró completar las tareas y sumar más puntos. Esta competencia nos deja ver que aun hoy la autonomía robótica no está resuelta, hacen falta mejores algoritmos de planeamiento y percepción, así como procesadores más veloces y mecanismos más robustos ante caídas.

Humaniods

Figura 2. Algunos robots humanoides.

Existen varios robots autónomos en México: Justina [16], Golem [17], Markovitov[18], Donaxi [19] y Mex-One [20] (ver Figura 3). Los primeros cuatro pueden navegar autónomamente dentro de interiores de edificios, son capaces de dirigirse hacia lugares conocidos y evitar obstáculos. Pueden ejecutar actividades como reconocer objetos, personas y voz; limpiar mesas; asir envases; hablar ciertas frases pre-programadas. Estos robots han participado en la competencia Robocup@home, una competencia cuyo objetivo es desarrollar robots para tareas domésticas, donde Golem recibió el premio a la innovación en 2013. Por otro lado está Mex-One, un humanoide que será bípedo, quizá el primero mexicano, pero aún está en desarrollo. Será una plataforma excelente para probar algoritmos que lo conviertan en autónomo. Además, hay robots mexicanos que compiten en RoboCup@Soccer y RoboCup Rescue para realizar tareas autónomas como jugar futbol y mapear un edificio colapsado, respectivamente.

Robotsmexicanos2

Figura 3. Robots autónomos mexicanos.

Varias empresas producen robots autónomos. En USA, tres empresas dirigen la incipiente industria (ver Figura 4). Boston Dynamics ha hecho fama con sus impresionantes mulas robóticas capaces de transitar por terrenos escarpados y de soportar patadas manteniendo el equilibrio. Willow Garage produce el robot PR2 que ha sido usado para probar que los robots pueden doblar ropa o jugar billar. Pero su contribución más importante es continuar con el desarrollo del sistema operativo para robots ROS, cuya licencia es libre y soporta una cantidad considerable de robots comerciales. Rethink Robotics vende a Baxter que es un robot maquilador que no requiere un especialista para programar las tareas, ya que cualquiera puede programarlo mediante una interfaz gráfica muy amigable y moviendo los brazos del robot para indicarle la tarea. Por otra parte, en Alemania, BlueBotics produce y vende robots móviles con sistemas de navegación autónoma para guiar turistas en ciudades y museos. Estos son algunos ejemplos de cómo la industria robótica va avanzando hacia la autonomía.

En México, la industria de robots autónomos es casi nula. Esto es una oportunidad para inversionistas y emprendedores en robótica ya que el mercado es virgen, esperando que alguien lo explote. Dentro de las pocas empresas existentes destaca la compañía 3D robotics, misma que fue co-fundada por un mexicano y un estadounidense en el 2009, dicha empresa produce y distribuye vehículos aéreos no tripulados con un sistema de navegación autónoma por GPS. El resto de la industria robótica mexicana se limita a la venta de robots y sus accesorios, a ofrecer cursos de robótica o a prestar servicios de instalación y mantenimiento de robots automáticos para manufactura.

Empresas

Figura 4. Empresas de robótica autónoma.

Aplicaciones

La navegación autónoma cataliza la productividad y la calidad de diversas actividades humanas. A continuación se mencionan las aplicaciones ya existentes con el objetivo de mostrar la amplia gama de posibles aplicaciones de esta área de la robótica. Los empresarios o emprendedores pueden quizá encontrar una idea en esta lista que genere riqueza.

Figura 5. Aplicaciones de la robótica autónoma.

Figura 5. Aplicaciones de la robótica autónoma.

Mensajería y Paquetería. Imagine una motocicleta robótica o cuadricóptero que le entregue la pizza en la puerta de su casa. En el futuro cercano las empresas comenzarán a enviar paquetes pequeños con comida rápida, facturas, documentos, refracciones, libros o discos usando robots autónomos. Una ventaja es que los robots voladores pueden aprovechar el cielo a diferencia de los mensajeros humanos. Si usted no me cree, lo invitó a ver las referencias: el proyecto Matternet [22] propone formar una red de cuadricópteros para distribuir alimentos y medicinas; así mismo, existen robots mensajeros que transportan materiales y documentos entre los distintos departamentos en hospitales [23] (ver Figura 5).

Limpiadores. La limpieza y el orden son un símbolo en toda civilización avanzada. Pero limpiar y mantener el orden en cualquier lugar siempre ha sido una actividad pesada y monótona. Los robots pueden realizar estas tareas por nosotros en el hogar y en los lugares públicos. Dele un vistazo a los avances actuales, iRoomba limpia los pisos de los hogares [24], Lely Discovery limpia el guarda ganado [25] y Ambrogio poda el césped [26]. Esto solo es el comienzo.

Agricultura. El tractor y toda la maquinaría añadida en siglo XX ha permitido que la agricultura moderna incremente su productividad y que libere a los humanos para hacer otras actividades que desarrollen la civilización. La empresa John Deere estima que el 90 % de la población estadounidense en 1848 estaba involucrada en la agricultura, en la actualidad es menos de 0.9 %; debido en parte a la maquinaria para cosechar y sembrar. ¿Por qué no autonomizarla? Los algoritmos desarrollados para navegación autónoma pueden permitir que la maquinaría produzca con mínima intervención humana para reparaciones y supervisión. Vea estas referencias: en Australia [28][29] y en Dinamarca [27] están dotando de autonomía a la maquinaría agrícola. En algunos años, veremos empresas explotando estas oportunidades, espero que sean mexicanas.

Vigilancia. Los algoritmos para percibir y modelar el ambiente serán usados para monitorear el comportamiento humano. Imagine cuadricópteros vigilantes en busca de actos delictivos en las calles de las ciudades y reportando los delitos a los policías más cercanos. Imagine robots protectores del hogar como perros guardianes que detectan la entrada de una persona desconocida o la ruptura de una ventana. La empresa japonesa Secom ha desarrollado cuadricópteros para vigilancia que ha presentado en la International Drone Expo 2015 en Los Angeles [30].

Figura 6. Aplicaciones de la robótica autónoma bis.

Figura 6. Aplicaciones de la robótica autónoma bis.

Búsqueda y Rescate. En México, una de las tareas básicas del plan DN-III-E es la búsqueda y rescate de personas ante desastres. El Ejercito Mexicano podría usar robots móviles para encontrar personas atrapadas en lugares peligrosos. La información que recolecte el robot puede servir para crear un mejor plan de rescate. En la actualidad, la mayoría de los robots son teleoperados [31]; pero otorgarles la capacidad de navegar y buscar autónomamente permitiría que varios robots cubrieran la misma área más rápido, aumentando la probabilidad de rescatar a las personas. La búsqueda y rescate tiene varios retos: movilidad en terrenos con escombros, energía suficiente para misiones largas, capacidad para identificar a las víctimas del desastre, etc. La competencia Robocup Rescue tiene como objetivo superar estas limitaciones.(Ver Figura 6).

Construcción. Así como la industria de manufactura, la de construcción puede beneficiarse de la robótica. Los robots liberarían del trabajo pesado a los humanos, permitiendo elevar su calidad de vida. Una ciudad podría construir más rápido y más barato las viviendas de sus habitantes. Aunque la construcción robótica es incipiente, ya hay algunos avances: robots de exploración espacial que apilan barras metálicas para formar paredes [32], cuadricópteros que ensamblan estructuras cúbicas [33] y robots móviles con brazos mecánicos que ensamblan muebles [34].

Transporte. La mayor parte de las mercancías que usted usa, fueron traídas de lugares lejanos, esto es posible por los aviones, carros, y barcos que amplifican la fuerza de los humanos. El futuro será que esos vehículos naveguen con mínima asistencia humana, lo que incrementará la productividad, la eficiencia y la seguridad (reducción de accidentes). Las ciudades tendrán transporte público autónomo: en el Intelligent Vehicles Symposium 2012 hicieron una demostración de un mini-bus autónomo [35]. También el transporte a corta distancia puede beneficiarse: la empresa Kiva comercializa un sistema de robots que manejan las entradas y salidas de un almacén [36]

Guía de Personas. Desde 1997 ya hay robots que interactúan con los visitantes en los museos [37][38]; explican las exposiciones y guían a las personas. Esta tecnología también puede ser usada para guiar personas invidentes, o bien, para publicidad en centros comerciales, estadios de futbol y conciertos. Imagine un robot vendedor que sea atractivo para el público y enganche a la gente para ofrecerles un producto. Imagine robots voladores que se alinean para formar figuras en el aire, mientras anuncian un servicio.

Problemática

Cada aplicación tiene sus retos específicos, pero comparten la navegación autónoma como problema en común. Aunque para un ser humano es fácil navegar, para un robot es una tarea difícil porque debe navegar sin dañarse, alcanzando la meta dada y en un ambiente natural. La Figura 7 muestra un sistema de navegación autónoma.

Figura 7. Esquema de un sistema de navegación autónoma.

Figura 7. Esquema de un sistema de navegación autónoma.

El cuerpo del robot tiene:

  • Sensores que envían a la computadora del robot trozos de información acerca del ambiente y del robot mismo, por ejemplo la distancia a los objetos más cercanos o la velocidad del robot.
  • Actuadores que ejecutan los movimientos que la computadora ordena tales como los motores eléctricos.

El comportamiento autónomo del robot es posible gracias a un conjunto de algoritmos ejecutados por la computadora:

  • Percepción: interpreta los números enviados por los sensores para reconocer objetos, lugares y eventos que ocurran en el ambiente o en el robot. Al reconocerlos, el robot puede prevenir daños, saber dónde está o saber cómo es el ambiente.
  • Mapeo: crea un modelo numérico del ambiente alrededor del robot. Esto le permite tomar decisiones convenientes para evitar daños y alcanzar sus metas.
  • Localización: estima la posición y la postura del robot respecto al mapa. Esta información permite al robot planear y ejecutar los movimientos, y construir un mapa correcto del ambiente.
  • Planeamiento: decide los movimientos necesarios para alcanzar la meta sin chocar, con mínimo tiempo o mínima distancia.
  • Control: garantiza que los movimientos planeados sean ejecutados, a pesar de perturbaciones inesperadas en el movimiento del robot.
  • Evasión de obstáculos: evita chocar contra objetos móviles como personas, animales, puertas, muebles u otros robots que están omitidos en el mapa.

Para cada una de estas tareas existen ya algoritmos que funcionan bajo ciertas circunstancias, consulte [39]. En el Depto. de Control Automático del CINVESTAV y en la Universidad de Bristol he implementado algunos de estos algoritmos en un robot diferencial iRobot [40] (ver las Figuras 8 y 9).

Figura 8. Un ejemplo de navegación [40]. El robot debe encontrar la salida de emergencia guiándose de las señales que ya existen en los pasillos. Al inicio, el robot no conoce el ambiente, así que debe construir un mapa conforme explora el lugar. En la figura mostramos algunas imágenes de un recorrido y el mapa que construyó.

Figura 8. Un ejemplo de navegación [40]. El robot debe encontrar la salida de emergencia guiándose de las señales que ya existen en los pasillos. Al inicio, el robot no conoce el ambiente, así que debe construir un mapa conforme explora el lugar. En la figura mostramos algunas imágenes de un recorrido y el mapa que construyó.

Figura 9. Mostramos las señales de emergencia que el robot usa para hallar la salida y algunas detecciones durante su exploración [40].

Figura 9. Mostramos las señales de emergencia que el robot usa para hallar la salida y algunas detecciones durante su exploración [40].

La robótica autónoma presenta varios retos. El principal obstáculo es el ruido en los datos de los sensores que provocan errores en las decisiones y los errores en los actuadores. El segundo reto es interpretar los datos de los sensores: los robots deben ser capaces de identificar situaciones peligrosas, objetos, personas y lugares a partir de una gran cantidad de números provenientes de los sensores. El tercer reto es que los algoritmos deben lidiar con un ambiente dinámico, deben ser capaces de aprender de sus experiencias y tomar decisiones flexibles para adaptarse a los cambios del ambiente, por ejemplo los cambios de lugar de los muebles, el abrir y cerrar de las puertas, el movimiento de las personas, etc. Pero además, en particular para la navegación, la localización del robot es un problema realmente difícil. Las soluciones existentes son específicas para un tipo de robot y de ambiente. Los sistemas de GPS, que anteriormente parecían ser la solución a este problema, presentan una gran cantidad de fallas e interrumpen constantemente la señal. Los localizadores basados en estimadores de estado (filtros u optimizadores) son susceptibles a confundirse entre las ubicaciones, el ruido y las oclusiones. Los localizadores basados en reconocimiento del lugar son más robustos, pero carecen de información métrica de la ubicación. Finalmente, existen limitaciones tecnológicas. Los recursos computacionales son finitos, tienen un costo en dinero y en peso que puede cargar el robot. Las baterías aún tienen una baja densidad energía/volumen. Si requerimos tiempos largos de operación autónoma será necesario contar con baterías grandes incrementando el precio del robot y su tamaño.

Los científicos le han puesto especial atención a la generación automática de mapas para que un robot navegue o se localice usando un mapa. Esta tarea, denominada SLAM (Simultaneous Localization and Mapping), requiere simultáneamente que el robot conozca su posición y la posición de algunas características del ambiente (árboles, esquinas, paredes). El Depto. de Control Automático del CINVESTAV ha desarrollado una nueva técnica SLAM [41]. La mayoría de los métodos SLAM suponen que la incertidumbre en el modelo y las mediciones son Gaussianas. La técnica propuesta abandona la Gaussianidad debido a que dicha suposición, aunque resulta útil, no concuerda con la realidad, en su lugar considera que la incertidumbre es acotada por elipsoides. Con ello demuestra que es posible resolver el problema SLAM sin requerir Gaussianidad en ambientes de alta escala y en tiempo real. La Figura 10 muestra un mapa resultante de la técnica SLAM elipsoidal.

Figura 10. Mapa generado por el robot Koala usando el SLAM elipsoidal [40] durante un trayecto cerrado en el patio del Depto. de Control Automático, CINVESTAV Zacatenco, D. F. (cada arbol está numerado para verificar cualitativamente la correspondencia entre el mapa y las ubicaciones reales de los arboles).

Figura 10. Mapa generado por el robot Koala usando el SLAM elipsoidal [40] durante un trayecto cerrado en el patio del Depto. de Control Automático, CINVESTAV Zacatenco, D. F. (cada arbol está numerado para verificar cualitativamente la correspondencia entre el mapa y las ubicaciones reales de los arboles).

Mensaje final

Damas y caballeros, el futuro es brillante. La robótica es para el siglo XXI, lo que fue la electricidad para el siglo IX; catalizará el desarrollo de nuestra civilización. Hoy existe la tecnología y los métodos eficaces para implementar robots autónomos. Es estratégico usar estos recursos para generar riqueza en beneficio de la sociedad mexicana.

Jóvenes mexicanos, estudien robótica o áreas relacionadas. Empresarios e inversionistas mexicanos, inviertan dinero tanto en proyectos de investigación como en empresas que desarrollen robótica. Científicos y académicos, sigan desarrollando proyectos de investigación de frontera y produciendo recursos humanos de alta calidad. Gobernantes mexicanos, aumenten la inversión en investigación al 2% del PIB. CONACYT, fomente el desarrollo de tecnología (hechos) sobre las ideas archivadas en libros y revistas. Si sumamos fuerzas, la robótica transformará el país para mejorar nuestra calidad de vida.✵


Referencias

1. Thrun S., et al. (2006) “Stanley: The robot that won the DARPA Grand Challenge”. Journal of Robotic Systems – Special Issue on the DARPA Grand Challenge, Vol. 23, No. 9, pp. 661-692.
2. Urmson C., et al. (2008) “Autonomous driving in urban environments: Boss and the Urban Challenge”. Journal of Field Robotics Special Issue on the 2007 DARPA Urban Challenge, Part I. Vol. 25, No.8, pp. 425-466.
3. Google (2015) “Google Self-Driving Car Project”. http://www.google.com/selfdrivingcar/. Recuperado el 29/07/2015.
4. RobotCar UK project (2015) “Robocar of Oxford University”. http://mrg.robots.ox.ac.uk/application/robotcar/. Recuperado el 29/07/2015.
5. Honda (2015) “Asimo, The world’s most advanced humaniod robot”. http://asimo.honda.com/. Recuperado el 29/07/2015.
6. BostonDynamics (2015) “Atlas – The Agile Anthropomorphic Robot”. http://www.bostondynamics.com/robot_Atlas.html. Recuperado el 29/07/2015.
7. Robotics and Mechatronics Center (2015) “Rollin’ Justin”. http://www.dlr.de/rm/en/desktopdefault.aspx/tabid-5471/. Recuperado el 29/07/2015.
8. Pal Robotics (2015) “REEM : Robot humanoide de servicio y tamaño real”. http://pal-robotics.com/es/products/reem/. Recuperado el 29/07/2015.
9. RoMeLa (2015) “CHARLI: Cognitive Humanoid Autonomous Robot with Learning Intelligence”. http://www.romela.org/main/CHARLI:_Cognitive_Humanoid_Autonomous_Robot_with_Learning_Intelligence. Recuperado el 29/07/2015.
10. National Institute of Advanced Industrial Science and Technology (2015) “HRP-4C”. http://www.aist.go.jp/aist_e/latest_research/2009/20090513/20090513.html. Recuperado el 29/07/2015.
11. Willow Garage (2015) “PR2”. http://www.willowgarage.com/pages/pr2/overview. Recuperado el 29/07/2015.
12. Instituto Italiano di Tecnologia (2015) “An open source cognitive humanoid robotic platform”. http://www.icub.org/. Recuperado el 29/07/2015.
13. Perez A., Karaman S., Shkolnik A., Frazzoli E., Teller S., Walter M.R.(2011) “Asymptotically-optimal path planning for manipulation using incremental sampling-based algorithms”. IEEE/RSJ International Conference Intelligent Robots and Systems, pp.4307-4313.
14. Stollenga M., Pape L., Frank M., Leitner J., Forster A, Schmidhuber J. (2013) “Task-relevant roadmaps: A framework for humanoid motion planning”. IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), pp.5772-5778.
15. DARPA (2012) “Darpa Robotics Challenge”. http://www.theroboticschallenge.org/. Recuperado el 29/07/2015.
16. Savage J., Negrete M., Matamoros M., Cruz J., Contreras L., Pacheco A., Figueroa I., Márquez J., (2013) “Pumas@Home 2013 Team Description Paper”. RoboCup.
17. Pineda L. A., Meza I. V., Fuentes G., Rascón C., Peña M., Ortega H., Reyes-Castillo M., Salinas L., Ortega J. D., Rodríguez-García A., Estrada V. (2013) “The Golem Team, RoboCup@Home 2013”. RoboCup.
18. Sucar L. E., Morales E., Heyer P., Vasquez I., Palacios-Alonso M. A., Escalante H. J., Oropeza J. M., Avila S., Rocha A., Herrera J., Ocana A., Reyes A., Vázquez H., Zorilla P., Hayet J., Rivera M., Esquivel J., Rodriguez D., Estevez C. (2012) “Markovito’s Team Description RoboCup@Home”. RoboCup.
19. Vargas H., Olmedo E., Martínez D., Poisot V., Perroni A., Rodriguez A., Granillo O., Merino C., Antonio W., Carbonel C., Portillo A. (2013), “Donaxi@HOME Project”. RoboCup.
20. Excelsior (2011) “Mexicanos crean ‘Mex-One’, un robot con vocación social”. http://www.excelsior.com.mx/2011/07/08/dinero/751383. Recuperado el 29/07/2015.
21. International Federation of Robotics (2013) “International Federation of Robotics”. http://www.ifr.org/. Recuperado el 29/07/2015.
22. Matternet Matternet Inc. (2015) “Matternet”. http://mttr.net/. Recuperado el 29/07/2015.
23. Swisslog Inc. (2015) “Material Handling Automation”. http://www.swisslog.com/en/Solutions/HCS/Material-HandlingAutomation. Recuperado el 29/07/2015.
24. iRobot Corp. (2015) “. A spiradora robótica”. http://www.irobot.com.mx/. Recuperado el 29/07/2015.
25. Lely Group (2015) “Mobile barn cleaner”. http://www.lely.com/en/housing/mobile-barn-cleaner/discovery. Recuperado el 29/07/2015. 39. Siegwart R., Nourbakhsh I. R., Scaramuzza D. (2011) “Introduction to Autonomous Mobile robots”. 2nd Edition, MIT Press.
26. Zucchetti Centro Sistemi S.P.A. (2015) “Ambrogio Robot”. http://www.ambrogiorobot.com/it/es. Recuperado 29/07/2015.
27. FroboMind Project (2015) “FroboMind is a robot control system software platform designed for field robotics research”. http://www.frobomind.org/index.php/Main_Page. Recuperado el 29/07/2015.
28. Eaton RP., Katupitiya J., Siew KW, Howarth B. (2010) “Autonomous farming: modelling and control of agricultural machinery in a unified framework”. International Journal of Intelligent Systems Technologies and Applications, Vol. 8, No.1-4, pp. 444 – 457.
29. University of New South Wales (2015) “Associate Professor Jayantha Katupitiya”. https://research.unsw.edu.au/people/associate-professor-jay-katupitiya. Recuperado el 29/07/2015.
30. Security Sales & Integration (2015) “Secom’s New Security Drone Trails, Records Intruders”. http://www.securitysales.com/article/secoms_new_security_drone_trails_records_intruders/blogs. Recuperado el 29/07/2015.
31. Siciliano B., Khatib O., (Eds.) (2008) “Handbook of Robotics”. Springer.
32. Stroupe A., Huntsberger T., Okon A., Aghazarian H., Robinson M. (2005) “Behavior-based multi-robot collaboration for autonomous construction tasks”. IEEE/RSJ International Conference on Intelligent Robots and Systems, pp. 1495-1500.
33. Durrant-Whyte H., Roy N., Abbeel P. (2012) “Construction of Cubic Structures with Quadrotor Teams- Book: Robotics:Science and Systems VII”. MIT Press, pp. 177-184.
34. Knepper R. A., Layton T., Romanishin J., Rus D. (2013) “IkeaBot: An Autonomous Multi-Robot Coordinated Furniture Assembly System”. IEEE International Conference on Robotics and Automation.
35. IEEE 2012 Intelligent Vehicles Symposium (2012) “Demo of an autonomous electric mini-bus”. https://www.youtube.com/watch?v=OVfAGCwusK8&safe=active. Recuperado el 29/07/2015.
36. KIVA Systems (2015) “Solutions”. http://www.kivasystems.com/solutions/. Recuperado el 29/07/2015.
37. Burgard. W, Cremers A.B., Fox D., Hanel D., Lakemeyer G., Schulz D., Steiner W., Thrun S. (1998) “The interactive museum tour-guide robot”. MI-98.
38. Thrun S., Bennewitz M., Burgard W., Cremers A.B., Dellaert F., Fox D., Hahnel D., Rosenberg C., Roy N., Schulte J., Schulz D. (1999) “MINERVA: a second-generation museum tour-guide robot”. IEEE International Conference on Robotics & Automation, Vol. 3, pp.1999-2005.
39. Siegwart R., Nourbakhsh I. R., Scaramuzza D. (2011) “Introduction to Autonomous Mobile robots”. 2nd Edition, MIT Press.
40. Zamora E. (2015) “Map-building and planning for autonomous navigation in unstructured environments”. Tesis de doctorado, CINVESTAV Zacatenco, Mexico.
41. Yu W., Zamora E., Soria A. (2015) “Ellipsoid SLAM: A Novel Set Membership Method for Simultaneous Localization and Mapping”. Autonomous Robots, Springer.

Tutorial 3: Redireccionamiento y tuberías

Autor: Irving Hernández Uribe;  Editor: Dr. Erik Zamora Gómez

Hasta ahora se ha trabajado con los comandos fundamentales que permiten la manipulación de directorios y archivos. En el tutorial anterior, se explicó cómo crear y concatenar el contenido de archivos, también se mostró cómo cambiar la ruta de alguno de ellos, eliminarlos del sistema o renombrarlos, finalmente se trabajó con el contenido de los archivos usando los comandos que permitieran navegar en él. En esta ocasión, se introducirán dos nuevos e importantes conceptos, los cuales hacen referencia a las entradas y salidas estándar, así como el uso de “pipes” o tuberías, las cuales nos permitirán trabajar con el flujo de información que es intercambiada entre los usuarios y el sistema.

Tema 3.1.- ¿Qué son las Entradas y Salidas estándar?

Al trabajar con el flujo de información en UNIX se cuenta con tres canales básicos que permiten el intercambio de datos entre los usuarios y el propio sistema; a los canales que tienen como objetivo recopilar la información para ser utilizada por algún programa se les denomina de Entrada, a los encargados de mostrar esa información al usuario con ayuda de algún dispositivo, por ejemplo la pantalla, se les denomina de Salida, y aquellos que se encargan de indicar cuando algo dentro del proceso resultó imposible de realizar o no se llevó a cabo correctamente se les denomina de Error.

Existen diversos elementos (tanto físicos como digitales) que pueden estar asociados a los canales de entradas y de salidas, sin embargo, los tres canales básicos cuentan con uno estándar. La palabra “estándar” hace referencia a un concepto de “establecido por defecto”, es decir, todo aquello que siempre es de la misma forma a menos de que se especifique algo diferente, teniendo que los elementos estándar de entradas y salidas son:

t5

En el tutorial anterior se utilizó el comando “wc” para contar las líneas, palabras y letras que se introducían por la entrada estándar para mostrarlas en la salida estándar, en otras palabras el teclado y la pantalla.

Tema 3.2.- ¿Qué es el redireccionamiento?

A pesar de que los canales de entrada y de salida en los sistemas de UNIX cuentan con elementos estándar, es posible utilizar una gran variedad de ellos para la adquisición y representación de la información, sin limitarse únicamente al teclado y la pantalla del ordenador.

El concepto de redireccionamiento consiste en indicarle al sistema que utilice elementos diferentes a los estándar ya sea para las entradas o las salidas de datos, lo cual se logra por medio de algunos comandos como los que se explican en los siguientes apartados.

d1

Tema 3.3.- ¿Cómo redireccionar salidas?

Uso del símbolo “>”:

El símbolo “>” permite el redireccionamiento sencillo hacia una salida especifica (según el comando que se utilice) , por ejemplo, en el tutorial anterior se utilizó el comando “cat” para la creación de archivos de texto, sin embargo, la acción que realmente se llevó a cabo fue la de redireccionar la salida de dicho comando, teniendo como resultado, la creación de un archivo de texto (guardado con un  nombre y ruta definidos por el usuario) en lugar de simplemente mostrar el texto en pantalla. Para realizar esto se utiliza la siguiente estructura general.

: [Comando de entrada] > [Nombre de ruta / Nombre de archivo]

De esta forma funciona el redireccionamiento que se puede aplicar a los comandos que se verán posteriormente, y para ejemplificarlo con el comando “cat” se hará una lista con los planetas existentes en nuestro sistema solar, dándole el nombre de “Planetas” a este archivo y ubicándolo en el directorio de “unix_ejemplos”, con el siguiente código:

%: cat > ~/unix_ejemplos/Planetas

A continuación se podrá escribir normalmente como si se tratara de un editor de texto (separando cada elemento de la lista al usar la tecla [Enter]), y una vez terminada la lista se debe presionar la combinación de teclas [Control] + [d], con lo cual el archivo se guardará de forma automática y se podrá ingresar una nueva instrucción.

3_1

Uso del símbolo “>>” (Anexar):

En el tutorial anterior también se describió el uso del comando “cat” en combinación con el símbolo doble “>>” el cual permite modificar un archivo ya existente. En este caso, su verdadera función es la de redireccionar la entrada de un comando o función a una salida especificada por el usuario, siendo ésta una creada anteriormente, y a la que se AÑADIRÁ contenido adicional, basándose en la siguiente estructura.

: [Comando de entrada] >> [Nombre de ruta y archivo ya existentes]

Para ejemplificar lo anterior se añadirán a la lista “Planetas” los 4 planetas pertenecientes a nuestro sistema solar que se han descubierto por la comunidad científica en los últimos años, los cuales son Ceres, Haumea, Makemake y Eris, y para ello se utilizará la siguiente codificación empleando el comando “cat” y el redireccionamiento para anexar contenido:

 %: cat >> ~/unix_ejemplos/Planetas

Después de escribir los nombres de los nuevos planetas en forma de lista se podrá abrir el mismo archivo para comprobar que contiene los planetas anteriores más los que han sido anexados.

3_3

Direccionamiento de múltiples entradas a una sola salida:

Existe otra manera de unir dos listas para generar una sola, este método corresponde al redireccionamiento de múltiples salidas a una sola entrada, el cual no se limita únicamente a la creación de listas pero se puede ejemplificar muy bien por medio de ellas.

En primer lugar, se generarán tres listas diferentes usando el comando “cat” y el símbolo “>” para redireccionar el texto a tres archivos denominados “Aves”, “Peces” y “Mamíferos” donde se colocarán animales pertenecientes a estas categorías usando la codificación mostrada en los apartados anteriores:

3_4

Una vez que se tengan las tres listas, éstas se unirán en una sola denominada “Animales” al redireccionar cada archivo (como entrada) hacia uno nuevo (como salida), y para ello se utilizará la siguiente estructura la cual utiliza el comando “cat”, todas las entradas que se deseen concatenar, el símbolo de redireccionamiento “>” y el nombre de la salida:

: cat [NombreArchivo1] [NombreArchivo2] [NombreArchivo3] … > [NombreArchivoSalida]

En este caso, el código específico que se deberá de escribir es el siguiente:

 %: cat Aves Peces Mamiferos > Animales 

  • NOTA: El código anterior puede ser utilizado únicamente si el usuario se encuentra ubicado en el mismo directorio en el que se encuentran los archivos de “Aves”, “Peces” y “Mamíferos” mismo en el que se creará el nuevo archivo “Animales”, sin embargo, es posible utilizar la ruta de todos los archivos para obtenerlos de su ubicación inicial y posicionar el nuevo en otra dirección, por ejemplo:

%: cat ~/unix_ejemplos/Aves ~/unix_ejemplos/Peces ~/unix_ejemplos/Mamiferos > ~/Animales 

3_5

Tema 3.4.- ¿Cómo redireccionar entradas?

Uso del símbolo “<”:

El proceso de redireccionamiento de entradas es muy similar al relativo a las salidas y consiste, de manera análoga, en la elección del usuario de la entrada que desea utilizar para el funcionamiento de algún comando, ligándolo por medio del símbolo “<“.

Para ejemplificarlo se utilizará el comando “sort” (Ordenar) el cual permite generar un nuevo archivo ordenado de manera alfabética o numérica tomando como base un archivo ya existente con una lista por ejemplo.

En este caso, se ordenará de manera alfabética la lista completa de animales que se creó en el apartado anterior al redireccionar la entrada del comando “sort”, lo cual es tan simple como escribir el siguiente código:

 %: sort < ~/unix_ejemplos/Animales

Lo anterior mostrará en pantalla la lista ordenada como se presenta a continuación:

3_6

Tema 3.5.- Uso conjunto de redireccionamientos (Entradas y salidas):

El uso conjunto de redireccionamientos se utiliza comúnmente en combinación con algunos comandos de Unix, y permite ahorrar tiempo y recursos de codificación al redireccionar tanto la entrada como la salida que trabajarán con el comando en la misma línea en lugar de utilizar dos o más pasos para obtener el mismo resultado.

Lo anterior se logra mediante la siguiente expresión general que utiliza al mismo tiempo los símbolos “<“ y “>”:

: [Comando] < [Elemento(s) de entrada] > [Elemento(s) de salida]

En este caso, se creará como ejemplo un nuevo archivo que contenga la lista de animales ordenada alfabéticamente y se colocará en el directorio principal a partir de la generada en el apartado anterior, para ello se debe escribir:

 %: sort < ~/unix_ejemplos/Animales > Ordenado

3_7

Tema 3.6.- Uso de Tuberías

El redireccionamiento conjunto de entradas y salidas permite realizar dos acciones en una sola línea de código, haciendo que no sea necesario ejecutar un comando dos veces y tomar la salida del primero para colocarlo como entrada del segundo antes de obtener la salida final; dicho método es bastante útil, sin embargo, NO es posible utilizarlo con más de un comando al mismo tiempo, y para dar solución a este inconveniente existen las tuberías.

Al igual que en los populares juegos de Super Mario Bros®, donde el personaje principal utiliza las tuberías para transportarse de un mundo a otro, recolectando estrellas, monedas e items, para finalmente llegar a la salida del nivel por medio de la tubería final, en Unix las tuberías funcionan de manera muy similar, en este caso, nos permiten ingresar un elemento de entrada el cual podrá ser conectado con varios comandos o procesos de manera secuencial antes de obtenerse la salida final.

Gracias a las tuberías varias aplicaciones del sistema pueden interactuar entre sí, convirtiendo a estos elementos en una forma práctica de redireccionar la salida estándar de un programa hacia la entrada estándar de otro, y para ello, se utiliza el símbolo “|” (pipe o tubería) siguiendo la estructura que se muestra a continuación:

: [Comando1] [Elementos y/o Opciones] | [Comando2] [Elementos y/o Opciones] | [Comando3] [Elementos y/o Opciones] | [Comando4] [Elementos y/o Opciones] | …

d2

Como ejemplo del uso de las tuberías se combinarán los comandos “cat” y “sort”, para ello se creó una nueva lista denominada “Plantas”, y se intentará generar una nueva que ordene alfabéticamente los elementos contenidos tanto en “Animales” como en “Plantas”, (En un solo paso). Se escribe entonces el siguiente código:

%: cat ~/unix_ejemplos/Animales ~/unix_ejemplos/Plantas | sort

3_8

Al ejemplo anterior se le puede aumentar un poco la complejidad, y con el objetivo de demostrar como las tuberías pueden ser combinadas también con los redireccionamientos tanto de entradas como de salidas (al inicio y al final de la instrucción respectivamente) se creará un archivo llamado “Tuberías_ejemplo” que contenga los elementos de las listas de “Animales” y de “Plantas”, considerando solamente aquellos que incluyan la letra “L” y ordenándolos alfabéticamente, para lo cual se usarán conjuntamente los comandos “cat”, “grep” y “sort” conectados por tuberías, así como el símbolo “>”:

%: cat ~/unix_ejemplos/Animales ~/unix_ejemplos/Plantas | grep l | sort > Tuberias_ejemplo

  • NOTA: El comando “cat” utiliza dos archivos ya existentes como entradas, por otro lado el comando “grep” utiliza la opción “l” y el comando “sort” redirecciona su salida hacia un nuevo archivo denominado “Tuberías_ejemplo” (Cada proceso trabaja de manera individual pero la salida del anterior se utiliza como la entrada del siguiente).

3_9

Utilizando la información contenida en este y los tutoriales anteriores el usuario ya puede comenzar a desarrollar aplicaciones básicas pero bastante útiles que manejen directorios, archivos, entradas y salidas estándar, redireccionamientos, entre algunas cosas más, y para complementar la información que se tiene hasta el momento, en el siguiente tutorial se desarrollarán tres temas referentes al manejo de elementos del sistema y las opciones de ayuda al usuario, en este caso, se explicará la normativa de nombres y extensiones para archivos y directorios, el uso de comodines y la ayuda del sistema tanto on-line como off-line.

⇐ Tutorial Anterior                                                                          Tutorial Siguiente ⇒

Tutorial 2: Manejo de Archivos

Autor: Irving Hernández Uribe;  Editor: Dr. Erik Zamora Gómez

En el tutorial anterior se trabajó con rutas y directorios, en él se explicó el funcionamiento de algunos comandos que permiten visualizar los nombres de archivos y directorios, crear subdirectorios y navegar entre el contenido del sistema. Además, se detalló el uso de “opciones” que presentan los comandos y la combinación de estos con el concepto de ruta para obtener mayor eficiencia y facilidad en la codificación.

En esta ocasión, se trabajará con archivos y aprenderás el funcionamiento de los comandos que te permitirán crear, copiar y cambiar la ubicación de archivos, también la manera de remover del sistema tanto éstos como los directorios. Finalmente, aprenderás a navegar en el contenido de los archivos, realizando acciones tales cómo mostrar éste en pantalla o buscar fragmentos específicos del mismo.

Tema 2.1.- ¿Cómo crear archivos?

Los archivos en cualquier sistema operativo son un conjunto de datos agrupados, los cuales con ayuda de un programa específico o el mismo sistema, pueden ser interpretados y mostrados a los usuarios de manera comprensible por medio de imágenes, audio, gráficos, entre muchos otros. También existen otro tipo de archivos que ayudan a que un sistema operativo funcione de manera apropiada, utilizando estos para guardar información. En este tutorial, se explicarán las funciones que el usuario tiene a su disposición para trabajar con archivos dentro de los sistemas basados en UNIX:

 “cat>”(concatenate):

El primer comando que se explicará corresponde a “cat”, el cual permite generar directamente desde la terminal del sistema archivos de TEXTO realizados por el usuario. Es necesario posicionarse (primero) en el directorio donde se desea generar el archivo (esto se puede hace mediante el comando “cd”) o escribir la ruta completa de este.

Para realizar esta función se utilizará el siguiente código (Se debe usar el símbolo “>”):

 : cat>[Ruta/NombreArchivo]

Por ejemplo, para escribir un archivo de prueba en el directorio “unix_ejemplos” llamado “PruebaCat”, escribiremos lo siguiente (ya ubicados en el directorio “unix_ejemplos”).

%: cat>PruebaCat

El cursor pasará a la siguiente línea de la terminal y podremos escribir normalmente como si se tratara del Bloc de notas. El sistema saldrá de esta función una vez que nosotros presionemos [Control] + [d], con lo cual el archivo se guardará de forma automática y se podrá ingresar una nueva instrucción.

2.-1

“cat>>”:

Además de crear archivos el comando “cat” nos permite modificarlos (agregar más contenido) al utilizar el doble símbolo “>>”. En este caso se llamará por medio del sistema a un archivo ya existe para ser modificado usando:

 : cat>>[Ruta/NombreArchivo]

Para añadir texto al archivo “PruebaCat” ubicado en “unix_ejemplos” se escribiría lo siguiente:

%: cat>>~/unix_ejemplos/PruebaCat

Se debe mostrar una ventana igual a la anterior, y después de escribir el texto podremos salir usando los botones [Control] + [d]. La próxima vez que abramos el archivo este contendrá lo que se escribió al inicio seguido del texto que recién se ha agregado.

2.-2

2.-3

Tema 2.2.- ¿Cómo copiar archivos?

 “cp”(copy):

El comando “cp” permite generar la copia de algún archivo especificado, y posicionar dicha copia en algún otro directorio.

Para realizar dicha acción se requiere la ruta completa del archivo que se desea copiar así como la ruta del directorio en el cual se pretende colocar dicha copia. De manera general se expresaría de la siguiente forma:

  : cp_[Ruta1 / Archivo]_[Ruta2]

Para ejemplificarlo, se copiará un archivo de texto (actualmente ubicado en las descargas del usuario) al directorio de “unix_ejemplos”. Tendremos que escribir lo siguiente en la terminal:

%: cp  /home/irving/Descargas/EjemploArchivo.txt  /home/irving/unix_ejemplos

Recordando que el caracter “~” se puede utilizar para referirse al directorio principal con objeto de hacer más eficiente la escritura. La misma instrucción se puede escribir de la siguiente forma:

%: cp  ~/Descargas/EjemploArchivo.txt  ~/unix_ejemplos

De la misma forma, si lo que se desea es copiar el archivo de una ruta específica al directorio actual, se puede utilizar el signo de punto “.” (que hace referencia al directorio actual) y escribir lo siguiente:

%: cp  ~/Descargas/EjemploArchivo.txt  .

Los tres códigos son correctos, y se pueden utilizar en función de la ubicación en la que se desee copiar el archivo, recordando que este se generará con el mismo nombre con el que fue copiado

Se puede utilizar el comando “cd” en conjunto con el comando “ls” para verificar el funcionamiento de las instrucciones anteriores:
2_1

A continuación se presenta una tabla con algunas de las opciones que se pueden utilizar como complemento del comando “cp” y que pueden ser de gran utilidad. Se recuerda que se puede utilizar más de una a la vez:

t1

Tema 2.3.- ¿Cómo cambiar archivos de ubicación y renombrarlos?

“mv”(move):

El siguiente comando, “mv”, permite realizar dos acciones, la primera es similar al comando “cp” ya que permite generar un archivo (ya existente) dentro de otro directorio. La diferencia radica en que el comando “cp” realiza una copia (se tendrán 2 archivos iguales después de usarlo), mientras que el comando “mv” simplemente desplaza el archivo de un directorio a otro.

De manera general se debe escribir el siguiente comando:

 : mv_[Origen / Archivo]_[Destino]

Si se desea, por ejemplo, mover el archivo “EjemploArchivo.txt” que se copió anteriormente, y ubicarlo en el directorio “copia_seguridad”, se tendría que escribir el siguiente código:

%: mv  ~/unix_ejemplos/EjemploArchivo.txt  ~/unix_ejemplos/copia_seguridad

Para comprobar el comando anterior se puede utilizar el comando “ls”. A continuación se muestra como el archivo se ha movido de un directorio a otro:

foto1

El comando “mv” también puede utilizarse para cambiar un archivo de nombre, y se usa la sintaxis anterior, con la diferencia de que se enviará el archivo al mismo directorio en el que ya se encontraba, pero con otro nombre (se eliminará el archivo con el nombre anterior y quedará solo el del nombre cambiado). De manera general se escribirá lo siguiente:

 : mv_[Origen / NombreViejo]_[Origen / NombreNuevo]

Para cambiar el nombre del archivo “EjemploArchivo.txt” que actualmente está en el directorio “copia_seguridad” y renombrarlo como “EjemploNombreCambio.txt” se usaría el siguiente código:

%: mv  ~/unix_ejemplos/copia_seguridad/EjemploArchivo.txt  ~/unix_ejemplos/copia_seguridad/EjemploNombreCambio.txt

Si nos encontramos ya ubicados en el directorio “copia_seguridad”, se puede utilizar el siguiente código simplificado (Usando el signo de punto para referirse al directorio actual):

%: mv  ./EjemploArchivo.txt  ./EjemploNombreCambio.txt

foto2

Las siguientes son opciones que se pueden utilizar junto con el comando “mv”:

t2

Tema 2.4.- ¿Cómo remover (eliminar) archivos y directorios?

“rm”(remove):

Si se desea eliminar algún archivo se debe utilizar el comando “rm”, basta con escribir la ruta y el nombre del archivo de la siguiente forma:

 : rm_[Ruta / Archivo]

Por ejemplo, si deseamos eliminar el archivo “EjemploNombreCambio” ubicado en el directorio “copia_seguridad”, escribimos la siguiente instrucción:

%: rm ~/unix_ejemplos/copia_seguridad/EjemploNombreCambio.txt

2_66

“rmdir”(remove directory):

El comando “rm” permite remover únicamente archivos, sin embargo, podemos realizar la misma acción por medio del comando “rmdir” que nos permite eliminar directorios utilizando la misma sintaxis:

 : rmdir_[Ruta / Directorio]

Se creará como ejemplo un directorio de prueba por medio del comando “mkdir” (en el directorio principal) y se eliminará con el siguiente código:

%: mkdir ~/Prueba

%: rmdir ~/Prueba

2_77

Tema 2.5.- ¿Cómo mostrar el contenido de archivos en pantalla y navegar en ellos?

Los 5 comandos, que se presentan a continuación, permiten el manejo de archivos en la pantalla de la terminal. Los comandos se encuentran enfocados a los archivos de TEXTO debido a que estos trabajan sin la necesidad de salir de la terminal del sistema o utilizar un programa adicional.

“clear”(clear screen):

Se utiliza para limpiar el contenido presente en pantalla, y no se limita al manejo de archivos ya que en cualquier momento puede ser utilizado para dejar libre la terminal de sistema, escribiendo lo siguiente:

%: clear

Todo el texto en pantalla desaparecerá a excepción de la línea para introducir un nuevo comando.

“cat”(concatenate):

El comando “cat” que se utilizó para crear archivos en el tema 2.1 también se puede usar para mostrar en pantalla el contenido de un archivo. Tal contenido se mostrará completo, y en caso de ser mayor al tamaño de la ventana, aparecerá de forma automática una barra vertical para desplazarnos.

Para utilizar el comando solo necesitamos ingresar la ruta y el nombre del archivo:

: cat_[Ruta / Archivo]

Si queremos mostrar el archivo “frases.txt” que se ha guardado en la carpeta “Descargas” escribiremos la siguiente instrucción:

%: cat ~/Descargas/frases.txt

2_88

Aquí se muestran las opciones que se pueden utilizar en conjunto con el comando “cat”:

t4

“less”:

El comando “less” tiene un funcionamiento muy similar al anterior, ya que nos permite navegar en el contenido de un texto, sin embargo, este mostrará los textos largos divididos en páginas, además de presentar algunas opciones adicionales. Para utilizarlo se emplea la siguiente sintaxis:

: less_[Ruta / Archivo]

Para ver el archivo “Imagine.txt” ubicado en la carpeta “Descargas” escribimos la siguiente instrucción:

%: less ~/Descargas/Imagine.txt

Al utilizar el comando “less” se tienen algunas opciones disponibles para ver el contenido del archivo, por ejemplo, al presionar [Barra-espaciadora] el sistema pasará a la siguiente página, si se presiona esta tecla al mismo tiempo que la flecha izquierda en el teclado se hará la acción contraria, y si se presiona la tecla [q], se cerrará la vista del archivo.

2_99

Las siguientes son las acciones que se pueden realizar en la navegación del archivo al presionar diferentes teclas de la computadora:

t3

“head” and “tail”:

A continuación se presentan dos comandos similares a los anteriores que nos permiten visualizar solo el inicio o el final de un archivo para identificar si este nos resulta de utilidad.

Por un lado, el comando “head” mostrará en pantalla las primeras 10 líneas del archivo especificado al escribir lo siguiente:

: head_[Ruta / Archivo]

Primeras 10 líneas del archivo “Imagine.txt”:

%: head ~/Descargas/Imagine.txt

2_1111

Para el caso contrario, las últimas diez líneas del archivo se mostrarán con el comando “tail”:

: tail_[Ruta / Archivo]

Últimas 10 líneas del archivo “Imagine.txt”:

%: tail ~/Descargas/Imagine.txt

2_1212

Los comandos “head” y “Tail” cuentan con dos opciones particulares que permiten alterar la cantidad de texto que se mostrará en pantalla. La primera de ellas corresponde a “-n” y permite mostrar la cantidad de LÍNEAS que el usuario elija. Si se desean mostrar las últimas 5 líneas de un archivo se escribiría lo siguiente:

%: tail -n 5 ~/Descargas/Imagine.txt

La opción “-c” realiza la misma acción, pero en lugar de contar líneas, cuenta los BYTES especificados, y de la misma forma puede ser aplicada para “head” y para “tail”.

Finalmente, la opción “-f” funciona únicamente con el comando “tail” y permite mostrar la parte final de un archivo a medida que este va creciendo, lo cual puede ser de gran utilidad al monitorear registros que crecen con el tiempo.

Tema 2.6.- ¿Cómo buscar contenido específico dentro de un archivo?

“less”(para realizar búsquedas simples):

El funcionamiento del comando “less” se explicó en el tema 2.5, y se mostró por medio de una tabla que es posible realizar búsquedas de palabras específicas o clave al utilizar los botones [/] y [?] del teclado.

Al encontrarse en la ventana de lectura de textos del sistema y presionar los botones anteriores se nos permitirá escribir una palabra, por ejemplo, si se desea buscar la palabra “imagine” dentro del archivo “Imagine.txt”:

Presionar -> [/] , después escribir -> imagine, presionar -> [Enter]

La palabra escrita será buscada y todas las coincidencias serán subrayada por el sistema. Al presionar la tecla [n] se desplazará la pantalla a la siguiente coincidencia.

2_15

“grep”:

El comando “grep” es de los más útiles para el manejo de archivos, y cuenta con varias funciones dependiendo de la opción con la cual sea combinado.

Su funcionamiento base permite buscar líneas de texto que contengan una palabra específica dentro de un archivo (sin la necesidad de estar dentro de dicho archivo). Se necesita especificar el comando, la palabra que se desea buscar y la ruta del archivo:

: grep_[Palabra]_[Ruta/Archivo]

Por ejemplo, si se quisieran buscar todas las líneas con la palabra “Imagine” dentro del archivo de texto “Imagine.txt” ubicado en descargas, tendríamos que escribir lo siguiente:

%: grep Imagine ~/Descargas/Imagine.txt

2_14

  • NOTA: El comando “grep” distingue letras mayúsculas de minúsculas, por lo cual, si en la búsqueda anterior se escribiera “imagine” (con i minúscula en lugar de I mayúscula) la búsqueda no daría ningún resultado. Para eliminar la distinción del tipo de letra se debe utilizar la opción “-i”.

Además de palabras simples es posible realizar la búsqueda de frases completas, lo cual se logra al escribir la frase entre comillas simples después del comando, por ejemplo:

%: grep ‘Imagine all the people’ ~/Descargas/Imagine.txt

2_13

La opción “-i” para ignorar la diferencia del tipo de letra también se puede utilizar en este caso; así mismo, se puede utilizar la opción “-v” para mostrar todas aquellas líneas que no coinciden en lugar de las que si lo hacen, o “-c” que devolverá únicamente el número de líneas coincidentes sin mostrarlas (puede ser combinada con “-i” o -“v”)

“wc”(word count):

El comando “wc” permite contar el número de palabras, líneas o caracteres que posee un archivo, y para ello se requiere la opción correspondiente y la ruta del archivo de la siguiente forma:

: wc_(-w/-l/-c)_[Ruta / Archivo]

La opción “-w” devolverá el total de palabras del archivo, mientras que “-l” regresará el número de líneas que lo conforman y “-c” mostrará la cantidad de bytes presentes.

Las tres opciones se pueden utilizar al mismo tiempo, y los números serán mostrados siempre por la jerarquía de Líneas / Palabras / Bytes. Por ejemplo al escribir:

%: wc -l -w -c ~/Descargas/Imagine.txt

2_16

Por otro lado, si se utiliza el comando sin opciones, se le permitirá al usuario escribir un texto en la terminar para ser contado, mostrando la cantidad tanto de líneas como de letras y de bytes (en ese orden). EL texto escrito en este caso corresponde a la “entrada estándar” del sistema, concepto que será desarrollado en el tutorial siguiente.

Hasta ahora se ha explicado la estructura jerárquica que poseen los sistemas basados en UNIX, y se han mostrado los comandos más importantes que permiten manejar directorios y archivos. Los conocimientos en los tutoriales anteriores nos permitirán trabajar con los siguientes temas a desarrollar, y en el tutorial siguiente se introducirán los conceptos de entrada y salida estándar del sistema, además, se explicará el proceso de redireccionamiento de datos así como el uso de las “pipes” (Tuberías) para redireccionar salidas estándar.

⇐ Tutorial Anterior                                                                          Tutorial Siguiente ⇒

Tutorial 1: Manejo de Directorios y Rutas

Autor: Irving Hernández Uribe;  Editor: Dr. Erik Zamora Gómez

En el tutorial anterior se realizó la introducción al tema, se describió qué es UNIX, así como sus características principales, las versiones que existen y su estructura. Además, se presentaron los primeros pasos para el uso y manejo de archivos, procesos y directorios, dando a conocer el significado de Kernel y Shell. Finalizando con la explicación referente a cómo abrir la terminal del sistema para trabajar en ella.

En este tutorial se explicará el manejo de directorios y rutas. Aprenderás el funcionamiento de algunos comandos que te permitirán visualizar archivos y directorios, crear subdirectorios, navegar entre el contenido del sistema y usar el concepto de “ruta”. Además, aprenderás a utilizar las “opciones” que presentan estos comandos por medio de ejemplos. La finalidad es que tu obtengas mayor fluidez al trabajar en un ambiente Unix (particularmente, Ubuntu).

Tema 1.1.- ¿Cómo visualizar archivos y directorios?

Un directorio en UNIX contiene archivos y otros directorios de menor jerarquía denominados subdirectorios. La estructura de los directorios se denomina “de árbol invertido” debido a que se ordena de manera jerárquica comenzando por el directorio raíz  “/”, y a partir de el se desglosan los demás descendientemente. Se han desarrollado una serie de comandos los cuales permiten navegar entre los directorios y archivos para trabajar con ellos. En este tutorial se explicarán con mayor detalle con ejemplos del funcionamiento.

 “ls”(list):

Cuando se realiza el inicio de sesión por el usuario, en Unix, el sistema se posiciona en el directorio principal de manera automática (directorio actual); este directorio es el cual comparte nombre con el “nombre de usuario”, debido a que contiene todos los archivos y directorios creados por el mismo.

  • Aclaración: Los sistemas basados en Unix generan de manera automática elementos propios del sistema como variables o archivos temporales, estos se encuentran inmersos en el directorio con el nombre Home y como error común se suele confundir este con el directorio principal (Con el nombre del usuario). Por cuestiones prácticas, y con el motivo de evitar confusiones (principalmente porque la mayoría del contenido relacionado a este tema se encuentra en idioma inglés), se nombrará en esta serie de tutoriales al directorio de elementos creados por el usuario como Directorio Principal, mientras que al generado automáticamente por el sistema se le continuará nombrando Home. 

Teniendo en cuenta lo anterior, se explica la función del comando “ls”, y como su nombre lo indica, genera una lista en pantalla con los documentos y archivos presentes en el directorio actual. Para utilizarla basta escribir el siguiente comando sobre el cursor:

%: ls

(En la instrucción anterior se deben de escribir ambas letras en minúsculas)

  • NOTA: La manera en que se presentan las líneas de comando puede variar ligeramente entre cada versión de Unix (La petición de nueva línea), por tal motivo, se emplearán los símbolos “%:” para indicar que posterior a ellos se escribirá sin cambios una nueva instrucción.

Si se ejecuta la instrucción anterior y no se genera ninguna lista se debe a que no existen elementos dentro del directorio actual (por lo general cuando se inicia sesión por primera vez), en este caso, el indicador de nueva línea se mostrará de nuevo. En caso de existir archivos en el directorio actual, se presentará la lista de los mismos separados por diagonales como se muestra en la imagen siguiente:

12765668_1081495048567245_1888684974_o

En este caso se presentarán todos los directorios en color azul y los archivos (de existir) en color blanco, sin embargo tanto la tipografía como la separación de la lista puede variar ligeramente entre versiones de UNIX.

  • NOTA: El comando “ls” presenta todos los directorios y archivos manipulables por el usuario (Aquellos con los que puede trabajar). Sin embargo, existe otro tipo de archivos que no se muestran con este comando denominados “ocultos” cuyo nombre siempre inicia con un signo de punto “.”. Debido a que estos elementos contienen información importante para el correcto funcionamiento del sistema, y es recomendable NO realizar modificaciones de los mismos a menos que se tengan conocimientos avanzados sobre UNIX.

Opciones:

Las denominadas “opciones”, son complementos que se pueden aplicar a los comandos con la finalidad de cambiar su funcionamiento, es decir, permiten modificar las acciones que estos realizan, por medio de agregarles caracteres adicionales al utilizarlos.

Por ejemplo, al utilizar el comando “ls”, si se desean visualizar todos los elementos del directorio, incluyendo los ocultos (que el comando “ls” no presenta por si solo) se deberán de agregar los caracteres “-a”, escribiendo ahora lo siguiente:

%: ls -a

 Lo anterior corresponde al uso de una opción para comando “ls”, y generará lo siguiente en pantalla:

 12765811_1081510935232323_1554695008_o

Esta vez se han generado un mayor número de directorios (en color azul) y de archivos (en color blanco) que en la ocasión anterior. (Con un signo de punto aquellos que corresponden a elementos ocultos del sistema).

De manera general, se puede utilizar el comando “ls” seguido de alguna opción (separada por un espacio), siendo posible agregar más de una en una sola instrucción con la siguiente sintaxis:

 : ls_-op1_-op2_-op3_…

Sugerencia: Con relación a este tema, existen manuales en línea que contienen tablas extensas indicando las diferentes “opciones” para cada comando, estas detallan el nombre y el funcionamiento en cada caso.

Tema 1.2.- ¿Cómo crear subdirectorios?

“mkdir(make directory)”:

El segundo comando a presentar permite crear subdirectorios, mismos que se generarán en el directorio actual. Para ello, se utiliza la instrucción “mkdir” (abreviatura de las palabras “make directory”, o crear directorio en el idioma español).

Para crear un subdirectorio, se debe escribir “mkdir” seguido del nombre que pretendamos dar al subdirectorio (separados por un espacio):

: mkdir_[Nombre]

Por ejemplo, si queremos generar un subdirectorio con el nombre de “unix_ejemplos”, tendremos que escribir lo siguiente en la terminal:

%: mkdir unix_ejemplos

Al presionar la tecla [Enter] se generará el subdirectorio en el directorio actual, lo cual se puede comprobar al utilizar el comando “ls” como se muestra a continuación:

12751874_1081517165231700_1909507333_o

Tema 1.3.- ¿Cómo cambiar el directorio actual a uno diferente?

“cd”(change directory):

El comando “cd”, permite cambiar el directorio actual en el que nos encontremos trabajando, y posicionarnos de manera directa en algún otro subdirectorio dentro del sistema, poniendo a nuestra disposición los elementos presentes ahí.

Para cambiar de directorio se escribe el comando “cd” seguido del nombre del directorio en el cual deseemos posicionarnos separado por un espacio;

: cd_[Directorio]

Por ejemplo, si deseamos trabajar en el directorio de “unix_ejemplos” que generamos anteriormente, tendremos que escribir lo siguiente:

%: cd unix_ejemplos

All utilizar el comando anterior, estando en el directorio principal, la dirección mostrada en la línea de color negro de la terminal (en la parte superior) cambia del caracter “~” al nombre del directorio actual “unix_ejemplos”.

12752186_1081521791897904_536434756_o

Una vez posicionados aquí, es posible trabajar con los elementos de este directorio, así como generar nuevos.

1.3.1.- Comando “cd” para cambiar a los directorios  “.” y “..”

Cuando se trabaja en UNIX, existe una manera sencilla y práctica para realizar el cambio de un directorio a otro, para ello, se emplean dos extensiones que tienen la sintaxis siguiente:

“.” (Signo de punto) → Significa directorio actual dentro de los comandos de UNIX

“..” (Doble signo de punto) → Significa directorio “padre”, y hace referencia al directorio inmediato superior en la jerarquía, el cual contiene en su interior al subdirectorio actual

El uso de estas extensiones se realiza como complemento del comando “cd”. Por ejemplo, al escribir el siguiente comando:

%: cd .

El sistema nos dejará posicionados en el directorio actual sin cambios, debido a que “.” referencia siempre a este directorio, y puede ser útil en comandos posteriores aunque no tenga un efecto palpable en este.

Por otro lado, al utilizar el código siguiente:

%: cd ..

El sistema deberá posicionarnos en el directorio anterior al actual (el directorio padre).

  • NOTA:  En caso de que el usuario pierda su ubicación actual al encontrarse trabajando, puede utilizar el comando “cd” sin agregar ninguna extensión para regresar al directorio principal del sistema sin importar la ubicación actual.

En la imagen se muestra el funcionamiento de las variaciones del comando “cd”.

12751791_1081526831897400_528392046_o

Tema 1.4.- ¿Cómo trabajar con rutas?

“pwd”(print working directory):

Ruta: El concepto de ruta hace referencia a la ubicación que tiene algún elemento (directorio o archivo) dentro de la jerarquía del sistema, y corresponde a una línea de texto que muestra los nombres de los directorios donde se encuentra contenido dicho elemento mediante una secuencia ordenada desde el directorio raíz del sistema (el primero en la jerarquía) hasta el elemento especificado, desglosando todos aquellos que se encuentren en medio de ambos.

Para ejemplificar el funcionamiento del comando “pwd” se puede acceder al directorio principal por medio del comando “cd” y una vez aquí, deberemos de escribir lo siguiente en la terminal:

%: pwd

El código utilizado debería desplegar en la pantalla algo similar a los que se muestra en la imagen:

12755336_1081528611897222_153741122_o

Como se puede apreciar, se genera la ruta hasta el subdirectorio actual, mostrando el trayecto de directorios ubicados entre este y la raíz “/” (separando los nombres por diagonales).

En este caso “/ home / irving” significa que el directorio principal con el nombre de “irving” se encuentra dentro del directorio home, que a su vez se encuentra dentro del directorio raíz.

1.4.1.- Combinar el comando “ls” con las rutas del directorio:

El uso de rutas puede ser combinado con algunos comandos del sistema, lo cual nos permite aplicar instrucciones directamente a elementos de subdirectorios en los que no nos encontremos posicionados. Para ello, se escriben conjuntamente los comandos y el nombre de la ruta perteneciente a un elemento:

: [Instrucción]_[r1/r2/r3/…]

Para ejemplifica el funcionamiento de esto, se creó un subdirectorio nuevo llamado “copia_seguridad” dentro de “unix_ejemplos”, y dentro de este, otro subdirectorio denominado “prueba”. Entonces, para mostrar la lista de elementos que componen al directorio “copia de seguridad” se debe de escribir la siguiente instrucción (Recordando escribir la ruta completa del elemento, ya que de lo contrario se generará un mensaje de error al no poder localizar el elemento).

%: ls unix_ejemplos/copia_seguridad

Esto nos mostrará lo siguiente en pantalla:

12765648_1081536598563090_1950063115_o

1.4.2.- Aplicación del caracter “~” (Tilde) en el uso de rutas:

Finalmente, se puede utilizar el caracter conocido como tilde (~); este sirve para hacer referencia al directorio home del sistema, y puede emplearse de la misma forma que los nombres de otros directorios en el manejo de rutas y comandos.

Por ejemplo al escribir la siguiente instrucción:

%: ls ~/unix_ejemplos

Lo anterior deberá de mostrar el contenido del directorio “unix_ejemplos” sin importar nuestra ubicación actual en el sistema.

Contenido útil adicional:

A continuación se presenta una tabla donde se muestran los nombres y el contenido de algunos de los directorios más importantes dentro de los sistemas basados en UNIX:

tabla1

Finalmente, se presenta una tabla, con el funcionamiento de los comandos empleados durante este tutorial, así como algunas de las opciones disponibles para éstos. Haciendo la aclaración de que existe una gran cantidad de estas, y que es posible encontrar material al respecto en línea para propósitos específicos.

tabla2

En el siguiente tutorial se continuará con el uso de comandos del sistema, en este caso, el tutorial se enfocará en el manejo de archivos, y en él aprenderás como crear, copiar y cambiar de directorio archivos especificados; también se explicará como mostrar el contenido de los archivos en pantalla, y cómo navegar en este, teniendo acciones tales como mostrar solo una parte del mismo o buscar palabras o frases específicas.

⇐ Tutorial Anterior                                                                          Tutorial Siguiente⇒

c084d-gnulinux-logo

Tutorial 0: Introducción a UNIX y primeros pasos en Ubuntu

Autor: Irving Hernández Uribe;  Editor: Dr. Erik Zamora Gómez

El propósito que tiene esta serie de tutoriales es el de proporcionarle al lector tanto explicaciones como ejemplos de manera clara y puntual que le permitan familiarizarse con los conceptos fundamentales así como con el entorno de programación propio de UNIX.

A lo largo de este conjunto de tutoriales se pretende que el lector se familiarice con los comandos principales que se presentan en Unix, con el uso de directorios y archivos, el redireccionamiento de los mismos, y el uso de procesos, y variables en general.

En este primer tutorial que funcionará como introducción a los posteriores aprenderás qué es UNIX, cuáles son sus características, cuáles versiones existen, cuál es su estructura, cómo se manejan los archivos, procesos y directorios, qué significa Kernel y Shell, y finalmente,  cómo se puede abrir la terminal de Linux para trabajar en ella.

¿Qué es UNIX?

Comencemos por ¿Qué es un sistema operativo? Por definición es un conjunto de programas que trabajan de manera armónica para la ejecución de tareas de manera simultánea; estos programas hacen el papel de intermediario entre el usuario y la computadora, a fin de que este pueda dar instrucciones a la misma por medio de una interfaz que es sencilla de utilizar.

UNIX es el nombre que se le dio al sistema operativo desarrollado en 1968 por Ken Thompson y Dennis MacAlistair Ritchie, quién es conocido también por ser el principal desarrollador del lenguaje de programación C. La característica principal es que se encuentra en constante desarrollo, y por lo tanto, las versiones se actualizan con mucha frecuencia.

Los aspectos más destacables de este sistema son el hecho de ser estable, que significa que es una versión completa y probada que puede ser comprada o descargada por los usuarios, además de ser multiusuario y multi-tarea lo que significa que puede ser empleado en servidores, computadoras convencionales, de escritorio e incluso en laptopts.

Todos los sistemas operativos basados en UNIX cuentan con el uso de GUI’s (Interfaces Gráficas de Usuario); estas son similares a las que se tienen en los sistemas de Microsoft Windows y su tarea es brindarle al usurario una manera simple de usar el entorno del sistema por medio de imágenes, íconos, colores y demás elementos que faciliten la comprensión de su uso. Sin embargo, al igual que ocurre en otros sistemas operativos, es necesario un conocimiento un poco más profundo del mismo para realizar ciertas operaciones que no cuentan con el uso de la interfaz gráfica, como en el caso de la programación directa en elementos del sistema o al realizar sesiones de Telnet que es un protocolo de comunicación muy utilizado que permite ingresar y manipular una computadora de manera remota.

Versiones de UNIX

Existen muchas versiones diferentes de UNIX, todas ellas comparten ciertas características, y son muy similares en cuanto a su uso. Las principales de estas versiones son las siguientes:

  • Sun Solaris: Se trata de un sistema operativo de tipo Unix desarrollado por Sun Microsystems en 1992 y que fue el sucesor del sistema SunOs. Este sistema se encuentra certificado de manera oficial como versión de Unix a pesar de haber sido desarrollado como software privado. La mayor parte del código de este sistema ha si
    do liberado como proyecto de software libre denominado OpenSolaris.
  • GNU/Linux: El nombre combinado de GNU/LINUX se debe a que los sistemas operativos cuentan con Linux como núcleo (La parte más importante del sistema operativo, la cual establece el funcionamiento del mismo). En este caso, el núcleo corresponde a Linux mientras que el resto de sus programas secundarios fueron desarrollados por el proyecto GNU como subprogramas de interfaz para el sistema, por lo cual se decidió emplear el nombre como combinación de ambas características en GNU/Linux, teniendo como nombre informal y comúnmente conocido como simplemente Linux. La característica que más llama la atención de este sistema operativo es el hecho de que nadie es realmente dueño del mismo ya que la mayor parte de su desarrollo es realizado por programadores de manera voluntaria que buscan contribuir al uso de este software libre en el que puedan participar muchas personas para su mejora.
  • MacOS X: Este sistema es desarrollado por la compañía Apple Inc. empleada en su línea de computadoras Macintosh y es conocido por haber sido el primer sistema operativo que se comercializó al público en general, además de ser el primero en contar con una interfaz gráfica amigable con los usuarios que permitió el uso de este de manera sencilla a través del entonces revolucionario uso de los accesorios de la computadora como lo era el mouse, las ventanas, los íconos y lo menús. A partir de la versión 10, el sistema de MacOs cambió su arquitectura por completo y basó la misma en el uso de UNIX, cambiando de esta forma su programación y desarrollo, pero conservando los elementos gráficos que lo caracterizaron desde las primeras versiones existentes.

Las versiones de UNIX más populares en las universidades son Solaris, Ubuntu y Fedora. En este tutorial, nos enfocaremos en Ubuntu debido a que este es utilizado en robots comerciales y de investigación.

Composición del sistema operativo UNIX

UNIX se encuentra compuesto por tres elementos principales que trabajan en conjunto de una manera estructurada:

  • Kernel (núcleo): El kernel o núcleo es el elemento central del sistema operativo, este se encarga de realizar las asignaciones correspondientes de tiempo y cantidad de memoria a utilizar para cada programa, así mismo, se encarga de manejar y almacenar los archivos generados en el sistema además de ser el responsable de las comunicaciones presentes entre todos los programas del sistema y el usuario.
  • Shell (caparazón o cascarón): El Shell o Cascarón es en realidad un lenguaje de control programable para el sistema, que funciona como un intérprete entre el usuario y el Kernel, en otras palabras, este es el que se encarga de actuar como interfaz al recibir instrucciones en su lenguaje de programación y traducirlas al lenguaje de la máquina para ejecutar acciones. El funcionamiento del SHELL consiste en la interpretación de líneas de comando CLI (Common Language Infrastructure) que corresponden a un conjunto de especificaciones estandarizadas para la ejecución de aplicaciones. Una de las características más llamativas del SHELL es el hecho de que puede ser personalizable, y esto se debe a que los usuarios que posean ciertos conocimientos de programación en UNIX pueden crear sus propios SHELL’s personalizados, además de contar con la opción de utilizar más de uno de estos en la misma máquina, ampliando así la cantidad de opciones que se tienen para trabajar con este sistema operativo. En la mayoría de los casos, principalmente en configuraciones del sistema UNIX presentes en escuelas donde se trabaja programando en estos sistemas operativos se cuenta con la configuración de TCSH SHELL, la cual se presenta por defecto y resulta muy útil al contar con características que le facilitan al usuario introducir comandos para programar en el sistema.
  • Programas (aplicaciones): Como en cualquier otro sistema operativo, los programas son los elementos con menor jerarquía dentro del mismo, estos tienen una influencia mínima o nula en la configuración del sistema, sin embargo, estos representan la principal utilidad para el usuario ya que estos son un conjunto de instrucciones que cuentan con una interfaz gráfica y que permiten ejecutar tareas muy variadas.

Archivos y procesos

En los sistemas operativos basados en UNIX, todos los elementos con los que se trabajan son archivos o procesos:

  • Proceso: El proceso hace referencia a un programa que se encuentre en ejecución identificado por un PID (Identificador de proceso)
  • Archivo: El archivo hace referencia a un conjunto de datos que puede ser generado por el sistema o por el mismo usuario al utilizar un programa de edición de texto, audio, imágenes, entre muchos otros, así como datos que pueden ser generados por un compilador cuando se encuentre trabajando. Como ejemplos de archivos se puede hacer referencia a documentos como informes o ensayos los cuales el usuario puede trabajar y modificar como si fueran texto (elementos entendibles por los humanos) sin embargo, para el sistema operativo, estos archivos corresponden a un lenguaje de programación en alto nivel, así pues, lo que nosotros vemos como palabras, la máquina ve un conjunto de instrucciones que son traducidas por el programa para que ella pueda interpretarlas, por ejemplo instrucciones en lenguaje binario. En el caso anterior se tendría un archivo escrito en lenguaje de unos y ceros que la máquina podrá interpretar, y con ayuda del programa adecuado estos podrán ser presentados al usuario como algo comprensible para el mismo, ya sea letras, números, imágenes, entre otros.

El directorio y su estructura

UNIX cuenta con directorios, estos son elementos que contienen información concreta sobre los archivos en el sistema; dentro de un directorio se puede encontrar una mezcla de información acerca de otros directorios los cuales son llamados subdirectorios y de archivos ordinarios.

Podemos realizar la analogía con el directorio telefónico en el cual podemos encontrar el número telefónico y dirección de alguna persona o lugar, con lo cual podemos comunicarnos con dicha persona. Las personas no se encuentran de manera física dentro del directorio, sin embargo, este sirve como una forma eficiente de contactarlas y de tener almacenada la información de todos los individuos que nos sean de interés en un solo lugar.

En UNIX, la estructura con la que cuentan los directorios se realiza de manera jerárquica, teniendo una forma denominada de árbol invertido, la cual comienza con el elemento más importante en la parte superior que en este caso corresponde al directorio raíz (el cual se representa siempre por medio del símbolo “/”), y a partir de este se desglosan de manera descendente los demás directorios con base en el contenido que estos presentan.

El directorio raíz es el primero que es montado en el sistema al realizar el arranque del mismo ya que este contiene los elementos necesarios que permiten preparar el sistema operativo para su funcionamiento.

Todos los archivos se agrupan en la estructura del directorio siendo los creados o agregados por el mismo usuario los que se encuentran más abajo en la jerarquía.

diagrama

En el diagrama anterior se presenta un esquema que ejemplifica como se ordenan los directorios en el sistema de Unix. Podemos ver que la parte superior del diagrama presenta el directorio raíz, al cual le siguen los directorios de archivos propios del usuario así como algunos de los archivos que el propio sistema utiliza para su funcionamiento tales como los ficheros temporales (tmp), los de multipropósito para el uso de aplicaciones y las utilidades del usuario (usr). A partir del directorio Home, se encuentran los directorios personalizados por el usuario, y a manera de ejemplo, se hace la observación que el directorio de color naranja corresponde al directorio principal del usuario, y que el bloque de color verde que no tiene las puntas redondeadas no es en realidad un directorio sino que es un archivo, entonces, si se buscara llamar al archivo llamado “reporte.doc” se tendría que escribir la siguiente ruta:

                                              /home/its/ug1/ee51vn/reporte.doc

Se debe escribir la ruta comenzando por la raíz “/” y de ahí en adelante escribir cada subdirectorio que contenga al archivo deseado de manera descendente y separando los nombres por medio del símbolo diagonal.

Iniciando la terminal de UNIX

Como ya se comentó anteriormente, existen una cantidad considerable de distribuciones diferentes de UNIX, siendo las más comunes en escuelas las correspondientes a Fedora y Ubuntu, teniendo interfaces similares y características de software basadas en la misma arquitectura. En este caso, se trabajará a partir de este momento y en los siguientes tutoriales con la versión de Ubuntu 15.1, haciendo la aclaración que las explicaciones mostradas posteriormente y el funcionamiento de los códigos empleados pueden ser aplicados a otras versiones y otras distribuciones con variaciones mínimas que principalmente están relacionadas con la interfaz gráfica.

Procedemos a realizar el primer paso para comenzar a trabajar en el entorno de UBUNTU, el cual consiste en abrir la ventana de Terminal del sistema, lo que se realiza buscando directamente en las aplicaciones de nuestro sistema, y para ello se debe seleccionar el siguiente icono:  terminal
ima0Una vez ahí, si este no aparece directamente, es posible buscarlo por medio de la barra auxiliar para búsquedas (o bien, usando las teclas Ctrl+Alt+T). imaa1

Finalmente, al ingresar en el ícono de Terminal se deberá de abrir la siguiente ventana, la cual nos mostrará el nombre de usuario y presentará un cuadro blando en el lugar del cursor, el cual representa que el sistema está listo para recibir una nueva instrucción.

ima2

De esta forma ya se encuentra lista la terminal para realizar trabajos en ella, esto significa que nos encontramos preparados para ejecutar comandos y trabajar con los diferentes elementos pertenecientes a UNIX.

En el siguiente tutorial se explicará el uso de los primeros comandos, los cuales nos permitirán trabajar con directorios, creándolos, buscándolos en una dirección específica, cambiándolos de ruta y agregándolos a los directorios principales y de trabajo.

Tutorial Siguiente ⇒

Sigue leyendo

MTN

Máquina de Turing Neuronal

En el 2014 se publicó en la plataforma arXiv un artículo [Graves, et al. 2014] que ha estimulado la imaginación de todos quienes trabajamos para crear maquinas más inteligentes, en particular, usando redes neuronales artificiales. A continuación voy a resumir este artículo poniendo algunos comentarios. Mi propósito es difundir esta tecnología en el mundo hispano. El contenido de esta nota es:

  1. ¿Para qué sirve?
  2. ¿Cómo funciona?
  3. Arquitectura y Operación
  4. Método de Aprendizaje
  5. Experimentos
  6. Conclusión

1 ¿Para qué sirve?

Es una máquina de Turing [0] capaz de aprender programas sencillos a partir de un entrenamiento con datos de ejemplo sin que alguien explícitamente la programe. Por ejemplo, se le puede enseñar a ordenar números o  copiarlos en cierto orden, mostrándole ejemplos de números desordenados en la entrada y los mismos números ordenados en la salida. Así infiere por sí misma las operaciones que debe realizar para ordenar los números. Los autores proponen la MTN como un modelo matemático de la memoria de trabajo [1]. En contraste con modelos previos con operaciones fijas prediseñadas, la MTN es capaz de aprender nuevas operaciones para manipular la memoria. Más investigación debe hacerse para averiguar qué tan complejos pueden ser los programas aprendidos, es decir, hallar los limites teóricos y prácticos de la MTN.

2 ¿Cómo funciona?

Básicamente, la MTN es una red neuronal recurrente [2] con un banco de memoria al que puede acceder leyendo y escribiendo datos. Elige la sección de memoria a manipular de manera difusa. En lugar de escoger exactamente qué elementos manipular, interactúa más o menos en cierto grado con todos los elementos de la memoria. Qué tanto se lee o se escribe está determinado por unos pesos sinápticos asignados para cada elemento de la memoria.  El que las operaciones de lectura y escritura sean continuas respecto a los pesos sinápticos permite que pueda usarse el método del descenso por gradiente [3] para entrenar la MTN. Aunque el articulo [Graves, et al. 2014] no explica cómo hacerlo.

3 Arquitectura y Operación

La MTN consiste en dos componentes principales: el controlador y el banco de memoria (como se muestra en figura). Estos dos interactúan a través de los cabezales de lectura y escritura.  Primero, explicaremos como lee y escribe, después cómo elige cuál lote de memoria manipular (direccionamiento), y por último, explicaremos qué es el controlador.

MTN

Lectura. El vector de datos \textbf{r}_t leído está dado por una combinación convexa de los elementos de la memoria como sigue:

\textbf{r}_t\leftarrow \sum_{i}^{N} w_t(i)\textbf{M}_t(i)

Donde w_t(i) es el peso sináptico correspondiente al lote i de la memoria y se debe cumplir que \sum_{i} w_t(i)=1, 0\leq w_t(i)\leq 1 para \forall i; el vector \textbf{M}_t(i) es el dato almacenado en el lote i de la memoria; t indica el tiempo en que ocurre la lectura.

Escritura. El vector de datos \textbf{M}_t(i) se escribe en la memoria con dos operaciones

borrar y agregar

Donde 1 es un vector de unos, \textbf{e}_t es el vector de borrado cuyos elementos están en el rango 0 y 1. En casos extremos, la memoria se borra totalmente solo si el producto w_t(i)\textbf{e}_t = 1 y se conserva totalmente si w_t(i) = 0 ó \textbf{e}_t = \textbf{0}. Y en cualquier otro caso, se borra parcialmente la información. Después del borrado, se agrega al lote de la memoria el vector de adición \textbf{a}_t  ponderado por el peso w_t(i). Nota: no me quedo claro cómo se generan \textbf{e}_t y \textbf{a}_t además, supongo que \textbf{a}_t es la entrada y \textbf{r}_t es la salida de la MTN.

Direccionamiento (cálculo de \textbf{w}_t). Incorpora dos mecanismos de dirección a la memoria para producir el vector \textbf{w}_t : dirección basada en contenido y dirección basada en ubicación. Estos mecanismos son distintos y están mezclados en el cálculo de \textbf{w}_t.

  • El primero elige los lotes a manipular de acuerdo a la similitud entre el vector de información que se busca \textbf{k}_t y los lotes de memoria \textbf{M}_t(i). Esto lo hace asignando los pesos de acuerdo a una medida de similitud \textbf{K}[ , ]. Así es muy fácil recuperar información, ya que solo se requiere tener una aproximación del lote que se busca brincando al lote en donde está.
  • El segundo permite desplazar circularmente la distribución de pesos \textbf{w}_t a través de los lotes para ubicar cuales lotes serán manipulados. Esto lo hace a través de un desplazamiento convolucional. Por ejemplo, la distribución original selecciona al lote 200 y parcialmente su vecindad, entonces este mecanismo puede desplazar la distribución 50 lotes a la derecha de tal manera que se seleccione el lote 250 y su vecindad. Esto permite escanear una sección de la memoria de manera secuencial.

La MTN puede elegir cuál de los dos mecanismos de dirección predomina o si usa una mezcla equitativa de ambos en cada ciclo de trabajo. Esto lo hace a través de una interpolación. Finalmente, como la convolución provoca dispersión de la distribución \textbf{w}_t conforme avanza el tiempo, se incorpora un procedimiento para enfocar la distribución y evitar la dispersión convolutiva. Todos estos mecanismos se representan gráficamente en la siguiente figura.
Direccionamiento

En concreto, el procedimiento para calcular \textbf{w}_t es el siguiente:

direccionamiento ecuaciones

Donde \textbf{K}[ , ] es la medida de similitud; \beta_t atenúa o intensifica la selección de lotes similares al vector de información  que se busca; g_t  regula cuando se le da más importancia al direccionamiento por contenido o no: si g_t = 1 entonces w^g_t(i) = w^c_t(i) y si g_t = 0 entonces w^g_t(i) = w_{t-1}(i); \textbf{s}_t es el vector que regula el desplazamiento de la distribución de pesos; \gamma_t \geq 1 sirve para enfocar la distribución en caso que se disperse. Para más detalles consulte [Graves, et al. 2014].

Con este procedimiento, la MTN puede aprender: 1) cuando acceder a la memoria por contenido para poder brincar al lote donde están los datos; 2) cuando acceder por ubicación para poder escanear secuencialmente la memoria; ó 3) cuando usar una mezcla de ambos mecanismos. Esto le permite ser versátil para poder aprender programas.

Controlador de Memoria. Es el encargado de generar las señales \textbf{k}_t, \beta_t, g_t, \textbf{s}_t y \gamma_t  para controlar cuales lotes y cuanto de esa información se lee de la memoria o se escribe en la memoria. Los autores han experimentado usando los siguientes controladores: 1) redes neuronales de propagación hacia adelante [4], y 2) redes recurrentes como la red LSTM [5].  El aprendizaje de la MTN de programas está influenciado por capacidad de la red neuronal de aprender a controlar la memoria. Los parámetros que el método de aprendizaje ajusta son los parámetros de la red neuronal controladora (y no los pesos \textbf{w}_t).

4 Método de Aprendizaje

Los autores mencionan que usan el método del descenso por gradiente para entrenar al controlador, en particular, usan el algoritmo RMSprop [Graves, 2013]. Pero no describen como computar el gradiente, solo mencionan que durante la retro-propagación los gradientes los delimitaron en rango (-10, 10) y los parámetros que usaron en sus experimentos.

Ya hay librerías abiertas que han intentado reproducir este trabajo para poner a disposición de los investigadores e ingenieros aficionados:

5 Experimentos

Los autores se plantean averiguar empíricamente ¿Qué tan compactos son los programas que la MTN aprende? ¿Qué tan bien generaliza? En específico, averiguar si es capaz de aprender un programa general para N datos, poniendo solo ejemplos de M datos (donde N \ne M). Y averiguar si lo puede hacer mejor que una red LSTM (que es la mejor técnica conocida). Ponen a prueba una MTN y una red LSTM ante las siguientes tareas:

  • Copiar secuencias de N vectores binarios en la salida.
  • Copiarlos repetida y periódicamente.
  • Recuperar información asociada al ítem pasado. Se le muestra una secuencia de ítems (es un conjunto de vectores binarios), después se le muestra uno de los ítems elegido aleatoriamente, y se le pide que recupere el siguiente ítem correspondiente a la secuencia mostrada al inicio.
  • Modelar probabilísticamente un N-grama dinámico [6]. Se le presenta una secuencia de N-1 bits y la maquina debe aprender un modelo probabilístico para predecir el N-simo bit. La probabilidad es cambiante, así que el modelo debe adaptarse.
  • Ordenar datos de acuerdo con una clave de prioridad.

En todos los experimentos, la MTN aprendió “más rápido” que una red LSTM (es decir, en un número menor de iteraciones; en tiempo no necesariamente es más rápido porque las iteraciones en la MTN podrían tardan más). En comparación con una red LSTM,  la MTN generaliza con menos errores los programas aprendidos cuando se incrementa el número de datos de entrada. Por último, el número de parámetros que necesitó una MTN en comparación con una red LSTM, es mucho menor. Lo cual puede explicar porque el aprendizaje era “más rápido” en la MTN. Sin embargo, NO queda claro cuánto tiempo se necesitó para entrenar la MTN y la LSTM en cada tarea.

Además, se averiguó en cada tarea, si una red de propagación hacia adelante podría ser mejor controlador que una red LSTM. En la mayoría de las tareas, la MTN con el controlador LSTM supero en velocidad de aprendizaje, pero con muy poca diferencia en cantidad de errores después converger.

6 Conclusión

Los autores han mostrado que la MTN puede aprender programas sencillos (copiar, ordenar, predecir y recuperar datos) a partir de ejemplos de entrada y salida; también que los aprende más rápido que una red LSTM y que puede generalizar esos programas a un mayor número de datos de entrada. Todo esto con un número menor de parámetros de aprendizaje a ajustar que una red LSTM. Lo cual es magnífico. Sin embargo, la MTN aún necesita demostrar que puede aprender programas más complejos a partir de ejemplos sin programadores humanos; y que puede reducir los errores en sus programas al grado que sea práctico usarla. Está abierto aun conocer, cuál es su poder computacional en la práctica y en la teoría.

Creo que las MTNs son un campo fascinante de exploración científica para extender nuestras capacidades tecnológicas: imaginen computadoras que se auto-programan con base en su experiencia (datos recolectados). Es una meta ambiciosa y poco realista en este momento, pero es estimulante intelectualmente.  Si usted llego hasta aquí leyendo, por favor, no dude en leer el artículo original; no se conforme con este resumen comentado en español.

Glosario

[0] La máquina de Turing convencional consiste en una memoria, cabezales de lectura y escritura, un registro de estado y un conjunto de instrucciones que dirigen el estado, que se lee y que se escribe en la memoria.  Este dispositivo debe ser programado por un ser humano para realizar tareas de manera automática.

[1] La memoria de trabajo es un concepto que los psicólogos usan para explicar la manipulación de información en memoria de corto plazo en las tareas que realizan los seres humanos y animales.

[2] La redes neuronales recurrentes son conjuntos de neuronas dinámicas cuya salida depende del estado de las neuronas y de la entrada. Esto permite que puedan procesar información dependiendo del contexto actual. Las redes neuronales multicapa Perceptron o las redes convolucionales no pueden hacer esto ya que carecen de un estado.

[3] El método del descenso por gradiente es un método de optimización muy popular y útil para entrenar redes neuronales que ajusta los pesos sinápticos.

[4] Las redes neuronales de propagación hacia adelante son redes neuronales sin memoria como las redes perceptron multicapa. El término “propagación hacia adelante” proviene del término en inglés “feedforward”.

[5] La red LSTM (Long Short-Term Memory) es un tipo de neurona que tiene un estado interno que evoluciona con el tiempo, permitiéndole aprender relaciones entre datos presentados a la neurona en el pasado y los del presente. Así es que su respuesta está condicionada al contexto de su pasado, y no solo a las entradas presentes.

[6] Un N-grama es un secuencia contigua de N ítems; pueden ser números, palabras, letras, etc. Por ejemplo, “1,3,5,7,9” es un 5-grama.

Referencias

[Graves, et al. 2014] Graves, et al. “Neural Turing Machine”.http://arxiv.org/abs/1410.5401

[Graves, 2013] “Generating sequences with recurrent neural networks”, arXiv preprint http://arxiv.org/abs/1308.0850.