00001 #ifndef CAJUN_DISCONTINUITY_H
00002 #define CAJUN_DISCONTINUITY_H
00003
00004 #include "data_type.H"
00005 #include "data_queue.H"
00006 #include "data_logger.H"
00007 #include <cstdio>
00008
00009 # define SEARCH_DEPTH 225 //no of scans to be searched
00010 # define SEARCH_BUCKET 300
00011 # define MAX_SCANS 1000
00012 # define NUM_SENSORS 2
00013 # define SCANS_OVERWRITE (MAX_SCANS - SEARCH_BUCKET)
00014
00015
00016 namespace cajun
00017 {
00018
00019 # define scan_beam_p(sick_id,scan_num,beam_num) scan_repository[(sick_id)][(scan_num)].end_beam[(beam_num)]
00020
00021 # define assign_slope(curr_beam) assign_slope.end_beam[(curr_beam)]
00022 # define assign_slope_b(curr_beam) assign_slope_b.end_beam[(curr_beam)]
00023 class discontinuity_t
00024 {
00025 unsigned curr_scan[NUM_SENSORS];
00026 scan_analysis_data_t scan_repository[NUM_SENSORS][MAX_SCANS];
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 public:
00031 discontinuity_t (data_queue_writer_t<scan_analysis_data_t> *scan_analysis_dq_writer,data_queue_writer_t<scan_analysis_data_t> *scan_analysis_dq_b_writer)
00032 {
00033 for(int i=0; i< NUM_SENSORS; i++)
00034 curr_scan[i] = 0;
00035 m_dq_writer = scan_analysis_dq_writer;
00036 m_dq_b_writer = scan_analysis_dq_b_writer;
00037
00038 };
00039
00040 void add_scan (scan_gp_data_t const &points, unsigned sick_id, nav_data_t bot_posi)
00041 {
00042
00043 scan_repository[sick_id][curr_scan[sick_id]].num_beams = points.num_beams;
00044 scan_repository[sick_id][curr_scan[sick_id]].tstamp = points.tstamp;
00045 unsigned j;
00046 for (j = 0; j < scan_repository[sick_id][curr_scan[sick_id]].num_beams;j++)
00047 {
00048 scan_beam_p (sick_id,curr_scan[sick_id],j).x = points.end_beam[j].x;
00049 scan_beam_p (sick_id,curr_scan[sick_id],j).y = points.end_beam[j].y;
00050 scan_beam_p (sick_id,curr_scan[sick_id],j).z = points.end_beam[j].z;
00051 }
00052 find_discontinuity(scan_repository,curr_scan[sick_id],bot_posi,points,sick_id);
00053 curr_scan[sick_id]++;
00054 if (curr_scan[sick_id] > MAX_SCANS - 1)
00055 {
00056 for ( unsigned i = 0; i < SEARCH_BUCKET ; i++)
00057 {
00058 scan_repository[sick_id][i].num_beams = scan_repository[sick_id][i+SCANS_OVERWRITE].num_beams;
00059 scan_repository[sick_id][i].tstamp = scan_repository[sick_id][i+SCANS_OVERWRITE].tstamp;
00060
00061 for ( unsigned j = 0 ; j < scan_repository[sick_id][i].num_beams ; j++)
00062 {
00063 scan_beam_p (sick_id,i, j).x = scan_beam_p (sick_id,i+SCANS_OVERWRITE, j).x ;
00064 scan_beam_p (sick_id,i, j).y = scan_beam_p (sick_id,i+SCANS_OVERWRITE, j).y ;
00065 scan_beam_p (sick_id,i, j).z = scan_beam_p (sick_id,i+SCANS_OVERWRITE, j).z ;
00066 }
00067 }
00068 curr_scan[sick_id] = SEARCH_BUCKET;
00069 }
00070 }
00071
00072 void find_discontinuity (scan_analysis_data_t scan_repository[][MAX_SCANS], unsigned curr_scan, nav_data_t bot_posi, scan_gp_data_t points, unsigned sick_id);
00073
00074 };
00075 };
00076 #endif