Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef NAVFN_NAVFN_ROS_H_
00038 #define NAVFN_NAVFN_ROS_H_
00039
00040 #include <ros/ros.h>
00041 #include <navfn/navfn.h>
00042 #include <costmap_2d/costmap_2d.h>
00043 #include <geometry_msgs/PoseStamped.h>
00044 #include <geometry_msgs/Point.h>
00045 #include <nav_msgs/Path.h>
00046 #include <tf/transform_datatypes.h>
00047 #include <vector>
00048 #include <nav_core/base_global_planner.h>
00049 #include <nav_msgs/GetPlan.h>
00050 #include <navfn/potarr_point.h>
00051 #include <pcl_ros/publisher.h>
00052
00053 namespace navfn {
00058 class NavfnROS : public nav_core::BaseGlobalPlanner {
00059 public:
00063 NavfnROS();
00064
00070 NavfnROS(std::string name, costmap_2d::Costmap2DROS* costmap_ros);
00071
00077 void initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros);
00078
00086 bool makePlan(const geometry_msgs::PoseStamped& start,
00087 const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan);
00088
00097 bool makePlan(const geometry_msgs::PoseStamped& start,
00098 const geometry_msgs::PoseStamped& goal, double tolerance, std::vector<geometry_msgs::PoseStamped>& plan);
00099
00105 bool computePotential(const geometry_msgs::Point& world_point);
00106
00113 bool getPlanFromPotential(const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan);
00114
00120 double getPointPotential(const geometry_msgs::Point& world_point);
00121
00127 bool validPointPotential(const geometry_msgs::Point& world_point);
00128
00135 bool validPointPotential(const geometry_msgs::Point& world_point, double tolerance);
00136
00140 void publishPlan(const std::vector<geometry_msgs::PoseStamped>& path, double r, double g, double b, double a);
00141
00142 ~NavfnROS(){}
00143
00144 bool makePlanService(nav_msgs::GetPlan::Request& req, nav_msgs::GetPlan::Response& resp);
00145
00146 protected:
00147
00151 costmap_2d::Costmap2DROS* costmap_ros_;
00152 boost::shared_ptr<NavFn> planner_;
00153 ros::Publisher plan_pub_;
00154 pcl_ros::Publisher<PotarrPoint> potarr_pub_;
00155 bool initialized_, allow_unknown_, visualize_potential_;
00156
00157
00158 private:
00159 inline double sq_distance(const geometry_msgs::PoseStamped& p1, const geometry_msgs::PoseStamped& p2){
00160 double dx = p1.pose.position.x - p2.pose.position.x;
00161 double dy = p1.pose.position.y - p2.pose.position.y;
00162 return dx*dx +dy*dy;
00163 }
00164
00165 void mapToWorld(double mx, double my, double& wx, double& wy);
00166 void clearRobotCell(const tf::Stamped<tf::Pose>& global_pose, unsigned int mx, unsigned int my);
00167 double planner_window_x_, planner_window_y_, default_tolerance_;
00168 std::string tf_prefix_;
00169 boost::mutex mutex_;
00170 ros::ServiceServer make_plan_srv_;
00171 };
00172 };
00173
00174 #endif