30
30
31
31
namespace behavior_path_planner
32
32
{
33
- PlannerManager::PlannerManager (rclcpp::Node & node, const size_t max_iteration_num )
33
+ PlannerManager::PlannerManager (rclcpp::Node & node)
34
34
: plugin_loader_(" behavior_path_planner" , " behavior_path_planner::SceneModuleManagerInterface" ),
35
35
logger_ (node.get_logger().get_child(" planner_manager" )),
36
- clock_(*node.get_clock()),
37
- max_iteration_num_{max_iteration_num}
36
+ clock_(*node.get_clock())
38
37
{
39
38
processing_time_.emplace (" total_time" , 0.0 );
40
39
debug_publisher_ptr_ = std::make_unique<DebugPublisher>(&node, " ~/debug" );
@@ -64,6 +63,11 @@ void PlannerManager::launchScenePlugin(rclcpp::Node & node, const std::string &
64
63
}
65
64
}
66
65
66
+ void PlannerManager::calculateMaxIterationNum (const size_t scene_module_num)
67
+ {
68
+ max_iteration_num_ = scene_module_num * (scene_module_num + 1 ) / 2 ;
69
+ }
70
+
67
71
void PlannerManager::removeScenePlugin (rclcpp::Node & node, const std::string & name)
68
72
{
69
73
auto it = std::remove_if (manager_ptrs_.begin (), manager_ptrs_.end (), [&](const auto plugin) {
@@ -122,17 +126,19 @@ BehaviorModuleOutput PlannerManager::run(const std::shared_ptr<PlannerData> & da
122
126
" Ego is out of route, no module is running. Skip running scene modules." );
123
127
return output;
124
128
}
129
+ std::vector<SceneModulePtr>
130
+ deleted_modules; // store the scene modules deleted from approved modules
125
131
126
132
for (size_t itr_num = 1 ;; ++itr_num) {
127
133
/* *
128
134
* STEP1: get approved modules' output
129
135
*/
130
- auto approved_modules_output = runApprovedModules (data);
136
+ auto approved_modules_output = runApprovedModules (data, deleted_modules );
131
137
132
138
/* *
133
139
* STEP2: check modules that need to be launched
134
140
*/
135
- const auto request_modules = getRequestModules (approved_modules_output);
141
+ const auto request_modules = getRequestModules (approved_modules_output, deleted_modules );
136
142
137
143
/* *
138
144
* STEP3: if there is no module that need to be launched, return approved modules' output
@@ -243,7 +249,8 @@ void PlannerManager::generateCombinedDrivableArea(
243
249
}
244
250
245
251
std::vector<SceneModulePtr> PlannerManager::getRequestModules (
246
- const BehaviorModuleOutput & previous_module_output) const
252
+ const BehaviorModuleOutput & previous_module_output,
253
+ const std::vector<SceneModulePtr> & deleted_modules) const
247
254
{
248
255
if (previous_module_output.path .points .empty ()) {
249
256
RCLCPP_ERROR_STREAM (
@@ -261,6 +268,18 @@ std::vector<SceneModulePtr> PlannerManager::getRequestModules(
261
268
262
269
for (const auto & manager_ptr : manager_ptrs_) {
263
270
stop_watch_.tic (manager_ptr->name ());
271
+ /* *
272
+ * skip the module that is already deleted.
273
+ */
274
+ {
275
+ const auto name = manager_ptr->name ();
276
+ const auto find_deleted_module = [&name](const auto & m) { return m->name () == name; };
277
+ const auto itr =
278
+ std::find_if (deleted_modules.begin (), deleted_modules.end (), find_deleted_module);
279
+ if (itr != deleted_modules.end ()) {
280
+ continue ;
281
+ }
282
+ }
264
283
265
284
/* *
266
285
* determine the execution capability of modules based on existing approved modules.
@@ -635,7 +654,8 @@ std::pair<SceneModulePtr, BehaviorModuleOutput> PlannerManager::runRequestModule
635
654
return std::make_pair (module_ptr, results.at (module_ptr->name ()));
636
655
}
637
656
638
- BehaviorModuleOutput PlannerManager::runApprovedModules (const std::shared_ptr<PlannerData> & data)
657
+ BehaviorModuleOutput PlannerManager::runApprovedModules (
658
+ const std::shared_ptr<PlannerData> & data, std::vector<SceneModulePtr> & deleted_modules)
639
659
{
640
660
std::unordered_map<std::string, BehaviorModuleOutput> results;
641
661
BehaviorModuleOutput output = getReferencePath (data);
@@ -751,6 +771,9 @@ BehaviorModuleOutput PlannerManager::runApprovedModules(const std::shared_ptr<Pl
751
771
const auto itr = std::find_if (
752
772
approved_module_ptrs_.begin (), approved_module_ptrs_.end (),
753
773
[](const auto & m) { return m->getCurrentStatus () == ModuleStatus::FAILURE; });
774
+ if (itr != approved_module_ptrs_.end ()) {
775
+ deleted_modules.push_back (*itr);
776
+ }
754
777
755
778
std::for_each (itr, approved_module_ptrs_.end (), [this ](auto & m) {
756
779
debug_info_.emplace_back (m, Action::DELETE, " From Approved" );
@@ -822,6 +845,9 @@ BehaviorModuleOutput PlannerManager::runApprovedModules(const std::shared_ptr<Pl
822
845
}))
823
846
resetCurrentRouteLanelet (data);
824
847
848
+ std::copy_if (
849
+ itr, approved_module_ptrs_.end (), std::back_inserter (deleted_modules), success_module_cond);
850
+
825
851
std::for_each (itr, approved_module_ptrs_.end (), [&](auto & m) {
826
852
debug_info_.emplace_back (m, Action::DELETE, " From Approved" );
827
853
deleteExpiredModules (m);
0 commit comments