You are on page 1of 186

ii

Universidad de Costa Rica Facultad de Ingeniera Escuela de Ingeniera Elctrica

IE 0502 Proyecto Elctrico

Diseo e implementacin de un vehculo no tripulado guiado por GPS y su controlador

Por: Esteban J. Alvarado Senz

Ciudad Universitaria Rodrigo Facio Julio del 2008

iii

Diseo e implementacin de un vehculo no tripulado guiado por GPS y su controlador


Por: Esteban J. Alvarado Senz

Sometido a la Escuela de Ingeniera Elctrica de la Facultad de Ingeniera de la Universidad de Costa Rica como requisito parcial para optar por el grado de: BACHILLER EN INGENIERA ELCTRICA Aprobado por el Tribunal:

_________________________________ Ing. Peter B. Zeledn Mndez Profesor Gua

_________________________________ Ing. M.Sc. Ismael Mazn Gonzlez Profesor lector

_________________________________ Ing. M.Sc. Geovanny Delgado Profesor lector

iv

DEDICATORIA
Quiero dedicar este proyecto en primera instancia a Dios todopoderoso, quien me ha acompaado durante esta larga travesa; no slo en lo que concierne al proyecto, sino en lo que representa, mi realizacin como Ingeniero Elctrico. A mis padres, quienes sin cuestionamiento y con mucho sacrificio, me han apoyado durante toda mi vida, con tal de ayudarme a alcanzar mis metas. Papi, Mami, no existen palabras para manifestarles mi gratitud, ustedes me han concedido un regalo muy valioso, una gran disciplina en los estudios, la cual desde pequeo me fue inculcada y hoy en da muestra una vez ms sus frutos. El inmenso amor que me tienen, me hace valorar lo privilegiado que soy de contar con unos padres admirables; por eso y ms, esto es por ustedes. A mi familia en general, porque ninguno escapa de haberme brindado un enorme apoyo durante este proyecto. Pero quiero dedicrselo especialmente a mi abuelita Marielos, quien siempre estuvo atenta a las distintas dificultades que se afrontaron. A Laura Rodrguez Molina. Lau, el apoyo emocional que me diste a lo largo de todo este proyecto es invaluable y digno de identificar como una bendicin ms de Dios en mi vida. Me ayudaste a buscar al Padre en esos momentos difciles que afront, por ello mil gracias.

RECONOCIMIENTOS
A mi to Luis Fernando Senz Snchez, por la orientacin que me proporcion acerca del funcionamiento del sistema de posicionamiento global y por todos los contactos y equipo electrnico que aport al proyecto. A Mauricio Rodrguez Carvajal por la invaluable ayuda que me brind durante todo el proyecto. Su gua y consejos fueron claves para poder superar los obstculos que se me presentaron. Sin dejar de lado, todo el equipo y las herramientas que gustosamente aport a la causa. A mi hermano Luis Diego Alvarado Senz, por su valiosa ayuda durante todas las pruebas de campo que se realizaron. Al seor Larry Stewart Postel, gerente general de la empresa Craisa S.A., quien muy amablemente prest el sistema de posicionamiento global, elemento indispensable para el proyecto. Al Ingeniero Peter Zeledn Mndez, por la confianza puesta en mi persona, a la hora de aceptar el reto que representaba ser el profesor gua de un proyecto que le fue propuesto, as como por sus consejos y apoyo brindados. Al profesor Roberto Rodrguez Rodrguez por los consejos proporcionados respecto al manejo del puerto serial en Linux.

vi

NDICE GENERAL
NDICE DE FIGURAS ................................ ................................ ................................ ........ix NDICE DE TABLAS................................ ................................ ................................ ........... xi NOMENCLATURA ................................ ................................ ................................ ............ xii RESUMEN................................ ................................ ................................ ......................... xiii CAPTULO 1: Introduccin................................ ................................ ................................ ..1
1.1
1.1.1 1.1.2

Objetivos ................................ ................................ ................................ ........................... 3


Objetivo general ..........................................................................................................................3 Objetivos especficos ..................................................................................................................3

1.2
1.2.1 1.2.2

Levantamiento de requerimientos ................................ ................................ .................. 4


Requerimientos del vehculo ....................................................................................................... 4 Requerimientos del software a desarrollar ..................................................................................6

1.3

Metodologa ................................ ................................ ................................ ...................... 7

CAPTULO 2: Desarrollo terico ................................ ................................ ....................... 10


2.1
2.1.1 2.1.2

Antecedentes histricos................................ ................................ ................................ .. 10


DARPA Autonomous Land Vehicle (ALV) .............................................................................11 Rovers planetarios.....................................................................................................................13

2.2
2.2.1

Definicin de robot ................................ ................................ ................................ ......... 14


Robots mviles..........................................................................................................................15

2.3 2.4

Elementos de un robot ................................ ................................ ................................ ... 16 Programacin de un robot................................ ................................ ............................. 16

2.4.1 Programacin por guiado .......................................................................................................... 17 2.4.2 Programacin textual ................................................................................................................18 2.4.2.1 Nivel robot............................................................................................................................18 2.4.2.2 Nivel objeto ..........................................................................................................................18 2.4.2.3 Nivel tarea ............................................................................................................................18

2.5

Sistema de Posicionamiento Global (GPS)................................ ................................ ... 19


Segmento espacial.....................................................................................................................20 Seal GPS.............................................................................................................................21 Segmento de Control.................................................................................................................21 Segmento de usuario .................................................................................................................22 Principios de Funcionamiento del GPS.....................................................................................22 Medicin de la Distancia...........................................................................................................26 Sincronizacin del tiempo......................................................................................................... 27 Fuentes de error.........................................................................................................................31 Relojes de los satlites.......................................................................................................... 31 Errores de rbita ...................................................................................................................32 Atmsfera terrestre ...............................................................................................................32 Multitrayectoria ....................................................................................................................33

2.5.1 2.5.1.1 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.7.1 2.5.7.2 2.5.7.3 2.5.7.4

vii

2.5.7.5 Geometra satelital................................................................................................................33 2.5.7.6 Receptores de GPS ...............................................................................................................34 2.5.7.7 Disponibilidad selectiva (Selective Availability S/A)..........................................................35 2.5.8 Correccin diferencial ...............................................................................................................35 2.5.9 Resumen de los factores que se deben considerar al utilizar un GPS ....................................... 37 2.5.9.1 Nmero de satlites visibles ................................................................................................. 37 2.5.9.2 Dilucin de la Precisin Posicional (PDOP) ........................................................................ 38 2.5.9.3 Relacin seal- ruido (S/N) .................................................................................................. 38 2.5.9.4 Elevacin ..............................................................................................................................38 2.5.9.5 Factores ambientales ............................................................................................................39

CAPTULO 3: Diseo, construccin y descripcin general del vehculo ......................... 40


3.1 3.2
3.2.1 3.2.2 3.2.3 3.2.4 3.2.5

Diseo y construccin del vehculo ................................ ................................ ............... 40 Descripcin general del vehculo................................ ................................ ................... 44
La estructura..............................................................................................................................44 Sistema de transmisin..............................................................................................................44 Sistema sensorial.......................................................................................................................45 Sistema de control .....................................................................................................................46 Sistema de alimentacin............................................................................................................48

CAPTULO 4: Desarrollo de un algoritmo para la creacin de rutinas de desplazamiento del vehculo................................. ................................ ................................ .......................... 49
4.1 4.2 4.3 Software desarrollado para el ajuste y mantenimiento del vehculo ......................... 49 Software desarrollado para el trazado de rutas al vehculo ................................ ....... 50 Resultados obtenidos durante la primera etapa de programacin ............................ 56

CAPTULO 5: Desarrollo e implementacin de un algoritmo de navegacin para el vehculo basado en la informacin del punto destino y de la ubicacin actual. ............... 57
5.1 5.2 5.3 Ubicacin en un cuadrante imaginario ................................ ................................ ........ 57 Descripcin del cdigo fuente................................ ................................ ........................ 68 Resultados obtenidos en la segunda etapa de desarrollo de software........................ 71

CAPTULO 6: Conclusiones y recomendaciones ................................ .............................. 73


6.1 6.2
6.2.1

Conclusiones ................................ ................................ ................................ ................... 73 Recomendaciones ................................ ................................ ................................ ........... 75
Recomendaciones generales...................................................................................................... 76

BIBLIOGRAFA................................ ................................ ................................ .................. 78 APNDICES................................ ................................ ................................ ........................ 80


Apndice 1: Planos de diseo del armazn del vehculo ................................ .......................... 81 Apndice 2: Cdigo ProyectoGPS.exe ................................ ................................ ....................... 88 Apndice 3: Cdigo Progps1 ................................ ................................ ................................ .... 100 Apndice 4: Cdigo ProGPSfinal................................ ................................ ............................. 118

viii

Apndice 5: Disco Compacto con los videos, planos de diseo y cdigo fuente ................... 160

ANEXOS ................................ ................................ ................................ ............................ 162


Glosario ................................ ................................ ................................ ................................ ...... 163 Null Modem ................................ ................................ ................................ ............................... 165 RMC (Recommended Minimum Specific GPS/Transit Data) ................................ .............. 167 Hojas de Fabricante ................................ ................................ ................................ .................. 168

ix

NDICE DE FIGURAS
Figura 2.1 Procedimiento para ubicar un bote en el mapa de un lago ............................. 24 Figura 2.2 Posibles dos ubicaciones del receptor a partir de 3 mediciones satelitales .....25 Figura 2.3 Seales de reloj del receptor y del satlite ................................ ........................ 26 Figura 2.4 Receptor sincronizado con los satlites genera una posicin X ...................... 28 Figura 2.5 Receptor des-sincronizado con los satlites genera una posicin XX ............. 28 Figura 2.6 Ejemplo en dos dimensiones de receptor sincronizado con los satlites ......... 29 Figura 2.7 Ejemplo de correccin de desincronizacin (Tanteo)................................ ......29 Figura 2.8 Ejemplo de multitrayectoria ................................ ................................ .............. 33 Figura 2.9 Geometra satelital (Los satlites deben estar lo ms alejados posible para obtener una buena precisin) ................................ ................................ .............................. 34 Figura 2.10 Correccin diferencial................................ ................................ ..................... 36 Figura 2.11 Seal correctora Beacon ................................ ................................ ................. 37 Figura 2.12 Seal satelital (Satlite Geoestacionario) ................................ ....................... 37 Figura 3.1. Transformacin sufrida por el vehculo 4X4 a escala donado al proyecto ....41 Figura 3.2. Foto del servo controlador utilizado en el proyecto. ................................ ....... 42 Figura 3.3 Fotografa de la antena y recibidor GPS utilizados en el proyecto ................. 45 Figura 4.1 Ventana del programa ProyectoGPS.exe (Escogiendo el puerto serial) ......... 49 Figura 4.2 Zoom a la ventana del programa ProyectoGPS.exe (Seleccionando COM1 como puerto serial) ................................ ................................ ................................ .............. 50 Figura 4.3 Fragmento de la ejecucin de Progps1 (Rutina de apagado) .......................... 53 Figura 4.4 Inicio de la ejecucin del programa Progps1 ................................ ................... 54 Figura 4.5 Ejecucin del programa Progps1 (Opciones de ruta) ................................ ......55 Figura 4.6 Ejecucin del programa Progps1 (Presentacin de la ruta seleccionada y ejecucin de la misma)................................ ................................ ................................ ......... 55 Figura 4.7 Ejecucin del programa Progps1 (Rutina de apagado y fin d el programa) ...55 Figura 5.1 Principio del arco producto de un desplazamiento sobre una circunferencia 59 Figura 5.2 Mapamundi (Ubicacin de Amrica Central en el planeta Tierra) ................ 60 Figura 5.3 Cuadrante imaginario cuyo centro es el punto destino ................................ ...61

Figura Apndice 1-1 Vista superior del armazn utilizado para instalar los componentes electrnicos sobre el vehculo ................................ ................................ .............................. 82 Figura Apndice 1-2 Vista lateral del armazn utilizado para instalar los componentes electrnicos sobre el vehculo ................................ ................................ .............................. 83 Figura Apndice 1-3 Vista frontal del armazn utilizado para instalar los componentes electrnicos sobre el vehculo ................................ ................................ .............................. 83 Figura Apndice 1-4 Vista superior del armazn utilizado para instalar los componentes electrnicos sobre el vehculo y de la unin al sistema de suspensin de los motores del vehculo ................................ ................................ ................................ ................................ 84 Figura Apndice 1-5 Vista lateral del armazn utilizado para instalar los componentes electrnicos sobre el vehculo y de la unin al sistema de suspensin de los motores del vehculo ................................ ................................ ................................ ................................ 85 Figura Apndice 1-6 Vista frontal del armazn utilizado para instalar los componentes electrnicos sobre el vehculo y de la unin al sistema de suspensin de los motores del vehculo ................................ ................................ ................................ ................................ 86 Figura Apndice 1-7 Dimensiones de las piezas utilizadas para unir el armazn utilizado para instalar los componentes electrnicos sobre el vehculo y el sistema de suspensin de los motores del vehculo ................................ ................................ ................................ ..87 Figura A.1 DB-9 macho ................................ ................................ ................................ ....165 Figura A.2 DB-9 hembra................................ ................................ ................................ ...166

xi

NDICE DE TABLAS
Tabla A.1 Conexin Null-Modem ms comn ................................ ................................ .165 Tabla A.2 Campos del mensaje RMC................................ ................................ ................ 167

xii

NOMENCLATURA
AgGPS Familia de GPS fabricados por Trimble utilizados en agricultura de

precisin (Agriculture GPS) BEC Battery Elminator Circuit Agencia de Investigacin de Proyectos Avanzados de Defensa European Geostationary Navigation Overlay Service

DARPA EGNOS ESC ES GPS IA

Control electrnico de velocidad Entrada/Salida Sistema de posicionamiento global Inteligencia Artificial Microsoft Comm Control Navigation System and Ranging

MSComm NAVSTAR

NMEA National Marine Electronics Association PWM Pulse Wide Modulation RMC Recommended minimum data for gps TSIP Trimble Standard Interface Protocol

UHF Frecuencia ultra alta UTP Par trenzado no reforzado

WAAS Wide Area Augmentation System

xiii

RESUMEN
El proyecto consisti en el diseo, construccin e implementacin de un vehculo no tripulado guiado por GPS. La seccin de programacin del proyecto se dividi en dos mdulos o etapas. La primera etapa consisti en desarrollar un software que permitiera al usuario asignarle rutinas al vehculo. Este programa luego fue utilizado para crear las 10 rutinas de

desplazamiento que se utilizaran posteriormente. En la segunda etapa se realiz un manejo de la informacin que proporciona el sistema de posicionamiento global. Se desfragment la cadena de caracteres enviada, se almacen la informacin y se aplicaron los clculos necesarios para darle utilidad a la informacin. Adems se desarroll un algoritmo que permitiera a partir de las coordenadas de la ubicacin anterior, la ubicacin actual y el punto destino, determinar el cuadrante alrededor del destino en que se encontraba el vehculo, orientarlo y por ltimo aproximarlo hasta alcanzar el objetivo. El proyecto concluye con la fusin de estos dos mdulos, obteniendo as un vehculo capaz alcanzar su destino con una precisin de hasta 1m, y todo gracias a la teora del nuevo cuadrante desarrollada durante este proyecto.

CAPTULO 1: Introduccin
A raz de la latente necesidad en la que se ven inmersos diversos proyectos (infraestructura, energa, hidrocarburos y turismo) en Costa Rica de encontrar una alternativa nacional para realizar levantamientos tridimensionales de terreno y as reducir al mnimo los costos de este tipo de estudios, es que este proyecto naci como una posible solucin. Dado que la meta a alcanzar posea dimensiones fuera del alcance de un proyecto de bachillerato; como es el caso, se decidi plantear una propuesta en dos dimensiones (vehculo terrestre), la cual ser til para iniciar el desarrollo, adems de que se podr anticipar y solucionar posibles problemas que se puedan presentar tambin en tres dimensiones (vehculo areo). Se construy un vehculo o rover; como tambin se le conoce a este tipo de robots, que satisficiera los siguientes requerimientos: capacidad de transporte de carga, cuatro ruedas que aportaran mayor estabilidad y agarre con el terreno, capacidad de avance y retroceso, capacidad de freno y por ltimo traccin en las cuatro ruedas. El elemento principal en el sistema de navegacin desarrollado es un sistema de posicionamiento global o GPS; por sus siglas en ingls, el cual hace uso de una constelacin de satlites para determinar su posicin actual. Para poder conducir a buen trmino este proyecto, se debi iniciar por una investigacin profunda acerca de los vehculos no tripulados, as como del funcionamiento de un sistema de posicionamiento global.

Seguido a esto se establecieron los requerimientos y objetivos que se cumpliran en este trabajo. El proyecto se dividi en dos mdulos o secciones. La primera etapa consisti en la construccin del armazn que soportara todo el equipo de control y de medicin, la unin del mismo a los motores y ruedas que le proporcionaran movimiento, la instalacin del equipo de control del vehculo; as como del servomotor de la direccin del rover, y por ltimo una investigacin acerca del manejo del puerto serial, la cual culmina con la implementacin de un algoritmo que permitiera trazar rutinas para el robot. En el segundo mdulo se desarroll un algoritmo que permitiera hacer uso de la cadena de caracteres que enviaba el sistema de posicionamiento global para determinar la posicin actual, y que a partir de esta, la posicin destino y la posicin anterior, se determinara mediante una serie de posibilidades la rutina que se deba ejecutar para as alcanzar el objetivo. El proyecto concluye al fusionar estas dos etapas y realizar las correspondientes pruebas de campo que determinaron que en condiciones ptimas de clima y entorno, el vehculo es capaz de alcanzar su objetivo con una precisin de tres metros. De modo que haciendo entrega de las bases, se espera que tanto la investigacin como el desarrollo, logren captar la atencin de la comunidad estudiantil de la Escuela de Ingeniera Elctrica como de personas en general inmersas en el campo de la robtica, para que en un futuro prximo se le de seguimiento y as materializar una idea; que como todas aquellas que llegaron a ser grandes inventos para la humanidad, al inicio parecan imposibles de realizar.

1.1
1.1.1 1.1.2

Objetivos
Objetivo general Disear, construir e implementar un vehculo no tripulado guiado por GPS. Objetivos especficos Realizar un levantamiento de requerimientos tanto para el vehculo como para el software a desarrollar. Investigar sobre vehculos no tripulados, sus principales caractersticas y la evolucin que han tenido. Investigar acerca del funcionamiento del Sistema de Posicionamiento Global. Disear y construir un vehculo de acuerdo a especificaciones. Crear un medio de comunicacin entre el vehculo y la computadora de mando, que permita adquirir la informacin del estado del robot y enviar instrucciones al mismo. Desarrollar un algoritmo de comunicacin entre la computadora de mando y el controlador del robot, as como una interfaz con el usuario que facilite la creacin de rutinas para el vehculo. Utilizar un sistema GPS como elemento bsico en el sistema de navegacin del vehculo. Descargar la informacin del GPS para su procesamiento en una computadora de mando externa. Desarrollar un algoritmo de navegacin para el vehculo basado en la informacin del punto destino y de la ubicacin actual. Realizar pruebas de campo.

1.2
1.2.1

Levantamiento de requerimientos
Requerimientos del vehculo Una de las principales caractersticas que deber poseer el vehculo es capacidad

para transportar todo el equipo de control, alimentacin y de posicionamiento global, por lo que su diseo girar en torno al peso del equipo de GPS y la alimentacin, debido a que el peso del equipo de control generalmente resulta insignificante. Adicionalmente la potencia de los motores a escoger debe ser la adecuada para que el rover pueda desplazarse sin problemas. Con el objetivo de otorgarle al vehculo la mayor estabilidad y agarre al suelo posible; de modo que este pueda desplazarse casi por cualquier tipo de terreno, un diseo de cuatro ruedas es la mejor opcin. Otro factor importante es que el vehculo debe ser capaz de circular en cualquier tipo de terreno, por lo que la altura de las llantas y de sus ejes, as como una traccin en las cuatro ruedas, debe ser tomada en cuenta a la hora del diseo del mismo. Debido a que el vehculo debe maniobrar para adoptar distintas orientaciones y posiciones; pero sin que esto altere su ubicacin actual, deber poseer capacidad de avance tanto en retroceso como hacia adelante. Adicionalmente, la presencia de un sistema de frenado; ya fuera inherente a los motores o un diseo propio, es imprescindible para que las rutinas de desplazamiento predefinidas, no dependan del tipo y/o inclinacin del terreno en que navegue el vehculo.

Seguidamente, se debe disear o adquirir un pequeo y sencillo circuito que sea capaz de controlar la direccin del giro de los motores que mueven las llantas del vehculo, as como de proporcionar diferentes velocidades en ambos sentidos de giro. Una vez que el vehculo est en capacidad de desplazarse se procede a colocar el servomotor de la direccin. Para esto se ajustar una barra al eje de las llantas frontales, el cual funcionar como un volante. El otro extremo de la barra se fijar al servomotor, de modo que se pueda cambiar la direccin del movimiento con gran precisin. Un detalle muy importante es la fuente de energa del vehculo, ya que debido a que la autonoma es primordial, una alimentacin estacionaria, no es la mejor solucin, en vista del futuro que se le depara a este proyecto. Es por esto que la alimentacin debe ser portable, y liviana, por lo que se espera conseguir una batera de nquel-cadmio que satisfaga las necesidades de los motores presentes. Con el objetivo de controlar los servomotores, se debe encontrar algn tipo de controlador interfaz perifrico, que permita manipularlos desde una computadora externa. Se espera que el mismo sea adquirido con algn tipo de software que facilite la comunicacin entre la computadora y el procesador, evitando as problemas que puedan proceder a la hora del manejo de los puertos perifricos de la computadora. Luego se debe conseguir un receptor de seales satelitales de posicionamiento global, el cual debe ser capaz de realizar un procesamiento interno de datos en tiempo real, y entregar informacin de utilidad a la computadora de mando. Debido a posibles fluctuaciones de la carga que puedan afectar al sistema GPS, y al tamao fsico que debera tener una batera que sea capaz de alimentar a los motores y al

