15 #ifndef NAV2_SMAC_PLANNER__NODE_HYBRID_HPP_
16 #define NAV2_SMAC_PLANNER__NODE_HYBRID_HPP_
23 #include "ompl/base/StateSpace.h"
25 #include "nav2_smac_planner/constants.hpp"
26 #include "nav2_smac_planner/types.hpp"
27 #include "nav2_smac_planner/collision_checker.hpp"
28 #include "nav2_smac_planner/costmap_downsampler.hpp"
29 #include "nav2_smac_planner/obstacle_heuristic.hpp"
30 #include "nav2_smac_planner/distance_heuristic.hpp"
31 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
32 #include "nav2_costmap_2d/inflation_layer.hpp"
34 namespace nav2_smac_planner
59 unsigned int & size_x_in,
60 unsigned int & size_y_in,
61 unsigned int & angle_quantization_in,
72 unsigned int & size_x_in,
73 unsigned int & size_y_in,
74 unsigned int & angle_quantization_in,
103 double getAngle(
const double & theta);
105 MotionModel motion_model = MotionModel::UNKNOWN;
106 MotionPoses projections;
108 unsigned int num_angle_quantization;
109 float num_angle_quantization_float;
110 float min_turning_radius;
112 float change_penalty;
113 float non_straight_penalty;
115 float reverse_penalty;
116 float travel_distance_reward;
117 bool downsample_obstacle_heuristic;
118 bool use_quadratic_cost_penalty;
119 bool allow_primitive_interpolation;
120 ompl::base::StateSpacePtr state_space;
121 std::vector<std::vector<double>> delta_xs;
122 std::vector<std::vector<double>> delta_ys;
123 std::vector<TrigValues> trig_values;
124 std::vector<float> travel_costs;
135 typedef std::unique_ptr<std::vector<NodeHybrid>> Graph;
136 typedef std::vector<NodePtr> NodeVector;
138 typedef std::vector<Coordinates> CoordinateVector;
147 obstacle_heuristic = std::make_unique<ObstacleHeuristic>();
148 distance_heuristic = std::make_unique<DistanceHeuristic<NodeHybrid>>();
151 std::unique_ptr<ObstacleHeuristic> obstacle_heuristic;
152 std::unique_ptr<DistanceHeuristic<NodeHybrid>> distance_heuristic;
158 explicit NodeHybrid(
const uint64_t index, NodeContext * ctx);
172 return this->_index == rhs._index;
195 return _accumulated_cost;
204 _accumulated_cost = cost_in;
213 _motion_primitive_index = idx;
214 _turn_dir = turn_dir;
223 return _motion_primitive_index;
277 const bool & traverse_unknown,
297 const unsigned int & x,
const unsigned int & y,
const unsigned int & angle,
298 const unsigned int & width,
const unsigned int & angle_quantization)
300 return static_cast<uint64_t
>(angle) +
static_cast<uint64_t
>(x) *
301 static_cast<uint64_t
>(angle_quantization) +
302 static_cast<uint64_t
>(y) *
static_cast<uint64_t
>(width) *
303 static_cast<uint64_t
>(angle_quantization);
314 const uint64_t & index,
315 const unsigned int & width,
const unsigned int & angle_quantization)
318 (index / angle_quantization) % width,
319 index / (angle_quantization * width),
320 index % angle_quantization);
331 const CoordinateVector & goals_coords);
343 const MotionModel & motion_model,
344 unsigned int & size_x,
345 unsigned int & size_y,
346 unsigned int & angle_quantization,
357 std::function<
bool(
const uint64_t &,
360 const bool & traverse_unknown,
361 NodeVector & neighbors);
375 float _accumulated_cost;
378 unsigned int _motion_primitive_index;
379 TurnDirection _turn_dir;
380 bool _is_node_valid{
false};
381 NodeContext * _ctx =
nullptr;
A costmap grid collision checker.
NodeHybrid implementation for graph, Hybrid-A*.
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.
NodeHybrid(const uint64_t index, NodeContext *ctx)
A constructor 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.
float getAccumulatedCost()
Gets the accumulated cost at this node.
void reset()
Reset method for new search.
bool operator==(const NodeHybrid &rhs) const
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.
static void initMotionModel(NodeContext *ctx, const MotionModel &motion_model, unsigned int &size_x, unsigned int &size_y, unsigned int &angle_quantization, SearchInfo &search_info)
Initialize motion models.
static Coordinates getCoords(const uint64_t &index, const unsigned int &width, const unsigned int &angle_quantization)
Get coordinates at index.
bool wasVisited()
Gets if cell has been visited in search.
float getHeuristicCost(const Coordinates &node_coords, const CoordinateVector &goals_coords)
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.
Implementation of coordinate2d structure.
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.
NodeContext()
A constructor for nav2_smac_planner::NodeContext.
Search properties and penalties.