Skip to content

Commit 0669c0a

Browse files
committed
feat(mission_planner): reroute for modified goal
Signed-off-by: yutaka <purewater0901@gmail.com>
1 parent ec8961a commit 0669c0a

File tree

2 files changed

+99
-12
lines changed

2 files changed

+99
-12
lines changed

planning/mission_planner/src/mission_planner/mission_planner.cpp

+96-12
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,6 @@ LaneletRoute MissionPlanner::create_route(
221221
const std_msgs::msg::Header & header, const std::vector<geometry_msgs::msg::Pose> & waypoints,
222222
const geometry_msgs::msg::Pose & goal_pose, const bool allow_goal_modification)
223223
{
224-
using ResponseCode = autoware_adapi_v1_msgs::srv::SetRoute::Response;
225-
226224
// Use temporary pose stamped for transform.
227225
PoseStamped pose;
228226
pose.header = header;
@@ -239,10 +237,6 @@ LaneletRoute MissionPlanner::create_route(
239237

240238
// Plan route.
241239
LaneletRoute route = planner_->plan(points);
242-
if (route.segments.empty()) {
243-
throw component_interface_utils::ServiceException(
244-
ResponseCode::ERROR_PLANNER_FAILED, "The planned route is empty.");
245-
}
246240
route.header.stamp = header.stamp;
247241
route.header.frame_id = map_frame_;
248242
route.uuid.uuid = generate_random_id();
@@ -251,6 +245,14 @@ LaneletRoute MissionPlanner::create_route(
251245
return route;
252246
}
253247

248+
LaneletRoute MissionPlanner::create_route(
249+
const std_msgs::msg::Header & header, const geometry_msgs::msg::Pose & goal_pose,
250+
const bool allow_goal_modification)
251+
{
252+
const std::vector<geometry_msgs::msg::Pose> empty_waypoints;
253+
return create_route(header, empty_waypoints, goal_pose, allow_goal_modification);
254+
}
255+
254256
LaneletRoute MissionPlanner::create_route(const SetRoute::Service::Request::SharedPtr req)
255257
{
256258
const auto & header = req->header;
@@ -342,9 +344,17 @@ void MissionPlanner::on_set_route_points(
342344
return;
343345
}
344346

347+
change_state(RouteState::Message::CHANGING);
348+
345349
// Plan route.
346350
const auto route = create_route(req);
347351

352+
if (route.segments.empty()) {
353+
change_state(RouteState::Message::SET);
354+
throw component_interface_utils::ServiceException(
355+
ResponseCode::ERROR_PLANNER_FAILED, "The planned route is empty.");
356+
}
357+
348358
// Update route.
349359
change_route(route);
350360
change_state(RouteState::Message::SET);
@@ -379,6 +389,13 @@ void MissionPlanner::on_set_mrm_route(
379389
// Plan route.
380390
const auto new_route = create_route(req);
381391

392+
if (new_route.segments.empty()) {
393+
change_route(*normal_route_);
394+
change_state(RouteState::Message::SET);
395+
throw component_interface_utils::ServiceException(
396+
ResponseCode::ERROR_PLANNER_FAILED, "The planned route is empty.");
397+
}
398+
382399
// check route safety
383400
if (checkRerouteSafety(*normal_route_, new_route)) {
384401
// sucess to reroute
@@ -435,10 +452,15 @@ void MissionPlanner::on_clear_mrm_route(
435452
}
436453

437454
// reroute with normal goal
438-
const std::vector<geometry_msgs::msg::Pose> empty_waypoints;
439-
const auto new_route = create_route(
440-
odometry_->header, empty_waypoints, normal_route_->goal_pose,
441-
normal_route_->allow_modification);
455+
const auto new_route =
456+
create_route(odometry_->header, normal_route_->goal_pose, normal_route_->allow_modification);
457+
458+
if (new_route.segments.empty()) {
459+
change_route(*normal_route_);
460+
change_state(RouteState::Message::SET);
461+
throw component_interface_utils::ServiceException(
462+
ResponseCode::ERROR_PLANNER_FAILED, "The planned route is empty.");
463+
}
442464

443465
// check new route safety
444466
if (new_route.segments.empty() || !checkRerouteSafety(*mrm_route_, new_route)) {
@@ -460,8 +482,56 @@ void MissionPlanner::on_clear_mrm_route(
460482

461483
void MissionPlanner::on_modified_goal(const ModifiedGoal::Message::ConstSharedPtr msg)
462484
{
463-
// TODO(Yutaka Shimizu): reroute if the goal is outside the lane.
464-
arrival_checker_.modify_goal(*msg);
485+
using ResponseCode = autoware_adapi_v1_msgs::srv::SetRoute::Response;
486+
487+
if (state_.state != RouteState::Message::SET) {
488+
throw component_interface_utils::ServiceException(
489+
ResponseCode::ERROR_INVALID_STATE, "The route hasn't set yet. Cannot reroute.");
490+
}
491+
if (!odometry_) {
492+
throw component_interface_utils::ServiceException(
493+
ResponseCode::ERROR_PLANNER_UNREADY, "The vehicle pose is not received.");
494+
}
495+
if (!normal_route_) {
496+
throw component_interface_utils::ServiceException(
497+
ResponseCode::ERROR_PLANNER_UNREADY, "Normal route is not set.");
498+
}
499+
500+
// set to changing state
501+
change_state(RouteState::Message::CHANGING);
502+
503+
if (normal_route_->uuid == msg->uuid) {
504+
const auto new_route = create_route(msg->header, msg->pose, normal_route_->allow_modification);
505+
if (new_route.segments.empty()) {
506+
change_route(*normal_route_);
507+
change_state(RouteState::Message::SET);
508+
throw component_interface_utils::ServiceException(
509+
ResponseCode::ERROR_PLANNER_FAILED, "The planned route is empty.");
510+
}
511+
change_route(new_route);
512+
change_state(RouteState::Message::SET);
513+
arrival_checker_.modify_goal(*msg);
514+
return;
515+
}
516+
517+
if (mrm_route_ && mrm_route_->uuid == msg->uuid) {
518+
const auto new_route = create_route(msg->header, msg->pose, mrm_route_->allow_modification);
519+
if (new_route.segments.empty()) {
520+
change_mrm_route(*mrm_route_);
521+
change_state(RouteState::Message::SET);
522+
throw component_interface_utils::ServiceException(
523+
ResponseCode::ERROR_PLANNER_FAILED, "The planned route is empty.");
524+
}
525+
change_mrm_route(new_route);
526+
change_state(RouteState::Message::SET);
527+
arrival_checker_.modify_goal(*msg);
528+
return;
529+
}
530+
531+
change_state(RouteState::Message::SET);
532+
throw component_interface_utils::ServiceException(
533+
ResponseCode::ERROR_REROUTE_FAILED, "UUID is incorrect.");
534+
return;
465535
}
466536

467537
void MissionPlanner::on_change_route(
@@ -489,6 +559,13 @@ void MissionPlanner::on_change_route(
489559
// Convert request to a new route.
490560
const auto new_route = create_route(req);
491561

562+
if (new_route.segments.empty()) {
563+
change_route(*normal_route_);
564+
change_state(RouteState::Message::SET);
565+
throw component_interface_utils::ServiceException(
566+
ResponseCode::ERROR_PLANNER_FAILED, "The planned route is empty.");
567+
}
568+
492569
// check route safety
493570
if (checkRerouteSafety(*normal_route_, new_route)) {
494571
// sucess to reroute
@@ -535,6 +612,13 @@ void MissionPlanner::on_change_route_points(
535612
// Plan route.
536613
const auto new_route = create_route(req);
537614

615+
if (new_route.segments.empty()) {
616+
change_route(*normal_route_);
617+
change_state(RouteState::Message::SET);
618+
throw component_interface_utils::ServiceException(
619+
ResponseCode::ERROR_PLANNER_FAILED, "The planned route is empty.");
620+
}
621+
538622
// check route safety
539623
if (checkRerouteSafety(*normal_route_, new_route)) {
540624
// sucess to reroute

planning/mission_planner/src/mission_planner/mission_planner.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ class MissionPlanner : public rclcpp::Node
8787
LaneletRoute create_route(
8888
const std_msgs::msg::Header & header, const std::vector<geometry_msgs::msg::Pose> & waypoints,
8989
const geometry_msgs::msg::Pose & goal_pose, const bool allow_goal_modification);
90+
LaneletRoute create_route(
91+
const std_msgs::msg::Header & header, const geometry_msgs::msg::Pose & goal_pose,
92+
const bool allow_goal_modification);
9093

9194
RouteState::Message state_;
9295
component_interface_utils::Publisher<RouteState>::SharedPtr pub_state_;

0 commit comments

Comments
 (0)