sistema de posicionamiento global al mismo tiempo, se recomienda seleccionar una fuente de alimentacin independiente para este ltimo. 1.2.2 Requerimientos del software a desarrollar Puesto que se espera que un gran porcentaje de este proyecto sea reutilizado en el desarrollo de una etapa area, el software desarrollado deber procesar y almacenar toda la informacin proveniente del sistema de posicionamiento global, a pesar de que esta no tenga uso para este proyecto en particular. Adems los clculos realizados para averiguar distancias, debern realizarse de modo que puedan ser utilizados en tres dimensiones tambin. La importancia de utilizar una computadora de mando externa y por lo tanto un software adecuado para esta, se debe a que se estima que la etapa area; dado que tiene que almacenar tanto los datos de posicin como las caractersticas del suelo sobrevolado, necesitar de una gran capacidad de almacenamiento de datos. Tan pronto se haya instalado el controlador de los servomotores y este funcione correctamente, se deber proceder a establecer una comunicacin One way desde la computadora de mando hasta el rover; utilizando un lenguaje de programacin flexible, y as crear la primera versin del programa de mando. Esta versin contendr todas las clases y funciones necesarias para indicarle una ruta al vehculo, las cuales sern usadas ms adelante en futuras versiones. Esta ruta deber tener la caracterstica de ser de un tamao indefinido y funcionar como un buffer.

Despus de instalar el receptor GPS, se debe asegurar una comunicacin entre la computadora externa y el mismo, agregando nuevas funciones al programa de mando, con las que se pueda procesar la informacin suministrada por la unidad de posicionamiento global. Con la informacin de posicionamiento global disponible, se debe investigar y desarrollar una forma en la que a partir de la ubicacin actual del vehculo y el punto destino, se pueda alcanzar este ltimo de una forma prctica y sencilla. Una vez que se tenga cuente con el programa base completo, se deben realizar varias pruebas de campo, que permitan constatar el xito del proyecto.

1.3

Metodologa
A continuacin se enumeraran los pasos que se debieron tomar para alcanzar todos

los objetivos del proyecto en discusin: 1. Se realiz una investigacin acerca de los antecedentes de los vehculos terrestres no tripulados, con el objetivo de determinar cules eran las caractersticas esenciales de los mismos y poder aplicarlas luego en el diseo. 2. Seguidamente se efectu otra investigacin acerca del funcionamiento del sistema de posicionamiento global con el objetivo de comprender mejor su funcionamiento y as facilitar el desarrollo de un futuro algoritmo que utilice la informacin proveniente del GPS para determinar las rutinas que debe efectuar el vehculo para alcanzar el destino.

3.

Luego se realiz un planteamiento de los requerimientos que deba satisfacer tanto el vehculo como el software a desarrollar, y a partir de esto se hizo un dise bastante simple de un rover que satisficiera todas las necesidades del proyecto.

4.

Una vez que se cont con este diseo, se procedi a buscar distintas piezas; por medio de donaciones, que se apegaran a la idea original y que con simples modificaciones se pudieran satisfacer los ya mencionados requerimientos.

5.

Tan pronto se construy el marco que iba a soportar todo el equipo de alimentacin, control y de GPS, se procedi a unirlo a los motores y ruedas que se encontraron .

6.

Se aprovech el sistema de direccin existente en las ruedas, por lo que slo se debi instalar un servomotor y una barra que transmitiera la fuerza en forma horizontal a alguna rueda (aleatoriamente se escogi la izquierda).

7.

Se instal el ESC (Electronic Speed Control), conectndolo directamente a la alimentacin de los motores de las ruedas.

8.

La fuente de energa porttil (batera de Ni/Cd) se instal en el rover y se conect al regulador de voltaje del ESC.

9.

El controlador de los servomotores se instal y se le conect la entrada de voltaje regulado proveniente del ESC, la salida PWM hacia el ESC, y el servomotor de la direccin.

10. Se realiz una investigacin a fondo sobre el manejo del puerto serial, la cual determin la necesidad de continuar todo desarrollo en una plataforma libre.

11. Se desarroll un programa que por medio del puerto serial, se pudiera comunicar con el controlador de los servomotores y que adems permitiera al usuario definir rutinas al robot. 12. Se instal el Sistema de Posicionamiento Global. 13. Adicionalmente se tuvo que instalar una fuente de energa independiente para el GPS. 14. Se inici un desarrollo de software orientado a adquirir la informacin proveniente del GPS, desfragmentarla y almacenarla para su posterior uso. 15. Una vez que se cont con la informacin de posicin geogrfica, se desarroll un algoritmo que a partir de la ubicacin anterior, de la ubicacin actual y del punto destino, permitiera al robot orientarse y aproximarse hacia el destino. 16. Luego se fusion el programa que controlaba los motores del vehculo, con el programa que adquira la informacin de posicionamiento global y que adems permita al rover tomar decisiones para aproximarse al destino. 17. Se definieron 10 rutinas de desplazamiento que permiten al robot orientarse y aproximarse hacia el destino. 18. Se realizaron distintas pruebas de campo.

10

CAPTULO 2: Desarrollo terico


2.1 Antecedentes histricos
La comunidad acadmica usualmente se refiere a los vehculos terrestres no tripulados que posean habilidades autnomas significativas, como robots mviles. Existe una cierta irona en esta terminologa, dado que muchas de estas investigaciones claves dirigidas a la robtica tradicional (orientada al control de manipuladores industriales) son completamente irrelevantes para los robots mviles. Poseen cierta similitud en temas relacionados al planeamiento de la trayectoria, evasin de obstculos y control basado en sensores, pero los resultados han tendido a fluir ms desde los robots mviles a los manipuladores, que en la otra direccin. De hecho, el nfasis de las investigaciones en robtica mvil ha evolucionado desde la disciplina de la inteligencia artificial (IA). El primer gran esfuerzo en el desarrollo de un robot mvil fue Shakey, el cual fue desarrollado a finales de 1960 para fungir como una plataforma de pruebas para las investigaciones sobre IA promovidas por DARPA en el Instituto de Investigacin de Stanford. Shakey era una plataforma sobre ruedas equipada con una cmara de televisin giratoria, sensores snicos de proximidad, sensores de contacto, conectados mediante un enlace RF a su computadora central (una SDS-940), la cual se encargaba de la navegacin y de las tareas de exploracin. Como plataforma de pruebas en IA, el sistema Shakey poda recibir varias instrucciones desde la terminal del operador, las cuales guiaban al robot para empujar largos bloques de madera alrededor del ambiente de su mundo laboratorio. A pesar de que fue considerado un fracaso en su poca porque nunca logr una operacin

11

autnoma, el proyecto estableci las bases funcionales y de desarrollo para los robots mviles, localizando las deficiencias tecnolgicas, y contribuyendo a orientar la agenda de investigacin de la IA en reas como planeamiento, visin y procesamiento del lenguaje natural. Desde 1973 hasta 1981, Hans Moravec condujo el proyecto titulado Vehculo Stanford, en el laboratorio de Inteligencia Artificial de la Universidad de Stanford, donde se trat temas como la navegacin de exploracin y la evasin de obstculos utilizando un sofisticado sistema de visin estreo. La nica cmara de televisin era girada a cualquiera de las 9 diferentes posiciones gracias a su base giratoria, y las imgenes obtenidas eran procesadas por la computadora central KL-10 que no viajaba en el carro por razones obvias de dimensin y peso de la misma. La extraccin de objetos y la correlacin entre las imgenes permitieron reconstruir un modelo de la imagen tridimensional, el cual fue utilizado para planear un camino libre de obstculos hacia el destino. El sistema era increblemente lento, tomaba 15 minutos para realizar un desplazamiento de un metro. Moravec se traslad a la Universidad de Carnegie Mellon (CMU) en 1981 y continu su trabajo en el pequeo CMU Rover. Esta universidad se convirti en el principal lder en investigaciones sobre robots mviles; durante la dcada de los ochentas, con su vehculo Navlab el cual fue reflejo del arduo trabajo 2.1.1 DARPA Autonomous Land Vehicle (ALV) El desarrollo patrocinado por DARPA conocido como Robots mviles como un campo de aplicacin para la demostracin de IA y alto rendimiento en tcnicas de

12

procesamiento, que fue iniciado al final de la dcada de los sesentas con Shakey, reemergi en los inicios de los ochentas como la DARPA Autonomous Land Vehicule (ALV). Bajo el procesamiento estratgico de DARPA (conocido como SC por sus siglas en ingls), el ALV funcion como uno de varios proyectos cuya meta era proveer un ambiente de tareas realistas para la investigacin tecnolgica. Otras aplicaciones del SC incluy la administracin del centro de combate de una flota naval estadounidense (FCCBMP), la conduccin de un combate areo-terrestre de la armada estadounidense (ALBM) y el conocido Relacin Piloto (PA) que consista en una especie de piloto automtico para aeronaves de la fuerza area estadounidense que se dividi en dos objetivos: misiones aire-aire y misiones aire-tierra. El ALV se construy sobre un vehculo de ocho ruedas dirigido hidrostticamente, capaz de alcanzar velocidades de hasta 72 km/h en una autopista y de hasta 29 km/h en un terrero difcil. El ALV poda cargar seis estantes de equipo electrnico dentro de un ambiente con aire acondicionado libre de polvo y obtener energa desde su fuente auxiliar de energa diesel de 12 kW. El equipo de sensores consista en una cmara de video a color y un escner lser provisto por el Instituto de Investigaciones del Medio Ambiente de Michigan (ERIM), el cual devolva una imagen de 64x256 pxeles a un intervalo de 1-2 segundos. Los mdulos de procesamiento de informacin de video y de alcance producan informacin a nivel del borde del camino, que era utilizada para generar un modela de la escena en frente. Un mayor nivel de razonamiento fue desarrollado por los mdulos de bsqueda de objetivos y de navegacin, los cuales pasaban luego la ruta deseada al mdulo del piloto que en realidad manejaba al vehculo. Martn Marieta; el contratista de

13

integracin, incorpor mdulos funcionales proporcionados por otros desarrolladores de tecnologa de DARPA, incluyendo al Laboratorio de Investigacin Hughes, la Universidad Carnegie-Mellon y la Universidad de Maryland. Las demostraciones del ALV; sobre el seguimiento de un camino, iniciaron en 1985 a 3km/h sobre un camino recto de 1 km, luego mejoraron en 1986 a 10 km/h sobre un camino de 4,5 km con curvas pronunciadas y con tipos variables de pavimento, y en 1987 a un promedio de 14,5 km/h (mximo 21 km/h) sobre un trayecto de 4,5 km a travs de varios tipos de pavimentos, anchos de camino y sombras, mientras se evadan obstculos. Tambin en 1987, se demostr el trnsito guiado por visin sobre un camino de tierra, a lo largo de un trayecto de 0,6 km, a velocidades de 3 km/h, sobre terreno cambiante mientras se evadan zanjas, piedras, rboles y otros pequeos obstculos. El enfoque del programa ALV fue modificado en 1988 de demostraciones ntegras de aplicaciones militares a soporte de experimentos cientficos para la navegacin en terrenos fuera de carretera. El programa de la divisin del ejrcito de los Estados Unidos de Norteamrica Tank-Automotive Command (TACOM)/ DARPA Advanced Ground Vehicle Techonology (AGVT), adapt tcnicas de navegacin desarrolladas bajo el programa del ALV, a vehculos militares que estuvieran mejor capacitados para aplicaciones militares. 2.1.2 Rovers planetarios El uso de vehculos robticos no tripulados reducen drsticamente el costo de la exploracin espacial al ser comparados con viajes espaciales tripulados, dado que los robots pueden ser ms pequeos que los humanos, y al eliminar a los humanos tambin se elimina

14

la necesidad tanto del pesado y complicado equipo de soporte de vida, como de la gran confiabilidad en todos los subsistemas crticos de seguridad. El desarrollo patrocinado por la NASA de vehculos no tripulados para explorar superficies planetarias inici con el JPL (Jet Propulsion Laboratory) Mars Rover, en los inicios de la dcada de los setenta. El programa fue clausurado en 1979 y luego retomado en 1986-1987. El objetivo era proveer una navegacin sobre la superficie marciana de hasta 10km por da con una autonoma parcial, recolectando muestras mientras es dirigido desde la tierra. El retraso de la propagacin de la velocidad de la luz inherente a las transmisiones interplanetarias reduce los tipos de estrategias de control que se pueden utilizar en estos sistemas. A pesar de que carecen de los recursos del gobierno estadounidense para poner hombres sobre la Luna, Rusia ha tenido un activo programa de rovers planetarios, por ejemplo en la Luna con el Lunokhod y en Marte con el Marsokhod.

2.2

Definicin de robot
De manera complementaria es importante establecer una definicin de robot, la cual

se encontrar de manera implcita cada vez que se haga referencia a dicho dispositivo y sobre la cual se establecern todas las acciones a desarrollar. Por tanto, la definicin de robot a utilizar es la suministrada por la Asociacin Francesa de Normalizacin (AFNOR), la cual define primero el manipulador y luego al robot como sigue 1:
1

Barrientos A. Et al. Fundamentos de robtica. 1 ed. McGraw, Madrid, Espaa, 1997, pg 10.

15

Manipulador: mecanismo formado generalmente por elementos en serie, Es

articulados entre s, destinado al agarre y desplazamiento de objetos.

multifuncional y puede ser gobernado directamente por un operador humano o mediante un dispositivo lgico. Robot: manipulador automtico servocontrolado, reprogramable,

polivalente, capaz de adoptar posiciones y orientar piezas tiles o dispositivos especiales, siguiendo trayectorias variables reprogramables, para la ejecucin de tareas variadas. Normalmente tiene la forma de uno o varios brazos terminados en una mueca. Su unidad de control incluye un dispositivo de memoria y

ocasionalmente de percepcin del entorno. Normalmente su uso es el de realizar una tarea de manera cclica, pudindose adaptar a otra sin cambios permanentes en su material. 2.2.1 Robots mviles Los robots mviles son aquellos que estn provistos de patas, ruedas u orugas que los capacitan para desplazarse de acuerdo a su programacin. Elaboran la informacin que reciben a travs de sus propios sistemas de sensores y se emplean en determinado tipo de instalaciones industriales, sobre todo para el transporte de mercancas en cadenas de produccin y almacenes. Tambin se utilizan robots de este tipo para la investigacin en lugares de difcil acceso o muy distantes, como es el caso de la exploracin espacial y de las investigaciones o rescates submarinos.

16

2.3

Elementos de un robot
Todos los robots son sistemas, es decir, constan de componentes que forman un

todo. El sistema robtico se puede analizar de lo general a lo particular utilizando el anlisis sistemtico. El primer paso es considerar al sistema como una "caja negra", no se sabe qu hay en su interior, pero se puede identificar la entrada y salida del sistema. La entrada genuina al robot est constituida por las rdenes humanas; la salida est formada por diversos tipos de trabajo realizado automticamente. La segunda etapa o paso de anlisis es mirar dentro de la caja negra donde encontramos los subsistemas o unidades funcionales del robot. Cada unidad funcional realiza una funcin especfica y tiene su propia entrada y salida. Un robot est conformado por los siguientes elementos2: estructura mecnica, trasmisiones, sistema de accionamiento, sistema sensorial, sistema de control y elementos terminales.

2.4

Programacin de un robot
Para la entrada en funcionamiento de un determinado robot es necesario realizar una

rutina que ser la encargada de determinar los movimientos del mismo, siguiendo la tarea especfica para la cual el robot fue diseado. Por tanto, programar un robot consiste en la especificacin paso a paso de dicha rutina, siguiendo un sistema de programacin diseado para ese fin. Los sistemas de programacin existentes son tan variados como los robots que se pueden encontrar en la actualidad, es decir, no existe ningn tipo de normalizacin. Esto
2

Barrientos A. Et al. Fundamentos de robtica. 1 ed. McGraw, Madrid, Espaa, 1997, pg 15.

17

implica la no existencia de un procedimiento estndar a la hora de programar las rutinas que se desea que realicen los robots en un determinado proceso. Por el contrario, cada fabricante desarrolla un mtodo para sus propios robots. Sin embargo, los sistemas de programacin pueden ser sujetos a una clasificacin, la cual se basa en el sistema empleado al especificar la secuencia de acciones a realizar. En una el programador es el responsable de las acciones de control y de las instrucciones adecuadas que las implementan. En la otra se describe la tarea y el entorno, y el robot es el encargado de tomar sus propias decisiones. En este sentido se distinguen dos clases: programacin por guiado y programacin textual. 2.4.1 Programacin por guiado Consiste en guiar al robot a lo largo de la trayectoria llevndolo hasta los puntos deseados. De esta manera la unidad de control del robot guarda en memoria todos los puntos de la trayectoria que han sido obtenidos a travs de los sensores de posicin. Si el guiado del robot se hace de manera manual, es decir, si el programador toma la estructura del robot guindola a travs de la trayectoria deseada se habla de programacin por guiado pasivo. Existe adems una programacin guiada activa. Para esta se utiliza un dispositivo de enseanza comprendido por un sistema de accionamiento del robot, el cual est formado por botones, teclas, bastones de mando, etc. que se utilizan para realizar los movimientos necesarios que debe ejecutar luego el robot.

18

2.4.2

Programacin textual En este tipo de programacin la tarea que el robot debe realizar se indica mediante

un lenguaje de programacin especfico. La rutina queda establecida mediante un conjunto de textos de instrucciones o sentencias que son las encargadas de definir finalmente las acciones del robot. La programacin textual se clasifica en tres niveles: robot, objeto y tarea. 2.4.2.1 Nivel robot En este nivel se requiere programar todas las acciones a realizar por el robot, en cuanto al movimiento de sus articulaciones, velocidad, acciones de los elementos finales, orientacin espacial, etc. Para esto es necesario que la rutina total sea descompuesta en una serie de subrutinas de menor grado de complejidad. 2.4.2.2 Nivel objeto En este nivel de programacin textual las instrucciones comprendidas en el programa son realizadas en funcin de los objetos que el robot va a manipular. Para que las rutinas puedan ser llevadas a cabo, es necesario que las instrucciones a nivel de objeto sean generadas posteriormente a nivel robot, puesto que ste es quien finalmente realiza las acciones pertinentes. 2.4.2.3 Nivel tarea Este es el nivel en el que las instrucciones de programa se reducen a una nica sentencia, ya que lo que se hace es especificar cul es la tarea a realizar por el robot.

19

2.5 Sistema de Posicionamiento Global (GPS)


Un sistema de posicionamiento, como el nombre lo sugiere, es un mtodo para identificar y grabar; generalmente en forma electrnica, la ubicacin de un objeto o persona. Este sistema puede ser usado para registrar el recorrido de un vehculo a travs de la superficie terrestre, en el aire o en el espacio. El sistema de posicionamiento global; mejor conocido por su acrnimo en ingls (GPS: Global Positioning System), es un sistema de navegacin basado en satlites, creado y operado por el Departamento de Defensa de los Estados Unidos. Se inici a principios de los ochentas, pero fue declarado completamente operacional el 27 de Abril de 1995. Completamente operacional significa que el sistema puede ser usado para determinar la posicin de un receptor las 24 horas del da, en cualquier parte de la tierra. El sistema fue concebido originalmente como un auxiliar para la navegacin para las fuerzas militares de los Estados Unidos, pero hoy en da el GPS sirve tambin para fines industriales, comerciales y civiles. El servicio est disponible, en forma gratuita, las 24 horas del da y bajo cualquier condicin meteorolgica. Para describir mejor el sistema se lo puede dividir en tres partes: Segmento espacial Segmento de control Segmento de usuario

20

2.5.1

Segmento espacial Este segmento consiste de una constelacin de 24 satlites NAVSTAR

(NAVigation by Satellite Timing and Ranging). Con una rbita de 20200 km de altura sobre la superficie terrestre, cada satlite orbita la tierra 2 veces al da, o sea una vez cada 12 horas. Los 24 satlites se dividen en 6 rbitas con 4 satlites cada una. Esta distribucin particular garantiza que por lo menos 4 satlites estarn en lnea de vista de un receptor de GPS en cualquier parte del mundo durante todo el da. Los receptores deben ser capaces de recoger la seal satelital enviada a la tierra. Los satlites cuya seal puede ser recibida son aquellos que estn por sobre el horizonte. Cada satlite est equipado con receptores y emisores de ondas de radio que transmiten con una frecuencia de entre 1200-1600 MHz. Las ondas de radio viajan a la velocidad de la luz (300.000.000 m/s) en el vaco, y disminuyen su velocidad cuando atraviesan la atmsfera terrestre. Los satlites tambin estn equipados con relojes atmicos, que mantienen el tiempo con base en vibraciones naturales peridicas dentro de los tomos. Estos relojes increblemente precisos son un componente crtico que hacen posible el uso de satlites para navegacin y mapeo. Cada satlite cuenta con cuatro relojes, 2 de cesio y 2 de rubidio, a pesar de que uno sera suficiente, de esta forma se evita el riesgo de rotura o prdida de precisin por alguno de los relojes.

