homotopy_class_planner.h
Go to the documentation of this file.
1 /*********************************************************************
2  *
3  * Software License Agreement (BSD License)
4  *
5  * Copyright (c) 2016,
6  * TU Dortmund - Institute of Control Theory and Systems Engineering.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * * Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * * Redistributions in binary form must reproduce the above
16  * copyright notice, this list of conditions and the following
17  * disclaimer in the documentation and/or other materials provided
18  * with the distribution.
19  * * Neither the name of the institute nor the names of its
20  * contributors may be used to endorse or promote products derived
21  * from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  *
36  * Author: Christoph Rösmann
37  *********************************************************************/
38 
39 #ifndef HOMOTOPY_CLASS_PLANNER_H_
40 #define HOMOTOPY_CLASS_PLANNER_H_
41 
42 #include <math.h>
43 #include <algorithm>
44 #include <functional>
45 #include <vector>
46 #include <iterator>
47 #include <random>
48 
49 #include <boost/shared_ptr.hpp>
50 
51 #include <visualization_msgs/Marker.h>
52 #include <geometry_msgs/Point.h>
53 #include <std_msgs/ColorRGBA.h>
54 
55 #include <ros/console.h>
56 #include <ros/ros.h>
57 
66 
67 
68 namespace teb_local_planner
69 {
70 
72 inline std::complex<long double> getCplxFromVertexPosePtr(const VertexPose* pose)
73 {
74  return std::complex<long double>(pose->x(), pose->y());
75 };
76 
77 
79 inline std::complex<long double> getCplxFromMsgPoseStamped(const geometry_msgs::PoseStamped& pose)
80 {
81  return std::complex<long double>(pose.pose.position.x, pose.pose.position.y);
82 };
83 
109 {
110 public:
111 
112  using EquivalenceClassContainer = std::vector< std::pair<EquivalenceClassPtr, bool> >;
113 
118 
127  HomotopyClassPlanner(const TebConfig& cfg, ObstContainer* obstacles = NULL, RobotFootprintModelPtr robot_model = boost::make_shared<PointRobotFootprint>(),
128  TebVisualizationPtr visualization = TebVisualizationPtr(), const ViaPointContainer* via_points = NULL);
129 
133  virtual ~HomotopyClassPlanner();
134 
143  void initialize(const TebConfig& cfg, ObstContainer* obstacles = NULL, RobotFootprintModelPtr robot_model = boost::make_shared<PointRobotFootprint>(),
144  TebVisualizationPtr visualization = TebVisualizationPtr(), const ViaPointContainer* via_points = NULL);
145 
146 
147  void updateRobotModel(RobotFootprintModelPtr robot_model );
148 
151 
164  virtual bool plan(const std::vector<geometry_msgs::PoseStamped>& initial_plan, const geometry_msgs::Twist* start_vel = NULL, bool free_goal_vel=false);
165 
177  virtual bool plan(const tf::Pose& start, const tf::Pose& goal, const geometry_msgs::Twist* start_vel = NULL, bool free_goal_vel=false);
178 
190  virtual bool plan(const PoseSE2& start, const PoseSE2& goal, const geometry_msgs::Twist* start_vel = NULL, bool free_goal_vel=false);
191 
201  virtual bool getVelocityCommand(double& vx, double& vy, double& omega, int look_ahead_poses) const;
202 
211  TebOptimalPlannerPtr bestTeb() const {return tebs_.empty() ? TebOptimalPlannerPtr() : tebs_.size()==1 ? tebs_.front() : best_teb_;}
212 
226  virtual bool isTrajectoryFeasible(base_local_planner::CostmapModel* costmap_model, const std::vector<geometry_msgs::Point>& footprint_spec,
227  double inscribed_radius = 0.0, double circumscribed_radius=0.0, int look_ahead_idx=-1);
228 
236 
242  TebOptPlannerContainer::iterator removeTeb(TebOptimalPlannerPtr& teb);
243 
245 
248 
254  void setVisualization(TebVisualizationPtr visualization);
255 
262  virtual void visualize();
263 
265 
268 
269 
286  void exploreEquivalenceClassesAndInitTebs(const PoseSE2& start, const PoseSE2& goal, double dist_to_obst, const geometry_msgs::Twist* start_vel, bool free_goal_vel = false);
287 
303  template<typename BidirIter, typename Fun>
304  TebOptimalPlannerPtr addAndInitNewTeb(BidirIter path_start, BidirIter path_end, Fun fun_position, double start_orientation, double goal_orientation, const geometry_msgs::Twist* start_velocity, bool free_goal_vel = false);
305 
314  TebOptimalPlannerPtr addAndInitNewTeb(const PoseSE2& start, const PoseSE2& goal, const geometry_msgs::Twist* start_velocity, bool free_goal_vel = false);
315 
323  TebOptimalPlannerPtr addAndInitNewTeb(const std::vector<geometry_msgs::PoseStamped>& initial_plan, const geometry_msgs::Twist* start_velocity, bool free_goal_vel = false);
324 
331  void updateAllTEBs(const PoseSE2* start, const PoseSE2* goal, const geometry_msgs::Twist* start_velocity);
332 
333 
341  void optimizeAllTEBs(int iter_innerloop, int iter_outerloop);
342 
348 
357 
359 
365  virtual void clearPlanner() {clearGraph(); equivalence_classes_.clear(); tebs_.clear(); initial_plan_ = NULL;}
366 
367 
376  virtual void setPreferredTurningDir(RotType dir);
377 
391  template<typename BidirIter, typename Fun>
392  EquivalenceClassPtr calculateEquivalenceClass(BidirIter path_start, BidirIter path_end, Fun fun_cplx_point, const ObstContainer* obstacles = NULL,
393  boost::optional<TimeDiffSequence::iterator> timediff_start = boost::none, boost::optional<TimeDiffSequence::iterator> timediff_end = boost::none);
394 
400 
401  bool hasDiverged() const override;
402 
411  virtual void computeCurrentCost(std::vector<double>& cost, double obst_cost_scale=1.0, double viapoint_cost_scale=1.0, bool alternative_time_cost=false);
412 
419  inline static bool isHSignatureSimilar(const std::complex<long double>& h1, const std::complex<long double>& h2, double threshold)
420  {
421  double diff_real = std::abs(h2.real() - h1.real());
422  double diff_imag = std::abs(h2.imag() - h1.imag());
423  if (diff_real<=threshold && diff_imag<=threshold)
424  return true; // Found! Homotopy class already exists, therefore nothing added
425  return false;
426  }
434  void deletePlansDetouringBackwards(const double orient_threshold, const double len_orientation_vector);
444  bool computeStartOrientation(const TebOptimalPlannerPtr plan, const double len_orientation_vector, double& orientation);
445 
446 
451  const TebConfig* config() const {return cfg_;}
452 
457  const ObstContainer* obstacles() const {return obstacles_;}
458 
462  bool isInitialized() const {return initialized_;}
463 
467  void clearGraph() {if(graph_search_) graph_search_->clearGraph();}
468 
474  int bestTebIdx() const;
475 
476 
483  bool addEquivalenceClassIfNew(const EquivalenceClassPtr& eq_class, bool lock=false);
484 
490 
491  bool isInBestTebClass(const EquivalenceClassPtr& eq_class) const;
492 
493  int numTebsInClass(const EquivalenceClassPtr& eq_class) const;
494 
495  int numTebsInBestTebClass() const;
496 
508  void randomlyDropTebs();
509 
510 protected:
511 
514 
520  bool hasEquivalenceClass(const EquivalenceClassPtr& eq_class) const;
521 
522 
532  void renewAndAnalyzeOldTebs(bool delete_detours);
533 
542  void updateReferenceTrajectoryViaPoints(bool all_trajectories);
543 
545 
546 
547  // external objects (store weak pointers)
548  const TebConfig* cfg_;
551 
552  // internal objects (memory management owned)
557 
558  const std::vector<geometry_msgs::PoseStamped>* initial_plan_;
561 
563 
565  // The second parameter denotes whether to exclude the class from detour deletion or not (true: force keeping).
566 
568 
570 
571  std::default_random_engine random_;
573 
575 
576 
577 
578 public:
579  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
580 
581 
582 };
583 
586 
587 
588 } // namespace teb_local_planner
589 
590 // include template implementations / definitions
592 
593 #endif /* HOMOTOPY_CLASS_PLANNER_H_ */
boost::shared_ptr< GraphSearchInterface > graph_search_
int bestTebIdx() const
find the index of the currently best TEB in the container
virtual bool isTrajectoryFeasible(base_local_planner::CostmapModel *costmap_model, const std::vector< geometry_msgs::Point > &footprint_spec, double inscribed_radius=0.0, double circumscribed_radius=0.0, int look_ahead_idx=-1)
Check whether the planned trajectory is feasible or not.
TebVisualizationPtr visualization_
Instance of the visualization class (local/global plan, obstacles, ...)
boost::shared_ptr< HomotopyClassPlanner > HomotopyClassPlannerPtr
Abbrev. for a shared pointer of a HomotopyClassPlanner instance.
std::complex< long double > getCplxFromMsgPoseStamped(const geometry_msgs::PoseStamped &pose)
Inline function used for calculateHSignature() in combination with geometry_msgs::PoseStamped.
This abstract class defines an interface for local planners.
ROSCPP_DECL void start()
bool computeStartOrientation(const TebOptimalPlannerPtr plan, const double len_orientation_vector, double &orientation)
Given a plan, computes its start orientation using a vector of length >= len_orientation_vector start...
double & y()
Access the y-coordinate the pose.
Definition: vertex_pose.h:161
Config class for the teb_local_planner and its components.
Definition: teb_config.h:61
const std::vector< geometry_msgs::PoseStamped > * initial_plan_
Store the initial plan if available for a better trajectory initialization.
EquivalenceClassPtr initial_plan_eq_class_
Store the equivalence class of the initial plan.
bool initialized_
Keeps track about the correct initialization of this class.
bool hasEquivalenceClass(const EquivalenceClassPtr &eq_class) const
Check if a h-signature exists already.
virtual void computeCurrentCost(std::vector< double > &cost, double obst_cost_scale=1.0, double viapoint_cost_scale=1.0, bool alternative_time_cost=false)
bool isInitialized() const
Returns true if the planner is initialized.
Local planner that explores alternative homotopy classes, create a plan for each alternative and fina...
void deletePlansDetouringBackwards(const double orient_threshold, const double len_orientation_vector)
Checks if the orientation of the computed trajectories differs from that of the best plan of more tha...
TebOptimalPlannerPtr selectBestTeb()
In case of multiple, internally stored, alternative trajectories, select the best one according to th...
TebOptimalPlannerPtr initial_plan_teb_
Store pointer to the TEB related to the initial plan (use method getInitialPlanTEB() since it checks ...
TebOptimalPlannerPtr findBestTeb()
In case of empty best teb, scores again the available plans to find the best one. The best_teb_ varia...
bool hasDiverged() const override
Returns true if the planner has diverged.
void updateReferenceTrajectoryViaPoints(bool all_trajectories)
Associate trajectories with via-points.
EquivalenceClassPtr calculateEquivalenceClass(BidirIter path_start, BidirIter path_end, Fun fun_cplx_point, const ObstContainer *obstacles=NULL, boost::optional< TimeDiffSequence::iterator > timediff_start=boost::none, boost::optional< TimeDiffSequence::iterator > timediff_end=boost::none)
Calculate the equivalence class of a path.
const ObstContainer * obstacles() const
Access current obstacle container (read-only)
bool isInBestTebClass(const EquivalenceClassPtr &eq_class) const
void randomlyDropTebs()
Randomly drop non-optimal TEBs to so we can explore other alternatives.
boost::shared_ptr< TebOptimalPlanner > TebOptimalPlannerPtr
Abbrev. for shared instances of the TebOptimalPlanner.
virtual bool plan(const std::vector< geometry_msgs::PoseStamped > &initial_plan, const geometry_msgs::Twist *start_vel=NULL, bool free_goal_vel=false)
Plan a trajectory based on an initial reference plan.
void clearGraph()
Clear any existing graph of the homotopy class search.
RobotFootprintModelPtr robot_model_
Robot model shared instance.
ObstContainer * obstacles_
Store obstacles that are relevant for planning.
virtual bool getVelocityCommand(double &vx, double &vy, double &omega, int look_ahead_poses) const
Get the velocity command from a previously optimized plan to control the robot at the current samplin...
RotType
Symbols for left/none/right rotations.
Definition: misc.h:53
const TebConfig * cfg_
Config class that stores and manages all related parameters.
const TebOptPlannerContainer & getTrajectoryContainer() const
Read-only access to the internal trajectory container.
void exploreEquivalenceClassesAndInitTebs(const PoseSE2 &start, const PoseSE2 &goal, double dist_to_obst, const geometry_msgs::Twist *start_vel, bool free_goal_vel=false)
Explore paths in new equivalence classes (e.g. homotopy classes) and initialize TEBs from them...
const ViaPointContainer * via_points_
Store the current list of via-points.
virtual ~HomotopyClassPlanner()
Destruct the HomotopyClassPlanner.
void initialize(const TebConfig &cfg, ObstContainer *obstacles=NULL, RobotFootprintModelPtr robot_model=boost::make_shared< PointRobotFootprint >(), TebVisualizationPtr visualization=TebVisualizationPtr(), const ViaPointContainer *via_points=NULL)
Initialize the HomotopyClassPlanner.
boost::shared_ptr< TebVisualization > TebVisualizationPtr
Abbrev. for shared instances of the TebVisualization.
TebOptimalPlannerPtr getInitialPlanTEB()
Returns a shared pointer to the TEB related to the initial plan.
virtual void setPreferredTurningDir(RotType dir)
Prefer a desired initial turning direction (by penalizing the opposing one)
double & x()
Access the x-coordinate the pose.
Definition: vertex_pose.h:149
std::vector< ObstaclePtr > ObstContainer
Abbrev. for containers storing multiple obstacles.
Definition: obstacles.h:297
std::complex< long double > getCplxFromVertexPosePtr(const VertexPose *pose)
< Inline function used for calculateHSignature() in combination with VertexPose pointers ...
TebOptPlannerContainer::iterator removeTeb(TebOptimalPlannerPtr &teb)
Removes the specified teb and the corresponding homotopy class from the list of available ones...
void updateRobotModel(RobotFootprintModelPtr robot_model)
EquivalenceClassPtr best_teb_eq_class_
Store the equivalence class of the current best teb.
virtual void clearPlanner()
Reset the planner.
int numTebsInClass(const EquivalenceClassPtr &eq_class) const
TebOptPlannerContainer tebs_
Container that stores multiple local teb planners (for alternative equivalence classes) and their cor...
std::vector< TebOptimalPlannerPtr > TebOptPlannerContainer
Abbrev. for containers storing multiple teb optimal planners.
TebOptimalPlannerPtr last_best_teb_
Points to the plan used in the previous control cycle.
std::vector< std::pair< EquivalenceClassPtr, bool > > EquivalenceClassContainer
This class implements a pose in the domain SE2: The pose consist of the position x and y and an orie...
Definition: pose_se2.h:57
const EquivalenceClassContainer & getEquivalenceClassRef() const
Return the current set of equivalence erelations (read-only)
static bool isHSignatureSimilar(const std::complex< long double > &h1, const std::complex< long double > &h2, double threshold)
Check if two h-signatures are similar (w.r.t. a certain threshold)
TebOptimalPlannerPtr addAndInitNewTeb(BidirIter path_start, BidirIter path_end, Fun fun_position, double start_orientation, double goal_orientation, const geometry_msgs::Twist *start_velocity, bool free_goal_vel=false)
Add a new Teb to the internal trajectory container, if this teb constitutes a new equivalence class...
void renewAndAnalyzeOldTebs(bool delete_detours)
Renew all found h-signatures for the new planning step based on existing TEBs. Optionally detours can...
virtual void visualize()
Publish the local plan, pose sequence and additional information via ros topics (e.g. subscribe with rviz).
EquivalenceClassContainer equivalence_classes_
Store all known quivalence classes (e.g. h-signatures) to allow checking for duplicates after finding...
const TebConfig * config() const
Access config (read-only)
This class stores and wraps a SE2 pose (position and orientation) into a vertex that can be optimized...
Definition: vertex_pose.h:63
bool addEquivalenceClassIfNew(const EquivalenceClassPtr &eq_class, bool lock=false)
Internal helper function that adds a new equivalence class to the list of known classes only if it is...
TebOptimalPlannerPtr bestTeb() const
Access current best trajectory candidate (that relates to the "best" homotopy class).
void setVisualization(TebVisualizationPtr visualization)
Register a TebVisualization class to enable visiualization routines (e.g. publish the local plan and ...
void optimizeAllTEBs(int iter_innerloop, int iter_outerloop)
Optimize all available trajectories by invoking the optimizer on each one.
ViaPointContainer via_points
TebOptimalPlannerPtr best_teb_
Store the current best teb.
void updateAllTEBs(const PoseSE2 *start, const PoseSE2 *goal, const geometry_msgs::Twist *start_velocity)
Update TEBs with new pose, goal and current velocity.
ros::Time last_eq_class_switching_time_
Store the time at which the equivalence class changed recently.
std::vector< Eigen::Vector2d, Eigen::aligned_allocator< Eigen::Vector2d > > ViaPointContainer
Typedef for a container storing via-points.


teb_local_planner
Author(s): Christoph Rösmann
autogenerated on Wed Jun 1 2022 02:26:31