Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 #include <math.h>
00029 
00030 
00031 
00032 
00033 #include "nav2d_localizer/pf_vector.h"
00034 #include "nav2d_localizer/eig3.h"
00035 
00036 
00037 
00038 pf_vector_t pf_vector_zero()
00039 {
00040   pf_vector_t c;
00041 
00042   c.v[0] = 0.0;
00043   c.v[1] = 0.0;
00044   c.v[2] = 0.0;
00045   
00046   return c;
00047 }
00048 
00049 
00050 
00051 int pf_vector_finite(pf_vector_t a)
00052 {
00053   int i;
00054   
00055   for (i = 0; i < 3; i++)
00056     if (!finite(a.v[i]))
00057       return 0;
00058   
00059   return 1;
00060 }
00061 
00062 
00063 
00064 void pf_vector_fprintf(pf_vector_t a, FILE *file, const char *fmt)
00065 {
00066   int i;
00067 
00068   for (i = 0; i < 3; i++)
00069   {
00070     fprintf(file, fmt, a.v[i]);
00071     fprintf(file, " ");
00072   }
00073   fprintf(file, "\n");
00074 
00075   return;     
00076 }
00077 
00078 
00079 
00080 pf_vector_t pf_vector_add(pf_vector_t a, pf_vector_t b)
00081 {
00082   pf_vector_t c;
00083 
00084   c.v[0] = a.v[0] + b.v[0];
00085   c.v[1] = a.v[1] + b.v[1];
00086   c.v[2] = a.v[2] + b.v[2];
00087   
00088   return c;
00089 }
00090 
00091 
00092 
00093 pf_vector_t pf_vector_sub(pf_vector_t a, pf_vector_t b)
00094 {
00095   pf_vector_t c;
00096 
00097   c.v[0] = a.v[0] - b.v[0];
00098   c.v[1] = a.v[1] - b.v[1];
00099   c.v[2] = a.v[2] - b.v[2];
00100   
00101   return c;
00102 }
00103 
00104 
00105 
00106 pf_vector_t pf_vector_coord_add(pf_vector_t a, pf_vector_t b)
00107 {
00108   pf_vector_t c;
00109 
00110   c.v[0] = b.v[0] + a.v[0] * cos(b.v[2]) - a.v[1] * sin(b.v[2]);
00111   c.v[1] = b.v[1] + a.v[0] * sin(b.v[2]) + a.v[1] * cos(b.v[2]);
00112   c.v[2] = b.v[2] + a.v[2];
00113   c.v[2] = atan2(sin(c.v[2]), cos(c.v[2]));
00114   
00115   return c;
00116 }
00117 
00118 
00119 
00120 pf_vector_t pf_vector_coord_sub(pf_vector_t a, pf_vector_t b)
00121 {
00122   pf_vector_t c;
00123 
00124   c.v[0] = +(a.v[0] - b.v[0]) * cos(b.v[2]) + (a.v[1] - b.v[1]) * sin(b.v[2]);
00125   c.v[1] = -(a.v[0] - b.v[0]) * sin(b.v[2]) + (a.v[1] - b.v[1]) * cos(b.v[2]);
00126   c.v[2] = a.v[2] - b.v[2];
00127   c.v[2] = atan2(sin(c.v[2]), cos(c.v[2]));
00128   
00129   return c;
00130 }
00131 
00132 
00133 
00134 pf_matrix_t pf_matrix_zero()
00135 {
00136   int i, j;
00137   pf_matrix_t c;
00138 
00139   for (i = 0; i < 3; i++)
00140     for (j = 0; j < 3; j++)
00141       c.m[i][j] = 0.0;
00142         
00143   return c;
00144 }
00145 
00146 
00147 
00148 int pf_matrix_finite(pf_matrix_t a)
00149 {
00150   int i, j;
00151   
00152   for (i = 0; i < 3; i++)
00153     for (j = 0; j < 3; j++)
00154       if (!finite(a.m[i][j]))
00155         return 0;
00156   
00157   return 1;
00158 }
00159 
00160 
00161 
00162 void pf_matrix_fprintf(pf_matrix_t a, FILE *file, const char *fmt)
00163 {
00164   int i, j;
00165 
00166   for (i = 0; i < 3; i++)
00167   {
00168     for (j = 0; j < 3; j++)
00169     {
00170       fprintf(file, fmt, a.m[i][j]);
00171       fprintf(file, " ");
00172     }
00173     fprintf(file, "\n");
00174   }
00175   return;     
00176 }
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 void pf_matrix_unitary(pf_matrix_t *r, pf_matrix_t *d, pf_matrix_t a)
00223 {
00224   int i, j;
00225   
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236   double aa[3][3];
00237   double eval[3];
00238   double evec[3][3];
00239 
00240   for (i = 0; i < 3; i++)
00241   {
00242     for (j = 0; j < 3; j++)
00243     {
00244       
00245       aa[i][j] = a.m[i][j];
00246     }
00247   }
00248 
00249   
00250   
00251 
00252 
00253 
00254 
00255 
00256   eigen_decomposition(aa,evec,eval);
00257 
00258   *d = pf_matrix_zero();
00259   for (i = 0; i < 3; i++)
00260   {
00261     
00262     d->m[i][i] = eval[i];
00263     for (j = 0; j < 3; j++)
00264     {
00265       
00266       r->m[i][j] = evec[i][j];
00267     }
00268   }
00269   
00270   
00271   
00272   
00273   
00274   return;
00275 }
00276