21

2.5.1.1 Seal GPS Los satlites GPS transmiten dos seales de radio de baja potencia, designadas L1 y L2. Los GPS civiles usan la frecuencia L1 de 1575.42 MHz en la banda UHF. L2 es utilizado por los militares y algunos receptores especializados de GPS y su frecuencia es de 1227.6 MHz. Las seales viajan a lo largo de la lnea de visin, es decir, pasarn a travs de nubes, vidrio y plstico pero no atravesarn la mayora de objetos slidos, tales como edificios y montaas. La seal GPS contiene tres bits diferentes de informacin: un cdigo pseudo aleatorio, informacin efmera e informacin de almanaque. El cdigo pseudo aleatorio es simplemente un cdigo de identificacin que identifica al satlite que est transmitiendo la informacin. La informacin efmera informa al receptor GPS la ubicacin de cada satlite GPS en todo momento a lo largo del da. Cada satlite transmite informacin efmera mostrando la informacin orbital de ese satlite y de todos los otros satlites en el sistema. La informacin calendario, que es transmitida constantemente por cada satlite, contiene informacin importante sobre el estado del satlite (saludable o no saludable), fecha y hora actuales. Esta parte de la seal es esencial para determinar la posicin. 2.5.2 Segmento de Control Los satlites son seguidos y monitoreados por varias estaciones ubicadas estratgicamente alrededor del mundo. Esta red de estaciones de monitoreo se denomina

22

generalmente segmento de control del GPS, y consta de 4 estaciones de monitoreo y una estacin de control principal ubicada en la Base de la Fuerza Area Falcon en Colorado Springs, Colorado. La ubicacin de las otras 4 estaciones es: Las estaciones de tierra se encuentran repartidas en cuatro puntos del globo: Hawai, Isla de Ascensin, Diego Garca y Atoln de Kwajalein. Las estaciones de monitoreo miden las seales de ondas de radio que son transmitidas continuamente por los satlites y pasan esa informacin a la estacin de control principal. sta usa la informacin para determinar la rbita exacta de los satlites y para ajustar sus seales de navegacin, por ejemplo: error de reloj, correcciones, estado del satlite, etc. 2.5.3 Segmento de usuario Las unidades o receptores GPS son el segmento de usuario, que computan la posicin del usuario por medio de las seales recibidas. Los GPS de uso civil no requieren licencia para operar ya que no transmiten seales de radio, solamente las reciben. Hay una gran gama de receptores con distintas precisiones y por ende precio, cada uno se adapta a un uso en particular. 2.5.4 Principios de Funcionamiento del GPS El GPS se basa en las distancias entre el receptor y una serie de satlites para conocer su posicin. El principio bsico detrs del GPS es bastante simple, y lo vamos a ilustrar con un ejemplo: si se quiere ubicar un bote en el mapa de un lago, y se sabe que est ubicado a 10 minutos desde el puerto A, a 5 minutos desde el puerto B y a 15 minutos

23

desde el puerto C, asumiendo una velocidad constante de 10 km/h. El primer paso es calcular la distancia que separa cada puerto del lugar a ubicar. Para hacer esto se multiplica la velocidad 10 km/h (166 m/minuto) por el tiempo desde el punto hasta cada puerto. Distancia al puerto A 166 m/min x 10 min = 830 metros Distancia al puerto B 166 m/min x 5 min = 1660 metros Distancia al puerto C 166 m/min x 15 min = 2490 metros A continuacin se debe dibujar un crculo con centro en el puerto A y un radio de 830 m. El punto a ubicar puede estar en cualquier parte sobre el permetro de ste crculo. Luego se dibuja un segundo crculo con centro en el puerto B y un radio de 1660 m. Estos dos crculos se intersecan en solamente dos puntos, lo que indica que el punto a ubicar est en uno de esos dos puntos. Cuando se dibuja el tercer crculo con centro en el puerto C, con un radio de 2490 metros, los tres crculos se cruzan en un solo punto posible, y esa es la ubicacin del bote.

24

Figura 2.1 Procedimiento para ubicar un bote en el mapa de un lago Estos son esencialmente los mismos pasos que usa un receptor de GPS para determinar su posicin. En el ejemplo se us ste mtodo para determinar una posicin en dos dimensiones a travs de tres distancias. En un plano tres crculos intersecan en un nico punto. Sin embargo el GPS provee la posicin en tres dimensiones para lo que hace falta

25

cuatro (o ms) mediciones de distancia. En tres dimensiones 4 esferas coinciden en un nico punto. Cuando un receptor quiere averiguar su posicin se comunica con un satlite (A en el ejemplo) y deduce que la distancia que los separa es de 20400 km. Esto significa que el receptor se encuentra en algn punto de la superficie de una esfera con centro en el satlite y un radio de 20400 km. Si simultneamente se conoce la distancia a un segundo satlite (B), de por ejemplo 22200 km se reduce la localizacin del receptor a un crculo en la interseccin de las 2 esferas. Si se realiza la medicin de distancia desde un tercer satlite (C) se reduce la ubicacin posible del receptor a 2 puntos en el espacio, dnde la tercer esfera interseca el crculo formado por la primera con la segunda. Para decidir cul de esos dos puntos es la ubicacin correcta hay dos opciones: o hacer una cuarta medicin desde otro satlite o hacer una suposicin. Generalmente uno de los dos puntos es una ubicacin ridcula, o no se encuentra sobre la superficie terrestre o tiene una velocidad imposiblemente alta.

Figura 2.2 Posibles dos ubicaciones del receptor a partir de 3 mediciones satelitales

26

Los programas dentro de los receptores de GPS tienen varias tcnicas para distinguir el punto correcto del que no lo es. En sentido trigonomtrico hacen falta cuatro distancias para determinar una posicin en el espacio, pero en la prctica no es necesario por esta razn pero si por otra razn tcnica que se discutir ms adelante. Todo lo dems sobre el sistema son los detalles tcnicos de cmo se lleva a cabo el proceso de medicin o para hacerlo ms preciso.

2.5.5

Medicin de la Distancia El principio bsico de la medicin de la distancia es el principio de "velocidad por

tiempo". El sistema GPS funciona tomando el tiempo que tarda una seal de radio emitida por un satlite hasta llegar al receptor, y de esa forma calcular la distancia, sabiendo que las ondas de radio viajan a la velocidad de la luz (300.000.000 m/s). Si se conoce el tiempo exacto en que sali la seal del emisor y el tiempo de llegada al receptor, se puede calcular por diferencia el tiempo de viaje de la seal y por ende la distancia. De aqu se deduce que los relojes deben ser bastante precisos en tiempos pequeos, porque la seal de un satlite que est perpendicular al receptor slo tarda 6/100 de segundo en llegar.

Figura 2.3 Seales de reloj del receptor y del satlite

27

Para poder calcular el tiempo de viaje de la seal de radio, tanto el satlite como el receptor generan cdigos sincronizados. Esto es que ambos generan el mismo cdigo al mismo tiempo. Entonces cuando llega una onda al receptor este determina el tiempo transcurrido desde que ste gener el mismo cdigo. La diferencia de tiempo es lo que tard la onda en llegar. Tanto el satlite como el receptor generan un juego de cdigos digitales que responden a un criterio binario. Ese juego de cdigos digitales llevan el nombre de pseudo-random (pseudo aleatorios) y estn diseados de forma tal que puedan ser fcilmente comparados, en forma rpida y sin ambigedades. La secuencia pseudo aleatoria se repite en el orden de los milisegundos.

2.5.6

Sincronizacin del tiempo Como ya es conocido la luz viaja a 300.000.000 m/s, lo que implica que si los

relojes del satlite y del receptor estn desfasados tan solo 1/100 de segundo las medidas de distancia tendran un error de 3000 km. Los relojes atmicos de los satlites son extremadamente precisos, pero tienen un costo de US $100.000 cada uno, que sera prohibitivo para un receptor de uso civil. Afortunadamente este problema se resolvi utilizando la medicin desde un cuarto satlite. La trigonometra indica que se puede localizar un punto en el espacio mediante 3 medidas perfectas, y que cuatro medidas imperfectas pueden eliminar la desincronizacin del tiempo.

28

Figura 2.4 Receptor sincronizado con los satlites genera una posicin X

Figura 2.5 Receptor des-sincronizado con los satlites genera una posicin XX

El ejemplo posterior explicar cmo se resuelve la sincronizacin del tiempo, los diagramas estn hechos en dos dimensiones a los fines explicativos, para entender como pasa en la realidad (tres dimensiones) solo hay que agregar una medida ms.

29

Figura 2.6 Ejemplo en dos dimensiones de receptor sincronizado con los satlites

Figura 2.7 Ejemplo de correccin de desincronizacin (Tanteo)

Normalmente se habla de la distancia a los satlites en kilmetros o millas, que son deducidas a partir del tiempo de viaje de las ondas, para simplificar la explicacin nos

30

referiremos a las distancias en segundos. Supongamos que el reloj de un receptor adelanta 1 segundo, entonces si nos encontramos a una distancia real de dos satlites A y B de 4 y 6 segundos respectivamente (punto X), el receptor interpretar que est a 5 y 7 segundos de distancia de ambos satlites A y B respectivamente, lo que resulta en una posicin distinta que llamaremos XX. Esta posicin sera incorrecta pero nada en el receptor hara sospechar que as fuera. Si agregamos un tercer satlite C (recuerde que el ejemplo es en dos dimensiones, sera el cuarto trabajando en tres dimensiones como es en la realidad), que se encuentra a una distancia real de 8 segundos, entonces el crculo con centro en el satlite y radio de 8 segundos pasa exactamente por el punto X, pero el receptor cree que se encuentra a 9 segundos del satlite. Estas tres distancias a los satlites no tienen forma de coincidir en un punto, pero si definen un rea posible. Las computadoras en los receptores estn programadas para que en el caso que obtengan una serie de medidas que no puedan intersecar en un nico punto, reconozcan que hay algn error y asuman que su reloj interno est desfasado. Entonces las computadoras comienzan a sumar o a restar la misma cantidad de tiempo a cada medida hasta encontrar un punto en el que todas coincidan. En el ejemplo la computadora descubrir que restando un segundo a cada medida est el nico punto en que estas coinciden y asume que su reloj est un segundo adelantado. De hecho las computadoras no utilizan el mtodo de prueba y error sino utilizan un sistema de cuatro ecuaciones con cuatro incgnitas, pero en esencia el proceso es el mismo. La conclusin es que para obtener medidas precisas en tres dimensiones se necesitan cuatro satlites.

31

Esto afecta el diseo de los receptores ya que si se necesitan medidas de posicin precisas, continuas y en tiempo real, los receptores deben tener por lo menos cuatro canales para poder recibir cuatro satlites simultneamente. 2.5.7 Fuentes de error A pesar de que el desarrollo del GPS se bas en tecnologa muy sofisticada y con gran inversin de dinero, su precisin se ve degradada por una serie de fuentes de error. Algunas fuentes de error son inherentes al sistema e inevitables y otras son manejables por el usuario. Estas son: Relojes de los satlites Errores de rbita Atmsfera terrestre Multitrayectoria Geometra satelital Receptores de GPS Disponibilidad selectiva (S/A)

2.5.7.1 Relojes de los satlites Como se vio anteriormente los relojes atmicos de los satlites son unos de los ms precisos, pero no son perfectos. Pequeos e insignificantes errores en el tiempo pueden crear grandes errores en las medidas de posicin. Justamente la funcin del segmento de

32

control terrestre es monitorear y ajustar los relojes para minimizar las pequeas desviaciones. 2.5.7.2 Errores de rbita Las rbitas de los satlites son tan altas que la atmsfera terrestre no las afecta, sin embargo, algunos fenmenos naturales como las fuerzas gravitacionales de la luna y el sol, como as tambin la presin de la radiacin solar, generan pequeos errores en la altitud, posicin y velocidad de los satlites. Estos errores se acumulan acrecentando su efecto. Nuevamente el segmento de control terrestre ajusta las seales de los satlites para corregir los errores de rbita. 2.5.7.3 Atmsfera terrestre Las ondas de radio viajan a una velocidad constante en el vaco, sin embargo al entrar en la atmsfera terrestre se encuentran con la ionosfera, que es una capa de partculas cargadas que se encuentra de 80 a 400 km sobre la superficie terrestre. Esta demora en el tiempo de llegada de las ondas induce un error en los clculos de distancia ya que este asume una velocidad constante de la luz. Las demoras producidas en esta capa dependen de la cantidad de iones/m3 y la actividad o perturbacin ionosfrica en dicho momento. Despus de pasar a travs de la ionosfera, las seales de los satlites deben pasar por la atmsfera baja, la troposfera, donde el vapor de agua incrementa un poco mas las demoras. La porcin de error debida a esta capa de la atmsfera ha sido simulada con un alto grado de precisin, permitiendo de esta manera que los receptores lo tengan en cuenta y puedan minimizarlo.

33

2.5.7.4 Multitrayectoria

Figura 2.8 Ejemplo de multitrayectoria Los errores debido a la multitrayectoria aparecen cuando la seal "rebota" antes de llegar al receptor, o sea que la seal llega a la antena del receptor por ms de una trayectoria o camino. Parte de la onda llega en forma directa y parte realiza una trayectoria diferente, por ende causando diferencias en el tiempo de viaje. Hoy en da hay algunas antenas diseadas para minimizar este efecto. 2.5.7.5 Geometra satelital Con todos los errores mencionados anteriormente, se puede imaginar que el crculo que define la distancia a cada satlite no se tiene un permetro bien marcado sino es una lnea difusa (figura). Dnde coinciden las distancias de dos satlites, en vez de ser un punto es una pequea rea. Como lo indica la figura cuanto mas juntos estn los satlites mayor ser el rea de incertidumbre donde podemos estar ubicados y por ende aumenta el error.

34

Esto significa que cuanto mas desparramados estn los satlites sobre el receptor mayor ser la precisin.

Figura 2.9 Geometra satelital (Los satlites deben estar lo ms alejados posible par a obtener una buena precisin)

2.5.7.6 Receptores de GPS El ruido debido a interferencias elctricas o el redondeo de las operaciones matemticas llevan a errores en la medicin de la posicin. Los receptores de mayor calidad, y por lo tanto mas caros, estn diseados para disminuir el ruido interno y maximizar la precisin matemtica. Otro elemento constitutivo importante de los receptores es el nmero de canales que poseen. Los hay de un solo canal hasta de 12. Para una aplicacin de precisin son necesarios aquellos que tengan por lo menos 4 canales simultneos, uno para cada uno de los cuatro satlites indispensables para tomar una posicin en tres dimensiones, siendo ideales los de 12 canales.

35

Cuantos ms satlites se estn recibiendo ms precisa ser la posicin dada, debido a que el rea de incertidumbre se disminuye sustancialmente y se minimiza el error. Esto est tambin ligado a la geometra satelital explicada anteriormente. 2.5.7.7 Disponibilidad selectiva (Selective Availability S/A) El Departamento de Defensa de los Estados Unidos agregaba un error intencional al sistema para restringir el uso a fuerzas hostiles en tiempo de guerra. Esto lo lograban introduciendo ruido digital a los relojes de los satlites. Esta disponibilidad selectiva no afecta la precisin de los receptores militares de GPS pero si a los de uso civil. Los errores introducidos cambian constantemente en magnitud y direccin. Esta era la mayor fuente de error de los receptores de uso comn. A partir del 1 de Mayo de 2000, el gobierno estadounidense elimin la disponibilidad selectiva, aumentando considerablemente la precisin de los receptores de uso comn. 2.5.8 Correccin diferencial Todos estos errores enunciados anteriormente reducen la precisin del GPS, resultando en un error de entre 5 y 20 m (previo a la eliminacin de la disponibilidad selectiva el error ascenda hasta los 100 m). Lo cual puede resultar til para algunas actividades pero no en aplicaciones en las que la precisin sea un factor determinante. Por ende se requiere un mtodo para mejorar sustancialmente la precisin. El mtodo ms usado hoy en da es la correccin diferencial (DGPS Sistema de Posicionamiento Global Diferencial).

36

Figura 2.10 Correccin diferencial El sistema funciona usando un receptor de referencia (que puede ser una antena Beacon o un satlite geoestacionario) ubicado en un lugar de coordenadas exactamente conocidas. Esta estacin de referencia recibe las mismas seales que los receptores comunes, pero al conocer su posicin exacta puede calcular el error que transmite cada satlite en magnitud y sentido, en ese momento. La diferencia entre la distancia real desde el receptor de referencia y cada satlite se denomina distancia de correccin diferencial. Este error es transmitido a travs de seales de radio al mvil en tiempo real. Las seales de correccin diferencial pueden provenir de antenas Beacon o de satlites geoestacionarios. La seal Beacon proviene de antenas fijas, cada una que cubre un rea comprendida dentro de un radio de 450 Km. Mediante la correccin satelital se logran precisiones submtricas, que oscilan en los 30 cm.

37

Figura 2.11 Seal correctora Beacon

Figura 2.12 Seal satelital (Satlite Geoestacionario)

2.5.9

Resumen de los factores que se deben considerar al utilizar un GPS Algunos elementos que afectan la precisin del sistema de posicionamiento global y

que pueden ser encontrados entre los datos que el receptor proporciona al usuario son: 2.5.9.1 Nmero de satlites visibles Como ya se explic anteriormente cuantos ms satlites est recibiendo un receptor ms precisa ser su posicin ya que se disminuye el rea de incertidumbre de su posicin posible. El mnimo de satlites para ubicar un receptor en tres dimensiones es de 4, cada satlite que se agregue a las mediciones mejora la precisin. El mximo terico de satlites que se pueden recibir es 12, pero generalmente los que se encuentran demasiado cerca del

38

horizonte no se reciben. En la prctica se suele trabajar con un mximo de 8, lo que resulta en una muy buena precisin, se recomienda trabajar con por lo menos 5 o ms. 2.5.9.2 Dilucin de la Precisin Posicional (PDOP) PDOP es una medida sin unidades que indica cuando la geometra satelital provee los resultados ms precisos. Cuando los satlites estn desparramados por el espacio, el valor PDOP es bajo y las posiciones computadas son ms precisas. Cuando los satlites estn agrupados el valor PDOP es alto y las posiciones imprecisas. Para obtener precisiones submtricas el PDOP debe ser de 4 o menos. 2.5.9.3 Relacin seal- ruido (S/N) La relacin seal/ruido es una medida de la intensidad de la seal satelital. A medida que la intensidad aumenta la precisin tambin lo hace. A mayor seal y menor ruido la relacin es mayor y la precisin aumenta. Para obtener posiciones con precisin esta relacin (S/N) debe ser mayor de 6, con un ideal entre 12 y 15. 2.5.9.4 Elevacin Cuando un satlite est bajo en el horizonte, la seal que emite debe atravesar una gran distancia de atmsfera, demorando la llegada al receptor. Se pueden eliminar estos datos configurando los receptores para que eliminen las seales de los satlites que estn debajo de cierto ngulo por sobre el horizonte. Los satlites que estn por debajo de este ngulo son excluidos del cmputo de la posicin. Para la mayor precisin se recomienda utilizar un ngulo mnimo de 15. Al ser muy elevado este ngulo puede que se pierdan las

39

seales de algunos satlites y no se obtenga operacin continua. Por eso una solucin de compromiso es configurar este ngulo en por lo menos 7,5. 2.5.9.5 Factores ambientales Como ya se sabe la seal GPS es reflejada por objetos cercanos, particularmente por objetos metlicos, creando resultados falsos o errneos. Este fenmeno es conocido como multitrayectoria. La precisin ptima se obtiene recolectando datos lejos de superficies reflectoras, como edificios, galpones o rboles. Algunos receptores poseen distintas formas de minimizar el efecto de la multitrayectoria. Para lograr precisiones menores se deben cumplir las siguientes condiciones: Nmero de satlites usados: > 5 PDOP: < 4 Relacin seal / ruido (S/N): > 6 Elevacin mnima: > 7,5 Ambiente de reducida multitrayectoria

40

CAPTULO 3: Diseo, construccin y descripcin general del vehculo


Una vez presentados los aspectos de mayor relevancia en cuanto a los elementos constitutivos de un robot y a la programacin de los mismos, se procede a introducir al rover, el cual corresponde al vehculo/robot sujeto a estudio y control en este proyecto.

3.1

Diseo y construccin del vehculo


Cabe destacar que el GPS fue un prstamo; durante la duracin del proyecto por

parte de la empresa Craisa, con el cual se cont desde el inicio del mismo, por lo que el diseo del vehculo gir en torno a sus dimensiones y peso. El receptor GPS con que se cont tena por dimensiones 14.5cm de ancho, 5.1cm de alto, 19.5cm de largo y un peso de 0,76 kg, mientras que la antena GPS tena un dimetro de 15,5 cm, una altura de 14 cm y un peso de 0,55 kg. El consumo de potencia mximo de todo el equipo de posicionamiento global era de 7W, operando a un voltaje que poda oscilar entre 10 V y 32 V. Una donacin importante en el proyecto fue la de un carro de control remoto a escala, llamado Scorpion 4X4, el cual es capaz hasta de escalar pequeas rocas debido al torque de sus motores DC. Dado que los motores de este vehculo ya posean suficiente potencia y por ende capacidad de carga, no fue necesario disear los motores, ruedas y ejes de direccin del rover, por lo que se pudo ahorrar tiempo en esta etapa y simplemente se separaron del vehculo original. La siguiente imagen permite tener una concepcin mejor del proceso de transformacin al que se vio expuesto este 4X4 a escala.

