laser_bounds_filter.cpp
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   // Case 1 : lower_angle < upper_angle, angle_min < angle_max, angle_increment > 0  
00026   if (lower_angle_ < upper_angle_) {
00027   
00028           //loop through the scan and truncate the beginning and the end of the scan as necessary
00029           for (unsigned int i = 0; i < input_scan.ranges.size(); ++i){
00030                 //wait until we get to our desired starting angle
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                   //make sure  that we don't update intensity data if its not available
00040                   if (input_scan.intensities.size() > i)
00041                         filtered_scan.intensities[count] = input_scan.intensities[i];
00042                         count++;
00043                         //check if we need to break out of the loop, basically if the next increment will put us over the threshold
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     // Case 2 : lower_angle > upper_angle, angle_min > angle_max,  angle_increment < 0    
00053           //loop through the scan and truncate the beginning and the end of the scan as necessary
00054           for (unsigned int i = 0; i < input_scan.ranges.size(); ++i){
00055                 
00056                 //wait until we get to our desired starting angle
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                   //make sure  that we don't update intensity data if its not available
00066                   if (input_scan.intensities.size() > i)
00067                         filtered_scan.intensities[count] = input_scan.intensities[i];
00068                         count++;
00069                         //check if we need to break out of the loop, basically if the next increment will put us over the threshold
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   //make sure to set all the needed fields on the filtered scan
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   //ros::NodeHandle n1, n2;
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 }


rbcar_navigation
Author(s): Robotnik
autogenerated on Thu Jun 6 2019 21:37:46