00001 /********************************************************************* 00002 * 00003 * Software License Agreement (BSD License) 00004 * 00005 * Copyright (c) 2015-2016, Jiri Horner. 00006 * All rights reserved. 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions 00010 * are met: 00011 * 00012 * * Redistributions of source code must retain the above copyright 00013 * notice, this list of conditions and the following disclaimer. 00014 * * Redistributions in binary form must reproduce the above 00015 * copyright notice, this list of conditions and the following 00016 * disclaimer in the documentation and/or other materials provided 00017 * with the distribution. 00018 * * Neither the name of the Jiri Horner nor the names of its 00019 * contributors may be used to endorse or promote products derived 00020 * from this software without specific prior written permission. 00021 * 00022 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00023 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00024 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00025 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00026 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00027 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00028 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00029 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00030 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00032 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00033 * POSSIBILITY OF SUCH DAMAGE. 00034 * 00035 *********************************************************************/ 00036 00037 #ifndef COSTMAP_CLIENT_ 00038 #define COSTMAP_CLIENT_ 00039 00040 #include <ros/ros.h> 00041 #include <costmap_2d/costmap_2d.h> 00042 #include <nav_msgs/OccupancyGrid.h> 00043 #include <map_msgs/OccupancyGridUpdate.h> 00044 #include <tf/tf.h> 00045 #include <tf/transform_listener.h> 00046 00047 namespace explore { 00048 00049 class Costmap2DClient { 00050 public: 00061 Costmap2DClient( 00062 ros::NodeHandle& param_nh, 00063 ros::NodeHandle& subscription_nh, 00064 const tf::TransformListener* tf_listener 00065 ); 00071 bool getRobotPose(tf::Stamped<tf::Pose>& global_pose) const; 00072 00078 costmap_2d::Costmap2D* getCostmap() 00079 { 00080 return &costmap_; 00081 } 00082 00088 const costmap_2d::Costmap2D* getCostmap() const 00089 { 00090 return &costmap_; 00091 } 00092 00097 const std::string& getGlobalFrameID() const 00098 { 00099 return global_frame_; 00100 } 00101 00106 const std::string& getBaseFrameID() const 00107 { 00108 return robot_base_frame_; 00109 } 00110 00111 protected: 00112 void updateFullMap(const nav_msgs::OccupancyGrid::ConstPtr& msg); 00113 void updatePartialMap(const map_msgs::OccupancyGridUpdate::ConstPtr& msg); 00114 00115 costmap_2d::Costmap2D costmap_; 00116 00117 const tf::TransformListener* const tf_; 00118 std::string global_frame_; 00119 std::string robot_base_frame_; 00120 double transform_tolerance_; 00121 00122 private: 00123 // will be unsubscribed at destruction 00124 ros::Subscriber costmap_sub_; 00125 ros::Subscriber costmap_updates_sub_; 00126 }; 00127 00128 } // namespace explore 00129 00130 #endif