41

Figura 3.1. Transformacin sufrida por el vehculo 4X4 a escala donado al proyecto. Como se mencion anteriormente, tanto las ruedas, como la suspensin y los motores del Scorpion 4X4 estn diseados para ser utilizados en terrenos difciles. Con esto se logr satisfacer los requerimientos de potencia de los motores, as como de la capacidad de circular en cualquier tipo de terreno. Debido a que el Scorpion 4X4 posea; adems de los motores de las ruedas, un servomotor que controlaba la direccin y un circuito que controlaba estos tres motores, y que estos eran a su vez alimentados mediante una batera de 7,2 V, se decidi que los clculos de potencia no eran necesarios, dado que se tena pensado seguir esa misma lnea de componentes. De modo que slo fue necesario encontrar una batera similar para alimentar al vehculo. Se eligi una batera de Nquel-Cadmio, por razones de seguridad y de peso, la cual entrega 7,2 V, con una capacidad en funcionamiento de 1,5 A/h. Se decidi que uno de los elementos esenciales en el proyecto era el controlador de los servomotores, por lo que despus de una larga investigacin acerca de este tipo de

42

microcontroladores se eligi el controlador de 8 servomotores de la empresa Servo City, debido a que provena de una marca de renombre en lo que es el mercado del radio control y a que presentaba buenos comentarios en los foros indagados, aumentando as las probabilidades de que este cumpliera los requerimientos del proyecto. Las dimensiones de la cubierta del circuito son 7.1 x 5.7 x 2.4 cm, y posee un peso de 50g.

Figura 3.2. Foto del servo controlador utilizado en el proyecto. Luego; paralelo a la bsqueda de un regulador de voltaje que evitara que una variacin de voltaje en la batera daara la tarjeta controladora de servomotores, se requera un circuito capaz de accionar los motores de las ruedas a distintas velocidades y en ambos sentidos por medio de una seal PWM enviada por el microcontrolador, por lo que investigando ms a fondo acerca de los componente electrnicos de otros rovers, se encontr que existe un circuito que realiza ambas funciones. Este dispositivo electrnico se conoce como ESC, y dentro de sus partes bsicas se encuentran un regulador de voltaje y un circuito digital que al recibir una seal PWM, funge como un puente H y energiza a los motores, con base al ancho de pulso de la seal recibida.

43

El ESC elegido para el proyecto fue un Novak Rooster 12T, el cual posee capacidad de corriente extra, previendo as un esfuerzo excesivo por parte de los motores en terrenos difciles. Dentro de sus cualidades ms importantes se encuentra: 1) Un BEC (Battery Eliminator Circuit), que permite resolver el problema de la ausencia de un voltaje regulado para el servo controlador, 2) Una proteccin trmica de sobrecarga, 3)Una cubierta resistente al agua, 4) Configuracin por medio de un sistema One Touch, eliminando as la presencia de un potencimetro de tornillo que puede dar problemas a la hora de ajustar la posicin de neutro de los motores y 5) Permite el giro de los motores en ambos sentidos. Tambin fue necesario buscar una fuente de alimentacin adicional para el GPS, debido a que este funciona con un voltaje mayor al de los motores de las ruedas, y a que resultaba peligroso un consumo tan grande de corriente a partir de una nica batera. La batera que se consigui fue de gel cido de 12 V, con una capacidad de 7AH/20HR. La misma tiene un gran peso a considerar de 15 kg. Resumiendo, el vehculo transporta una carga de 15 kg por parte del sistema de alimentacin, y 1,31 kg por parte del sistema de posicionamiento global. Por lo que una vez teniendo presente el peso y las dimensiones del equipo que se deba transportar, se procedi a disear el marco o armazn del vehculo. En los apndices es posible encontrar el diseo del marco diseado para instalarse sobre el sistema de suspensin del Scorpion 4X4.

44

3.2

Descripcin general del vehculo


A continuacin se ubicar cada parte del vehculo dentro de los elementos bsicos

de un robot mencionados en la nota terica. 3.2.1 La estructura Est compuesta por las ruedas, las cuales van directamente unidas a los motores de corriente de directa, quienes fungen tambin como eje y soporte principal del rover. Adicionalmente y debido a que se quera otorgar un sistema de suspensin que permitiera al receptor GPS mantenerse; en la medida de lo posible, siempre sobre el mismo plano horizontal, se agreg sobre cada uno de estos dos motores, un eje rotatorio, con lo que sumado a los cuatro compensadores presentes, se logr obtener la funcin deseada. Por ltimo los dos motores y sus respectivos sistemas de suspensin se encuentran conectados por medio de un marco que fue diseado exclusivamente para transportar la carga estimada, tanto del sistema de alimentacin, como el sensorial y el del control. 3.2.2 Sistema de transmisin Este sistema est presente nicamente en el control de direccin del vehculo. Est compuesto por una barra mvil en el eje y, la cual se encuentra dentro de la carcasa del motor frontal y enlaza directamente ambas ruedas, de modo que cualquier fuerza horizontal que se le aplique a una rueda, fluye por esta barra hasta la otra. Luego, hay una segunda barra, que une la rueda nmero dos con un adaptador que permite conectar esta barra al servomotor que controla la direccin. Este adaptador que se menciona no slo permite

45

enlazar la segunda barra con el servomotor, sino que aumenta el par del servomotor, aprovechando la mayor distancia que se genera entre la segunda barra y el eje de rotacin del servomotor. Debido a que los motores utilizados son de corriente directa, el par desarrollado por el eje del motor es directamente proporcional al flujo en el campo y a la corriente en la armadura. Es por esta razn que no fue necesario utilizar un sistema de transmisin para controlar la velocidad del vehculo, en su lugar se utiliz un controlador electrnico de velocidad. 3.2.3 Sistema sensorial Este puede ser localizado en el sistema GPS, el cual consiste de la antena, un cable coaxial, el recibidor y el cable NULL MODEM (se hicieron 20 m adicionales) que permite comunicar el receptor con la base. En la siguiente figura se pueden apreciar tanto el receptor como la antena utilizados en este proyecto.

Figura 3.3 Fotografa de la antena y recibidor GPS utilizados en el proyecto

46

La antena se encarga de recibir la seal satelital y por medio del cable coaxial transmite estas seales en forma de corriente al recibidor; que en este caso es un AgGPS 132 de Trimble, el cual utiliza la tecnologa The Choice, que es una combinacin de recibidores diferenciales beacon, satelitales y WAAS/EGNOS reunidos en un mismo recibidor, y que provee cobertura confiable DGPS en prcticamente cualquier regin. Esto es un gran aporte para el proyecto, ya que se puede hacer uso en cualquier momento de esta caracterstica, para hacer ms confiables los datos proporcionados por este sistema. El AgGPS 132 puede a su vez transmitir a un tercer equipo, mediante cualquiera de sus dos puertos RS-232, haciendo uso de los mensajes estandar NMEA (En el proyecto se usa el mensaje NMEA RMC), o del protocolo TSIP. Para esta tarea y dado que el cable de fbrica es muy corto, se utiliza un cable UTP categora 5, en configuracin NULL MODEM. 3.2.4 Sistema de control El sistema de control del rover se compone de lo que para efectos del proyecto denominaremos: computadora de mando. Esta puede ser cualquier computadora personal o de escritorio, que sea capaz de correr el programa de mando desarrollado. Dentro de esta, un proceso automatizado toma lugar, ya que se recibe la informacin que aporta el sistema sensorial, se procesa, se toma una decisin a partir de la misma, y por ltimo se enva una orden a ser ejecutada por la tarjeta controladora de servos. La tarjeta contralodora de servos es una tarjeta integrada que puede controlar 8 servomotores, y que es capaz de comunicarse con cualquier equipo anfitrin que posea una

47

interfaz de puerto serial. El formato de comunicacin es de 9600 baudios, sin paridad, 8 bits de datos y uno de parada (9600, n, 8, 1). La tarjeta no cuenta con un convertidor RS232 a TTL, pero esto es til desde el punto de vista de que se puede comunicar con otros sistemas al slo invertir la lgica TTL. El procesador PIC puede manejar los niveles estndar de RS232 directamente con slo hacer uso de la resistencia limitadora de 22k en el pin Rx. El programa de mando debe enviar 3 bytes de datos en el siguiente orden preestablecido: byte de sincronizacin (255), byte que corresponde al nmero de servomotor (0-7) y por ltimo el byte de posicin del servomotor (0-254). El servocontrolador nicamente controla 2 unidades, la primera de ellas es el servomotor que gua la barra de direccin, el cual por conveniencia corresponde al espacio marcado como servo #1. La otra unidad es el control de velocidad electrnico, el cual a pesar de no ser propiamente un servomotor, est diseado para trabajar como uno, y que dependiendo del valor asignado por la tarjeta, as variar el sentido y magnitud de la corriente directa que alimenta a los motores, y que por la misma razn indicada anteriormente este corresponde al servo #2. El ESC (por sus siglas en ingles Electronic Speed Control) o control de velocidad, a grandes rasgos se encarga de recibir una seal PWM, la cual dependiendo del ancho del pulso, corresponde a una cierta velocidad en reversa, al freno, o a una velocidad proporcional hacia delante. alimentacin del vehculo Este cumple tambin un papel muy importante en la

48

3.2.5

Sistema de alimentacin Aunque no se encuentra dentro de la clasificacin que hace la bibliografa, se

decidi incluirlo como un sistema aparte, dado el papel fundamental que juega dentro del funcionamiento del robot. Este sistema est compuesto por una batera de Nquel-Cadmio, la cual entrega 7,2 V, con una capacidad en funcionamiento de 1,5 A/h, el ESC y una segunda batera de gel cido de 12 V, con una capacidad de 7AH/20HR. La batera de Nquel-Cadmio se encuentra alimentando directamente al ESC y como ya se mencion, este es muy importante dentro del sistema en anlisis, ya que funciona como un puerto de alimentacin. Al mismo tiempo que controla los motores de corriente directa, los alimenta, y dado que posee un circuito conocido como eliminador de batera, que bsicamente consiste en un regulador de voltaje que provee de un voltaje fijo al propio ESC y a la tarjeta de controladora de servos, quien controla y alimenta al servomotor de la direccin. Por ltimo, la batera de gel cido es utilizada nicamente para alimentar al sistema de posicionamiento global, debido a que la carga de la otra batera ya es bastante elevada y a que su voltaje no era el requerido.

49

CAPTULO 4: Desarrollo de un algoritmo para la creacin de rutinas de desplazamiento del vehculo.


4.1 Software desarrollado para el ajuste y mantenimiento del vehculo
Para constatar que tanto la tarjeta controladora como los motores funcionaban correctamente, fue que se decidi realizar un pequeo y simple programa utilizando Microsofts Visual Basic, que permitiera crear una interfaz serial desde la computadora hacia el microcontrolador. Este programa lleva por nombre ProyectoGPS.exe. A pesar de que se utiliz la herramienta de MSComm; que incluye la versin profesional de Visual Basic, la cual permite que la programacin de aplicaciones seriales sea realmente simple, incursionar en esta herramienta fue de gran ayuda, ya que otorg las bases de lo que es el desarrollo de un software para comunicaciones seriales.

Figura 4.1 Ventana del programa ProyectoGPS.exe (Escogiendo el puerto serial)

50

ProyectoGPS.exe permite hacer un manejo sencillo de cualquiera de los ocho posibles servomotores, al desplazar su barra respectiva. Esta representa la posicin actual del servomotor y el cuadro que se encuentra en la parte superior de cada barra, indica el valor numrico de esta posicin (En la figura anterior todos los cuadros indican 127 que corresponde a la posicin central de los servos). Debido a que el manejo es por medio del ratn, slo se puede manipular un servo a la vez. Esta aplicacin permite la variante de que en caso de que la computadora posea dos puertos seriales, poder escoger entre cualquiera de ellos. explicar mejor esta situacin. La siguiente figura permite

Figura 4.2 Zoom a la ventana del programa ProyectoGPS.exe (Seleccionando COM1 como puerto serial) Actualmente, el programa ProyectoGPS.exe es utilizado para labores muy sencillas de ajustes y mantenimiento al vehculo.

4.2

Software desarrollado para el trazado de rutas al vehculo


Una vez que se estableci comunicacin por medio del puerto serial con la tarjeta

controladora de los servomotores, se procedi a utilizar un lenguaje de programacin ms

51

flexible y poderoso, de modo que se inici una nueva etapa en el proyecto al dar inicio al programa base, por medio del lenguaje C++. El programa lleva por nombre Progps1 y fue desarrollado baja la plataforma de Linux, debido a que este otorga un manejo puro al usuario de sus puertos de interfaz mediante el uso de ficheros, en contraste a Windows, que a pesar de que tambin maneja sus puertos como ficheros; debido a su mal diseo inicial que ha arrastrado con los aos y a su intento por brindarle seguridad a la mquina, hace prcticamente imposible acceder a estos. Para iniciar el desarrollo de este programa se hizo uso de las clases de C++ llamadas libserial. Estas clases permiten; en sistemas POSIX, accesar al puerto serial como un objeto de iostream. Adems se provee de varias funciones que permiten ajustar varios parmetros del puerto serial, como la tasa de baudios, el tamao del carcter, el control de flujo, entre otros. La utilizacin de estas clases es un proceso poco comn para la mayora de los usuarios de computadoras; especialmente sino se est acostumbrado al entorno Linux, por lo que a continuacin se explicar en detalle los pasos que se deben seguir para poder hacer uso de este cdigo C++: 1. 2. Se debe descargar desde la web el archivo libserial-0.5.0.tar.gz. Luego se debe descomprimir el archivo en alguna carpeta de conocimiento

previo.

52

3.

Una vez descomprimido el archivo se debe abrir una terminal de usuario y

como superusuario ejecutar los siguiente 3 comandos en el orden indicado: a. ./configure b. make c. make install 4. Luego se debe modificar el archivo de sistema /etc/bash.bashrc; el cual

permite agregar variables de entorno generales para el sistema, aadiendo al final del mismo la siguiente lnea: export LD_PRELOAD=$LD_PRELOAD:/usr/local/lib/libserial.so 5. Se debe verificar que el usuario pertenece al grupo dialout. Con el fin de

chequear esto se puede ejecutar el siguiente comando en una terminal como superusuario: adduser usuario dialout 6. Por ltimo, a la hora de compilar el cdigo, se debe recordar agregar al final

del comando de compilacin la siguiente opcin: -lserial En el desarrollo del cdigo, el primer paso fue crear una clase que contuviera todas las funciones que seran utilizadas luego desde una funcin main. Esta clase se nombr

53

tipo puertoserial, y est compuesta por su constructor y tres funciones que son: escribir, ruta y cerrar. Este constructor es lo que en programacin se conoce como un constructor por defecto, ya que se hace uso del mismo con tan slo crear un objeto tipo la clase a la cual el constructor pertenece. Dentro de este se encuentran todas las funciones de la clase

serial_port; la cual es una de las principales funciones obtenidas a partir de la librera libserial, con las que se puede abrir y configurar el puerto desea, tan slo al crear un objeto tipo puertoserial. La funcin escribir permite enviar una sola instruccin a un nico servomotor, al hacer uso de la funcin write de la clase serialport. Esta funcin fue creada con el objetivo de crear rutinas, como la rutina de apagado que contiene la funcin main de este programa.

Figura 4.3 Fragmento de la ejecucin de Progps1 (Rutina de apagado) La funcin ruta recibe una cadena de caracteres que representan una serie de instrucciones para el vehculo, y esta se encarga de discernir si corresponde a una instruccin vlida o no. De ser vlida; mediante la funcin write de la clase serialport, ejecuta la instruccin, en caso contrario, el vehculo se detiene y centra el servomotor de la direccin, mientras se obtiene una instruccin vlida de la cadena de caracteres recibida. Desde que se cre esta funcin, se pens en el futuro uso que tendra en el programa base,

54

ya que se esperaba que esta fuera el ltimo eslabn del cdigo entre la recepcin de la informacin sensorial y la ejecucin de instrucciones. La funcin cerrar fue creada con la intencin de ser utilizada al final de cada ejecucin, tanto de este programa como de cualquier otro que se desarrollara en el futuro. Hace uso de la funcin close de la clase serialport, por lo que se encarga de cerrar el fichero que corresponde al puerto serie en uso. Es una buena prctica cerrar la comunicacin con el puerto una vez finalizado su uso, con el fin de evitar problemas con otras aplicaciones que hagan uso del puerto serial o con otra ejecucin de este mismo programa . La funcin main de progps1, es simplemente una interfaz con el usuario, que permite hacer uso de las funciones explicadas anteriormente y fue creada exclusivamente con el objetivo de presentar un avance a los profesores lectores, por lo que no se profundizar en su cdigo. En su lugar se presentan algunas capturas de la ejecucin del programa.

Figura 4.4 Inicio de la ejecucin del programa Progps1

55

Figura 4.5 Ejecucin del programa Progps1 (Opciones de ruta)

Figura 4.6 Ejecucin del programa Progps1 (Presentacin de la ruta seleccionada y ejecucin de la misma)

Figura 4.7 Ejecucin del programa Progps1 (Rutina de apagado y fin del programa)

56

4.3

Resultados obtenidos durante la primera etapa de programacin


El programa ProGPS.exe fue de gran utilidad a la hora de determinar el giro

mximo y mnimo del servomotor de la direccin, as como a la hora de regular las diferentes velocidades de los motores de las ruedas. Su sencilla pero til forma de enviar pulsos a la tarjeta controladora de servos, permiti conocer con exactitud el valor de la posicin que se deba utilizar a la hora de establecer los pasos principales de las rutinas. El programa Progps1 dio excelentes resultados, ya que permiti constatar el buen desempeo del vehculo a la hora de seguir una ruta. En el disco compacto del apndice es posible encontrar un video que muestra la interfaz del usuario y los resultados obtenidos.

57

CAPTULO 5: Desarrollo e implementacin de un algoritmo de navegacin para el vehculo basado en la informacin del punto destino y de la ubicacin actual.
Este es el ltimo programa que se desarrolla, lleva por nombre ProGPSfinal, el cual rene todos los objetivos planteados al inicio de este documento. El mismo ha tenido una base slida gracias a los dos programas desarrollados anteriormente. A continuacin se proceder a explicar los conceptos bsicos de cmo se solucion el problema de la determinacin de la posicin instantnea del vehculo y del trazo de la ruta hacia el objetivo, posteriormente se analizar con detalle el cdigo fuente.

5.1

Ubicacin en un cuadrante imaginario


El sistema sensorial conformado por el GPS, dentro de la extensa informacin que

puede proporcionar, se encuentran los datos de latitud y longitud. La latitud es enviada por el receptor hacia la base en el siguiente formato: DDMM,MMMM. Donde DD corresponde a los grados, MM corresponde a los minutos y ,MMMM; que puede variar su nmero de cifras de cero a siete, corresponde a las dcimas de minutos. La longitud es enviada en un formato similar, la nica diferencia es que esta presenta una cifra ms en los grados, as: DDDMM,MMMM.

58

Ambos formatos deben ser convertidos a uno que pueda ser til. Por ello es que se escogi utilizar el formato DD,DDDD y DDD,DDDD, para la latitud y la longitud respectivamente. El procedimiento es el siguiente: Se debe almacenar los grados, ya sean DD o DDD. Luego se debe tomar la parte restante MM.MMMM y dividirla entre 60. El resultado tendr un exponente cero, y formar una nueva mantisa de 0,DDDD. Luego se suma las unidades de grados previamente almacenadas al valor obtenido en el paso anterior, y se obtiene la latitud o longitud en un formato conocido como grados y dcimas de grados. Adicionalmente, se deben convertir los grados a radianes as:

radianes

grados 180

(5.1-1)

Una vez que se obtiene la ubicacin en radianes, se puede utilizar el principio del arco producido por un desplazamiento, y que se explica a continuacin:

59

Figura 5.1 Principio del arco producto de un desplazamiento sobre una circunferencia

Si se dividiera en dos la tierra, ya sea por la lnea del ecuador o paralelo cero (para la longitud), o por el meridiano Greenwich (para la latitud), como se aprecia en la figura anterior, donde el punto C corresponde al centro de la tierra, A al punto origen y B la localizacin actual, la distancia entre A y B representada por la lnea roja, se encuentra haciendo uso de la siguiente ecuacin:
Dis tan cia[km] [radianes ] R[km]

(5.1-2)

Dado que Costa Rica se ubica en el hemisferio Nor-Oeste, una distancia calculada a partir del dato de longitud; proporcionado por el GPS, siempre va a corresponder a la distancia medida desde el meridiano 0 hacia el oeste. La siguiente figura puede ser de gran ayuda.

60

Figura 5.2 Mapamundi (Ubicacin de Amrica Central en el planeta Tierra)

De igual forma una distancia calculada a partir del dato de latitud, corresponde a una distancia medida desde el paralelo 0 hacia el norte. Por lo tanto, un punto en el mapa, corresponde nicamente a dos distancias, una a partir de la latitud y otra a partir de la longitud. Y para los efectos del proyecto, se puede obviar la orientacin de la latitud y de la longitud, dado que esta no va a variar. Como el destino es un punto fijo, resulta fcil tomarlo como nueva referencia, y as trazar alrededor de este un sistema nuevo de coordenadas, que permitan al vehculo conocer su ubicacin respecto al destino, y as poder tomar una decisin acerca de su posible aproximacin al mismo. La siguiente figura ilustra este hecho.

