self_mask.h
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2008, Willow Garage, Inc.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  *     * Redistributions of source code must retain the above copyright
00009  *       notice, this list of conditions and the following disclaimer.
00010  *     * Redistributions in binary form must reproduce the above copyright
00011  *       notice, this list of conditions and the following disclaimer in the
00012  *       documentation and/or other materials provided with the distribution.
00013  *     * Neither the name of the Willow Garage, Inc. nor the names of its
00014  *       contributors may be used to endorse or promote products derived from
00015  *       this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00021  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027  * POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 #ifndef ROBOT_SELF_FILTER_SELF_MASK_
00031 #define ROBOT_SELF_FILTER_SELF_MASK_
00032 
00033 #include <pcl/point_types.h>
00034 #include <pcl_ros/point_cloud.h>
00035 #include <sensor_msgs/PointCloud2.h>
00036 #include <pr2_navigation_self_filter/bodies.h>
00037 #include <tf/transform_listener.h>
00038 #include <boost/bind.hpp>
00039 #include <string>
00040 #include <vector>
00041 
00042 namespace robot_self_filter
00043 {
00044   typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
00045 
00047     enum
00048     {
00049         INSIDE = 0,
00050         OUTSIDE = 1,
00051         SHADOW = 2,
00052     };
00053 
00054 struct LinkInfo
00055 {
00056   std::string name;
00057   double padding;
00058   double scale;
00059 };
00060     
00061 
00065     class SelfMask
00066     {   
00067     protected:
00068         
00069         struct SeeLink
00070         {
00071             SeeLink(void)
00072             {
00073                 body = unscaledBody = NULL;
00074             }
00075             
00076             std::string   name;
00077             bodies::Body *body;
00078             bodies::Body *unscaledBody;
00079             tf::Transform   constTransf;
00080             double        volume;
00081         };
00082         
00083         struct SortBodies
00084         {
00085             bool operator()(const SeeLink &b1, const SeeLink &b2)
00086             {
00087                 return b1.volume > b2.volume;
00088             }
00089         };
00090         
00091     public:
00092         
00094         SelfMask(tf::TransformListener &tf, const std::vector<LinkInfo> &links) : tf_(tf)
00095         {
00096             configure(links);
00097         }
00098         
00101         ~SelfMask(void)
00102         {
00103             freeMemory();
00104         }
00105         
00109         void maskContainment(const PointCloud& data_in, std::vector<int> &mask);
00110 
00120         void maskIntersection(const PointCloud& data_in, const std::string &sensor_frame, const double min_sensor_dist,
00121                               std::vector<int> &mask, const boost::function<void(const tf::Vector3&)> &intersectionCallback = NULL);
00122 
00129         void maskIntersection(const PointCloud& data_in, const tf::Vector3 &sensor, const double min_sensor_dist,
00130                               std::vector<int> &mask, const boost::function<void(const tf::Vector3&)> &intersectionCallback = NULL);
00131         
00134         void assumeFrame(const std_msgs::Header& header);
00135         
00138         void assumeFrame(const std_msgs::Header& header, const std::string &sensor_frame, const double min_sensor_dist);
00139 
00142         void assumeFrame(const std_msgs::Header& header, const tf::Vector3 &sensor_pos, const double min_sensor_dist);
00143         
00146         int  getMaskContainment(double x, double y, double z) const;
00147         
00150         int  getMaskContainment(const tf::Vector3 &pt) const;
00151         
00155         int  getMaskIntersection(double x, double y, double z, const boost::function<void(const tf::Vector3&)> &intersectionCallback = NULL) const;
00156         
00160         int  getMaskIntersection(const tf::Vector3 &pt, const boost::function<void(const tf::Vector3&)> &intersectionCallback = NULL) const;
00161         
00163         void getLinkNames(std::vector<std::string> &frames) const;
00164         
00165     private:
00166 
00168         void freeMemory(void);
00169 
00171         bool configure(const std::vector<LinkInfo> &links);
00172         
00174         void computeBoundingSpheres(void);
00175         
00177         void maskAuxContainment(const PointCloud& data_in, std::vector<int> &mask);
00178 
00180         void maskAuxIntersection(const PointCloud& data_in, std::vector<int> &mask, const boost::function<void(const tf::Vector3&)> &callback);
00181         
00182         tf::TransformListener              &tf_;
00183         ros::NodeHandle                     nh_;
00184         
00185         tf::Vector3                           sensor_pos_;
00186         double                              min_sensor_dist_;
00187         
00188         std::vector<SeeLink>                bodies_;
00189         std::vector<double>                 bspheresRadius2_;
00190         std::vector<bodies::BoundingSphere> bspheres_;
00191         
00192     };
00193     
00194 }
00195 
00196 #endif


pr2_navigation_self_filter
Author(s): Eitan Marder-Eppstein
autogenerated on Mon Dec 2 2013 11:48:54