15 #ifndef NAV2_SMAC_PLANNER__NODE_HYBRID_HPP_
16 #define NAV2_SMAC_PLANNER__NODE_HYBRID_HPP_
28 #include "ompl/base/StateSpace.h"
30 #include "nav2_smac_planner/constants.hpp"
31 #include "nav2_smac_planner/types.hpp"
32 #include "nav2_smac_planner/collision_checker.hpp"
33 #include "nav2_smac_planner/costmap_downsampler.hpp"
34 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
35 #include "nav2_costmap_2d/inflation_layer.hpp"
37 namespace nav2_smac_planner
40 typedef std::vector<float> LookupTable;
41 typedef std::pair<double, double> TrigValues;
43 typedef std::pair<float, uint64_t> ObstacleHeuristicElement;
46 bool operator()(
const ObstacleHeuristicElement & a,
const ObstacleHeuristicElement & b)
const
48 return a.first > b.first;
52 typedef std::vector<ObstacleHeuristicElement> ObstacleHeuristicQueue;
76 unsigned int & size_x_in,
77 unsigned int & size_y_in,
78 unsigned int & angle_quantization_in,
89 unsigned int & size_x_in,
90 unsigned int & size_y_in,
91 unsigned int & angle_quantization_in,
120 double getAngle(
const double & theta);
122 MotionModel motion_model = MotionModel::UNKNOWN;
123 MotionPoses projections;
125 unsigned int num_angle_quantization;
126 float num_angle_quantization_float;
127 float min_turning_radius;
129 float change_penalty;
130 float non_straight_penalty;
132 float reverse_penalty;
133 float travel_distance_reward;
134 bool downsample_obstacle_heuristic;
135 bool use_quadratic_cost_penalty;
136 ompl::base::StateSpacePtr state_space;
137 std::vector<std::vector<double>> delta_xs;
138 std::vector<std::vector<double>> delta_ys;
139 std::vector<TrigValues> trig_values;
140 std::vector<float> travel_costs;
151 typedef std::unique_ptr<std::vector<NodeHybrid>> Graph;
152 typedef std::vector<NodePtr> NodeVector;
171 Coordinates(
const float & x_in,
const float & y_in,
const float & theta_in)
172 : x(x_in), y(y_in), theta(theta_in)
177 return this->x == rhs.x && this->y == rhs.y && this->theta == rhs.theta;
182 return !(*
this == rhs);
188 typedef std::vector<Coordinates> CoordinateVector;
208 return this->_index == rhs._index;
231 return _accumulated_cost;
240 _accumulated_cost = cost_in;
249 _motion_primitive_index = idx;
250 _turn_dir = turn_dir;
259 return _motion_primitive_index;
313 const bool & traverse_unknown,
333 const unsigned int & x,
const unsigned int & y,
const unsigned int & angle,
334 const unsigned int & width,
const unsigned int & angle_quantization)
336 return static_cast<uint64_t
>(angle) +
static_cast<uint64_t
>(x) *
337 static_cast<uint64_t
>(angle_quantization) +
338 static_cast<uint64_t
>(y) *
static_cast<uint64_t
>(width) *
339 static_cast<uint64_t
>(angle_quantization);
350 const unsigned int & x,
const unsigned int & y,
const unsigned int & angle)
353 x, y, angle, motion_table.size_x,
354 motion_table.num_angle_quantization);
365 const uint64_t & index,
366 const unsigned int & width,
const unsigned int & angle_quantization)
369 (index / angle_quantization) % width,
370 index / (angle_quantization * width),
371 index % angle_quantization);
381 const Coordinates & node_coords,
382 const Coordinates & goal_coordinates);
393 const MotionModel & motion_model,
394 unsigned int & size_x,
395 unsigned int & size_y,
396 unsigned int & angle_quantization,
408 const float & lookup_table_dim,
409 const MotionModel & motion_model,
410 const unsigned int & dim_3_size,
420 const Coordinates & node_coords,
421 const Coordinates & goal_coords,
422 const float & cost_penalty);
433 const Coordinates & node_coords,
434 const Coordinates & goal_coords,
435 const float & obstacle_heuristic);
443 std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros,
444 const unsigned int & start_x,
const unsigned int & start_y,
445 const unsigned int & goal_x,
const unsigned int & goal_y);
455 std::function<
bool(
const uint64_t &,
458 const bool & traverse_unknown,
459 NodeVector & neighbors);
481 static float travel_distance_cost;
484 static LookupTable obstacle_heuristic_lookup_table;
485 static ObstacleHeuristicQueue obstacle_heuristic_queue;
487 static std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros;
489 static LookupTable dist_heuristic_lookup_table;
490 static float size_lookup;
494 float _accumulated_cost;
497 unsigned int _motion_primitive_index;
498 TurnDirection _turn_dir;
499 bool _is_node_valid{
false};
A costmap grid collision checker.
NodeHybrid implementation for graph, Hybrid-A*.
static void precomputeDistanceHeuristic(const float &lookup_table_dim, const MotionModel &motion_model, const unsigned int &dim_3_size, const SearchInfo &search_info)
Compute the SE2 distance heuristic.
uint64_t getIndex()
Gets cell index.
bool isNodeValid(const bool &traverse_unknown, GridCollisionChecker *collision_checker)
Check if this node is valid.
void setAccumulatedCost(const float &cost_in)
Sets the accumulated cost at this node.
float getTraversalCost(const NodePtr &child)
Get traversal cost of parent node to child node.
void setPose(const Coordinates &pose_in)
setting continuous coordinate search poses (in partial-cells)
~NodeHybrid()
A destructor for nav2_smac_planner::NodeHybrid.
void getNeighbors(std::function< bool(const uint64_t &, nav2_smac_planner::NodeHybrid *&)> &validity_checker, GridCollisionChecker *collision_checker, const bool &traverse_unknown, NodeVector &neighbors)
Retrieve all valid neighbors of a node.
float getCost()
Gets the costmap cost at this node.
static void destroyStaticAssets()
Destroy shared pointer assets at the end of the process that don't require normal destruction handlin...
float getAccumulatedCost()
Gets the accumulated cost at this node.
static void initMotionModel(const MotionModel &motion_model, unsigned int &size_x, unsigned int &size_y, unsigned int &angle_quantization, SearchInfo &search_info)
Initialize motion models.
void reset()
Reset method for new search.
bool operator==(const NodeHybrid &rhs)
operator== for comparisons
static uint64_t getIndex(const unsigned int &x, const unsigned int &y, const unsigned int &angle, const unsigned int &width, const unsigned int &angle_quantization)
Get index at coordinates.
void setMotionPrimitiveIndex(const unsigned int &idx, const TurnDirection &turn_dir)
Sets the motion primitive index used to achieve node in search.
unsigned int & getMotionPrimitiveIndex()
Gets the motion primitive index used to achieve node in search.
NodeHybrid(const uint64_t index)
A constructor for nav2_smac_planner::NodeHybrid.
static Coordinates getCoords(const uint64_t &index, const unsigned int &width, const unsigned int &angle_quantization)
Get coordinates at index.
static float getObstacleHeuristic(const Coordinates &node_coords, const Coordinates &goal_coords, const float &cost_penalty)
Compute the Obstacle heuristic.
static uint64_t getIndex(const unsigned int &x, const unsigned int &y, const unsigned int &angle)
Get index at coordinates.
static float getDistanceHeuristic(const Coordinates &node_coords, const Coordinates &goal_coords, const float &obstacle_heuristic)
Compute the Distance heuristic.
bool wasVisited()
Gets if cell has been visited in search.
static float getHeuristicCost(const Coordinates &node_coords, const Coordinates &goal_coordinates)
Get cost of heuristic of node.
TurnDirection & getTurnDirection()
Gets the motion primitive turning direction used to achieve node in search.
bool backtracePath(CoordinateVector &path)
Set the starting pose for planning, as a node index.
void visited()
Sets if cell has been visited in search.
static void resetObstacleHeuristic(std::shared_ptr< nav2_costmap_2d::Costmap2DROS > costmap_ros, const unsigned int &start_x, const unsigned int &start_y, const unsigned int &goal_x, const unsigned int &goal_y)
reset the obstacle heuristic state
A table of motion primitives and related functions.
void initReedsShepp(unsigned int &size_x_in, unsigned int &size_y_in, unsigned int &angle_quantization_in, SearchInfo &search_info)
Initializing using Reeds-Shepp model.
MotionPoses getProjections(const NodeHybrid *node)
Get projections of motion models.
double getAngle(const double &theta)
Get the angle scaled across bins from a raw orientation.
HybridMotionTable()
A constructor for nav2_smac_planner::HybridMotionTable.
float getAngleFromBin(const unsigned int &bin_idx)
Get the raw orientation from an angular bin.
unsigned int getClosestAngularBin(const double &theta)
Get the angular bin to use from a raw orientation.
void initDubin(unsigned int &size_x_in, unsigned int &size_y_in, unsigned int &angle_quantization_in, SearchInfo &search_info)
Initializing using Dubin model.
NodeHybrid implementation of coordinate structure.
Coordinates()
A constructor for nav2_smac_planner::NodeHybrid::Coordinates.
Coordinates(const float &x_in, const float &y_in, const float &theta_in)
A constructor for nav2_smac_planner::NodeHybrid::Coordinates.
Search properties and penalties.