61

Figura 5.3 Cuadrante imaginario cuyo centro es el punto destino Una vez que se cont con una nocin de la ubicacin espacial, se procedi a relacionar la ubicacin actual y la ubicacin anterior, con el tipo de decisin que se debe tomar. El programa parte del supuesto de que siempre se ha avanzado anteriormente al menos una instruccin. Es por ello que al inicio de la bsqueda del destino, siempre se ejecuta la instruccin de avanzar. Esto no slo le permite a la base conocer la ubicacin de vehculo, sino la orientacin de su movimiento respecto al destino. Durante el anlisis realizado para determinar en qu forma se procedera en la toma de decisiones; a partir de la distancia tanto en latitud como en longitud del rover respecto

62

al origen, se encontr que las decisiones que deben tomarse en los cuadrantes 1 y 3 son las mismas bajo condiciones iguales, y que para los cuadrantes 2 y 4, las decisiones son inversas a las que se deberan tomar en los otros dos cuadrantes. De modo que el problema se reduca a analizar slo un par de cuadrantes; sean el 1 y el 2, y proyectar los resultados a sus homlogos de 180. Luego de analizar todos los posibles casos, se determin que slo eran necesarias diez decisiones o rutinas para poder llevar a cabo la bsqueda del destino. Estas se presentan a continuacin, y se indicar con un ejemplo su posible uso en el cuadrante 1; que con las similitudes explicadas anteriormente, todos los cuadrantes quedan explicados. Para facilitar la explicacin, se usarn cuatro variables que tambin son utilizadas en el cdigo fuente: distlat2, distlat1, distlon2 y distlon1. La primera representa la distancia en latitud que existe entre la ubicacin antes de ejecutar el ltimo avance y el destino, la segunda corresponde a la distancia en latitud entre la ubicacin actual y el destino y las dos restantes es la misma situacin slo que en lugar de distancia en latitud, es la distancia en longitud. Las rutinas son: a. Invertir direccin derecha: Se encarga de invertir en 180 la orientacin del Si dstlat1 aument respecto a

vehculo, pero haciendo el giro hacia al derecha.

dstlat 2 y dstlon1 aument tambin respecto a dstlon 2 , esto implica que el vehculo
se est alejando del punto destino, por lo que si se est en el cuadrante 1 y si hay ms distancia entre el eje vertical y el vehculo, que entre el eje horizontal y este, o la

63

distancia es la misma, se debe hacer un giro a la derecha, para mantenerse dentro del mismo cuadrante, y as poder aproximarse al punto destino. b. Invertir direccin izquierda: Se encarga de invertir en 180 la orientacin del

vehculo, pero haciendo el giro hacia la izquierda. Si el vehculo se est alejando del punto destino, pero este se encuentra ms cerca del eje horizontal que del vertical, el giro debe realizarse hacia la izquierda, con la intencin de mantenerse en el mismo cuadrante. c. Medio giro derecha: Realiza un giro de 90 hacia la derecha. Si

dstlat1 < dstlat 2 , pero dstlon1 > dstlon 2 , esto significa que el vehculo se est
alejando horizontalmente del destino, pero se est acercando verticalmente. En otras palabras; visto desde el primer cuadrante, el rover tiene un sentido suroeste, lo cual lo aleja del punto y lo har cambiar de cuadrante en un futuro. Para tratar de orientarlo hacia el destino, el robot deber hacer un giro de 90 haci a la derecha. d. Medio giro izquierda: Realiza un giro de 90 hacia la izquierda. Si por el

contrario el vehculo toma una direccin noreste, la accin que debe hacerse para corregir el rumbo, deber ser un giro de 90 a la izquierda. e. Horizontal por la derecha: Alnea al vehculo con el eje horizontal,

realizando pequeos ajustes en la direccin siempre hacia la derecha. Una vez que el rover tiene una orientacin favorable hacia el punto destino, si la distancia con el eje vertical disminuye ms que lo que disminuy la distancia con el eje horizontal, entonces

64

es ms fcil para el robot alinearse con el eje horizontal, de modo que esta rutina lo facilita. f. Horizontal por la izquierda: Alnea al vehculo con el eje horizontal,

realizando pequeos ajustes en la direccin siempre hacia la izquierda. Esta rutina slo es til en los cuadrantes 2 y 4. g. Vertical por la derecha: Alnea al rover con el eje vertical, realizando

pequeos ajustes en la direccin siempre hacia la derecha. Esta rutina slo es til en los cuadrantes 2 y 4. h. Vertical por la izquierda: Alnea al rover con el eje vertical, realizando

pequeos ajustes en la direccin siempre hacia la izquierda. Una vez que el rover tiene una orientacin favorable hacia el punto destino, si la distancia con el eje vertical disminuye menos que lo que disminuy la distancia con el eje horizontal, entonces es ms fcil para el robot alinearse con el eje vertical, y se logra por medio de esta rutina. i. Aproximacin escalera derecha: Una vez que se ha alineado el vehculo con

algn eje a su derecha, se inicia la aproximacin al destino, describiendo una escalera. Esto se hace por dos razones, la primera se debe a que es una forma de reducir la distancia viajada, y la segunda porque una vez que se ha cumplido con la precisin solicitada respecto al eje al cual se est en paralelo; al aproximarse de esta forma, lo nico que se debe hacer es continuar lentamente hacia delante, hasta que se cumpla con la precisin deseada en el otro eje.

65

j.

Aproximacin escalera izquierda: Una vez que se ha alineado el vehculo

con algn eje a su derecha, se inicia la aproximacin al destino, describiendo una escalera. Esto se hace por dos razones, la primera se debe a que es una forma de reducir la distancia viajada, y la segunda porque una vez que se ha cumplido con la precisin solicitada respecto al eje al cual se est en paralelo; al aproximarse de esta forma, lo nico que se debe hacer es continuar lentamente hacia delante, hasta que se cumpla con la precisin deseada en el otro eje. Las rutinas anteriores hacen uso de la funcin ruta, descrita en el programa Progps1. A manera de resumen, se enumerarn los pasos que realiza el programa, en el supuesto caso de que se ubique el rover en el cuadrante nmero 1 respecto al destino y este quede orientado en la direccin noreste (alejndose del destino): 1. Se abren y configuran tanto el puerto que comunica la base con la tarjeta

controladora de servos, como el puerto que recibe la informacin del sistema GPS. 2. Se hace un llamado a la funcin marcadestino, del objeto com1 tipo clase

puertoserial, la cual gua al usuario para que pueda marcar el punto destino. Una vez que ha sido marcado, le indica al usuario que coloque al rover en el punto de partida. 3. El programa hace uso de la funcin escribir, del objeto com2 tipo clase

puertoserial1, para centrar la direccin del vehculo, la cual durante la marcacin del destino o la colocacin en el punto de partida pudo ser alterada.

66

4.

Luego se almacena la cadena de caracteres enviada por el receptor GPS,

mediante la funcin leer del objeto com1 tipo clase puertoserial. 5. Seguidamente se utiliza la funcin desfragmentar; perteneciente al objeto

com1, la cual separa la informacin til enviada por el receptor GPS. 6. Despus de tener la primera cadena de datos tiles, y de haberlos separado,

mediante las funciones distlatitud y distlongitud; pertenecientes al objeto com1, se calcula la distancia vertical y horizontal que existe entre la ubicacin actual y el punto destino. 7. Una vez que se han almacenado estas distancias, se utiliza la funcin

escribir; del objeto com2, para generar un avance hacia delante en el vehculo durante 1 segundo, inmediatamente se vuelve a utilizar la misma funcin para detenerlo. 8. Mediante la funcin cuadrante; perteneciente al objeto com1, se almacena el

cuadrante en que se encontraba el rover antes de realizar el avance. 9. Se repiten los pasos 4, 5 y 6, para determinar las nuevas distancias vertical y

horizontal respecto al punto destino. 10. El paso 8 se repite para almacenar el cuadrante actual. 11. Por medio de la funcin distnav; perteneciente al objeto com1, se averigua la hipotenusa que se forma con las distancias en latitud y en longitud. 12. Se realizan dos comparaciones: la primera es entre el cuadrante actual y el anterior, y la segunda es un chequeo; a partir de la informacin obtenida en el punto 11,

67

para constatar si ya se cumpli con la precisin solicitada. En caso de que haya ocurrido un cambio de cuadrante y de que la distancia mxima solicitada respecto al punto destino no se haya alcanzado, se provoca un salto al paso 3 y se inicia el proceso. En caso contrario el programa sigue ejecutndose normalmente. Esto se debe a que al haber un cambio de cuadrante la toma de decisiones se imposibilita, ya que estas dependen del patrn que ha seguido el vehculo, y claramente del cuadrante en que est ubicado. 13. Se vuelve a comparar si la separacin mxima entre el punto destino y el rover se ha alcanzado, en caso contrario se ejecuta una decisin a partir del patrn de avance del vehculo. En este caso particular, dado que el vehculo se alej del punto tanto en latitud como en longitud, dependiendo de cual variacin fue mayor, as elegir el programa hacia donde realizar el giro de 180 que le permita tomar rumbo hacia el destino. Luego de realizar la rutina, se indaga si se lleg al destino, en cuyo caso se provoca un salto al final del programa, sino se salta al paso 3 y as inicia de nuevo la aproximacin al destino. Las siguientes decisiones que se tomen dependen de la distancia del punto de partida respecto al destino. Pero en caso de que esta haya sido suficiente, el rover una vez orientado hacia al destino, buscar el eje con el cual le sea ms sencillo alinearse, y una vez alineado proceder a aproximarse describiendo un patrn de escalera o serpenteo hacia el destino. Tan pronto cumpla con la precisin solicitada respecto a alguno de los ejes, si el

68

eje es el correcto slo tendr que aproximarse mediante avances frontales, sino deber ejecutar un giro de 90 y seguir avanzando hasta cumplir con la precisin solicitada.

5.2

Descripcin del cdigo fuente


A continuacin se presenta una descripcin del cdigo fuente, el cual puede ser

encontrado en el apndice. Lo primero que se puede encontrar en el cdigo son las acostumbradas libreras que se han venido utilizando con anterioridad. Slo se agreg una adicional que es la librera math.h, la cual entre otras cosas facilita la tarea de obtener la distancia del rover respecto al destino, ya que permite calcular el arco seno de una expresin. Seguidamente se pueden encontrar la definicin de constantes utilizadas en las funciones escribir y ruta de la clase puertoserial1, as como constante que representa la precisin solicitada. Este proceder permite hacer cambios al programa de una manera sencilla, precisa y segura, sin afectar el cdigo en si. Luego se definen las variables globales que pueden ser usadas tanto en el manejo de objetos tipo alguna de las clases como en la funcin main. Despus se definen las dos clases que se van a utilizar posteriormente en la funcin main, las cuales son: puertoserial y puertoserial1. La primera est asignada

especficamente al GPS, por lo que contiene todas las funciones que permite hacer un manejo de esta informacin. La segunda abarca el movimiento del rover, ya que se encarga de dirigir la tarjeta controladora de servomotores. Debido a que slo se contaba

69

con un puerto serial en la computadora en la que se desarroll bsicamente todo el programa, fue que se adquiri un adaptador USB que permitiera simular un puerto serial extra. Por defecto la clase puertoserial hace uso directo del puerto serial existente, mientras que la clase puertoserial1 utiliza el adaptador. La eleccin se hizo por conveniencia, ya que la forma de comunicacin con el GPS es ms compleja que con la tarjeta de servomotores, y se prefiri darle la mayor transparencia posible. La clase puertoserial cuenta con siete funciones. La primera se llama leer y se encarga de tomar la cadena de caracteres enviada por el GPS, analizar que sea informacin vlida y almacenarla en infogps. Luego se cuenta con la funcin desfragmentar, que se encarga de separar la informacin y almacenarla en variables que permitan su uso y modificacin. Adicionalmente se tiene la funcin distnav, la cual realiza los clculos necesarios para averiguar la distancia entre dos pares de latitudes y longitudes. Esta funcin hace uso de la siguiente ecuacin:

d acos(sin(Lat1) sin(Lat2) cos(Lat1) cos(Lat2) cos(Lon1 Lon2)) (5.2-1)


La razn del porque no se utiliz la ecuacin de Pitgoras, donde x sera el valor absoluto de la diferencia de latitudes y y el valor absoluto de la diferencia de longitudes,
2 es porque este resultado es correcto nicamente en la cercana de 300 , pero luego de eso

se deteriora rpidamente. La ecuacin de Pitgoras se muestra a continuacin:


d x2 y2

(5.2-2)

70

Adems, debido a que el Teorema de Pitgoras es til slo en dos dimensiones y dado que la perspectiva de este proyecto es ser la base de un vehculo areo, donde la tercera dimensin espacial juega un papel crucial en la navegacin, el teorema no aplica en este caso. De modo que previendo esto es que se prefiri dejar el camino preparado. Luego se cuenta con las funciones distlatitud y distlongitud, las cuales se encargan de realizar la resta entre la latitud destino y la actual y la longitud destino y la actual, devolviendo as la distancia que existe entre el eje x y vehculo y el y y el vehculo, respectivamente. Esta clase tambin cuenta con la funcin marcadestino, la cual gua al usuario para marcar el punto destino, y almacena al mismo tiempo la informacin de latitud y longitud destino. Por ltimo se cuenta con la funcin cuadrante, la cual permite averiguar en cual cuadrante; respecto al punto destino, se encuentra el rover. Para realizar esta funcin utiliza las distancias en latitud y longitud existentes entre el punto destino y el vehculo. La otra clase; puertoserial1, es la misma clase que se utiliza en el programa Progps1, y que ya fue explicada. Dado que en ese momento no se tena la necesidad de un segundo puerto serial, la clase adopt el nombre de puertoserial, lo cual se puede prestar a confusiones al tratar de asociar esta clase en ambos programas. Pero se espera que al aclarar este hecho, se pueda distinguir en que la nica diferencia entre la clase del programa Progps1 y la clase puertoserial1 del programa ProGPSfinal, es simplemente su nombre.

71

El final del cdigo est compuesto por la funcin main, la cual ya fue explicada al describir el mtodo con el que el rover busca el destino. Esta funcin es slo la puesta en prctica de las dems funciones pertenecientes a las dos clases mencionadas.

5.3

Resultados obtenidos en la segunda etapa de desarrollo de software


Se realizaron varias pruebas de campo para este programa, en las cuales se alcanz

una precisin menor a los 3 metros, partiendo de una distancia respecto al punto destino de aproximadamente 25 m. Se habla de menor a los tres metros debido a que dependa de dos factores, el primero corresponde al tipo de rutina que era ejecutada por ltima vez, y el segundo; que est ntimamente relacionado con el primero, a la distancia existente entre el radio de precisin solicitado y la posicin en la que se iniciaba la ltima rutina. Cuando se solicitaba una precisin menor, el vehculo giraba alrededor del punto destino. Esto se debi a que el servomotor de la direccin no permita realizar giros de 180 exactos, sino giros de 170; por ejemplo, de modo que el error era arrastrado y esto evitaba alcanzar el objetivo con una mayor precisin. Vale la pena destacar que cuando se realizaban pruebas a cortas distancias (alrededor de 5 metros) del punto de partida, el rover alcanzaba su destino con una precisin ligeramente mayor a 1 m. Se alarg la barra de la direccin que enlaza el servomotor de la direccin con la rueda izquierda delantera, permitiendo as obtener; partiendo del punto neutro del servomotor, un verdadero ngulo de 90 con el extensor del servomotor, aumentando as el par aplicado a las ruedas. Adicionalmente se cambi el servomotor de la direccin por uno

72

de mayor torque (2,33 Nm).

Estas dos pequeas variantes en el diseo original,

permitieron programar rutinas de giros de exactamente 180 sobre el punto de inicio de la rutina, con lo cual se puede asegurar que la precisin del rover; partiendo de distancias de 25 m o mayores del punto de partida, puede llegar a ser tan buena como la obtenida a distancias alrededor de los 5 metros (precisin de 1 m). En el disco compacto de anexos se muestran videos de los resultados obtenidos en estas pruebas de campo.

73

CAPTULO 6: Conclusiones y recomendaciones


6.1 Conclusiones
Dentro de las principales conclusiones obtenidas a partir del desarrollo del proyecto y de los resultados del mismo, se tiene: Fue posible disear, construir e implementar un sistema de navegacin a partir de un receptor GPS y un cdigo que permitiera el manejo tanto de la informacin geoposicional como del robot objeto de control. Se pudo realizar un levantamiento adecuado de los requerimientos del proyecto, lo cual permiti tener un horizonte claro durante todo el proyecto. Las investigaciones realizadas permitieron adquirir conocimientos muy valiosos, los cuales fueron aplicados tanto en el diseo del vehculo, como el uso de la informacin geoposicional. El diseo inicial del vehculo fue un xito. Slo una mejora en el sistema de direccin fue necesaria para aumentar la precisin del robot. La eleccin del tipo de locomocin del vehculo depende de las caractersticas del proyecto a realizar tales como el tipo de terreno y la velocidad requerida. Se logr realizar un manejo adecuado de la informacin proporcionada por el GPS, al desfragmentarla y almacenarla en varias variables para su posterior uso. La mejor forma de trabajar las latitudes y las longitudes es en radianes.

74

Al restarle las coordenadas del punto destino a la ubicacin actual del vehculo fue posible determinar; tanto la distancia respecto al punto destino como la ubicacin en un nuevo cuadrante, facilitando as el planeamiento de la ruta de navegacin del vehculo.

El vehculo puede alcanzar una precisin de hasta 1 m en la bsqueda del punto destino. Esta distancia se considera buena, pero puede mejorar al utilizar seales de correccin RTK.

Se comprendi que para el desarrollo de un proyecto el uso de plataformas libres siempre es la mejor ruta a seguir, debido a la flexibilidad y a la libertad que proporcionan.

Dado que el sistema de posicionamiento global satelital hace honor a su nombre al captar las seales que envan los satlites de la constelacin NAVSTAR, el mismo no funciona bien en interiores, debido a que estas seales son microondas. Es por esto que el rover puede ser usado nicamente en exteriores.

El rover no funciona adecuadamente en das con mucha nubosidad y ms bien presenta un comportamiento errtico.

La base para un futuro proyecto que involucre la navegacin de un vehculo areo se ha establecido.

La utilizacin de un receptor GPS con su respectiva antena; en lugar de un chip y una antena hecha en casa, fue determinante para cumplir con el plazo de tiempo

75

requerido, gracias a que elimin posibles fuentes de error que pudieron haber retrasado al proyecto. El control electrnico de velocidad (ESC) es una pieza clave en el sistema de alimentacin del vehculo de este proyecto por dos razones: la primera es que controla los motores de las ruedas y la segunda est ligada a su regulador de voltaje, puesto que funge como la fuente de corriente directa que permite a la tarjeta controladora de servomotores crear las seales PWM. movilidad al vehculo. Juntas hacen posible la

6.2

Recomendaciones
Gracias al conocimiento y a las experiencias adquiridas durante este proyecto, se

desea agregar unas cuantas recomendaciones que pueden resultar tiles a la hora de realizar optimizaciones a este proyecto, o para otros que estn interesados en proyectos similares. Dado que se comprob que el proyecto funciona, ahora es ms fcil implementar una etapa de comunicacin inalmbrica que le permita ms autonoma al vehculo y al mismo tiempo alcanzar mayores distancias. Tambin se sugiere agregar un sistema de evasin de obstculos que combine sensores infrarrojos, snicos y de video. La informacin que se adquiera deber ser procesada y a partir de la misma se debe modificar la ruta establecida, permitiendo al vehculo evadir el obstculo, pero a la vez desvindose lo menos posible, para as lograr siempre una ruta ptima.

76

Una vez que se hayan implementado la etapa inalmbrica y la de evasin de obstculos, se debe sustituir el sistema GPS utilizado, por uno de menor peso. De modo que el primer vehculo areo no tripulado fabricado por la Universidad de Costa Rica sea una realidad.

6.2.1

Recomendaciones generales Con la intencin de cumplir con el objetivo principal de un proyecto en general, es preferible reducir la complejidad de los pasos que se deben seguir, para as eliminar posibles fuentes de error, las cuales; a pesar de que su solucin sea muy simple, a la hora de discriminarlas y encontrarlas pueden acaparar valioso tiempo del desarrollo del proyecto, y hasta cambiar la ruta del mismo.

Los sensores utilizados en un robot mvil dependen del tipo de obstculos que se encuentren y las caractersticas del entorno donde se desplace el mismo. Los

sensores infrarrojos se ven afectados por el sol o por las superficies opacas. Los sensores snicos pueden resultar afectados de las frecuencias similares que circulen en el ambiente. Es por ello que para contar con un sistema de evasin de obstculos confiable, la combinacin de diferentes tipos de sensores es la clave. Un proyecto como este puede resultar realmente costoso, especialmente si se ubica en una regin como Costa Rica, donde la mayora de las piezas electrnicas no se consiguen fcilmente y hay que acudir a intermediarios o comprarlas por Internet, por lo que se debe estar preparado para las demoras y contratiempos que este proceso puede representar.

77

