18 #include "nav2_route/plugins/edge_cost_functions/costmap_scorer.hpp"
19 #include "nav2_ros_common/tf2_factories.hpp"
25 const nav2::LifecycleNode::SharedPtr node,
26 const nav2::TransformBuffer::SharedPtr,
27 std::shared_ptr<nav2_costmap_2d::CostmapSubscriber> costmap_subscriber,
28 const std::string & name)
30 RCLCPP_INFO(node->get_logger(),
"Configuring costmap scorer.");
32 logger_ = node->get_logger();
33 clock_ = node->get_clock();
36 use_max_ = node->declare_or_get_parameter(
getName() +
".use_maximum",
true);
39 invalid_on_collision_ = node->declare_or_get_parameter(
40 getName() +
".invalid_on_collision",
true);
43 invalid_off_map_ = node->declare_or_get_parameter(
44 getName() +
".invalid_off_map",
true);
47 max_cost_ =
static_cast<float>(
48 node->declare_or_get_parameter(
getName() +
".max_cost", 253.0));
51 check_resolution_ =
static_cast<unsigned int>(
52 node->declare_or_get_parameter(
getName() +
".check_resolution", 2));
55 std::string server_costmap_topic = node->get_parameter(
"costmap_topic").as_string();
56 std::string costmap_topic = node->declare_or_get_parameter(
57 getName() +
".costmap_topic", std::string(
"global_costmap/costmap_raw"));
58 if (costmap_topic != server_costmap_topic) {
59 costmap_subscriber_ = std::make_shared<nav2_costmap_2d::CostmapSubscriber>(
63 "Using costmap topic: %s instead of server costmap topic: %s for CostmapScorer.",
64 costmap_topic.c_str(), server_costmap_topic.c_str());
66 costmap_subscriber_ = costmap_subscriber;
70 weight_ =
static_cast<float>(
71 node->declare_or_get_parameter(
getName() +
".weight", 1.0));
77 costmap_ = costmap_subscriber_->getCostmap();
86 const EdgeType & ,
float & cost)
89 RCLCPP_WARN_THROTTLE(logger_, *clock_, 1000,
"No costmap yet received!");
93 float largest_cost = 0.0, running_cost = 0.0, point_cost = 0.0;
94 unsigned int x0, y0, x1, y1, idx = 0;
95 if (!costmap_->worldToMap(edge->start->coords.x, edge->start->coords.y, x0, y0) ||
96 !costmap_->worldToMap(edge->end->coords.x, edge->end->coords.y, x1, y1))
98 if (invalid_off_map_) {
106 point_cost =
static_cast<float>(costmap_->getCost(iter.getX(), iter.getY()));
107 if (point_cost >= max_cost_ && max_cost_ != 255.0f && invalid_on_collision_) {
113 running_cost += point_cost;
114 if (largest_cost < point_cost && point_cost != 255.0) {
115 largest_cost = point_cost;
119 for (
unsigned int i = 0; i < check_resolution_; i++) {
125 cost = weight_ * largest_cost / max_cost_;
127 cost = weight_ * running_cost / (
static_cast<float>(idx) * max_cost_);
140 #include "pluginlib/class_list_macros.hpp"
Scores edges by the average or maximum cost found while iterating over the edge's line segment in the...
std::string getName() override
Get name of the plugin for parameter scope mapping.
void prepare() override
Prepare for a new cycle, by resetting state, grabbing data to use for all immediate requests,...
void configure(const nav2::LifecycleNode::SharedPtr node, const nav2::TransformBuffer::SharedPtr tf_buffer, std::shared_ptr< nav2_costmap_2d::CostmapSubscriber > costmap_subscriber, const std::string &name) override
Configure.
bool score(const EdgePtr edge, const RouteRequest &route_request, const EdgeType &edge_type, float &cost) override
Main scoring plugin API.
A plugin interface to score edges during graph search to modify the lowest cost path (e....
An iterator implementing Bresenham Ray-Tracing.
bool isValid() const
If the iterator is valid.
An object representing edges between nodes.
An object to store salient features of the route request including its start and goal node ids,...