angle_range_filter.h
Go to the documentation of this file.
00001 /*
00002  * LICENSE: https://github.com/utexas-bwi/segbot/blob/devel/LICENSE
00003  */
00004 
00005 #ifndef LASER_SCAN_ANGLE_FILTER_H
00006 #define LASER_SCAN_ANGLE_FILTER_H
00007 
00008 #include <filters/filter_base.h>
00009 #include <sensor_msgs/LaserScan.h>
00010 
00011 namespace segbot_sensors
00012 {
00013  
00014   /*
00015    *  A class that filters LaserScan messages using a minimum and maximum angles (radians)
00016    *  For 
00017    * 
00018    * 
00019    */
00020  
00021   class AngleRangeFilter : public filters::FilterBase<sensor_msgs::LaserScan>
00022   {
00023     public:
00024 
00025       bool configure() {
00026                 
00027                 getParam("angle_min", angle_param_min);  
00028                 getParam("angle_max", angle_param_max);  
00029                 
00030                 start_index=-1;
00031                 end_index=-1;
00032                 computed_indeces = false;
00033                     
00034                   
00035         return true;
00036       }
00037 
00038       virtual ~AngleRangeFilter(){}
00039 
00040       bool update(const sensor_msgs::LaserScan& input_scan, sensor_msgs::LaserScan& filtered_scan){
00041 
00042                 int num_original_measurements = input_scan.ranges.size();
00043                 
00044                 //compute the start and end index in the original vector of values
00045                 if (!computed_indeces){
00046                         
00047                         if (angle_param_max > input_scan.angle_max){ //check if requested range is outside the actual range
00048                                 angle_param_max = input_scan.angle_max;
00049                                 end_index = num_original_measurements - 1;
00050                         }
00051                         else 
00052                                 end_index = (int)floor((double)num_original_measurements*(angle_param_max-input_scan.angle_min)/(input_scan.angle_max-input_scan.angle_min));
00053                         
00054                                 
00055                         if (angle_param_min < input_scan.angle_min){ //check if requested range is outside the actual range
00056                                 angle_param_min = input_scan.angle_min;
00057                                 start_index = 0;
00058                         }
00059                         else 
00060                                 start_index = (int)floor((double)num_original_measurements*(angle_param_min - input_scan.angle_min)/(input_scan.angle_max-input_scan.angle_min));
00061                         
00062                         //get the new values for the minimum and maximum angle -- these are going to be approximation to the input arguments
00063                         angle_out_min = input_scan.angle_min + (start_index*input_scan.angle_increment);
00064                         angle_out_max = input_scan.angle_min + (end_index*input_scan.angle_increment);
00065                         
00066                         computed_indeces = true;
00067                         
00068                         /*ROS_INFO("[angle range filter]: total num measurements: %i",num_original_measurements);
00069                         ROS_INFO("[angle range filter]: original angle range: %f to %f", input_scan.angle_min,  input_scan.angle_max);
00070                         ROS_INFO("[angle range filter]: start and end indeces %i, %i",start_index,end_index);*/
00071                 }
00072         
00073                 filtered_scan.ranges.resize(end_index-start_index+1);
00074                 filtered_scan.intensities.resize(end_index-start_index+1);
00075                 
00076                 for(unsigned int count = 0; count < filtered_scan.ranges.size(); ++count){
00077           filtered_scan.ranges[count] = input_scan.ranges[count+start_index];
00078           filtered_scan.intensities[count] = input_scan.intensities[count+start_index];
00079         }
00080     
00081 
00082         //make sure to set all the needed fields on the filtered scan
00083         filtered_scan.header.frame_id = input_scan.header.frame_id;
00084         filtered_scan.header.stamp = input_scan.header.stamp;
00085         filtered_scan.angle_min = angle_out_min; //override
00086         filtered_scan.angle_max = angle_out_max; //override
00087         filtered_scan.angle_increment = input_scan.angle_increment;
00088         filtered_scan.time_increment = input_scan.time_increment;
00089         filtered_scan.scan_time = input_scan.scan_time;
00090         filtered_scan.range_min = input_scan.range_min;
00091         filtered_scan.range_max = input_scan.range_max;
00092 
00093 
00094         return true;
00095 
00096       }
00097       
00098     private:
00099                 double angle_param_min, angle_param_max;
00100                 double angle_out_min, angle_out_max;
00101                 int start_index,end_index;
00102                 bool computed_indeces;
00103                 
00104   };
00105 }
00106 #endif
00107 


segbot_sensors
Author(s): Piyush Khandelwal
autogenerated on Thu Jun 6 2019 21:37:13