El presupuesto de una universidad estatal; como lo es la Universidad de Costa Rica es muy reducido, por lo que no se debe esperar ayuda econmica de la misma, ni dejar que esto sea un motivo para rechazar proyectos de desarrollo como este. La empresa privada de tecnologa; aunque escasa en nuestro pas, existe y recurrir a estas puede ser una forma de reducir costos para el desarrollo de un proyecto de calidad.

78

BIBLIOGRAFA
Artculos de revistas: 1. Cern Correa, A. Sistemas Robticas Teleoperador, Ciencia e Ingeniera Neogranadina, Colombia, Vol [15], 2005. 2. Gage, D. A Brief History of Unmanned Ground Vehicle (UGV) Development Efforts, Unmanned Systems Magazine, Estados Unidos, Vol [13] N [3], 1995.

Libros: 3. Barrientos, A. Fundamentos de Robtica, 1 edicin, Mc Graw-Hill, Espaa, 1997. 4. Jimnez Vega, N. Software para procesamiento de datos GPS. 1 edicin, Universidad Politcnica de Catalua, Espaa, 2006.

Manuales de operacin: 5. Agriculture Business Area, T. (2004). NMEA-0183 Messages: Guide for AgGPS Receivers. Kansas: Trimble. 6. Trimble Navigation Limited, A. (2004). AgGPS 132: Combination DGPS receiver with The Choice technology. Dayton, Ohio: Trimble. 7. Trimble, T. (2001). AgGPS 124/132: Manual de operacin. Sunnyvale, CA: Trimble.

Pginas Web: 8. Build a Serial Interface for the Mini SSC II Servo Controller. http://www.rentron.com/Mini-ssc.htm

79

9. Chauhan, D. Writing a Serial Communication Library for Windows. http://www.aspfree.com/c/a/Code-Examples/Writing-a-Serial-CommunicationLibrary-for-Windows 10. GPS Tutorial. http://www.trimble.com/gps/index.html 11. Pozo Coronado, S. Con Clase. http://www.conclase.net 12. Stefan, J. Circuit Cellar - Digital Library - 123 Stefan. http://www.circuitcellar.com/library/print/1000/Stefan123/4.htm 13. Uso del GPS Parrte 1: mapas georeferenciadas y computador para el vuelo libre. http://www.parapente-costarica.org/new/index.php?option=com_content&task=view&id=39&Itemid=89 14. Von Martini, A., Bragachini, M., & Bianchini, A. Sistemas de Posicionamiento. http://www.agriculturadeprecision.org/sistpos/SistemasPosicionamiento.htm 15. W, B. Build a Serial Interface for the Mini SSC II Servo Controller. Retrieved March 12, 2008, from http://www.rentron.com/Mini-ssc.htm. 16. freshmeat.net: Project details for libserial. http://freshmeat.net/projects/libserial/.

80

APNDICES

81

Apndice 1: Planos de diseo del armazn del vehculo

82

Figura Apndice 1-1 Vista superior del armazn utilizado para instalar los componentes electrnicos sobre el vehculo

83

Figura Apndice 1-2 Vista lateral del armazn utilizado para instalar los componentes electrnicos sobre el vehculo

Figura Apndice 1-3 Vista frontal del armazn utilizado para instalar los componentes electrnicos sobre el vehculo

84

Figura Apndice 1-4 Vista superior del armazn utilizado para instalar los componentes electrnicos sobre el vehculo y de la unin al sistema de suspensin de los motores del vehculo

85

Figura Apndice 1-5 Vista lateral del armazn utilizado para instalar los componentes electrnicos sobre el vehculo y de la unin al sistema de suspensin de los motores del vehculo

86

Figura Apndice 1-6 Vista frontal del armazn utilizado para instalar los componentes electrnicos sobre el vehculo y de la unin al sistema de suspensin de los motores del vehculo

87

Figura Apndice 1-7 Dimensiones de las piezas utilizadas para unir el armazn utilizado para instalar los componentes electrnicos sobre el vehculo y el sistema de suspensin de los motores del vehculo

88

Apndice 2: Cdigo ProyectoGPS.exe

89

Private Sub Barra1_Change() Text1.Text = Str(Barra1.Value) ' Enva el valor que tenga la barra (0 a 254) al cuadro de texto MSComm1.Output = Chr$(255) ' Enva el Bit de sincronizacin requerido por el controlador de los servos. MSComm1.Output = Chr$(0) ' Selecciona el servo #1

MSComm1.Output = Chr$(Text1.Text) ' Enva el valor que se encuentra en el cuadro de texto (la posicin) al controlador de los servos. End Sub Private Sub Barra1_Scroll() Barra1_Change End Sub

Private Sub Barra2_Change() Text2.Text = Str(Barra2.Value) ' En va el valor que tenga la barra (0 a 254) al cuadro de texto MSComm1.Output = Chr$(255) ' Enva el Bit de sincronizacin requerido por el controlador de los servos. MSComm1.Output = Chr$(1) ' Selecci ona el servo #2

90

MSComm1.Output = Chr$(Text2.Text) ' Enva el valor que se encuentra en el cuadro de texto (la posicin) al controlador de los servos.

End Sub Private Sub Barra2_Scroll() Barra2_Change End Sub

Private Sub Barra3_Change() Text3.Text = Str(Barra3.Value) ' Enva el valor que tenga la barra (0 a 254) al cuadro de texto MSComm1.Output = Chr$(255) ' Enva el Bit de sincronizacin requerido por el controlador de los servos. MSComm1.Output = Chr$(2) ' Selecciona el servo #3

MSComm1.Output = Chr$(Text3.Text) ' Enva el valor que se encuentra en el cuadro de texto (la posicin) al controlador de los servos.

End Sub Private Sub Barra3_Scroll() Barra3_Change

91

End Sub Private Sub Barra4_Change() Text4.Text = Str(Barra4.Value) ' Enva el valor que tenga la barra (0 a 254) al cuadro de texto MSComm1.Output = Chr$(255) ' Enva el Bit de sincronizacin requerido por el controlador de los servos. MSComm1.Output = Chr$(3) ' Selecciona el servo #4

MSComm1.Output = Chr$(Text4.Text) ' Enva el valor que se encuentra en el cuadro de texto (la posicin) al controlador de los servos.

End Sub Private Sub Barra4_Scroll() Barra4_Change End Sub Private Sub Barra5_Change() Text5.Text = Str(Barra5.Value) ' Enva el valor que tenga la barra (0 a 254) al cuadro de texto MSComm1.Output = Chr$(255) ' Enva el Bit de sincronizacin requerido por el controlador de los servos. MSComm1.Output = Chr$(4) ' Selecciona el servo #5

92

MSComm1.Output = Chr$(Text5.Text) ' Enva el valor que se encuentra en el cuadro de texto (la posicin) al controlador de los servos.

End Sub Private Sub Barra5_Scroll() Barra5_Change End Sub Private Sub Barra6_Change() Text6.Text = Str(Barra6.Value) ' Enva el valor que tenga la barra (0 a 254) al cuadro de texto MSComm1.Output = Chr$(255) ' Enva el Bit de sincronizacin requerido por el controlador de los servos. MSComm1.Output = Chr$(5) ' Selecciona el servo #6

MSComm1.Output = Chr$(Text6.Text) ' Enva el valor que se encuentra en el cuadro de texto (la posicin) al controlador de los servos.

End Sub Private Sub Barra6_Scroll() Barra6_Change End Sub

93

Private Sub Barra7_Change() Text7.Text = Str(Barra7.Value) ' Enva el valor que tenga la barra (0 a 254) al cuadro de texto MSComm1.Output = Chr$(255) ' Enva el Bit de sincronizacin requerido por el controlador de los servos. MSComm1.Output = Chr$(6) ' Selecciona el servo #7

MSComm1.Output = Chr$(Text7.Text) ' Enva el valor que se encuentra en el cuadro de texto (la posicin) al controlador de los servos.

End Sub Private Sub Barra7_Scroll() Barra7_Change End Sub Private Sub Barra8_Change() Text8.Text = Str(Barra8.Value) ' Enva el valor que tenga la barra (0 a 254) al cuadro de texto MSComm1.Output = Chr$(255) ' Enva el Bit de sincronizacin requerido por el controlador de los servos. MSComm1.Output = Chr$(7) ' Selecciona el servo #8

94

MSComm1.Output = Chr$(Text8.Text) ' Enva el valor que se encuentra en el cuadro de texto (la posicin) al controlador de los servos.

End Sub Private Sub Barra8_Scroll() Barra8_Change End Sub Private Sub Command1_Click()

End Sub

Private Sub CentrarBar1_Click() MSComm1.Output = Chr$(255) ' Envia el bit de sincronizacin requerido por el servo controlador. MSComm1.Output = Chr$(0) MSComm1.Output = Chr$(127) Text1.Text = Str(127) Barra1.Value = Text1.Text End Sub ' Enva el # del servo al servo controlador. ' Enva el valor de 127 al servo controlador.

' Actualiza el valor del cuadro de texto con 127. ' Posiciona la barra en el centro.

Private Sub CentrarBar2_Click()

95

MSComm1.Output = Chr$(255)

' Envia el bit de sincronizacin requerido por el servo controlador.

MSComm1.Output = Chr$(1) MSComm1.Output = Chr$(127) Text2.Text = Str(127) Barra2.Value = Text2.Text End Sub

' Enva el # del servo al servo controlador. ' Enva el valor de 127 al servo controlador.

' Actualiza el valor del cuadro de texto con 127. ' Posiciona la barra en el centro.

Private Sub CentrarBar3_Click() MSComm1.Output = Chr$(255) ' Envia el bit de sincronizacin requerido por el servo controlador. MSComm1.Output = Chr$(2) MSComm1.Output = Chr$(127) Text3.Text = Str(127) Barra3.Value = Text3.Text End Sub ' Enva el # del servo al servo controlador. ' Enva el valor de 127 al servo controlador.

' Actualiza el valor del cuadro de texto con 127. ' Posiciona la barra en el centro.

Private Sub CentrarBar4_Click() MSComm1.Output = Chr$(255) ' Envia el bit de sincronizacin requerido por el servo controlador. MSComm1.Output = Chr$(3) MSComm1.Output = Chr$(127) ' Enva el # del servo al servo controlador. ' Enva el valor de 127 al servo controlador.

96

Text4.Text = Str(127) Barra4.Value = Text4.Text End Sub

' Actualiza el valor del cuadro de texto con 127. ' Posiciona la barra en el centro.

Private Sub CentrarBar5_Click() MSComm1.Output = Chr$(255) ' Envia el bit de sincronizacin requerido por el servo controlador. MSComm1.Output = Chr$(4) MSComm1.Output = Chr$(127) Text5.Text = Str(127) Barra5.Value = Text5.Text End Sub ' Enva el # del servo al servo contr olador. ' Enva el valor de 127 al servo controlador.

' Actualiza el valor del cuadro de texto con 127. ' Posiciona la barra en el centr o.

Private Sub CentrarBar6_Click() MSComm1.Output = Chr$(255) ' Envia el bit de sincronizacin requerido por el servo controlador. MSComm1.Output = Chr$(5) MSComm1.Output = Chr$(127) Text6.Text = Str(127) Barra6.Value = Text6.Text End Sub ' Enva el # del servo al servo controlador. ' Enva el valor de 127 al servo controlador.

' Actualiza el valor del cuadro de texto con 127. ' Posiciona la barra en el centro.

97

Private Sub CentrarBar7_Click() MSComm1.Output = Chr$(255) ' Envia el bit de sincronizacin requerido por el servo controlador. MSComm1.Output = Chr$(6) MSComm1.Output = Chr$(127) Text7.Text = Str(127) Barra7.Value = Text7.Text End Sub ' Enva el # del servo al servo controlador. ' Enva el valor de 127 al servo controlador.

' Actualiza el valor del cuadro de texto con 127. ' Posiciona la barra en el centro.

Private Sub CentrarBar8_Click() MSComm1.Output = Chr$(255) ' Envia el bit de sincronizacin requerido por el servo controlador. MSComm1.Output = Chr$(7) MSComm1.Output = Chr$(127) Text8.Text = Str(127) Barra8.Value = Text8.Text End Sub ' Enva el # del servo al servo controlador. ' Enva el v alor de 127 al servo controlador.

' Actualiza el valor del cuadro de texto con 127. ' Posiciona la barra en el centro.

Private Sub Form_Load() MSComm1.Settings = "9600,N,8,1" ' Bits por segundo =9600, Sin paridad, 8 -bits de datos, 1 bit de parada.

98

MSComm1.CommPort = 1 MSComm1.PortOpen = True End Sub

' Com1 ser el puerto com predefinido. ' Abriendo el puerto para ser usado.

Private Sub Timer1_Timer()

End Sub

Private Sub mnuCom19600_Click() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If MSComm1.Settings = "9600,N,8,1" MSComm1.CommPort = 1 MSComm1.PortOpen = True End Sub

Private Sub mnuCom29600_Click() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If MSComm1.Settings = "9600,N,8,1"

99

MSComm1.CommPort = 2 MSComm1.PortOpen = True End Sub

Private Sub Salida_Click() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If End End Sub

Private Sub VScroll1_Change()

End Sub

100

Apndice 3: Cdigo Progps1

101

#include <iostream> #include <fstream> #include <stdio.h> #include <termios.h> #include <unistd.h> #include <SerialStream.h>

using namespace std; using namespace LibSerial ; #define admin = 0; #define admed = 1; #define admax = 2; #define atmin = 3; #define atmed = 4; #define atmax = 5; #define demin = 6; #define demed = 7; #define decom = 8; #define izmin = 9; #define izmed = 10; #define izmax = 11; #define centro = 12;

102

#define freno = 13;

