39 #include "nav2_costmap_2d/costmap_2d_ros.hpp"
49 #include "nav2_costmap_2d/layered_costmap.hpp"
50 #include "nav2_util/execution_timer.hpp"
51 #include "nav2_ros_common/node_utils.hpp"
52 #include "nav2_ros_common/rate.hpp"
53 #include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
54 #include "nav2_ros_common/tf2_factories.hpp"
55 #include "nav2_util/robot_utils.hpp"
56 #include "rcl_interfaces/msg/set_parameters_result.hpp"
58 using namespace std::chrono_literals;
59 using std::placeholders::_1;
60 using rcl_interfaces::msg::ParameterType;
64 Costmap2DROS::Costmap2DROS(
const rclcpp::NodeOptions & options)
65 : nav2::LifecycleNode(
"costmap",
"", options),
67 default_plugins_{
"static_layer",
"obstacle_layer",
"inflation_layer"},
69 "nav2_costmap_2d::StaticLayer",
70 "nav2_costmap_2d::ObstacleLayer",
71 "nav2_costmap_2d::InflationLayer"}
78 const std::string & name,
79 const std::string & parent_namespace,
80 const bool & use_sim_time,
81 const rclcpp::NodeOptions & parent_options)
83 std::vector<std::string> new_arguments = parent_options.arguments();
84 bool use_intra_process_comms = parent_options.use_intra_process_comms();
85 nav2::replaceOrAddArgument(
86 new_arguments,
"-r",
"__ns",
87 "__ns:=" + nav2::add_namespaces(parent_namespace, name));
88 nav2::replaceOrAddArgument(new_arguments,
"-r",
"__node", name +
":" +
"__node:=" + name);
89 nav2::replaceOrAddArgument(
90 new_arguments,
"-p",
"use_sim_time",
91 "use_sim_time:=" + std::string(use_sim_time ?
"true" :
"false"));
92 return rclcpp::NodeOptions().use_intra_process_comms(use_intra_process_comms).arguments(
97 const std::string & name,
98 const std::string & parent_namespace,
99 const bool & use_sim_time,
100 const rclcpp::NodeOptions & options)
101 : nav2::LifecycleNode(name,
"",
105 default_plugins_{
"static_layer",
"obstacle_layer",
"inflation_layer"},
107 "nav2_costmap_2d::StaticLayer",
108 "nav2_costmap_2d::ObstacleLayer",
109 "nav2_costmap_2d::InflationLayer"}
116 RCLCPP_INFO(get_logger(),
"Creating Costmap");
117 declare_parameter(
"lethal_cost_threshold", rclcpp::ParameterValue(100));
118 declare_parameter(
"trinary_costmap", rclcpp::ParameterValue(
true));
119 declare_parameter(
"unknown_cost_value", rclcpp::ParameterValue(
static_cast<unsigned char>(0xff)));
120 declare_parameter(
"inscribed_obstacle_cost_value", rclcpp::ParameterValue(99));
121 declare_parameter(
"use_maximum", rclcpp::ParameterValue(
false));
131 RCLCPP_INFO(get_logger(),
"Configuring");
134 }
catch (
const std::exception & e) {
136 get_logger(),
"Failed to configure costmap! %s.", e.what());
137 return nav2::CallbackReturn::FAILURE;
140 callback_group_ = create_callback_group(
141 rclcpp::CallbackGroupType::MutuallyExclusive,
false);
144 layered_costmap_ = std::make_unique<LayeredCostmap>(
147 if (!layered_costmap_->isSizeLocked()) {
148 layered_costmap_->resizeMap(
149 (
unsigned int)(map_width_meters_ / resolution_),
150 (
unsigned int)(map_height_meters_ / resolution_), resolution_, origin_x_, origin_y_);
154 tf_buffer_ = nav2::create_transform_buffer(
this, callback_group_);
155 tf_listener_ = nav2::create_transform_listener(*tf_buffer_);
158 for (
unsigned int i = 0; i < plugin_names_.size(); ++i) {
159 RCLCPP_INFO(get_logger(),
"Using plugin \"%s\"", plugin_names_[i].c_str());
161 std::shared_ptr<Layer> plugin = plugin_loader_.createSharedInstance(plugin_types_[i]);
163 layered_costmap_->addPlugin(plugin);
167 layered_costmap_.get(), plugin_names_[i], tf_buffer_.get(),
169 }
catch (
const std::exception & e) {
171 get_logger(),
"Failed to initialize costmap plugin %s! %s.",
172 plugin_names_[i].c_str(), e.what());
173 return nav2::CallbackReturn::FAILURE;
176 RCLCPP_INFO(get_logger(),
"Initialized plugin \"%s\"", plugin_names_[i].c_str());
179 for (
unsigned int i = 0; i < filter_names_.size(); ++i) {
180 RCLCPP_INFO(get_logger(),
"Using costmap filter \"%s\"", filter_names_[i].c_str());
182 std::shared_ptr<Layer> filter = plugin_loader_.createSharedInstance(filter_types_[i]);
184 layered_costmap_->addFilter(filter);
187 layered_costmap_.get(), filter_names_[i], tf_buffer_.get(),
190 RCLCPP_INFO(get_logger(),
"Initialized costmap filter \"%s\"", filter_names_[i].c_str());
195 footprint_stamped_sub_ = create_subscription<geometry_msgs::msg::PolygonStamped>(
196 "footprint", [
this](
const geometry_msgs::msg::PolygonStamped::ConstSharedPtr & footprint)
199 footprint_sub_ = create_subscription<geometry_msgs::msg::Polygon>(
200 "footprint", [
this](
const geometry_msgs::msg::Polygon::ConstSharedPtr & footprint)
204 footprint_pub_ = create_publisher<geometry_msgs::msg::PolygonStamped>(
205 "published_footprint");
207 costmap_publisher_ = std::make_unique<Costmap2DPublisher>(
210 "costmap", always_send_full_costmap_,
map_vis_z_);
212 auto layers = layered_costmap_->getPlugins();
214 for (
auto & layer : *layers) {
215 auto costmap_layer = std::dynamic_pointer_cast<CostmapLayer>(layer);
216 if (costmap_layer !=
nullptr) {
217 layer_publishers_.emplace_back(
218 std::make_unique<Costmap2DPublisher>(
221 layer->getName(), always_send_full_costmap_,
map_vis_z_)
230 std::vector<geometry_msgs::msg::Point> new_footprint;
236 get_cost_service_ = create_service<nav2_msgs::srv::GetCosts>(
237 std::string(
"get_cost_") + get_name(),
240 std::placeholders::_3));
243 clear_costmap_service_ = std::make_unique<ClearCostmapService>(
shared_from_this(), *
this);
245 executor_ = std::make_shared<rclcpp::executors::SingleThreadedExecutor>();
246 executor_->add_callback_group(callback_group_, get_node_base_interface());
247 executor_thread_ = std::make_unique<nav2::NodeThread>(executor_);
248 return nav2::CallbackReturn::SUCCESS;
254 RCLCPP_INFO(get_logger(),
"Activating");
259 std::string tf_error;
261 RCLCPP_INFO(get_logger(),
"Checking transform");
263 const auto initial_transform_timeout = rclcpp::Duration::from_seconds(
265 const auto initial_transform_timeout_point = now() + initial_transform_timeout;
266 while (rclcpp::ok() &&
267 !tf_buffer_->canTransform(
271 get_logger(),
"Timed out waiting for transform from %s to %s"
272 " to become available, tf error: %s",
276 if (now() > initial_transform_timeout_point) {
279 "Failed to activate %s because "
280 "transform from %s to %s did not become available before timeout",
283 return nav2::CallbackReturn::FAILURE;
293 footprint_pub_->on_activate();
294 costmap_publisher_->on_activate();
296 for (
auto & layer_pub : layer_publishers_) {
297 layer_pub->on_activate();
302 stop_updates_ =
false;
303 map_update_thread_shutdown_ =
false;
310 post_set_params_handler_ = this->add_post_set_parameters_callback(
313 this, std::placeholders::_1));
314 on_set_params_handler = this->add_on_set_parameters_callback(
317 return nav2::CallbackReturn::SUCCESS;
323 RCLCPP_INFO(get_logger(),
"Deactivating");
325 remove_post_set_parameters_callback(post_set_params_handler_.get());
326 post_set_params_handler_.reset();
327 remove_on_set_parameters_callback(on_set_params_handler.get());
328 on_set_params_handler.reset();
333 map_update_thread_shutdown_ =
true;
339 footprint_pub_->on_deactivate();
340 costmap_publisher_->on_deactivate();
342 for (
auto & layer_pub : layer_publishers_) {
343 layer_pub->on_deactivate();
346 return nav2::CallbackReturn::SUCCESS;
352 RCLCPP_INFO(get_logger(),
"Cleaning up");
353 executor_thread_.reset();
354 get_cost_service_.reset();
355 costmap_publisher_.reset();
356 clear_costmap_service_.reset();
358 layer_publishers_.clear();
360 layered_costmap_.reset();
362 tf_listener_.reset();
365 footprint_sub_.reset();
366 footprint_pub_.reset();
368 return nav2::CallbackReturn::SUCCESS;
374 RCLCPP_INFO(get_logger(),
"Shutting down");
375 return nav2::CallbackReturn::SUCCESS;
381 RCLCPP_DEBUG(get_logger(),
" getParameters");
385 "always_send_full_costmap",
false);
389 "footprint", std::string(
"[]"));
391 "global_frame", std::string(
"map"));
401 "plugins", default_plugins_);
403 "filters", std::vector<std::string>());
405 "publish_frequency", 1.0);
409 "robot_base_frame", std::string(
"base_link"));
411 "robot_radius", 0.1);
413 "rolling_window",
false);
415 "track_unknown_space",
false);
417 "transform_tolerance", 0.3);
419 "initial_transform_timeout", 60.0);
421 "update_frequency", 5.0);
423 "subscribe_to_stamped_footprint",
false);
427 if (plugin_names_ == default_plugins_) {
428 for (
size_t i = 0; i < default_plugins_.size(); ++i) {
429 nav2::declare_parameter_if_not_declared(
430 node, default_plugins_[i] +
".plugin", rclcpp::ParameterValue(default_types_[i]));
433 plugin_types_.resize(plugin_names_.size());
434 filter_types_.resize(filter_names_.size());
437 for (
size_t i = 0; i < plugin_names_.size(); ++i) {
438 plugin_types_[i] = nav2::get_plugin_type_param(node, plugin_names_[i]);
440 for (
size_t i = 0; i < filter_names_.size(); ++i) {
441 filter_types_[i] = nav2::get_plugin_type_param(node, filter_names_[i]);
445 if (map_publish_frequency_ > 0) {
446 publish_cycle_ = rclcpp::Duration::from_seconds(1 / map_publish_frequency_);
448 publish_cycle_ = rclcpp::Duration(-1s);
454 if (footprint_ !=
"" && footprint_ !=
"[]") {
456 std::vector<geometry_msgs::msg::Point> new_footprint;
463 get_logger(),
"The footprint parameter is invalid: \"%s\", using radius (%lf) instead",
464 footprint_.c_str(), robot_radius_);
470 if (map_width_meters_ <= 0) {
472 get_logger(),
"You try to set width of map to be negative or zero,"
473 " this isn't allowed, please give a positive value.");
475 if (map_height_meters_ <= 0) {
477 get_logger(),
"You try to set height of map to be negative or zero,"
478 " this isn't allowed, please give a positive value.");
480 if (resolution_ <= 0.0 || !std::isfinite(resolution_)) {
481 throw std::invalid_argument(
482 "Costmap resolution must be a positive finite value.");
489 if (points.empty()) {
491 get_logger(),
"You try to set an empty footprint"
492 " this isn't allowed, a footprint must contain at least one point.");
495 auto padded = std::make_shared<std::vector<geometry_msgs::msg::Point>>(points);
498 #ifdef __cpp_lib_atomic_shared_ptr
499 unpadded_footprint_.store(std::make_shared<std::vector<geometry_msgs::msg::Point>>(points));
500 padded_footprint_.store(padded);
503 &unpadded_footprint_, std::make_shared<std::vector<geometry_msgs::msg::Point>>(points));
504 std::atomic_store(&padded_footprint_, padded);
506 layered_costmap_->setFootprint(*padded);
511 const geometry_msgs::msg::Polygon & footprint)
519 geometry_msgs::msg::PoseStamped global_pose;
524 double yaw = tf2::getYaw(global_pose.pose.orientation);
525 #ifdef __cpp_lib_atomic_shared_ptr
526 auto padded_footprint = padded_footprint_.load();
528 auto padded_footprint = std::atomic_load(&padded_footprint_);
531 global_pose.pose.position.x, global_pose.pose.position.y, yaw,
532 *padded_footprint, oriented_footprint);
538 RCLCPP_DEBUG(get_logger(),
"mapUpdateLoop frequency: %lf", frequency);
541 if (frequency == 0.0) {
545 RCLCPP_DEBUG(get_logger(),
"Entering loop");
549 while (rclcpp::ok() && !map_update_thread_shutdown_) {
555 std::scoped_lock<std::mutex> lock(_dynamic_parameter_mutex);
563 if (publish_cycle_ > rclcpp::Duration(0s) && layered_costmap_->isInitialized()) {
564 unsigned int x0, y0, xn, yn;
565 layered_costmap_->getBounds(&x0, &xn, &y0, &yn);
566 costmap_publisher_->updateBounds(x0, xn, y0, yn);
568 for (
auto & layer_pub : layer_publishers_) {
569 layer_pub->updateBounds(x0, xn, y0, yn);
572 auto current_time = now();
573 if ((last_publish_ + publish_cycle_ < current_time) ||
577 RCLCPP_DEBUG(get_logger(),
"Publish costmap at %s", name_.c_str());
578 costmap_publisher_->publishCostmap();
580 for (
auto & layer_pub : layer_publishers_) {
581 layer_pub->publishCostmap();
584 last_publish_ = current_time;
594 if (r.period() > tf2::durationFromSec(1 / frequency)) {
597 "Costmap2DROS: Map update loop missed its desired rate of %.4fHz... "
598 "the loop actually took %.4f seconds", frequency, r.period());
607 RCLCPP_DEBUG(get_logger(),
"Updating map...");
609 if (!stop_updates_) {
611 geometry_msgs::msg::PoseStamped pose;
613 const double & x = pose.pose.position.x;
614 const double & y = pose.pose.position.y;
615 const double yaw = tf2::getYaw(pose.pose.orientation);
616 layered_costmap_->updateMap(x, y, yaw);
618 auto footprint = std::make_unique<geometry_msgs::msg::PolygonStamped>();
619 footprint->header = pose.header;
620 #ifdef __cpp_lib_atomic_shared_ptr
621 auto padded_footprint = padded_footprint_.load();
623 auto padded_footprint = std::atomic_load(&padded_footprint_);
627 RCLCPP_DEBUG(get_logger(),
"Publishing footprint");
628 footprint_pub_->publish(std::move(footprint));
638 auto waiting_start = now();
640 if (now() - waiting_start > timeout) {
641 throw std::runtime_error(
"Costmap timed out waiting for update");
650 RCLCPP_INFO(get_logger(),
"start");
651 std::vector<std::shared_ptr<Layer>> * plugins = layered_costmap_->getPlugins();
652 std::vector<std::shared_ptr<Layer>> * filters = layered_costmap_->getFilters();
657 for (std::vector<std::shared_ptr<Layer>>::iterator plugin = plugins->begin();
658 plugin != plugins->end();
661 (*plugin)->activate();
663 for (std::vector<std::shared_ptr<Layer>>::iterator filter = filters->begin();
664 filter != filters->end();
667 (*filter)->activate();
671 stop_updates_ =
false;
674 rclcpp::Rate r(20.0);
675 while (rclcpp::ok() && !initialized_) {
676 RCLCPP_DEBUG(get_logger(),
"Sleeping, waiting for initialized_");
684 stop_updates_ =
true;
687 if (layered_costmap_) {
688 std::vector<std::shared_ptr<Layer>> * plugins = layered_costmap_->getPlugins();
689 std::vector<std::shared_ptr<Layer>> * filters = layered_costmap_->getFilters();
692 for (std::vector<std::shared_ptr<Layer>>::iterator plugin = plugins->begin();
693 plugin != plugins->end(); ++plugin)
695 (*plugin)->deactivate();
697 for (std::vector<std::shared_ptr<Layer>>::iterator filter = filters->begin();
698 filter != filters->end(); ++filter)
700 (*filter)->deactivate();
703 initialized_ =
false;
710 stop_updates_ =
true;
711 initialized_ =
false;
717 stop_updates_ =
false;
720 rclcpp::Rate r(100.0);
721 while (!initialized_) {
729 Costmap2D * top = layered_costmap_->getCostmap();
733 std::vector<std::shared_ptr<Layer>> * plugins = layered_costmap_->getPlugins();
734 std::vector<std::shared_ptr<Layer>> * filters = layered_costmap_->getFilters();
735 for (std::vector<std::shared_ptr<Layer>>::iterator plugin = plugins->begin();
736 plugin != plugins->end(); ++plugin)
740 for (std::vector<std::shared_ptr<Layer>>::iterator filter = filters->begin();
741 filter != filters->end(); ++filter)
750 return nav2_util::getCurrentPose(
751 global_pose, *tf_buffer_,
757 const geometry_msgs::msg::PoseStamped & input_pose,
758 geometry_msgs::msg::PoseStamped & transformed_pose)
761 transformed_pose = input_pose;
764 return nav2_util::transformPoseInTargetFrame(
765 input_pose, transformed_pose, *tf_buffer_,
771 const std::vector<rclcpp::Parameter> & parameters)
773 rcl_interfaces::msg::SetParametersResult result;
774 result.successful =
true;
775 for (
const auto & parameter : parameters) {
776 const auto & param_type = parameter.get_type();
777 const auto & param_name = parameter.get_name();
778 if (param_name.find(
'.') != std::string::npos) {
781 if (param_type == ParameterType::PARAMETER_DOUBLE) {
782 if (parameter.as_double() <= 0.0 &&
783 (param_name ==
"resolution" || param_name ==
"publish_frequency"))
786 get_logger(),
"The value of parameter '%s' is incorrectly set to %f, "
787 "it should be >0. Ignoring parameter update.",
788 param_name.c_str(), parameter.as_double());
789 result.successful =
false;
790 }
else if (parameter.as_double() < 0.0 &&
791 (param_name !=
"origin_x" && param_name !=
"origin_y"))
794 get_logger(),
"The value of parameter '%s' is incorrectly set to %f, "
795 "it should be >0. Ignoring parameter update.",
796 param_name.c_str(), parameter.as_double());
797 result.successful =
false;
799 }
else if (param_type == ParameterType::PARAMETER_INTEGER) {
800 if (parameter.as_int() <= 0.0) {
802 get_logger(),
"The value of parameter '%s' is incorrectly set to %ld, "
803 "it should be >0. Ignoring parameter update.",
804 param_name.c_str(), parameter.as_int());
805 result.successful =
false;
807 }
else if (param_type == ParameterType::PARAMETER_STRING && param_name ==
"robot_base_frame") {
810 std::string tf_error;
811 RCLCPP_INFO(get_logger(),
"Checking transform");
812 if (!tf_buffer_->canTransform(
814 tf2::durationFromSec(1.0), &tf_error))
817 get_logger(),
"Timed out waiting for transform from %s to %s"
818 " to become available, tf error: %s",
819 parameter.as_string().c_str(),
global_frame_.c_str(), tf_error.c_str());
821 get_logger(),
"Rejecting robot_base_frame change to %s , leaving it to its original"
823 result.successful =
false;
833 bool resize_map =
false;
834 std::lock_guard<std::mutex> lock_reinit(_dynamic_parameter_mutex);
836 for (
const auto & parameter : parameters) {
837 const auto & param_type = parameter.get_type();
838 const auto & param_name = parameter.get_name();
839 if (param_name.find(
'.') != std::string::npos) {
843 if (param_type == ParameterType::PARAMETER_DOUBLE) {
844 if (param_name ==
"robot_radius") {
845 robot_radius_ = parameter.as_double();
850 }
else if (param_name ==
"footprint_padding") {
851 footprint_padding_ = parameter.as_double();
852 #ifdef __cpp_lib_atomic_shared_ptr
853 auto padded = std::make_shared<std::vector<geometry_msgs::msg::Point>>(
854 *unpadded_footprint_.load());
856 padded_footprint_.store(padded);
858 auto padded = std::make_shared<std::vector<geometry_msgs::msg::Point>>(
859 *std::atomic_load(&unpadded_footprint_));
861 std::atomic_store(&padded_footprint_, padded);
863 layered_costmap_->setFootprint(*padded);
864 }
else if (param_name ==
"transform_tolerance") {
866 }
else if (param_name ==
"publish_frequency") {
867 map_publish_frequency_ = parameter.as_double();
868 publish_cycle_ = rclcpp::Duration::from_seconds(1 / map_publish_frequency_);
869 }
else if (param_name ==
"resolution") {
871 resolution_ = parameter.as_double();
872 }
else if (param_name ==
"origin_x") {
874 origin_x_ = parameter.as_double();
875 }
else if (param_name ==
"origin_y") {
877 origin_y_ = parameter.as_double();
879 }
else if (param_type == ParameterType::PARAMETER_INTEGER) {
880 if (param_name ==
"width") {
882 map_width_meters_ = parameter.as_int();
883 }
else if (param_name ==
"height") {
885 map_height_meters_ = parameter.as_int();
887 }
else if (param_type == ParameterType::PARAMETER_STRING) {
888 if (param_name ==
"footprint") {
889 footprint_ = parameter.as_string();
890 std::vector<geometry_msgs::msg::Point> new_footprint;
894 }
else if (param_name ==
"robot_base_frame") {
900 if (resize_map && !layered_costmap_->isSizeLocked()) {
901 layered_costmap_->resizeMap(
902 (
unsigned int)(map_width_meters_ / resolution_),
903 (
unsigned int)(map_height_meters_ / resolution_), resolution_, origin_x_, origin_y_);
909 const std::shared_ptr<rmw_request_id_t>,
910 const std::shared_ptr<nav2_msgs::srv::GetCosts::Request> request,
911 const std::shared_ptr<nav2_msgs::srv::GetCosts::Response> response)
915 Costmap2D * costmap = layered_costmap_->getCostmap();
916 std::unique_lock<Costmap2D::mutex_t> lock(*(costmap->getMutex()));
917 response->success =
true;
918 for (
const auto & pose : request->poses) {
919 geometry_msgs::msg::PoseStamped pose_transformed;
922 get_logger(),
"Failed to transform, cannot get cost for pose (%.2f, %.2f)",
923 pose.pose.position.x, pose.pose.position.y);
924 response->success =
false;
925 response->costs.push_back(NO_INFORMATION);
928 double yaw = tf2::getYaw(pose_transformed.pose.orientation);
930 if (request->use_footprint) {
931 Footprint footprint = layered_costmap_->getFootprint();
935 get_logger(),
"Received request to get cost at footprint pose (%.2f, %.2f, %.2f)",
936 pose_transformed.pose.position.x, pose_transformed.pose.position.y, yaw);
938 response->costs.push_back(
940 pose_transformed.pose.position.x,
941 pose_transformed.pose.position.y, yaw, footprint));
944 get_logger(),
"Received request to get cost at point (%f, %f)",
945 pose_transformed.pose.position.x,
946 pose_transformed.pose.position.y);
949 pose_transformed.pose.position.x,
950 pose_transformed.pose.position.y, mx, my);
953 response->success =
false;
954 response->costs.push_back(LETHAL_OBSTACLE);
958 response->costs.push_back(
static_cast<float>(costmap->
getCost(mx, my)));
nav2::LifecycleNode::SharedPtr shared_from_this()
Get a shared pointer of this.
ParameterT declare_or_get_parameter(const std::string ¶meter_name, const ParameterDescriptor ¶meter_descriptor=ParameterDescriptor())
Declares or gets a parameter with specified type (not value). If the parameter is already declared,...
A sim-time-aware rate for Nav2 loops.
Costmap2DROS(const rclcpp::NodeOptions &options=rclcpp::NodeOptions())
Constructor for the wrapper.
nav2::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Cleanup node.
void mapUpdateLoop(double frequency)
Function on timer for costmap update.
void getOrientedFootprint(std::vector< geometry_msgs::msg::Point > &oriented_footprint)
Build the oriented footprint of the robot at the robot's current pose.
bool getRobotPose(geometry_msgs::msg::PoseStamped &global_pose)
Get the pose of the robot in the global frame of the costmap.
void getParameters()
Get parameters for node.
void pause()
Stops the costmap from updating, but sensor data still comes in over the wire.
void getCostsCallback(const std::shared_ptr< rmw_request_id_t >, const std::shared_ptr< nav2_msgs::srv::GetCosts::Request > request, const std::shared_ptr< nav2_msgs::srv::GetCosts::Response > response)
Get the cost at a point in costmap.
nav2::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Configure node.
nav2::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Deactivate node.
rcl_interfaces::msg::SetParametersResult validateParameterUpdatesCallback(const std::vector< rclcpp::Parameter > ¶meters)
Validate incoming parameter updates before applying them. This callback is triggered when one or more...
nav2::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Activate node.
~Costmap2DROS()
A destructor.
double transform_tolerance_
The timeout before transform errors.
bool rolling_window_
Whether to use a rolling window version of the costmap.
void resume()
Resumes costmap updates.
double initial_transform_timeout_
The timeout before activation of the node errors.
void updateMap()
Update the map with the layered costmap / plugins.
void setRobotFootprint(const std::vector< geometry_msgs::msg::Point > &points)
Set the footprint of the robot to be the given set of points, padded by footprint_padding.
void resetLayers()
Reset each individual layer.
bool transformPoseToGlobalFrame(const geometry_msgs::msg::PoseStamped &input_pose, geometry_msgs::msg::PoseStamped &transformed_pose)
Transform the input_pose in the global frame of the costmap.
std::string global_frame_
The global frame for the costmap.
void start()
Subscribes to sensor topics if necessary and starts costmap updates, can be called to restart the cos...
void stop()
Stops costmap updates and unsubscribes from sensor topics.
std::string robot_base_frame_
The frame_id of the robot base.
bool subscribe_to_stamped_footprint_
If true, the footprint subscriber expects a PolygonStamped msg.
bool isCurrent()
Same as getLayeredCostmap()->isCurrent().
void updateParametersCallback(const std::vector< rclcpp::Parameter > ¶meters)
Apply parameter updates after validation This callback is executed when parameters have been successf...
void waitUntilCurrent(const rclcpp::Duration &timeout)
Wait for the costmap to become current after updates or parameter changes.
void setRobotFootprintPolygon(const geometry_msgs::msg::Polygon &footprint)
Set the footprint of the robot to be the given polygon, padded by footprint_padding.
std::unique_ptr< std::thread > map_update_thread_
A thread for updating the map.
void init()
Common initialization for constructors.
bool is_lifecycle_follower_
whether is a child-LifecycleNode or an independent node
nav2::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
shutdown node
A 2D costmap provides a mapping between points in the world and their associated "costs".
void resetMap(unsigned int x0, unsigned int y0, unsigned int xn, unsigned int yn)
Reset the costmap in bounds.
unsigned char getCost(unsigned int mx, unsigned int my) const
Get the cost of a cell in the costmap.
bool worldToMap(double wx, double wy, unsigned int &mx, unsigned int &my) const
Convert from world coordinates to map coordinates.
unsigned int getSizeInCellsX() const
Accessor for the x size of the costmap in cells.
unsigned int getSizeInCellsY() const
Accessor for the y size of the costmap in cells.
Measures execution time of code between calls to start and end.
void start()
Call just prior to code you want to measure.
double elapsed_time_in_seconds()
Extract the measured time as a floating point number of seconds.
void end()
Call just after the code you want to measure.
void transformFootprint(double x, double y, double theta, const std::vector< geometry_msgs::msg::Point > &footprint_spec, std::vector< geometry_msgs::msg::Point > &oriented_footprint)
Given a pose and base footprint, build the oriented footprint of the robot (list of Points)
bool makeFootprintFromString(const std::string &footprint_string, std::vector< geometry_msgs::msg::Point > &footprint)
Make the footprint from the given string.
void padFootprint(std::vector< geometry_msgs::msg::Point > &footprint, double padding)
Adds the specified amount of padding to the footprint (in place)
rclcpp::NodeOptions getChildNodeOptions(const std::string &name, const std::string &parent_namespace, const bool &use_sim_time, const rclcpp::NodeOptions &parent_options)
Given the node options of a parent node, expands of replaces the fields for the node name,...
std::vector< geometry_msgs::msg::Point > makeFootprintFromRadius(double radius)
Create a circular footprint from a given radius.
std::vector< geometry_msgs::msg::Point > toPointVector(const geometry_msgs::msg::Polygon &polygon)
Convert Polygon msg to vector of Points.