Go to the documentation of this file.00001
00002
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
00016
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
00045 if (!computed_indeces){
00046
00047 if (angle_param_max > input_scan.angle_max){
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){
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
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
00069
00070
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
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;
00086 filtered_scan.angle_max = angle_out_max;
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