class puertoserial {

public: // Constructor puertoserial(); // Funciones miembro de la clase "puertoserial" void escribir(char servo, char desplazamiento); void ruta(int instruc[],int numinstruc); void cerrar();

private: // Datos miembro de la clase "puertoserial" SerialStream serial_port ; //const char* const SERIAL_PORT_DEVICE = "/dev/ttyS0" ; //char servo; //char desplazamiento;

// protected:

//using namespace LibSerial ;

103

public:

//SerialStream serial_port ; //const char* const SERIAL_PORT_DEVICE = "/dev/ttyS0" ; };

puertoserial::puertoserial(){ const char* const SERIAL_PORT_DEVICE = "/dev/ttyUSB0" ; // Utilizando namespace LibSerial ;

// SerialStream serial_port ; serial_port.Open( SERIAL_PORT_DEVICE ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not open serial port " << SERIAL_PORT_DEVICE << std::endl ; exit(1) ; } //

104

// Configurando la tasa de baudios del puerto serial // serial_port.SetBaudRate( SerialStreamBuf::BAUD_38400 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Coul d not set the baud rate." << std::endl ; exit(1) ; } // // Configurando el nmero de bits. // serial_port.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could no t set the character size." << std::endl ; exit(1) ; } // // Deshabilitando la paridad // serial_port.SetParity( SerialStreamBuf::PARITY_NONE ) ; if ( ! serial_port.good() )

105

{ std::cerr << "Error: Could not disab le the parity." << std::endl ; exit(1) ; } // // Configurando el bit de parada // serial_port.SetNumOfStopBits( 1 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not set the number of stop bits." << std::endl ; exit(1) ; } // // Iniciando el control de flujo del hardware // serial_port.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE ) ; if ( ! serial_port.good() ) { std::cerr << "Error : Could not use hardware flow control." << std::endl ;

106

exit(1) ; } //return EXIT_SUCCESS ;

void puertoserial::escribir(char servo, char desplazamiento) {

char info[] = {255,0,0};

info[1]=servo; info[2]=desplazamiento;

serial_port.write(info,3 ) ; sleep(1);

void puertoserial::ruta(int instruc[],int numinstruc)

107

int a = numinstruc; char info[3]; for(int i=0; i < a;i++) {

switch( instruc[i]) { case 0:{ info[0]= 255; info[1]=0; info[2]=70; serial_port.write(info,3 ); break; } case 1:{ info[0]= 255; info[1]=0; info[2]=70;

108

serial_port.write(info,3 ); sleep(1); info[0]= 255; info[1]=0; info[2]=70; serial_port.write(info,3 ); break; } case 2:{ info[0]= 255; info[1]=0; info[2]=45; serial_port.write(info,3 ); sleep(1); info[0]= 255; info[1]=0; info[2]=45; serial_port.write(info,3 ); break; } case 3:{ info[0]= 255;

109

info[1]=0; info[2]=180; serial_port.write(info,3 ); break; } case 4:{ info[0]= 255; info[1]=0; info[2]=180; serial_port.write(info,3 ); sleep(1); info[0]= 255; info[1]=0; info[2]=180; serial_port.write(info,3 ); break; } case 5:{ info[0]= 255; info[1]=0; info[2]=215; serial_port.write(info,3 );

110

sleep(1); info[0]= 255; info[1]=0; info[2]=215; serial_port.write(info,3 ); break; } case 6:{ info[0]= 255; info[1]=1; info[2]=93; serial_port.write(info,3 ); break; } case 7:{ info[0]= 255; info[1]=1; info[2]=71; serial_port.write(info,3 ); break; } case 8:{

111

info[0]= 255; info[1]=1; info[2]=56; serial_port.write(info,3 ); break; } case 9:{ info[0]= 255; info[1]=1; info[2]=133; serial_port.write(info,3 ); break; } case 10:{ info[0]= 255; info[1]=1; info[2]=155; serial_port.write(info,3 ); break; } case 11:{ info[0]= 255;

112

info[1]=1; info[2]=170; serial_port.write(info,3 ); break; } case 12:{ info[0]= 255; info[1]=1; info[2]=114; serial_port.write(info,3 ); break; } case 13:{ info[0]= 255; info[1]=0; info[2]=127; serial_port.write(info,3 ); break; } default:{ cout<<"Instruccin invlida...Aplicando freno y centrando el steer..."<<endl;

113

//info[] = {255,1,127}; info[0]= 255; info[1]=0; info[2]=127; serial_port.write(info,3 ); sleep(1);

//info[] = {255,0,79}; info[0]= 255; info[1]=1; info[2]=127; serial_port.write(info,3 );

break; } } sleep(1);

} cout<<endl;

114

void puertoserial::cerrar() { serial_port.Close(); }

int main() {

char respuesta = 'S'; int TAMARREGLO =0; int opcion; int trazadoruta[100]={0}; puertoserial com1; system("clear");

115

cout<<"A continuacin se le presentarn una lista de instrucciones con las cuales usted puede trazar una ruta para el rover, digite una tecla para continuar..."<<endl;

cin.get(); while(respuesta=='S') { system("clear"); cout<< "adelante vel min = 0"<<"\t\tadelante vel med = 1"<<"\t\tadelante vel max = 2"<<endl; cout<< "atrs vel min = 3"<<"\t\tatrs vel med = 4"<<"\t\tatrs vel max = 5"<<endl; cout<< "derecha giro min = 6"<<"\t\tderecha giro med = 7"<<"\t\tderecha giro max = 8"<<endl; cout<< "izquierda giro min = 9"<<"\t\tizquierda giro med =

10"<<"\t\tizquierda giro max = 11"<<endl; cout<< "centrar la direcin = 12"<<"\tfreno = 13"<<"\t\t\tTerminar trazado de ruta = 14"<<endl; cout<<"\n\nEscoja una opcin digitando el nmero correspondiente, por favor:"<<endl; cin>>opcion; if(opcion==14){ if(TAMARREGLO ==0){

116

cout<<"Usted no traz ninguna ruta.\n\n Finalizando el programa..."<<endl; exit(0); } else{ system("clear"); cout<<"Su ruta es la siguiente:"<<endl; for(int i=0;i<TAMARREGLO;i++){ cout<<trazadoruta [i]<<"\t";

} cout<<endl; cout<<"Ejecutando la ruta..."<<endl; respuesta = 'N';

} } else{ trazadoruta [TAMARREGLO]=opcion; TAMARREGLO++;

117

com1.ruta(trazadoruta,TAMARREGLO); cout<<"Apagando rover..."<<endl; cout<<"Aplicando frenos..."<<endl; com1.escribir(0,127); cout<<"Centrando el steer..."<<endl; com1.escribir(1,114);

cout<<"Presione ENTER para terminar el programa..."<<endl;

cin.get(); cin.get();

return 0; }

118

Apndice 4: Cdigo ProGPSfinal

119

//Llamado a libreras de cabecera #include <iostream> #include <fstream> #include <math.h> #include <stdio.h> #include <termios.h> #include <unistd.h> #include <SerialStream.h> #include <string.h> /* Funcin strlen() */ #include <fcntl.h> /* Modos de apertura y funcin open()*/ #include <stdlib.h> /* Funciones write() y close() */ //Definicin de constantes que permiten cambiar el valor de alguna definicin, sin alterar al programa //para utilizarlas en la funcin ruta int invdirderecha[] = {8,1,13,12,11,4,13,12,8,1,13,12,11,4,13 ,9,4,13,12,8,1,13,12,11,4,13,12,8,1,13,12,11,4,13,9, 4,13,12};//Rutina de giro de 180 hacia la derecha #define invdird 38 int invdirizquierda[] = {11,1,13,12,8,4,13,12,11,1,13,1,13,12,6,4,3,13,12,11,1,13,12,8,4,13,12,11,1,13,1,13,12,6,4, 4,13,12};//Rutina de giro de 180 hacia la izquierda #define invdiri 38 int medgiroderecha[] = {8,1,13,12,11,4,13,12,8,1,13,12,11,4,13,9,4,13,12};//Rutina de giro de 90 hacia la derecha #define medgd 19 int medgiroizquierda[] = {11,1,13,12,8,4,13,12,11,1,13,1,13,12,6,4,3,13 ,12};//Rutina de giro de 90 hacia la izquierda #define medgi 19 int escalderecha[] = {11,4,13,12,8,2,13,12,11,1,1,13,12};//Rutina para la aproximacin al punto deseado por medio de una ruta en forma de escalera hacia la derecha. #define escd 13 int escalizquierda[] = {8,4,13,12,11,2,13,12,8,1,1,0,13,12};//Rutina para la aproximacin al punto deseado por medio de una ruta en forma de escalera hacia la izquierda. #define esci 14 //Definicin de constantes que permiten cambiar el valor de alguna definicin, sin alterar al programa //para utilizarlas en la funcin escribir #define izqmin 133 #define izqmed 155 #define izqmax 170 #define dermin 93

120

#define dermed 71 #define dermax 56 #define admin 70 #define admed 70 #define admax 45 #define atmin 180 #define atmed 180 #define atmax 215 #define freno 127 #define centro 114 #define steer 1 #define motor 0 //Precisin #define maxdist 1000 //Para utilizarlas en la funcin ruta #define advelmin 0 #define advelmed 1 #define advelmax 2 #define atvelmin 3 #define atvelmed 4 #define atvelmax 5 #define degirmin 6 #define degirmed 7 #define degirmax 8 #define izgirmin 9 #define izgirmed 10 #define izgirmax 11 #define centrar 12 #define frenar 13

using namespace std; using namespace LibSerial ; //Definicin de variables globales char infogps[] = "$GPRMC,184804.00,A,3723.476543,N,12202.239745,W,000.0,0.0,051196,15.6,E*7C"; char infogpsdestino[] = "$GPRMC,184804.00,A,3723.476543,N,12202.239745,W,000.0,0.0,051196,15.6,E*7C"; char horaUTC[]= "hhmmss.ss"; char estadogps[]="X";

121

char latitudGPS[] = "0dmm.0000000"; char latdegGPS[] = "dd"; char latminGPS[] = "mm.0000000"; char dlatitud[] = "X"; char longitudGPS[] = "0ddmm.0000000"; char londegGPS[] = "ddd"; char lonminGPS[] = "mm.0000000"; char dlongitud[] = "X"; char velsuelo[] = "000.00"; char pasadagrados[] = "0.0"; char fecha[] = "ddmmaa"; char variamag[] = "00.0"; char dvariamag[] = "X"; int latdeg, londeg, cuadranteactual; long double hora, latmin, lonmin, veloc, pasadgrad, varimagn, latituddeg, longituddeg,latitud,longitud, latdestino, londestino,latituddegdestino,longituddegdestino;

//Definicin de la clase puertoserial. Comunicacin con el receptor GPS

class puertoserial { public: // Constructor puertoserial(); // Funciones miembro de la clase "puertoserial" int leer(); void desfragmentar(char infgps[]); void marcadestino(); int cuadrante(long double distancialat, long double distancialon); long double distnav(long double latA = latitud, long double lonA = longitud, long double latB = latdestino, long double lonB = londestino); long double distlatitud(long double latA = latitud, long double latB = latdestino); long double distlongitud(long double lonA = longitud, long double lonB = londestino);

122

private: // Datos miembro de la clase "puertoserial" SerialStream serial_port ; }; puertoserial::puertoserial(){ const char* const SERIAL_PORT_DEVICE = "/dev/ttyUSB1" ; // Utilizando namespace LibSerial ; // SerialStream serial_port ; serial_port.Open( SERIAL_PORT_DEVICE ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not open serial port " << SERIAL_PORT_DEVICE << std::endl ; exit(1) ; } // // Configurando la tasa de baudios del puerto serial // serial_port.SetBaudRate( SerialStreamBuf::BAUD_38400 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not set the baud rate." << std::endl ; exit(1) ; } // // Configurando el nmero de bits. // serial_port.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not set the character size." << std::endl ; exit(1) ; } // // Deshabilitando la paridad // serial_port.SetParity( SerialStreamBuf::PARITY_NONE ) ; if ( ! serial_port.good() ) {

123

std::cerr << "Error: Could not disable the parity." << std::endl ; exit(1) ; } // // Configurando el bit de parada // serial_port.SetNumOfStopBits( 1 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not set the number of stop bits." << std::endl ; exit(1) ; } // // Iniciando el control de flujo del hardware // serial_port.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not use hardware flow control." << std::endl ; exit(1) ; } //return EXIT_SUCCESS ; }

int puertoserial::leer() { Again: // esta es la etiqueta que permite iniciar el proceso en caso de que NO se haya obtenido una cadena de info valida char next_byte; int e=0; int i=1; int coma =0; int entre = 1; while(e==0) { cout<<"Entr al while"<<endl; while(serial_port.rdbuf()->in_avail() > 0 && entre == 1 ) { cout<<"hay info en el puerto"<<endl;

124

serial_port.get(next_byte); if(next_byte == '$') { e=1; cout<<"Reconoci el dolar"<<endl; entre = 0; } } } infogps[0] = (char)next_byte; cout<<"Esto es infogps[0]:"<<infogps[0]<<endl; entre = 1; while( serial_port.rdbuf()->in_avail() > 0 && entre == 1) { char next_byte; serial_port.get(next_byte); //std::cerr << std::hex << (int)next_byte;// << " "; cout<<next_byte<<"/t"; infogps[i] = (char)next_byte; cout<<"Esto es infogps[i]:"<<infogps[i]<<endl; i= i+1; if(next_byte == '\n'){ entre = 0; cout<<"Ojo"<<infogps[i-1]<<infogps[i]<<endl; } } if(infogps[i-5] != '*'){ goto Again; // No se obtuvo una cadena de informacin vlida } char *puntero; puntero = &infogps[0]; while(coma<2){ if(*puntero == ',') { coma++; } puntero++; } if(*puntero != 'A'){ goto Again; // No se obtuvo una cadena de informacin vlida } cout<<"Esto es el *:"<<infogps[i-5]<<endl; return i;

125

void puertoserial::desfragmentar(char infgps[]) { char *puntero; puntero = &infgps[0]; while(*puntero != ',')//buscando la primera coma { puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma int imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//guardando la hora UTC { horaUTC[imete]=*puntero; //cout<<horaUTC[imete]<<endl; imete++; puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//guardando el estado de GPS, si 'V', no funciona { estadogps[imete]=*puntero; imete++; puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//Obteniendo todo lo que corresponde a la latitud { latitudGPS[imete]=*puntero; imete++; puntero++; } cout<<"Esto es latitudGPS:"<<latitudGPS<<endl; latdegGPS[0]=latitudGPS[0];//Guardando lo que corresponde a los grados de la latitud latdegGPS[1]=latitudGPS[1]; cout<<"Esto es latdegGPS:"<<latdegGPS<<endl; latdeg = atoi(latdegGPS);//convirtiendo a valor numrico los grados de la latitud

126

imete=0; cout<<"Esto es latitudGPS:"<<latitudGPS<<endl; while(imete<9)//guardando lo que corresponde a los minutos y dcimas de minutos de la latitud { latminGPS[imete]=latitudGPS[imete+2]; imete++; } cout<<"Esto es latminGPS:"<<latminGPS<<endl; latmin = atof(latminGPS);//Convirtiendo a valor numrico los minutos de la latitud //Obteniendo el valor de la latitud en grados cout<<"Esto es latdegGPS:"<<latdegGPS<<endl; cout<<"Esto es latdeg:"<<latdeg<<endl; cout<<"Esto es latmin:"<<latmin<<endl; latmin = latmin/60;//obteniendo las dcimas de grados de la latitud cout<<"Esto es latmin dividido entre 60:"<<latmin<<endl; latituddeg = latdeg + latmin;//obteniendo el valor de la latitud en grados cout<<"Esto es la suma de latdeg y latmin:"<<latituddeg<<endl; //Obteniendo el valor de la latitud en radianes latitud = latituddeg*1000/57.295779513; cout<<"Esto es Latitud:\t"<<latitud<<endl; puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//guardando la direccin de la latitud (Norte o Sur) { dlatitud[imete]=*puntero; imete++; puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//Obteniendo todo lo que corresponde a la longitud { longitudGPS[imete]=*puntero; imete++; puntero++; } londegGPS[0]=longitudGPS[0];//Guardando lo que corresponde a los grados de la longitud londegGPS[1]=longitudGPS[1]; londegGPS[2]=longitudGPS[2]; londeg = atoi(londegGPS);//Obteniendo el valor numrico de los grados de la longitud

127

imete=0;//se inicia el puntero de variable receptora en 0 while(imete<9)//guardando lo que corresponde a los minutos y dcimas de minutos de la longitud { lonminGPS[imete]=longitudGPS[imete+3]; imete++; } lonmin = atof(lonminGPS);//Obteniendo el valor numrico de los minutos de la longitud //Obteniendo el valor de la longitud en grados cout<<"Esto es londegGPS:"<<londegGPS<<endl; cout<<"Esto es londeg:"<<londeg<<endl; cout<<"Esto es lonmin:"<<lonmin<<endl; lonmin = lonmin/60;//obteniendo las dcimas de grados de la longitud cout<<"Esto es lonmin dividido entre 60:"<<lonmin<<endl; longituddeg = londeg + lonmin;//obteniendo el valor de la longitud en grados cout<<"Esto es la suma de londeg y lonmin:"<<longituddeg<<endl; //Obteniendo el valor de la longitud en radianes longitud = longituddeg*1000/57.295779513; cout<<"Esto es Longitud:\t"<<longitud<<endl; puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//guardando la direccin de la longitud (Este u Oeste) { dlongitud[imete]=*puntero; imete++; puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//guardando la velocidad respecto al suelo { velsuelo[imete]=*puntero; imete++; puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//Guardando la pasada real en grados { pasadagrados[imete]=*puntero; imete++;

128

puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//Guardando la fecha en formato dd/mm/aa { fecha[imete]=*puntero; imete++; puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//guardando la variacin magntica { variamag[imete]=*puntero; imete++; puntero++; } puntero++;//se posiciona el puntero en el siguiente caracter despus de la coma imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//Guardando la direccin de la variacin magntica { dvariamag[imete]=*puntero; imete++; puntero++; } //Conversin de caracteres a valores numricos hora = atof (horaUTC); veloc = atof (velsuelo); pasadgrad = atof (pasadagrados); varimagn = atof (variamag); } long double puertoserial::distnav(long double latA, long double lonA, long double latB, long double lonB) { long double dkm = 6366.70702*acos(sin(latB)*sin(latA)+cos(latB)*cos(latA)*cos(lonB-lonA)); long double dm = dkm*1000; return dm; } long double puertoserial::distlatitud(long double latA, long double latB) { long double dkmA = 6366.70702*latA;

129

long double dkmB = 6366.70702*latB; long double dm = (dkmB-dkmA)*1000; return dm; } long double puertoserial::distlongitud(long double lonA, long double lonB) { long double dkmA = 6366.70702*lonA; long double dkmB = 6366.70702*lonB; long double dm = (dkmB-dkmA)*1000; return dm; } void puertoserial::marcadestino() { char latitudGPSdestino[] = "ddmm.mmmmmm"; char latdegGPSdestino[] = "dd"; char latminGPSdestino[] = "mm.mmmmmm"; char longitudGPSdestino[] = "dddmm.mmmmmm"; char londegGPSdestino[] = "ddd"; char lonminGPSdestino[] = "mm.mmmmmm"; int latdegdestino, londegdestino; long double latmindestino, lonmindestino; Denuevo: // esta es la etiqueta que permite iniciar el proceso en caso de que no se haya obtenido una cadena de info vlida char next_byte; int e=0; int i=1; int entre = 1; int imete = 0; int coma = 0; cout<<"Favor posicionar al rover en el destino, y presionar ENTER cuando se est listo, el programa tomar por usted la geoposicin almacenndola en latdestino y en londestino..."<<endl; cin.get(); cout<<"Registrando la ubicacin actual, favor esperar..."<<endl; while(e==0) { while(serial_port.rdbuf()->in_avail() > 0 && entre == 1 ) { cout<<"hay info en el puerto"<<endl; serial_port.get(next_byte);

130

if(next_byte == '$') { e=1; entre = 0; } } } infogpsdestino[0] = (char)next_byte; entre = 1; while( serial_port.rdbuf()->in_avail() > 0 && entre == 1) { char next_byte; serial_port.get(next_byte); cout<<next_byte; infogpsdestino[i] = (char)next_byte; i= i+1; if(next_byte == '\n'){ entre = 0; } } cout<<endl; if(infogpsdestino[i-5] != '*'){ goto Denuevo; // No se obtuvo una cadena de informaci n vlida } char *puntero; puntero = &infogpsdestino[0]; while(coma<2){ if(*puntero == ',') { coma++; } puntero++; } if(*puntero != 'A'){ goto Denuevo; // No se obtuvo una cadena de informaci n vlida } cout<<"Esto es el *:"<<infogpsdestino[i-5]<<endl; cout<<"Esto es el A:"<<*puntero<<endl; cout<<"Ubicacin almacenada, procesando informacin..."<<endl; //latitud coma = 0;

131

puntero = &infogpsdestino[0]; while(coma<3){ if(*puntero == ',') { coma++; } puntero++; } imete = 0; while(*puntero != ',')//Obteniendo todo lo que corresponde a la latitud destino { latitudGPSdestino[imete]=*puntero; imete++; puntero++; } cout<<"Esto es latitudGPSdestino:"<<latitudGPSdestino<<endl; latdegGPSdestino[0]=latitudGPSdestino[0];//Guardando lo que corresponde a los grados de la latitud destino latdegGPSdestino[1]=latitudGPSdestino[1]; cout<<"Esto es latdegGPSdestino:"<<latdegGPSdestino<<endl; latdegdestino = atoi(latdegGPSdestino);//convirtiendo a valor numrico los grados de la latitud destino imete=0; cout<<"Esto es latitudGPSdestino:"<<latitudGPSdestino<<endl; while(imete<9)//guardando lo que corresponde a los minutos y dcimas de minutos de la latitud destino { latminGPSdestino[imete]=latitudGPSdestino[imete+2]; imete++; } cout<<"Esto es latminGPSdestino:"<<latminGPSdestino<<endl; latmindestino = atof(latminGPSdestino);//Convirtiendo a valor numrico los minutos de la latitud destino //Obteniendo el valor de la latitud destino en grados cout<<"Esto es latdegGPSdestino:"<<latdegGPSdestino<<endl; cout<<"Esto es latdegdestino:"<<latdegdestino<<endl; cout<<"Esto es latmindestino:"<<latmindestino<<endl;

132

latmindestino = latmindestino/60;//obteniendo las dcimas de grados de la latitud destino cout<<"Esto es latmindestino dividido entre 60:"<<latmindestino<<endl; latituddegdestino = latdegdestino + latmindestino;//obteniendo el valor de la latitud destino en grados cout<<"Esto es la suma de latdegdestino y latmindestino:"<<latituddegdestino<<endl; //Obteniendo el valor de la latitud destino en radianes latdestino = latituddegdestino*1000/57.295779513; cout<<"Esto es la Latitud destino:\t"<<latdestino<<endl;

//longitud coma = 0; puntero = &infogpsdestino[0]; while(coma<5){ if(*puntero == ',') { coma++; } puntero++; } imete=0;//se inicia el puntero de variable receptora en 0 while(*puntero != ',')//Obteniendo todo lo que corresponde a la longitud destino { longitudGPSdestino[imete]=*puntero; imete++; puntero++; } londegGPSdestino[0]=longitudGPSdestino[0];//Guardando lo que corresponde a los grados de la longitud destino londegGPSdestino[1]=longitudGPSdestino[1]; londegGPSdestino[2]=longitudGPSdestino[2]; londegdestino = atoi(londegGPSdestino);//Obteniendo el valor numrico de los grados de la longitud destino imete=0;//se inicia el puntero de variable receptora en 0 while(imete<9)//guardando lo que corresponde a los minutos y dcimas de minutos de la longitud destino { lonminGPSdestino[imete]=longitudGPSdestino[imete+3];

133

imete++; } lonmindestino = atof(lonminGPSdestino);//Obteniendo el valor numrico de los minutos de la longitud destino //Obteniendo el valor de la longitud destino en grados cout<<"Esto es londegGPSdestino:"<<londegGPSdestino<<endl; cout<<"Esto es londegdestino:"<<londegdestino<<endl; cout<<"Esto es lonmindestino:"<<lonmindestino<<endl; lonmindestino = lonmindestino/60;//obteniendo las dcimas de grados de la longitud destino cout<<"Esto es lonmindestino dividido entre 60:"<<lonmindestino<<endl; longituddegdestino = londegdestino + lonmindestino;//obteniendo el valor de la longitud destino en grados cout<<"Esto es la suma de londegdestino y lonmindestino:"<<longituddegdestino<<endl; //Obteniendo el valor de la longitud destino en radianes londestino = longituddegdestino*1000/57.295779513; cout<<"Esto es la longitud destino:\t"<<londestino<<endl; cout<<"Proceso de marcacin del destino finalizado, puede proceder a posicionar al rover en el inicio del recorrido"<<endl; cout<<"Presione ENTER cuando todo est listo para dar inicio a la navegacin..."<<endl; cin.get(); } int puertoserial::cuadrante(long double distancialat, long double distancialon) { //Calcula en cual cuadrante se encuentra el rover int a=0; //Variable que almacena el cuadrante if(distancialat<0 && distancialon>0) { a=1;//El rover se encuentra en el primer cuadrante } if(distancialat<0 && distancialon<0) { a=2;//El rover se encuentra en el segundo cuadrante } if(distancialat>0 && distancialon<0) { a=3;//El rover se encuentra en el tercer cuadrante

134

} if(distancialat>0 && distancialon>0) { a=4;//El rover se encuentra en el cuarto cuadrante } if(distancialat==0 && distancialon>0) { a=5;//El rover se encuentra en el eje x positivo } if(distancialat<0 && distancialon==0) { a=6;//El rover se encuentra en el eje y positivo } if(distancialat==0 && distancialon>0) { a=7;//El rover se encuentra en el eje x negativo } if(distancialat>0 && distancialon==0) { a=8;//El rover se encuentra en el eje y negativo } return a;//Permite almacenar el cuadrante desde la funcin principal }

//Definicin de la clase puertoserial1. Comunicacin con la tarjeta controladora de servomotores class puertoserial1 { public: // Constructor puertoserial1(); // Funciones miembro de la clase "puertoserial" void escribir(char servo, char desplazamiento); void ruta(int instruc[],int numinstruc); void cerrar(); private: // Datos miembro de la clase "puertoserial" SerialStream serial_port ; //const char* const SERIAL_PORT_DEVICE = "/dev/ttyS0" ; //char servo; //char desplazamiento;

135

// protected: //using namespace LibSerial ;

public: //SerialStream serial_port ; //const char* const SERIAL_PORT_DEVICE = "/dev/ttyS0" ; }; puertoserial1::puertoserial1(){ const char* const SERIAL_PORT_DEVICE = "/dev/ttyUSB0" ; // Utilizando namespace LibSerial ; // SerialStream serial_port ; serial_port.Open( SERIAL_PORT_DEVICE ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not open s erial port " << SERIAL_PORT_DEVICE << std::endl ; exit(1) ; } // // Configurando la tasa de baudios del puerto serial // serial_port.SetBaudRate( SerialStreamBuf::BAUD_38400 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not set the baud rate." << std::endl ; exit(1) ; } // // Configurando el nmero de bits. // serial_port.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not set the character size." << std::endl ; exit(1) ; }

136

// // Deshabilitando la paridad // serial_port.SetParity( SerialStreamBuf::PARITY_NONE ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not disable the parity." << std::endl ; exit(1) ; } // // Configurando el bit de parada // serial_port.SetNumOfStopBits( 1 ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not set the number of stop bits." << std::endl ; exit(1) ; } // // Iniciando el control de flujo del hardware // serial_port.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE ) ; if ( ! serial_port.good() ) { std::cerr << "Error: Could not use hardware flow control." << std::endl ; exit(1) ; } //return EXIT_SUCCESS ; }

void puertoserial1::escribir(char servo, char desplazamiento) { char info[] = {255,0,0}; info[1]=servo; info[2]=desplazamiento; serial_port.write(info,3 ) ; sleep(1); }

137

void puertoserial1::ruta(int instruc[],int numinstruc) { int a = numinstruc; char info[3]; for(int i=0; i < a;i++) { switch( instruc[i]) { case 0:{ info[0]= 255; info[1]=0; info[2]=70; serial_port.write(info,3 ); break; } case 1:{ info[0]= 255; info[1]=0; info[2]=70; serial_port.write(info,3 ); sleep(1); info[0]= 255; info[1]=0; info[2]=70; serial_port.write(info,3 ); break; } case 2:{ info[0]= 255; info[1]=0; info[2]=45; serial_port.write(info,3 ); sleep(1); info[0]= 255; info[1]=0; info[2]=45; serial_port.write(info,3 ); break; } case 3:{ info[0]= 255; info[1]=0;

138

info[2]=180; serial_port.write(info,3 ); break; } case 4:{ info[0]= 255; info[1]=0; info[2]=180; serial_port.write(info,3 ); sleep(1); info[0]= 255; info[1]=0; info[2]=180; serial_port.write(info,3 ); break; } case 5:{ info[0]= 255; info[1]=0; info[2]=215; serial_port.write(info,3 ); sleep(1); info[0]= 255; info[1]=0; info[2]=215; serial_port.write(info,3 ); break; } case 6:{ info[0]= 255; info[1]=1; info[2]=93; serial_port.write(info,3 ); break; } case 7:{ info[0]= 255; info[1]=1; info[2]=71; serial_port.write(info,3 ); break; } case 8:{

139

info[0]= 255; info[1]=1; info[2]=56; serial_port.write(info,3 ); break; } case 9:{ info[0]= 255; info[1]=1; info[2]=133; serial_port.write(info,3 ); break; } case 10:{ info[0]= 255; info[1]=1; info[2]=155; serial_port.write(info,3 ); break; } case 11:{ info[0]= 255; info[1]=1; info[2]=170; serial_port.write(info,3 ); break; } case 12:{ info[0]= 255; info[1]=1; info[2]=114; serial_port.write(info,3 ); break; } case 13:{ info[0]= 255; info[1]=0; info[2]=127; serial_port.write(info,3 ); break; } default:{

140

cout<<"Instruccin invlida...Aplicando freno y centrando el steer..."<<endl; info[0]= 255; info[1]=0; info[2]=127; serial_port.write(info,3 ); sleep(1); info[0]= 255; info[1]=1; info[2]=114; serial_port.write(info,3 ); break; } } sleep(1);

} cout<<endl; } void puertoserial1::cerrar() { serial_port.Close(); } int main(int argc, char* argv[]) { int cuadranteviejo, cuadranteactual; long double distlat1, distlat2, distlon1, distlon2, hipotenusa;//Variables internas de la funcin principal puertoserial com1;//Creacin del objeto com1 tipo clase puertoserial (GPS) puertoserial1 com2;//Creacin del objeto com2 tipo clase puertoserial1 (tarjeta servocontroladora) system("clear"); com1.marcadestino();//Marca la ubicacin destino //Inicio de la bsqueda del punto destino keepfor: // esta es la etiqueta que permite continuar la aproximacin hacia adelante a partir del punto de partida com2.escribir(steer,centro);//Centra la direccin del rover sleep(1);//Accin de avanzar dura un segundo

141

//com2.ruta(invdirderecha,invdird);//invdirderecha;//Giro de 180 hacia la derecha com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//clculo de la distancia de latitud distlon1 = com1.distlongitud();//clculo de la distancia de longitud com2.escribir(motor,admin);//Avance para determinar orientacin y decidir la prxima accin sleep(2);//Accin de avanzar dura dos segundos com2.escribir(motor,freno);//Detiene al rover cuadranteviejo = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin distlat2 = distlat1;//Almacena la latitud del punto A (latitud antes de tomar nueva decisin) distlon2 = distlon1;//Almacena la longitud del punto A (longitud antes de tomar nueva decisin) com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la presicin solicitada (Evita bsqueda infinita del punto) if(cuadranteviejo != cuadranteactual && hipotenusa > maxdist)//Comprobando que no haya ocurrido un cambio de cuadrante { goto keepfor;//hubo un cambio de cuadrante, toma de decisiones no aplica. Avanzar hacia adelante para tomar datos vlidos } if(hipotenusa > maxdist) { goto decision; //Salto a la toma de decisiones goto keepfor; } arrivo: // Etiqueta a la cual se llega si despus de haber realizado una decisin se alcanz la precisin solicitada //Presicin alcanzada, fin de bsqueda de destino. Destino localizado

142

cout<< "Destino alcanzado"<<endl; cout<<"Presione ENTER para terminar el programa..."<<endl; cin.get(); cin.get(); return 0; decision: if(fabs(distlat2)<fabs(distlat1) && fabs(distlon2)<fabs(distlon1))//Se alej del punto destino tanto en longitud como en latitud { if(cuadranteactual == 1 || cuadranteactual == 3) { if(fabs(distlat1) == fabs(distlon1)) { com2.ruta(invdirderecha,invdird);//invdirderecha;//Giro de 180 hacia la derecha goto keepfor; } if(fabs(distlat1)>fabs(distlon1)) { com2.ruta(invdirderecha,invdird);//invdirderecha;//Giro de 180 hacia la derecha goto keepfor; } if(fabs(distlat1)<fabs(distlon1)) { com2.ruta(invdirizquierda,invdiri);//invdirizquierda;//Giro de 180 hacia la izquierda goto keepfor; } } if(cuadranteactual == 2 || cuadranteactual == 4) { if(fabs(distlat1) == fabs(distlon1)) { com2.ruta(invdirizquierda,invdiri);//invdirizquierda;//Giro de 180 hacia la izquierda goto keepfor; } if(fabs(distlat1)>fabs(distlon1)) {

143

com2.ruta(invdirizquierda,invdiri);//invdirizquierda;//Giro de 180 hacia la izquierda goto keepfor; } if(fabs(distlat1)<fabs(distlon1)) { com2.ruta(invdirderecha,invdird);//invdirderecha;//Giro de 180 hacia la derecha goto keepfor; } } } if(distlat2<distlat1 && distlon2==distlon1)//Slo se alej en latitud, su longitud no vari { if(cuadranteactual == 1 || cuadranteactual == 3) { com2.ruta(invdirderecha,invdird);//invdirderecha;//Giro de 180 hacia la derecha goto keepfor; } if(cuadranteactual == 2 || cuadranteactual == 4) { com2.ruta(invdirizquierda,invdiri);//invdirizquierda;//Giro de 180 hacia la izquierda goto keepfor; } } if(distlat2==distlat1 && distlon2<distlon1)//Slo se alej en longitud, su latitud no vari { if(cuadranteactual == 1 || cuadranteactual == 3) { com2.ruta(invdirizquierda,invdiri);//invdirizquierda;//Giro de 180 hacia la izquierda goto keepfor; } if(cuadranteactual == 2 || cuadranteactual == 4) { com2.ruta(invdirderecha,invdird);//invdirderecha;//Giro de 180 hacia la derecha

144

goto keepfor; } } if(distlat2>distlat1 && distlon2<distlon1)//Si se alej en longitud pero se acerc en latitud { if(cuadranteactual == 1 || cuadranteactual == 3) { com2.ruta(medgiroderecha,medgd);//medgiroderecha;//Giro de 90 hacia la derecha goto keepfor; } if(cuadranteactual == 2 || cuadranteactual == 4) { com2.ruta(medgiroizquierda,medgi);//medgiroizquierda;//Giro de 90 hacia la izquierda goto keepfor; } } if(distlat2<distlat1 && distlon2>distlon1)//Si se alej en latitud pero se acerc en longitud { if(cuadranteactual == 1 || cuadranteactual == 3) { com2.ruta(medgiroizquierda,medgi);//medgiroizquierda;//Giro de 90 hacia la izquierda goto keepfor; } if(cuadranteactual == 2 || cuadranteactual == 4) { com2.ruta(medgiroderecha,medgd);//medgiroderecha;//Giro de 90 hacia la derecha goto keepfor; } }

