@@ -221,8 +221,6 @@ LaneletRoute MissionPlanner::create_route(
221
221
const std_msgs::msg::Header & header, const std::vector<geometry_msgs::msg::Pose> & waypoints,
222
222
const geometry_msgs::msg::Pose & goal_pose, const bool allow_goal_modification)
223
223
{
224
- using ResponseCode = autoware_adapi_v1_msgs::srv::SetRoute::Response;
225
-
226
224
// Use temporary pose stamped for transform.
227
225
PoseStamped pose;
228
226
pose.header = header;
@@ -239,10 +237,6 @@ LaneletRoute MissionPlanner::create_route(
239
237
240
238
// Plan route.
241
239
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
- }
246
240
route.header .stamp = header.stamp ;
247
241
route.header .frame_id = map_frame_;
248
242
route.uuid .uuid = generate_random_id ();
@@ -251,6 +245,14 @@ LaneletRoute MissionPlanner::create_route(
251
245
return route;
252
246
}
253
247
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
+
254
256
LaneletRoute MissionPlanner::create_route (const SetRoute::Service::Request::SharedPtr req)
255
257
{
256
258
const auto & header = req->header ;
@@ -342,9 +344,17 @@ void MissionPlanner::on_set_route_points(
342
344
return ;
343
345
}
344
346
347
+ change_state (RouteState::Message::CHANGING);
348
+
345
349
// Plan route.
346
350
const auto route = create_route (req);
347
351
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
+
348
358
// Update route.
349
359
change_route (route);
350
360
change_state (RouteState::Message::SET);
@@ -379,6 +389,13 @@ void MissionPlanner::on_set_mrm_route(
379
389
// Plan route.
380
390
const auto new_route = create_route (req);
381
391
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
+
382
399
// check route safety
383
400
if (checkRerouteSafety (*normal_route_, new_route)) {
384
401
// sucess to reroute
@@ -435,10 +452,15 @@ void MissionPlanner::on_clear_mrm_route(
435
452
}
436
453
437
454
// 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
+ }
442
464
443
465
// check new route safety
444
466
if (new_route.segments .empty () || !checkRerouteSafety (*mrm_route_, new_route)) {
@@ -460,8 +482,56 @@ void MissionPlanner::on_clear_mrm_route(
460
482
461
483
void MissionPlanner::on_modified_goal (const ModifiedGoal::Message::ConstSharedPtr msg)
462
484
{
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 ;
465
535
}
466
536
467
537
void MissionPlanner::on_change_route (
@@ -489,6 +559,13 @@ void MissionPlanner::on_change_route(
489
559
// Convert request to a new route.
490
560
const auto new_route = create_route (req);
491
561
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
+
492
569
// check route safety
493
570
if (checkRerouteSafety (*normal_route_, new_route)) {
494
571
// sucess to reroute
@@ -535,6 +612,13 @@ void MissionPlanner::on_change_route_points(
535
612
// Plan route.
536
613
const auto new_route = create_route (req);
537
614
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
+
538
622
// check route safety
539
623
if (checkRerouteSafety (*normal_route_, new_route)) {
540
624
// sucess to reroute
0 commit comments