Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
critic_manager.cpp
1 // Copyright (c) 2022 Samsung Research America, @artofnothingness Alexey Budyakov
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "nav2_mppi_controller/critic_manager.hpp"
16 
17 namespace mppi
18 {
19 
21  nav2::LifecycleNode::WeakPtr parent, const std::string & name,
22  std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros, ParametersHandler * param_handler)
23 {
24  parent_ = parent;
25  costmap_ros_ = costmap_ros;
26  name_ = name;
27  auto node = parent_.lock();
28  logger_ = node->get_logger();
29  clock_ = node->get_clock();
30  parameters_handler_ = param_handler;
31 
32  getParams();
33  loadCritics();
34 }
35 
37 {
38  auto node = parent_.lock();
39  auto getParam = parameters_handler_->getParamGetter(name_);
40  getParam(critic_names_, "critics", std::vector<std::string>{}, ParameterType::Static);
41  getParam(visualize_, "visualize", false);
42 }
43 
45 {
46  if (!loader_) {
47  loader_ = std::make_unique<pluginlib::ClassLoader<critics::CriticFunction>>(
48  "nav2_mppi_controller", "mppi::critics::CriticFunction");
49  }
50 
51  auto node = parent_.lock();
52  if (visualize_) {
53  critics_effect_pub_ = node->create_publisher<nav2_msgs::msg::CriticsStats>(
54  "~/critics_stats");
55  critics_effect_pub_->on_activate();
56  }
57 
58  critics_.clear();
59  for (auto name : critic_names_) {
60  std::string fullname = getFullName(name);
61  auto instance = std::unique_ptr<critics::CriticFunction>(
62  loader_->createUnmanagedInstance(fullname));
63  critics_.push_back(std::move(instance));
64  critics_.back()->on_configure(
65  parent_, name_, name_ + "." + name, costmap_ros_,
66  parameters_handler_);
67  RCLCPP_INFO(logger_, "Critic loaded : %s", fullname.c_str());
68  }
69 }
70 
71 std::string CriticManager::getFullName(const std::string & name)
72 {
73  return "mppi::critics::" + name;
74 }
75 
77  CriticData & data)
78 {
79  std::unique_ptr<nav2_msgs::msg::CriticsStats> stats_msg;
80  if (visualize_) {
81  data.trajectories_in_collision.assign(data.costs.size(), false);
82  critic_costs_.clear();
83  critic_costs_.reserve(critics_.size());
84  stats_msg = std::make_unique<nav2_msgs::msg::CriticsStats>();
85  stats_msg->critics.reserve(critics_.size());
86  stats_msg->changed.reserve(critics_.size());
87  stats_msg->costs_sum.reserve(critics_.size());
88  }
89 
90  for (size_t i = 0; i < critics_.size(); ++i) {
91  if (data.fail_flag) {
92  break;
93  }
94 
95  // Store costs before critic evaluation
96  Eigen::ArrayXf costs_before;
97  if (visualize_) {
98  costs_before = data.costs;
99  }
100 
101  critics_[i]->score(data);
102 
103  // Calculate statistics if visualization is enabled
104  if (visualize_) {
105  stats_msg->critics.push_back(critic_names_[i]);
106 
107  // Calculate sum of costs added by this individual critic
108  Eigen::ArrayXf cost_diff = data.costs - costs_before;
109  float costs_sum = cost_diff.sum();
110  stats_msg->costs_sum.push_back(costs_sum);
111  stats_msg->changed.push_back(costs_sum != 0.0f);
112  critic_costs_.emplace_back(critic_names_[i], std::move(cost_diff));
113  }
114  }
115 
116  // Publish statistics if enabled
117  if (visualize_ && critics_effect_pub_) {
118  stats_msg->stamp = clock_->now();
119  critics_effect_pub_->publish(std::move(stats_msg));
120  }
121 }
122 
123 } // namespace mppi
void on_configure(nav2::LifecycleNode::WeakPtr parent, const std::string &name, std::shared_ptr< nav2_costmap_2d::Costmap2DROS >, ParametersHandler *)
Configure critic manager on bringup and load plugins.
void evalTrajectoriesScores(CriticData &data)
Score trajectories by the set of loaded critic functions.
void getParams()
Get parameters (critics to load)
virtual void loadCritics()
Load the critic plugins.
std::string getFullName(const std::string &name)
Get full-name namespaced critic IDs.
Handles getting parameters and dynamic parameter changes.
auto getParamGetter(const std::string &ns)
Get an object to retrieve parameters.
Data to pass to critics for scoring, including state, trajectories, pruned path, global goal,...
Definition: critic_data.hpp:40