00001
00002
00003
00004 #ifndef CAJUN_GRID_SLOPE_H
00005 #define CAJUN_GRID_SLOPE_H
00006
00007 #include "data_type.H"
00008 #include "data_queue.H"
00009 #include "data_logger.H"
00010 #include "grid.H"
00011 #include <cmath>
00012 #include <cstdio>
00013 #include <algorithm>
00014 #include <deque>
00015
00016 # define SCANS_PER_SEC 75
00017
00018 namespace cajun
00019 {
00020
00021 # define assign_slope(curr_beam) assign_slope.end_beam[(curr_beam)]
00022 # define scan_gp_beam(scan_num, beam_num) scan_gp_db[(scan_num)].end_beam[(beam_num)]
00023 class grid_slope_t
00024 {
00025
00026 scan_analysis_data_t assign_slope;
00027 data_queue_writer_t<scan_analysis_data_t> *m_dq_writer;
00028 data_queue_writer_t<scan_analysis_data_t> *m_dq_b_writer;
00029
00030 scan_gp_data_t *scan_gp_db;
00031
00032 static unsigned const NULL_ENTRY = INT_MAX ;
00033
00034 struct beam_chain_t
00035 {
00036 beam_chain_t() : next(NULL_ENTRY),
00037 previous (NULL_ENTRY) {};
00038 unsigned next ;
00039 unsigned previous ;
00040 };
00041
00042 beam_chain_t *beam_list;
00043
00044 struct data_cell_t
00045 {
00046 data_cell_t() : head(NULL_ENTRY),
00047 tail(NULL_ENTRY) {};
00048 unsigned head;
00049 unsigned tail;
00050 };
00051
00052 struct dist_list_t
00053 {
00054 unsigned index;
00055 double dist_sqr;
00056 };
00057
00058 struct dist_sort_t
00059 {
00060 bool operator () (dist_list_t const &v1,
00061 dist_list_t const &v2)const
00062 {return (v1.dist_sqr < v2.dist_sqr) ;}
00063
00064 };
00065
00066 std::vector<dist_list_t> ver_vec;
00067
00068 typedef grid_t<data_cell_t> data_grid_t;
00069 data_grid_t grid;
00070
00071 double data_cell_size;
00072 double R2D;
00073 int triangles_per_beam;
00074 unsigned head_of_db;
00075 unsigned tail_of_db;
00076 double MIN_LEN_SQR,MAX_LEN_SQR;
00077 unsigned VER_PER_CELL;
00078 unsigned MAX_VEC_LEN;
00079 unsigned MAX_SEARCH_SCANS;
00080 double refresh_time;
00081 unsigned scans_in_repository;
00082
00083 public:
00084 grid_slope_t ( data_queue_writer_t<scan_analysis_data_t>
00085 *scan_analysis_dq_b_writer,
00086 int triangle_count,
00087 double min_len, double max_len,
00088 unsigned ver_per_cell, unsigned max_vec_len,
00089 unsigned num_search_scans,double REFRESH_TIME )
00090 {
00091 m_dq_b_writer = scan_analysis_dq_b_writer;
00092 data_cell_size = 0.32;
00093 R2D = 180.0/ M_PI;
00094 triangles_per_beam = triangle_count;
00095 MIN_LEN_SQR = min_len * min_len;
00096 MAX_LEN_SQR = max_len * max_len;
00097 VER_PER_CELL = ver_per_cell;
00098 MAX_VEC_LEN = max_vec_len;
00099 refresh_time = REFRESH_TIME;
00100
00101 scan_gp_db = new scan_gp_data_t[num_search_scans];
00102
00103 for (unsigned i = 0; i < num_search_scans; i++)
00104 scan_gp_db[i].num_beams = 0;
00105
00106 beam_list = new beam_chain_t[num_search_scans *
00107 SCAN_GP_MAX_BEAMS];
00108
00109 MAX_SEARCH_SCANS = num_search_scans;
00110 head_of_db = 0;
00111 tail_of_db = 0;
00112 scans_in_repository = 0;
00113 grid.lru_limit (num_search_scans + 1);
00114 };
00115
00116 scan_gp_data_t &get_free_db_entry ()
00117 { return scan_gp_db[head_of_db]; }
00118
00119 bool is_db_full()
00120 {
00121 if(scans_in_repository == MAX_SEARCH_SCANS)
00122 return true;
00123 return false;
00124 }
00125
00126 void delete_old_data (double curr_time)
00127 {
00128
00129 double diff_time = curr_time - refresh_time;
00130
00131 while(scans_in_repository != 0 &&
00132 scan_gp_db[tail_of_db].tstamp <= diff_time )
00133 {
00134 delete_scan (scan_gp_db[tail_of_db]);
00135 scans_in_repository --;
00136 tail_of_db = (tail_of_db + 1) % MAX_SEARCH_SCANS;
00137 }
00138 }
00139
00140 void process_new_db_entry ()
00141 {
00142 assert (scans_in_repository <= MAX_SEARCH_SCANS);
00143 scans_in_repository ++;
00144 fill_grid (scan_gp_db[head_of_db], head_of_db);
00145 detect_slope(head_of_db);
00146 head_of_db = (head_of_db + 1) % MAX_SEARCH_SCANS;
00147 }
00148
00149 void sanity_check ( char * s, unsigned index);
00150
00151 void delete_scan ( scan_gp_data_t const &points);
00152
00153 void fill_grid ( scan_gp_data_t const &points, unsigned head);
00154
00155 void detect_slope (unsigned const &head);
00156
00157 void compute_slope ( double x1, double y1, double z1,
00158 double x2, double y2, double z2,
00159 double x3, double y3, double z3,
00160 scan_analysis_data_t &assign_slope);
00161
00162 void find_eligible_vertices ( double x1, double y1, double z1 );
00163
00164 void make_triangles ( double const & x1, double const & y1,
00165 double const & z1,
00166 scan_analysis_data_t & assign_slope);
00167
00168 bool test_sec_ver ( double x1, double y1,
00169 double x2, double y2,
00170 double z1, double z2,
00171 double &dist_sqr );
00172
00173
00174 };
00175 };
00176 #endif