if(distlat2>distlat1 && distlon2>distlon1)//Si se acerc en latitud y en longitud { if(cuadranteactual == 1 || cuadranteactual == 3)

145

{ if(fabs(distlat2-distlat1)<fabs(distlon2-distlon1)) { //horizontalderecha;//Buscando alinearse con el eje ms prximo mediante pequeos y continuos ajustes en la direccin(el eje horizontal aproximacin por la derecha) do{ com2.escribir(steer,dermin);//Gira la direccin un poco a la derecha sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admed);//Avance medio sleep(1);//Accin de avanzar dura un segundo com2.escribir(motor,freno);//Freno sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat2 = com1.distlatitud();//clculo de la distancia de latitud distlon2 = com1.distlongitud();//clculo de la distancia de longitud com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,atmed);//Retrocede para determinar orientacin y decidir la prxima accin sleep(1);//Accin de avanzar dura un segundo com2.escribir(motor,freno);//Detiene al rover sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM cuadranteviejo = com1.cuadrante(distlat2,distlon2);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin)

146

cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlat1 != distlat2); } if(fabs(distlat2-distlat1)>fabs(distlon2-distlon1)) { //verticalizquierda;//Buscando alinearse con el eje ms prximo mediante pequeos y continuos ajustes en la direccin(el eje vertical aproximacin por la izquierda) do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,izqmin);//Gira la direccin un poco a la izquierda sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admed);//Avance medio sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Freno sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat2 = com1.distlatitud();//clculo de la distancia de latitud distlon2 = com1.distlongitud();//clculo de la distancia de longitud com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,atmed);//Retrocede para determinar orientacin y decidir la prxima accin sleep(1);//Accin de avanzar dura un segundo com2.escribir(motor,freno);//Detiene al rover sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM

147

cuadranteviejo = com1.cuadrante(distlat2,distlon2);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlon1 != distlon2); } goto keepfor; } if(cuadranteactual == 2 || cuadranteactual == 4) { if(fabs(distlat2-distlat1)<fabs(distlon2-distlon1)) { //horizontalizquierda;//Buscando alinearse con el eje ms prximo mediante pequeos y continuos ajustes en la direccin(el eje horizontal aproximacin por la izquierda) do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,izqmin);//Gira la direccin un poco a la izquierda sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admed);//Avance medio sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Freno sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS

148

com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat2 = com1.distlatitud();//clculo de la distancia de latitud distlon2 = com1.distlongitud();//clculo de la distancia de longitud com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,atmed);//Retrocede para determinar orientacin y decidir la prxima accin sleep(1);//Accin de avanzar dura un segundo com2.escribir(motor,freno);//Detiene al rover sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM cuadranteviejo = com1.cuadrante(distlat2,distlon2);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlat1 != distlat2); } if(fabs(distlat2-distlat1)>fabs(distlon2-distlon1)) { //verticalderecha;//Buscando alinearse con el eje ms prximo mediante pequeos y continuos ajustes en la direccin(el eje vertical aproximacin por la derecha) do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,dermin);//Gira la direccin un poco a la izquierda sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM

149

com2.escribir(motor,admed);//Avance medio sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Freno sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat2 = com1.distlatitud();//clculo de la distancia de latitud distlon2 = com1.distlongitud();//clculo de la distancia de longitud com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,atmed);//Retrocede para determinar orientacin y decidir la prxima accin sleep(1);//Accin de avanzar dura un segundo com2.escribir(motor,freno);//Detiene al rover sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM cuadranteviejo = com1.cuadrante(distlat2,distlon2);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlon1 != distlon2); } } goto keepfor; }

150

if(distlat2>distlat1 && distlon2==distlon1)//Si ya no hay variacin en la longitud pero se est acercando en latitud { if(cuadranteactual == 1 || cuadranteactual == 3) { //aproxescderecha;//Aproximacin al punto deseado por medio de una ruta en forma de escalera hasta cumplir con la precisin deseada alguno de los ejes. Una vez alcanzada la precisin deseada en algn eje, se busca alcanzar la precisin deseada en el otro, tan slo avanzando hacia adelante o girando 90 a la derecha y continuando hacia adelante. do{//Escalera a la derecha hasta que se alcance la precisin en alguno de las coordenadas com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat2 = com1.distlatitud();//clculo de la distancia de latitud distlon2 = com1.distlongitud();//clculo de la distancia de longitud cuadranteviejo = com1.cuadrante(distlat2,distlon2);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin com2.ruta(escalderecha,escd);//rutina de un escaln a la derecha com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; if(distlon1 < maxdist) { do{//Ya lleg en longitud, siga avanzando hasta encontrar el punto.

151

sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admin);//Avanza sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Frena sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlat1 > maxdist); } if(distlat1 < maxdist)//Ya lleg en latitud, gire a la derecha y siga directo hasta cumplir con la longitud { com2.ruta(medgiroderecha,medgd);//medgiroderecha;//Giro de 90 hacia la derecha do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admin);//Avanza

152

sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Frena sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlon1 > maxdist); } }while(hipotenusa > maxdist); if(hipotenusa < maxdist) goto arrivo; goto keepfor; } if(cuadranteactual == 2 || cuadranteactual == 4) { //aproxescizquierda;//Aproximacin al punto deseado por medio de una ruta en forma de escalera hasta cumplir con la precisin deseada alguno de los ejes. Una vez alcanzada la precisin deseada en algn eje, se busca alcanzar la precisin deseada en el otro, tan slo avanzando hacia adelante o girando 90 a la izquierda y continuando hacia adelante. do{ com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat2 = com1.distlatitud();//clculo de la distancia de latitud distlon2 = com1.distlongitud();//clculo de la distancia de longitud

153

cuadranteviejo = com1.cuadrante(distlat2,distlon2);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin com2.ruta(escalizquierda,esci);//rutina de un escaln a la izquierda com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; if(distlon1 < maxdist) { do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admin);//Avanza sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Frena sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin)

154

cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlat1 > maxdist); } if(distlat1 < maxdist) { com2.ruta(medgiroizquierda,medgi);//medgiroizquierda;//Giro de 90 hacia la izquierda do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admin);//Avanza sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Frena sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlon1 > maxdist);

155

} }while(hipotenusa > maxdist); if(hipotenusa < maxdist) goto arrivo; } } if(distlat2==distlat1 && distlon2>distlon1)//Si ya no hay variacin en la latitud pero se est acercando en longitud { if(cuadranteactual == 1 || cuadranteactual == 3) { //aproxescizquierda;//Aproximacin al punto deseado por medio de una ruta en forma de escalera hasta cumplir con la precisin deseada alguno de los ejes. Una vez alcanzada la precisin deseada en algn eje, se busca alcanzar la precisin deseada en el otro, tan slo avanzando hacia adelante o girando 90 a la izquierda y continuando hacia adelante. do{ com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat2 = com1.distlatitud();//clculo de la distancia de latitud distlon2 = com1.distlongitud();//clculo de la distancia de longitud cuadranteviejo = com1.cuadrante(distlat2,distlon2);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin com2.ruta(escalizquierda,esci);//rutina de un escaln a la izquierda com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; if(distlat1 < maxdist)

156

{ do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admin);//Avanza sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Frena sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlon1 > maxdist); } if(distlon1 < maxdist) { com2.ruta(medgiroizquierda,medgi);//medgiroizquierda;//Giro de 90 hacia la izquierda do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM

157

com2.escribir(motor,admin);//Avanza sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Frena sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlat1 > maxdist); } }while(hipotenusa > maxdist); if(hipotenusa < maxdist) goto arrivo; goto keepfor; } if(cuadranteactual == 2 || cuadranteactual == 4) { //aproxescderecha;//Aproximacin al punto deseado por medio de una ruta en forma de escalera hasta cumplir con la precisin deseada alguno de los ejes. Una vez alcanzada la precisin deseada en algn eje, se busca alcanzar la precisin deseada en el otro, tan slo avanzando hacia adelante o girando 90 a la derecha y continuando hacia adelante. do{ com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat2 = com1.distlatitud();//clculo de la distancia de latitud distlon2 = com1.distlongitud();//clculo de la distancia de longitud cuadranteviejo = com1.cuadrante(distlat2,distlon2);//comprueba en que cuadrante se encontraba el rover antes de tomar decisin

158

com2.ruta(escalderecha,escd);//rutina de un escaln a la derecha com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; if(distlat1 < maxdist) { do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admin);//Avanza sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Frena sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor;

159

}while(distlon1 > maxdist); } if(distlon1 < maxdist) { com2.ruta(medgiroderecha,medgd);//medgiroderecha;//Giro de 90 hacia la derecha do{ sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(steer,centro);//Centra la direccin sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,admin);//Avanza sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com2.escribir(motor,freno);//Frena sleep(1);//Retardo necesario para que se reconozcan diferentes seales PWM com1.leer();//almacena la cadena de informacin enviada por el GPS com1.desfragmentar(infogps);//Separa la informacin til de la cadena enviada por el GPS distlat1 = com1.distlatitud();//Calcula y almacena la latitud del punto B (latitud despus de tomar nueva decisin) distlon1 = com1.distlongitud();//Calcula y almacena la longitud del punto B (longitud despus de tomar nueva decisin) cuadranteactual = com1.cuadrante(distlat1,distlon1);//comprueba en que cuadrante respecto al punto destino se encuentra hipotenusa = com1.distnav();//Comprobando que no se haya superado la precisin solicitada (Evita bsqueda infinita del punto) if(hipotenusa < maxdist) goto arrivo; if(cuadranteviejo != cuadranteactual) goto keepfor; }while(distlat1 > maxdist); } }while(hipotenusa > maxdist); if(hipotenusa < maxdist) goto arrivo; } goto keepfor; } goto keepfor; }

160

Apndice 5: Disco Compacto con los videos, planos de diseo y cdigo fuente

161

162

ANEXOS

163

Glosario
Iostream: Biblioteca de C++ con funciones que realizan operaciones de E/S. Es una implementacin orientada a objetos y est basada, al igual que stdio, en el concepto de flujos. Cuando se introducen caracteres desde el teclado, puede pensarse en caracteres que fluyen desde el teclado a las estructuras de datos del programa. Cuando se escribe en un archivo, se piensa en un flujo de bytes que van del programa al disco. Para acceder a la biblioteca iostream se debe incluir el archivo iostream.h. Este archivo contiene informacin de diferentes funciones de E/S. Define tambin los objetos cin y cout. POSIX: Es el acrnimo de Portable Operating System Interface; la X viene de UNIX como sea de identidad de la API. El trmino POSIX fue sugerido por Richard Stallman en respuesta a la demanda de la IEEE, que buscaba un nombre fcil de recordar. Una traduccin aproximada del acrnimo podra ser "Interfaz de Sistema Operativo Porttil basado en UNIX". Baud rate: La tasa de baudios (en ingls Baud Rate) es el nmero de unidades de seal por segundo. Un baudio puede contener varios bits. Root: En sistemas operativos del tipo Unix, root es el nombre convencional de la cuenta de usuario que posee todos los derechos en todos los modos (mono o multi usuario). root es tambin llamado superusuario. Normalmente esta es la cuenta de administrador. UHF: Por sus siglas en ingls: Ultra High Frequency, en espaol: frecuencia ultra alta. Es una banda del espectro electromagntico que ocupa el rango de frecuencias de 300 MHz a 3 GHz.

164

NMEA 0183 (o NMEA de forma abreviada): Es una especificacin combinada elctrica y de datos entre aparatos electrnicos marinos y receptores GPS. El protocolo NMEA 0183 es un medio a travs del cual los instrumentos martimos y tambin la mayora de los receptores GPS pueden comunicarse los unos con los otros. Ha sido definido, y est controlado, por la organizacin estadounidense National Marine Electronics Association. RTK: Una estacin de referencia geoposicional que provee correcciones instantneas para estaciones mviles, lo que hace que con la precisin obtenida se llegue al nivel centimtrico.

165

Null Modem
Es un mtodo para conectar dos terminales usando un cable serie RS-232, sin la necesidad de utilizar modems u otros dispositivos de comunicacin. Las lneas de

transmisin y recepcin estn cruzadas. Existe ms de una forma de realizar una conexin null mdem ya que no hay ningn estndar que defina esta conexin. Estos cables son comnmente usados para la transferencia de archivos. Tabla A.1 Conexin Null-Modem ms comn Signal Name FG (Frame Ground) TD (Transmit Data) RD (Receive Data) RTS (Request To Send) CTS (Clear To Send) SG (Signal Ground) DSR (Data Set Ready) CD (Carrier Detect) DTR (Data Terminal Ready) DTR (Data Terminal Ready) DB-25 Pin DB-9 Pin 1 2 3 4 5 7 6 8 20 20 3 2 7 8 5 6 1 4 4 X DB-9 DB-25 Pin Pin 2 3 8 7 5 4 4 1 6 1 3 2 5 4 7 20 20 8 6 FG RD TD CTS RTS SG DTR DTR CD DSR

A continuacin se muestran las figuras de un conector DB-9 macho y hembra, vistos desde el lado de los pines (no el lado de la soldadura).

Figura A.1 DB-9 macho

166

Figura A.2 DB-9 hembra

167

RMC (Recommended Minimum Specific GPS/Transit Data)


El mensaje RMC identifica la hora UTC, el estado, la latitud, la longitud, la velocidad respecto al suelo (SGO), la fecha, y la variacin magntica de la posicin. La estructura del mensaje es la siguiente: $GPRMC,184804.00,A,3723.476543,N,12202.239745,W,000.0,0.0,051196,15.6,E*7C La siguiente tabla describe estos campos de datos. Tabla A.2 Campos del mensaje RMC Campo Descripcin 1 Hora: UTC del fijo de posicin en formato hhmmss.ss 2 Estado A: Vlido V: Advertencia del receptor de navegacin (V se saca siempre que el receptor sospeche que algo no va bien) 3 Coordenada de latitud (el nmero de decimales puede variar de 0 a 7) 4 Direccin de la latitud N = Norte, S = Sur 5 Coordenada de longitud (el nmero de decimales puede variar de 0 a 7) 6 Direccin de la longitud E = Este, O = Oeste 7 Velocidad respecto al suelo (SOG) en nudos (03 cifras decimales) 8 Pasada real en grados 9 Fecha en formato dd/mm/aa 10 Variacin magntica en grados 11 Direccin de la variacin magntica E: Variacin hacia el este desde el rumbo real (se sustrae del rumbo real) W: Variacin hacia el oeste desde el rumbo real (se agrega al rumbo real) 12 Indicacin del modo A: Autnomo D: Diferencial N: Datos no vlidos

168

Hojas de Fabricante

You might also like