00001
00002
00003
00004
00005
00006 #ifndef CAJUN_PATH_EXTRACTOR_H
00007 #define CAJUN_PATH_EXTRACTOR_H
00008
00009
00010 #include "map_grid.H"
00011 #include "search_grid.H"
00012
00013 #include "planner_defs.H"
00014
00015
00016 #include <cmath>
00017 #include <vector>
00018
00019
00020 namespace cajun
00021 {
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 class gc_oracle_t;
00040
00041
00042 class path_extractor_t
00043 {
00044 public:
00045 path_extractor_t (double cell_size_) :
00046 m_cell_size (cell_size_), m_gc_oracle (0),
00047 m_map_grid (0), m_search_grid (0) {}
00048 virtual ~path_extractor_t () {}
00049
00050 void set_gc_oracle (gc_oracle_t *oracle_) { m_gc_oracle = oracle_; }
00051
00052 void set_map_grid (map_grid_t *grid_) { m_map_grid = grid_; }
00053 void set_search_grid (search_grid_t *grid_) { m_search_grid = grid_; }
00054
00055
00056
00057 void set_search_orient (double orient_) { m_search_orient = orient_; }
00058
00059 bool extract (double tstamp_, double sx_, double sy_,
00060 double gx_, double gy_, double goal_orient,
00061 path_t &path_, path_t &detail_path_, double orient_);
00062
00063 protected:
00064 double const m_cell_size;
00065
00066 void split_coord (double c_, int &i_, float &f_) const
00067 {
00068 double v = c_ / m_cell_size;
00069
00070 i_ = (int) floor (v);
00071 f_ = v - i_;
00072 }
00073
00074 gc_oracle_t *m_gc_oracle;
00075
00076 map_grid_t *m_map_grid;
00077 search_grid_t *m_search_grid;
00078
00079 double m_sx;
00080 double m_sy;
00081 double m_dcos;
00082 double m_dsin;
00083
00084 double m_goal_x;
00085 double m_goal_y;
00086 double m_goal_orient;
00087
00088
00089
00090 double m_search_orient;
00091
00092 int m_map_px;
00093 int m_map_py;
00094 map_grid_t::iterator_t m_map_beg;
00095
00096 int m_search_px;
00097 int m_search_py;
00098 search_grid_t::iterator_t m_search_beg;
00099
00100 virtual bool extract (double tstamp_, path_t &path_,
00101 path_t &detail_path_, double orient_) = 0;
00102
00103 double search_to_global_x (double x, double y)
00104 { return m_sx + x * m_dcos - y * m_dsin; }
00105
00106 double search_to_global_y (double x, double y)
00107 { return m_sy + x * m_dsin + y * m_dcos; }
00108 };
00109
00110
00111 };
00112
00113
00114 #endif