Go to the documentation of this file.00001 #include <ros/ros.h>
00002 #include <sensor_msgs/LaserScan.h>
00003 #include <iostream>
00004 using namespace std;
00005
00006 ros::Publisher filtered_scan_pub;
00007 ros::Subscriber input_scan_sub;
00008 sensor_msgs::LaserScan filtered_scan;
00009 double lower_angle_ = 1.5708;
00010 double upper_angle_ = -1.5708;
00011
00012
00013 bool my_update(const sensor_msgs::LaserScan& input_scan)
00014 {
00015
00016 filtered_scan.ranges.resize(input_scan.ranges.size());
00017 filtered_scan.intensities.resize(input_scan.intensities.size());
00018
00019 ros::Time start_time = input_scan.header.stamp;
00020 unsigned int count = 0;
00021
00022 double start_angle = input_scan.angle_min;
00023 double current_angle = input_scan.angle_min;
00024
00025
00026 if (lower_angle_ < upper_angle_) {
00027
00028
00029 for (unsigned int i = 0; i < input_scan.ranges.size(); ++i){
00030
00031 if(start_angle < lower_angle_) {
00032 start_angle += input_scan.angle_increment;
00033 current_angle += input_scan.angle_increment;
00034 start_time += ros::Duration(input_scan.time_increment);
00035 }
00036 else {
00037 filtered_scan.ranges[count] = input_scan.ranges[i];
00038
00039
00040 if (input_scan.intensities.size() > i)
00041 filtered_scan.intensities[count] = input_scan.intensities[i];
00042 count++;
00043
00044 if (current_angle + input_scan.angle_increment > upper_angle_) {
00045 break;
00046 }
00047 current_angle += input_scan.angle_increment;
00048 }
00049 }
00050 }
00051 else {
00052
00053
00054 for (unsigned int i = 0; i < input_scan.ranges.size(); ++i){
00055
00056
00057 if(start_angle > lower_angle_) {
00058 start_angle += input_scan.angle_increment;
00059 current_angle += input_scan.angle_increment;
00060 start_time += ros::Duration(input_scan.time_increment);
00061 }
00062 else {
00063 filtered_scan.ranges[count] = input_scan.ranges[i];
00064
00065
00066 if (input_scan.intensities.size() > i)
00067 filtered_scan.intensities[count] = input_scan.intensities[i];
00068 count++;
00069
00070 if (current_angle + input_scan.angle_increment < upper_angle_) {
00071 break;
00072 }
00073 current_angle += input_scan.angle_increment;
00074 }
00075 }
00076
00077 }
00078
00079
00080 filtered_scan.header.frame_id = input_scan.header.frame_id;
00081 filtered_scan.header.stamp = start_time;
00082 filtered_scan.angle_min = start_angle;
00083 filtered_scan.angle_max = current_angle;
00084 filtered_scan.angle_increment = input_scan.angle_increment;
00085 filtered_scan.time_increment = input_scan.time_increment;
00086 filtered_scan.scan_time = input_scan.scan_time;
00087 filtered_scan.range_min = input_scan.range_min;
00088 filtered_scan.range_max = input_scan.range_max;
00089
00090 filtered_scan.ranges.resize(count);
00091
00092 if (input_scan.intensities.size() >= count)
00093 filtered_scan.intensities.resize(count);
00094
00095 ROS_DEBUG("Filtered out %d points from the laser scan.", (int)input_scan.ranges.size() - (int)count);
00096 return true;
00097 }
00098
00099 void input_scan_sub_callback(const sensor_msgs::LaserScan& input_scan)
00100 {
00101 my_update(input_scan);
00102 filtered_scan_pub.publish(filtered_scan);
00103
00104 }
00105
00106
00107 int main(int argc, char** argv){
00108 ros::init(argc, argv, "laser_bounds_filter");
00109
00110 ros::NodeHandle n;
00111 input_scan_sub = n.subscribe("/hokuyo/scan", 10, input_scan_sub_callback);
00112 filtered_scan_pub = n.advertise<sensor_msgs::LaserScan>("/scan_filtered", 50);
00113 ros::Rate loop_rate(50);
00114
00115 while(ros::ok())
00116 {
00117 ros::spinOnce();
00118 loop_rate.sleep();
00119 }
00120 }