nd2.h
00001 00002 /*****************************************************************************/ 00003 /* */ 00004 /* Fichero: nd2.h */ 00005 /* Autor: Javier Minguez */ 00006 /* Creado: 28/05/2003 */ 00007 /* Modificado: 21/06/2003 */ 00008 /* */ 00009 /*****************************************************************************/ 00010 00011 #ifndef nd2_h 00012 #define nd2_h 00013 00014 #include "geometria.h" 00015 00016 // ---------------------------------------------------------------------------- 00017 // CONSTANTES. 00018 // ---------------------------------------------------------------------------- 00019 00020 // Número de sectores: múltiplo de 4. 00021 #define SECTORES 180 00022 00023 #define VERDADERO 1 00024 #define FALSO 0 00025 #define NO_SIGNIFICATIVO -1 00026 00027 // ---------------------------------------------------------------------------- 00028 // TIPOS. 00029 // ---------------------------------------------------------------------------- 00030 00031 // Información acerca del robot. 00032 00033 // Dimensiones del robot. 00034 // Consideramos el robot definido por un rectángulo. Numeramos sus 00035 // dimensiones, medidas a partir de su centro en las direcciones principales, 00036 // siguiendo la misma convención que para los sectores: 00037 // Dimension[0]: distancia desde el centro a la trasera del robot. 00038 // Dimension[1]: distancia desde el centro a la izquierda del robot. 00039 // Dimension[2]: distancia desde el centro al frontal del robot. 00040 // Dimension[3]: distancia desde el centro a la derecha del robot. 00041 typedef float TDimensiones[4]; 00042 00043 typedef float TMatriz2x2[2][2]; 00044 00045 typedef struct { 00046 00047 TDimensiones Dimensiones; 00048 float enlarge; 00049 00050 short int geometriaRect; // Si es cuadrado o no 00051 00052 float R; // radio del robot por si es circular 00053 00054 short int holonomo; 00055 00056 float E[SECTORES]; // Distancia desde el origen de SR2 al perímetro del robot. 00057 float ds[SECTORES]; // Distancia de seguridad: desde el perímetro del robot al perímetro de seguridad. 00058 00059 float velocidad_lineal_maxima; 00060 float velocidad_angular_maxima; 00061 00062 float aceleracion_lineal_maxima; 00063 float aceleracion_angular_maxima; 00064 00065 float discontinuidad; // Espacio mínimo por el que cabe el robot. 00066 00067 float T; // Período. 00068 00069 TMatriz2x2 H; // Generador de movimientos: "Inercia" del robot. 00070 TMatriz2x2 G; // Generador de movimientos: "Fuerza" aplicada sobre el robot. 00071 00072 } TInfoRobot; 00073 00074 // Información acerca del objetivo. 00075 00076 typedef struct { 00077 TCoordenadas c0; 00078 TCoordenadas c1; 00079 TCoordenadasPolares p1; 00080 int s; // Sector. 00081 } TObjetivo; 00082 00083 // Información acerca de la región escogida. 00084 00085 #define DIRECCION_OBJETIVO 0 00086 #define DIRECCION_DISCONTINUIDAD_INICIAL 1 00087 #define DIRECCION_DISCONTINUIDAD_FINAL 2 00088 00089 typedef struct { 00090 int principio; 00091 int final; 00092 00093 int principio_ascendente; 00094 int final_ascendente; 00095 00096 int descartada; 00097 00098 int direccion_tipo; 00099 int direccion_sector; 00100 float direccion_angulo; 00101 } TRegion; 00102 00103 typedef struct { 00104 int longitud; 00105 TRegion vector[SECTORES]; 00106 } TVRegiones; 00107 00108 // Información interna del método de navegación. 00109 00110 typedef struct { 00111 00112 TObjetivo objetivo; 00113 00114 TSR SR1; // Estado actual del robot: posición y orientación. 00115 TVelocities velocidades; // Estado actual del robot: velocidades lineal y angular. 00116 00117 TCoordenadasPolares d[SECTORES]; // Distancia desde el centro del robot al obstáculo más próximo en cada sector (con ángulos). 00118 float dr[SECTORES]; // Distancia desde el perímetro del robot al obstáculo más próximo en cada sector. 00119 00120 TVRegiones regiones; // Sólo como información de cara al exterior: Lista de todas las regiones encontradas en el proceso de selección. 00121 int region; // Como almacenamos más de una región debemos indicar cuál es la escogida. 00122 00123 int obstaculo_izquierda,obstaculo_derecha; 00124 00125 float angulosin; // Sólo como información de cara al exterior: Ángulo antes de tener en cuenta los obstáculos más próximos. 00126 float angulocon; // Sólo como información de cara al exterior: Ángulo después de tener en cuenta los obstáculos más próximos. 00127 char situacion[20]; // Sólo como información de cara al exterior: Situación en la que se encuentra el robot. 00128 char cutting[20]; // Sólo como información de cara al exterior: Cutting aplicado al movimiento del robot. 00129 00130 float angulo; // Salida del algoritmo de navegación y entrada al generador de movimientos: dirección de movimiento deseada. 00131 float velocidad; // Salida del algoritmo de navegación y entrada al generador de movimientos: velocidad lineal deseada. 00132 00133 } TInfoND; 00134 00135 // ---------------------------------------------------------------------------- 00136 // VARIABLES. 00137 // ---------------------------------------------------------------------------- 00138 00139 extern TInfoRobot robot; 00140 00141 // ---------------------------------------------------------------------------- 00142 // FUNCIONES. 00143 // ---------------------------------------------------------------------------- 00144 00145 extern float sector2angulo(int sector); 00146 00147 extern int angulo2sector(float angulo); 00148 00149 00150 #endif