diff --git a/planning/behavior_path_planner/config/goal_planner/goal_planner.param.yaml b/planning/behavior_path_planner/config/goal_planner/goal_planner.param.yaml
index 39d05a7fb761b..2318e81783479 100644
--- a/planning/behavior_path_planner/config/goal_planner/goal_planner.param.yaml
+++ b/planning/behavior_path_planner/config/goal_planner/goal_planner.param.yaml
@@ -2,7 +2,6 @@
ros__parameters:
goal_planner:
# general params
- minimum_request_length: 100.0
th_arrived_distance: 1.0
th_stopped_velocity: 0.01
th_stopped_time: 2.0 # It must be greater than the state_machine's.
@@ -36,6 +35,7 @@
# pull over
pull_over:
+ minimum_request_length: 100.0
pull_over_velocity: 3.0
pull_over_minimum_velocity: 1.38
decide_path_distance: 10.0
diff --git a/planning/behavior_path_planner/config/scene_module_manager.param.yaml b/planning/behavior_path_planner/config/scene_module_manager.param.yaml
index e89c5539a0965..9895d9b5e473f 100644
--- a/planning/behavior_path_planner/config/scene_module_manager.param.yaml
+++ b/planning/behavior_path_planner/config/scene_module_manager.param.yaml
@@ -8,6 +8,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: false
enable_simultaneous_execution_as_candidate_module: true
+ keep_last: false
priority: 6
max_module_size: 1
@@ -16,6 +17,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: false
enable_simultaneous_execution_as_candidate_module: true
+ keep_last: false
priority: 6
max_module_size: 1
@@ -24,6 +26,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: true
enable_simultaneous_execution_as_candidate_module: true
+ keep_last: false
priority: 5
max_module_size: 1
@@ -32,6 +35,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: true
enable_simultaneous_execution_as_candidate_module: true
+ keep_last: false
priority: 5
max_module_size: 1
@@ -40,6 +44,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: false
enable_simultaneous_execution_as_candidate_module: false
+ keep_last: false
priority: 0
max_module_size: 1
@@ -48,6 +53,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: false
enable_simultaneous_execution_as_candidate_module: false
+ keep_last: false
priority: 2
max_module_size: 1
@@ -56,6 +62,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: false
enable_simultaneous_execution_as_candidate_module: false
+ keep_last: true
priority: 1
max_module_size: 1
@@ -64,6 +71,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: true
enable_simultaneous_execution_as_candidate_module: false
+ keep_last: false
priority: 4
max_module_size: 1
@@ -72,6 +80,7 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: false
enable_simultaneous_execution_as_candidate_module: false
+ keep_last: false
priority: 3
max_module_size: 1
@@ -80,5 +89,6 @@
enable_rtc: true
enable_simultaneous_execution_as_approved_module: true
enable_simultaneous_execution_as_candidate_module: true
+ keep_last: false
priority: 7
max_module_size: 1
diff --git a/planning/behavior_path_planner/docs/behavior_path_planner_goal_planner_design.md b/planning/behavior_path_planner/docs/behavior_path_planner_goal_planner_design.md
index 99dadc959f5a5..e026a083eb277 100644
--- a/planning/behavior_path_planner/docs/behavior_path_planner_goal_planner_design.md
+++ b/planning/behavior_path_planner/docs/behavior_path_planner_goal_planner_design.md
@@ -86,8 +86,8 @@ Either one is activated when all conditions are met.
### fixed_goal_planner
-- The distance between the goal and ego-vehicle is shorter than `minimum_request_length`.
- Route is set with `allow_goal_modification=false` by default.
+- ego-vehicle is in the same lane as the goal.
@@ -95,7 +95,7 @@ Either one is activated when all conditions are met.
#### pull over on road lane
-- The distance between the goal and ego-vehicle is shorter than `minimum_request_length`.
+- The distance between the goal and ego-vehicle is shorter than `pull_over_minimum_request_length`.
- Route is set with `allow_goal_modification=true` .
- We can set this option with [SetRoute](https://github.com/autowarefoundation/autoware_adapi_msgs/blob/main/autoware_adapi_v1_msgs/routing/srv/SetRoute.srv#L2) api service.
- We support `2D Rough Goal Pose` with the key bind `r` in RViz, but in the future there will be a panel of tools to manipulate various Route API from RViz.
@@ -105,7 +105,7 @@ Either one is activated when all conditions are met.
#### pull over on shoulder lane
-- The distance between the goal and ego-vehicle is shorter than `minimum_request_length`.
+- The distance between the goal and ego-vehicle is shorter than `pull_over_minimum_request_length`.
- Goal is set in the `road_shoulder`.
@@ -118,17 +118,11 @@ Either one is activated when all conditions are met.
## General parameters for goal_planner
-| Name | Unit | Type | Description | Default value |
-| :------------------------- | :----- | :----- | :-------------------------------------------------------------------------------------------------------------------------------------- | :------------ |
-| minimum_request_length | [m] | double | when the ego-vehicle approaches the goal by this distance or a safe distance to stop, the module is activated. | 100.0 |
-| th_arrived_distance | [m] | double | distance threshold for arrival of path termination | 1.0 |
-| th_stopped_velocity | [m/s] | double | velocity threshold for arrival of path termination | 0.01 |
-| th_stopped_time | [s] | double | time threshold for arrival of path termination | 2.0 |
-| pull_over_velocity | [m/s] | double | decelerate to this speed by the goal search area | 3.0 |
-| pull_over_minimum_velocity | [m/s] | double | speed of pull_over after stopping once. this prevents excessive acceleration. | 1.38 |
-| margin_from_boundary | [m] | double | distance margin from edge of the shoulder lane | 0.5 |
-| decide_path_distance | [m] | double | decide path if it approaches this distance relative to the parking position. after that, no path planning and goal search are performed | 10.0 |
-| maximum_deceleration | [m/s2] | double | maximum deceleration. it prevents sudden deceleration when a parking path cannot be found suddenly | 1.0 |
+| Name | Unit | Type | Description | Default value |
+| :------------------ | :---- | :----- | :------------------------------------------------- | :------------ |
+| th_arrived_distance | [m] | double | distance threshold for arrival of path termination | 1.0 |
+| th_stopped_velocity | [m/s] | double | velocity threshold for arrival of path termination | 0.01 |
+| th_stopped_time | [s] | double | time threshold for arrival of path termination | 2.0 |
## **collision check**
@@ -174,12 +168,21 @@ searched for in certain range of the shoulder lane.
| longitudinal_margin | [m] | double | margin between ego-vehicle at the goal position and obstacles | 3.0 |
| max_lateral_offset | [m] | double | maximum offset of goal search in the lateral direction | 0.5 |
| lateral_offset_interval | [m] | double | distance interval of goal search in the lateral direction | 0.25 |
-| ignore_distance_from_lane_start | [m] | double | distance from start of pull over lanes for ignoring goal candidates | 15.0 |
+| ignore_distance_from_lane_start | [m] | double | distance from start of pull over lanes for ignoring goal candidates | 0.0 |
+| margin_from_boundary | [m] | double | distance margin from edge of the shoulder lane | 0.5 |
-## **Path Generation**
+## **Pull Over**
There are three path generation methods.
-The path is generated with a certain margin (default: `0.5 m`) from left boundary of shoulder lane.
+The path is generated with a certain margin (default: `0.5 m`) from the boundary of shoulder lane.
+
+| Name | Unit | Type | Description | Default value |
+| :------------------------------- | :----- | :----- | :-------------------------------------------------------------------------------------------------------------------------------------- | :------------ |
+| pull_over_minimum_request_length | [m] | double | when the ego-vehicle approaches the goal by this distance or a safe distance to stop, pull over is activated. | 100.0 |
+| pull_over_velocity | [m/s] | double | decelerate to this speed by the goal search area | 3.0 |
+| pull_over_minimum_velocity | [m/s] | double | speed of pull_over after stopping once. this prevents excessive acceleration. | 1.38 |
+| decide_path_distance | [m] | double | decide path if it approaches this distance relative to the parking position. after that, no path planning and goal search are performed | 10.0 |
+| maximum_deceleration | [m/s2] | double | maximum deceleration. it prevents sudden deceleration when a parking path cannot be found suddenly | 1.0 |
### **shift parking**
diff --git a/planning/behavior_path_planner/include/behavior_path_planner/parameters.hpp b/planning/behavior_path_planner/include/behavior_path_planner/parameters.hpp
index d6b99dca70618..e3a3784c5e928 100644
--- a/planning/behavior_path_planner/include/behavior_path_planner/parameters.hpp
+++ b/planning/behavior_path_planner/include/behavior_path_planner/parameters.hpp
@@ -28,6 +28,7 @@ struct ModuleConfigParameters
bool enable_rtc{false};
bool enable_simultaneous_execution_as_approved_module{false};
bool enable_simultaneous_execution_as_candidate_module{false};
+ bool keep_last{false};
uint8_t priority{0};
uint8_t max_module_size{0};
};
diff --git a/planning/behavior_path_planner/include/behavior_path_planner/scene_module/goal_planner/manager.hpp b/planning/behavior_path_planner/include/behavior_path_planner/scene_module/goal_planner/manager.hpp
index c410999b2aaa9..47ad47aecb9b3 100644
--- a/planning/behavior_path_planner/include/behavior_path_planner/scene_module/goal_planner/manager.hpp
+++ b/planning/behavior_path_planner/include/behavior_path_planner/scene_module/goal_planner/manager.hpp
@@ -40,6 +40,8 @@ class GoalPlannerModuleManager : public SceneModuleManagerInterface
void updateModuleParams(const std::vector & parameters) override;
+ bool isAlwaysExecutableModule() const override;
+
bool isSimultaneousExecutableAsApprovedModule() const override;
bool isSimultaneousExecutableAsCandidateModule() const override;
diff --git a/planning/behavior_path_planner/include/behavior_path_planner/scene_module/scene_module_manager_interface.hpp b/planning/behavior_path_planner/include/behavior_path_planner/scene_module/scene_module_manager_interface.hpp
index cb47c33b6901c..38101416a80b3 100644
--- a/planning/behavior_path_planner/include/behavior_path_planner/scene_module/scene_module_manager_interface.hpp
+++ b/planning/behavior_path_planner/include/behavior_path_planner/scene_module/scene_module_manager_interface.hpp
@@ -55,6 +55,7 @@ class SceneModuleManagerInterface
enable_simultaneous_execution_as_candidate_module_(
config.enable_simultaneous_execution_as_candidate_module),
enable_rtc_(config.enable_rtc),
+ keep_last_(config.keep_last),
max_module_num_(config.max_module_size),
priority_(config.priority)
{
@@ -214,16 +215,37 @@ class SceneModuleManagerInterface
bool canLaunchNewModule() const { return observers_.size() < max_module_num_; }
+ /**
+ * Determine if the module is always executable, regardless of the state of other modules.
+ *
+ * When this returns true:
+ * - The module can be executed even if other modules are not marked as 'simultaneously
+ * executable'.
+ * - Conversely, the presence of this module will not prevent other modules
+ * from executing, even if they are not marked as 'simultaneously executable'.
+ */
+ virtual bool isAlwaysExecutableModule() const { return false; }
+
virtual bool isSimultaneousExecutableAsApprovedModule() const
{
+ if (isAlwaysExecutableModule()) {
+ return true;
+ }
+
return enable_simultaneous_execution_as_approved_module_;
}
virtual bool isSimultaneousExecutableAsCandidateModule() const
{
+ if (isAlwaysExecutableModule()) {
+ return true;
+ }
+
return enable_simultaneous_execution_as_candidate_module_;
}
+ bool isKeepLast() const { return keep_last_; }
+
void setData(const std::shared_ptr & planner_data) { planner_data_ = planner_data; }
void reset()
@@ -290,6 +312,8 @@ class SceneModuleManagerInterface
private:
bool enable_rtc_;
+ bool keep_last_;
+
size_t max_module_num_;
size_t priority_;
diff --git a/planning/behavior_path_planner/include/behavior_path_planner/utils/goal_planner/goal_planner_parameters.hpp b/planning/behavior_path_planner/include/behavior_path_planner/utils/goal_planner/goal_planner_parameters.hpp
index f87944641f59b..79d3a0c6e9401 100644
--- a/planning/behavior_path_planner/include/behavior_path_planner/utils/goal_planner/goal_planner_parameters.hpp
+++ b/planning/behavior_path_planner/include/behavior_path_planner/utils/goal_planner/goal_planner_parameters.hpp
@@ -40,7 +40,6 @@ enum class ParkingPolicy {
struct GoalPlannerParameters
{
// general params
- double minimum_request_length;
double th_arrived_distance;
double th_stopped_velocity;
double th_stopped_time;
@@ -71,6 +70,7 @@ struct GoalPlannerParameters
double object_recognition_collision_check_max_extra_stopping_margin;
// pull over general params
+ double pull_over_minimum_request_length;
double pull_over_velocity;
double pull_over_minimum_velocity;
double decide_path_distance;
diff --git a/planning/behavior_path_planner/src/behavior_path_planner_node.cpp b/planning/behavior_path_planner/src/behavior_path_planner_node.cpp
index 3023357bd0a96..f86b2ff2c9c61 100644
--- a/planning/behavior_path_planner/src/behavior_path_planner_node.cpp
+++ b/planning/behavior_path_planner/src/behavior_path_planner_node.cpp
@@ -284,6 +284,7 @@ BehaviorPathPlannerParameters BehaviorPathPlannerNode::getCommonParam()
declare_parameter(ns + "enable_simultaneous_execution_as_approved_module");
config.enable_simultaneous_execution_as_candidate_module =
declare_parameter(ns + "enable_simultaneous_execution_as_candidate_module");
+ config.keep_last = declare_parameter(ns + "keep_last");
config.priority = declare_parameter(ns + "priority");
config.max_module_size = declare_parameter(ns + "max_module_size");
return config;
diff --git a/planning/behavior_path_planner/src/planner_manager.cpp b/planning/behavior_path_planner/src/planner_manager.cpp
index c09df4151ca35..896495197f612 100644
--- a/planning/behavior_path_planner/src/planner_manager.cpp
+++ b/planning/behavior_path_planner/src/planner_manager.cpp
@@ -194,22 +194,6 @@ std::vector PlannerManager::getRequestModules(
std::vector request_modules{};
- /**
- * check whether it is possible to push back more modules to approved modules.
- */
- {
- const auto find_block_module = [this](const auto & m) {
- return !getManager(m)->isSimultaneousExecutableAsApprovedModule();
- };
-
- const auto itr =
- std::find_if(approved_module_ptrs_.begin(), approved_module_ptrs_.end(), find_block_module);
-
- if (itr != approved_module_ptrs_.end()) {
- return {};
- }
- }
-
const auto toc = [this](const auto & name) {
processing_time_.at(name) += stop_watch_.toc(name, true);
};
@@ -218,14 +202,62 @@ std::vector PlannerManager::getRequestModules(
stop_watch_.tic(manager_ptr->name());
/**
- * don't launch candidate module if approved modules already exist.
+ * determine the execution capability of modules based on existing approved modules.
*/
- if (!approved_module_ptrs_.empty()) {
- if (!manager_ptr->isSimultaneousExecutableAsApprovedModule()) {
- toc(manager_ptr->name());
+ // Condition 1: always executable module can be added regardless of the existence of other
+ // modules, so skip checking the existence of other modules.
+ // in other cases, need to check the existence of other modules and which module can be added.
+ const bool has_non_always_executable_module = std::any_of(
+ approved_module_ptrs_.begin(), approved_module_ptrs_.end(),
+ [this](const auto & m) { return !getManager(m)->isAlwaysExecutableModule(); });
+ if (!manager_ptr->isAlwaysExecutableModule() && has_non_always_executable_module) {
+ // pairs of find_block_module and is_executable
+ std::vector, std::function>>
+ conditions;
+
+ // Condition 2: do not add modules that are neither always nor simultaneous executable
+ // if there exists at least one approved module that is simultaneous but not always
+ // executable. (only modules that are either always executable or simultaneous executable can
+ // be added)
+ conditions.push_back(
+ {[&](const SceneModulePtr & m) {
+ return !getManager(m)->isAlwaysExecutableModule() &&
+ getManager(m)->isSimultaneousExecutableAsApprovedModule();
+ },
+ [&]() { return manager_ptr->isSimultaneousExecutableAsApprovedModule(); }});
+
+ // Condition 3: do not add modules that are not always executable if there exists
+ // at least one approved module that is neither always nor simultaneous executable.
+ // (only modules that are always executable can be added)
+ conditions.push_back(
+ {[&](const SceneModulePtr & m) {
+ return !getManager(m)->isAlwaysExecutableModule() &&
+ !getManager(m)->isSimultaneousExecutableAsApprovedModule();
+ },
+ [&]() { return false; }});
+
+ bool skip_module = false;
+ for (const auto & condition : conditions) {
+ const auto & find_block_module = condition.first;
+ const auto & is_executable = condition.second;
+
+ const auto itr = std::find_if(
+ approved_module_ptrs_.begin(), approved_module_ptrs_.end(), find_block_module);
+
+ if (itr != approved_module_ptrs_.end() && !is_executable()) {
+ toc(manager_ptr->name());
+ skip_module = true;
+ continue;
+ }
+ }
+ if (skip_module) {
continue;
}
}
+ // else{
+ // Condition 4: if none of the above conditions are met, any module can be added.
+ // (when the approved modules are either empty or consist only of always executable modules.)
+ // }
/**
* launch new candidate module.
@@ -347,20 +379,58 @@ std::pair PlannerManager::runRequestModule
* remove non-executable modules.
*/
for (const auto & module_ptr : sorted_request_modules) {
- if (!getManager(module_ptr)->isSimultaneousExecutableAsCandidateModule()) {
- if (executable_modules.empty()) {
- executable_modules.push_back(module_ptr);
- break;
- }
+ // Condition 1: always executable module can be added regardless of the existence of other
+ // modules.
+ if (getManager(module_ptr)->isAlwaysExecutableModule()) {
+ executable_modules.push_back(module_ptr);
+ continue;
}
- const auto itr =
- std::find_if(executable_modules.begin(), executable_modules.end(), [this](const auto & m) {
- return !getManager(m)->isSimultaneousExecutableAsCandidateModule();
- });
-
- if (itr == executable_modules.end()) {
+ // Condition 4: If the executable modules are either empty or consist only of always executable
+ // modules, any module can be added.
+ const bool has_non_always_executable_module = std::any_of(
+ executable_modules.begin(), executable_modules.end(),
+ [this](const auto & m) { return !getManager(m)->isAlwaysExecutableModule(); });
+ if (!has_non_always_executable_module) {
executable_modules.push_back(module_ptr);
+ continue;
+ }
+
+ // pairs of find_block_module and is_executable
+ std::vector, std::function>>
+ conditions;
+
+ // Condition 3: Only modules that are always executable can be added
+ // if there exists at least one executable module that is neither always nor simultaneous
+ // executable.
+ conditions.push_back(
+ {[this](const SceneModulePtr & m) {
+ return !getManager(m)->isAlwaysExecutableModule() &&
+ !getManager(m)->isSimultaneousExecutableAsCandidateModule();
+ },
+ [&]() { return false; }});
+
+ // Condition 2: Only modules that are either always executable or simultaneous executable can be
+ // added if there exists at least one executable module that is simultaneous but not always
+ // executable.
+ conditions.push_back(
+ {[this](const SceneModulePtr & m) {
+ return !getManager(m)->isAlwaysExecutableModule() &&
+ getManager(m)->isSimultaneousExecutableAsCandidateModule();
+ },
+ [&]() { return getManager(module_ptr)->isSimultaneousExecutableAsCandidateModule(); }});
+
+ for (const auto & condition : conditions) {
+ const auto & find_block_module = condition.first;
+ const auto & is_executable = condition.second;
+
+ const auto itr =
+ std::find_if(executable_modules.begin(), executable_modules.end(), find_block_module);
+
+ if (itr != executable_modules.end() && is_executable()) {
+ executable_modules.push_back(module_ptr);
+ break;
+ }
}
}
@@ -456,11 +526,28 @@ BehaviorModuleOutput PlannerManager::runApprovedModules(const std::shared_ptrisKeepLast() && getManager(b)->isKeepLast();
+ });
+ }
+
// lock approved modules besides last one
std::for_each(approved_module_ptrs_.begin(), approved_module_ptrs_.end(), [&](const auto & m) {
m->lockOutputPath();
});
- approved_module_ptrs_.back()->unlockOutputPath();
+
+ // unlock only last approved module except keep last module.
+ {
+ const auto not_keep_last_modules = std::find_if(
+ approved_module_ptrs_.rbegin(), approved_module_ptrs_.rend(),
+ [this](const auto & m) { return !getManager(m)->isKeepLast(); });
+
+ if (not_keep_last_modules != approved_module_ptrs_.rend()) {
+ (*not_keep_last_modules)->unlockOutputPath();
+ }
+ }
/**
* execute all approved modules.
@@ -478,21 +565,31 @@ BehaviorModuleOutput PlannerManager::runApprovedModules(const std::shared_ptrisWaitingApproval(); };
+ const auto not_keep_last_module = std::find_if(
+ approved_module_ptrs_.rbegin(), approved_module_ptrs_.rend(),
+ [this](const auto & m) { return !getManager(m)->isKeepLast(); });
- const auto itr = std::find_if(
- approved_module_ptrs_.rbegin(), approved_module_ptrs_.rend(), waiting_approval_modules);
+ // convert reverse iterator -> iterator
+ const auto begin_itr = not_keep_last_module != approved_module_ptrs_.rend()
+ ? std::next(not_keep_last_module).base()
+ : approved_module_ptrs_.begin();
- if (itr != approved_module_ptrs_.rend()) {
- const auto is_last_module = std::distance(approved_module_ptrs_.rbegin(), itr) == 0;
- if (is_last_module) {
- clearCandidateModules();
- candidate_module_ptrs_.push_back(*itr);
+ const auto waiting_approval_modules_itr = std::find_if(
+ begin_itr, approved_module_ptrs_.end(),
+ [](const auto & m) { return m->isWaitingApproval(); });
- debug_info_.emplace_back(*itr, Action::MOVE, "Back To Waiting Approval");
+ if (waiting_approval_modules_itr != approved_module_ptrs_.end()) {
+ clearCandidateModules();
+ candidate_module_ptrs_.push_back(*waiting_approval_modules_itr);
- approved_module_ptrs_.pop_back();
- }
+ debug_info_.emplace_back(
+ *waiting_approval_modules_itr, Action::MOVE, "Back To Waiting Approval");
+
+ std::for_each(
+ waiting_approval_modules_itr, approved_module_ptrs_.end(),
+ [&results](const auto & m) { results.erase(m->name()); });
+
+ approved_module_ptrs_.erase(waiting_approval_modules_itr);
std::for_each(
manager_ptrs_.begin(), manager_ptrs_.end(), [](const auto & m) { m->updateObserver(); });
@@ -529,12 +626,15 @@ BehaviorModuleOutput PlannerManager::runApprovedModules(const std::shared_ptrname();
- const auto approved_modules_output = [&output_module_name, &results]() {
- if (results.count(output_module_name) == 0) {
- return results.at("root");
+ const auto approved_modules_output = [&results, this]() {
+ const auto itr = std::find_if(
+ approved_module_ptrs_.rbegin(), approved_module_ptrs_.rend(),
+ [&results](const auto & m) { return results.count(m->name()) != 0; });
+
+ if (itr != approved_module_ptrs_.rend()) {
+ return results.at((*itr)->name());
}
- return results.at(output_module_name);
+ return results.at("root");
}();
/**
diff --git a/planning/behavior_path_planner/src/scene_module/goal_planner/goal_planner_module.cpp b/planning/behavior_path_planner/src/scene_module/goal_planner/goal_planner_module.cpp
index faa629fc5cda1..dda350d073e80 100644
--- a/planning/behavior_path_planner/src/scene_module/goal_planner/goal_planner_module.cpp
+++ b/planning/behavior_path_planner/src/scene_module/goal_planner/goal_planner_module.cpp
@@ -302,25 +302,25 @@ bool GoalPlannerModule::isExecutionRequested() const
return false;
}
+ // if goal modification is not allowed
+ // 1) goal_pose is in current_lanes, plan path to the original fixed goal
+ // 2) goal_pose is NOT in current_lanes, do not execute goal_planner
+ if (!goal_planner_utils::isAllowedGoalModification(route_handler, left_side_parking_)) {
+ return goal_is_in_current_lanes;
+ }
+
// if goal arc coordinates can be calculated, check if goal is in request_length
const double self_to_goal_arc_length =
utils::getSignedDistance(current_pose, goal_pose, current_lanes);
const double request_length =
goal_planner_utils::isAllowedGoalModification(route_handler, left_side_parking_)
? calcModuleRequestLength()
- : parameters_->minimum_request_length;
+ : parameters_->pull_over_minimum_request_length;
if (self_to_goal_arc_length < 0.0 || self_to_goal_arc_length > request_length) {
// if current position is far from goal or behind goal, do not execute goal_planner
return false;
}
- // if goal modification is not allowed
- // 1) goal_pose is in current_lanes, plan path to the original fixed goal
- // 2) goal_pose is NOT in current_lanes, do not execute goal_planner
- if (!goal_planner_utils::isAllowedGoalModification(route_handler, left_side_parking_)) {
- return goal_is_in_current_lanes;
- }
-
// if (A) or (B) is met execute pull over
// (A) target lane is `road` and same to the current lanes
// (B) target lane is `road_shoulder` and neighboring to the current lanes
@@ -344,13 +344,13 @@ double GoalPlannerModule::calcModuleRequestLength() const
{
const auto min_stop_distance = calcFeasibleDecelDistance(0.0);
if (!min_stop_distance) {
- return parameters_->minimum_request_length;
+ return parameters_->pull_over_minimum_request_length;
}
const double minimum_request_length =
*min_stop_distance + parameters_->backward_goal_search_length + approximate_pull_over_distance_;
- return std::max(minimum_request_length, parameters_->minimum_request_length);
+ return std::max(minimum_request_length, parameters_->pull_over_minimum_request_length);
}
Pose GoalPlannerModule::calcRefinedGoal(const Pose & goal_pose) const
diff --git a/planning/behavior_path_planner/src/scene_module/goal_planner/manager.cpp b/planning/behavior_path_planner/src/scene_module/goal_planner/manager.cpp
index 7df1749a0fe82..eaac7a4912aff 100644
--- a/planning/behavior_path_planner/src/scene_module/goal_planner/manager.cpp
+++ b/planning/behavior_path_planner/src/scene_module/goal_planner/manager.cpp
@@ -35,7 +35,6 @@ GoalPlannerModuleManager::GoalPlannerModuleManager(
// general params
{
std::string ns = "goal_planner.";
- p.minimum_request_length = node->declare_parameter(ns + "minimum_request_length");
p.th_stopped_velocity = node->declare_parameter(ns + "th_stopped_velocity");
p.th_arrived_distance = node->declare_parameter(ns + "th_arrived_distance");
p.th_stopped_time = node->declare_parameter(ns + "th_stopped_time");
@@ -96,6 +95,7 @@ GoalPlannerModuleManager::GoalPlannerModuleManager(
// pull over general params
{
std::string ns = "goal_planner.pull_over.";
+ node->declare_parameter(ns + "minimum_request_length");
p.pull_over_velocity = node->declare_parameter(ns + "pull_over_velocity");
p.pull_over_minimum_velocity =
node->declare_parameter(ns + "pull_over_minimum_velocity");
@@ -259,8 +259,24 @@ void GoalPlannerModuleManager::updateModuleParams(
});
}
+bool GoalPlannerModuleManager::isAlwaysExecutableModule() const
+{
+ // enable AlwaysExecutable whenever goal modification is not allowed
+ // because only minor path refinements are made for fixed goals
+ if (!goal_planner_utils::isAllowedGoalModification(
+ planner_data_->route_handler, left_side_parking_)) {
+ return true;
+ }
+
+ return false;
+}
+
bool GoalPlannerModuleManager::isSimultaneousExecutableAsApprovedModule() const
{
+ if (isAlwaysExecutableModule()) {
+ return true;
+ }
+
// enable SimultaneousExecutable whenever goal modification is not allowed
// because only minor path refinements are made for fixed goals
if (!goal_planner_utils::isAllowedGoalModification(
@@ -273,6 +289,10 @@ bool GoalPlannerModuleManager::isSimultaneousExecutableAsApprovedModule() const
bool GoalPlannerModuleManager::isSimultaneousExecutableAsCandidateModule() const
{
+ if (isAlwaysExecutableModule()) {
+ return true;
+ }
+
// enable SimultaneousExecutable whenever goal modification is not allowed
// because only minor path refinements are made for fixed goals
if (!goal_planner_utils::isAllowedGoalModification(