@@ -170,59 +170,78 @@ void MissionPlanner::change_route(const LaneletRoute & route)
170
170
normal_route_ = std::make_shared<LaneletRoute>(route);
171
171
}
172
172
173
- LaneletRoute MissionPlanner::create_route (const SetRoute::Service::Request::SharedPtr req)
173
+ LaneletRoute MissionPlanner::create_route (
174
+ const std_msgs::msg::Header & header,
175
+ const std::vector<autoware_adapi_v1_msgs::msg::RouteSegment> & route_segments,
176
+ const geometry_msgs::msg::Pose & goal_pose, const bool allow_goal_modification)
174
177
{
175
- PoseStamped goal_pose ;
176
- goal_pose .header = req-> header ;
177
- goal_pose .pose = req-> goal ;
178
+ PoseStamped goal_pose_stamped ;
179
+ goal_pose_stamped .header = header;
180
+ goal_pose_stamped .pose = goal_pose ;
178
181
179
182
// Convert route.
180
183
LaneletRoute route;
181
184
route.start_pose = odometry_->pose .pose ;
182
- route.goal_pose = transform_pose (goal_pose ).pose ;
183
- for (const auto & segment : req-> segments ) {
185
+ route.goal_pose = transform_pose (goal_pose_stamped ).pose ;
186
+ for (const auto & segment : route_segments ) {
184
187
route.segments .push_back (convert (segment));
185
188
}
186
- route.header .stamp = req-> header .stamp ;
189
+ route.header .stamp = header.stamp ;
187
190
route.header .frame_id = map_frame_;
188
191
route.uuid .uuid = generate_random_id ();
189
- route.allow_modification = req-> option . allow_goal_modification ;
192
+ route.allow_modification = allow_goal_modification;
190
193
191
194
return route;
192
195
}
193
196
194
- LaneletRoute MissionPlanner::create_route (const SetRoutePoints::Service::Request::SharedPtr req)
197
+ LaneletRoute MissionPlanner::create_route (
198
+ const std_msgs::msg::Header & header, const std::vector<geometry_msgs::msg::Pose> & waypoints,
199
+ const geometry_msgs::msg::Pose & goal_pose, const bool allow_goal_modification)
195
200
{
196
- using ResponseCode = autoware_adapi_v1_msgs::srv::SetRoute::Response;
197
-
198
201
// Use temporary pose stamped for transform.
199
202
PoseStamped pose;
200
- pose.header = req-> header ;
203
+ pose.header = header;
201
204
202
205
// Convert route points.
203
206
PlannerPlugin::RoutePoints points;
204
207
points.push_back (odometry_->pose .pose );
205
- for (const auto & waypoint : req-> waypoints ) {
208
+ for (const auto & waypoint : waypoints) {
206
209
pose.pose = waypoint;
207
210
points.push_back (transform_pose (pose).pose );
208
211
}
209
- pose.pose = req-> goal ;
212
+ pose.pose = goal_pose ;
210
213
points.push_back (transform_pose (pose).pose );
211
214
212
215
// Plan route.
213
216
LaneletRoute route = planner_->plan (points);
214
- if (route.segments .empty ()) {
215
- throw component_interface_utils::ServiceException (
216
- ResponseCode::ERROR_PLANNER_FAILED, " The planned route is empty." );
217
- }
218
- route.header .stamp = req->header .stamp ;
217
+ route.header .stamp = header.stamp ;
219
218
route.header .frame_id = map_frame_;
220
219
route.uuid .uuid = generate_random_id ();
221
- route.allow_modification = req-> option . allow_goal_modification ;
220
+ route.allow_modification = allow_goal_modification;
222
221
223
222
return route;
224
223
}
225
224
225
+ LaneletRoute MissionPlanner::create_route (const SetRoute::Service::Request::SharedPtr req)
226
+ {
227
+ const auto & header = req->header ;
228
+ const auto & route_segments = req->segments ;
229
+ const auto & goal_pose = req->goal ;
230
+ const auto & allow_goal_modification = req->option .allow_goal_modification ;
231
+
232
+ return create_route (header, route_segments, goal_pose, allow_goal_modification);
233
+ }
234
+
235
+ LaneletRoute MissionPlanner::create_route (const SetRoutePoints::Service::Request::SharedPtr req)
236
+ {
237
+ const auto & header = req->header ;
238
+ const auto & waypoints = req->waypoints ;
239
+ const auto & goal_pose = req->goal ;
240
+ const auto & allow_goal_modification = req->option .allow_goal_modification ;
241
+
242
+ return create_route (header, waypoints, goal_pose, allow_goal_modification);
243
+ }
244
+
226
245
void MissionPlanner::change_state (RouteState::Message::_state_type state)
227
246
{
228
247
state_.stamp = now ();
@@ -249,6 +268,10 @@ void MissionPlanner::on_set_route(
249
268
throw component_interface_utils::ServiceException (
250
269
ResponseCode::ERROR_ROUTE_EXISTS, " The route is already set." );
251
270
}
271
+ if (!planner_->ready ()) {
272
+ throw component_interface_utils::ServiceException (
273
+ ResponseCode::ERROR_PLANNER_UNREADY, " The planner is not ready." );
274
+ }
252
275
if (!odometry_) {
253
276
throw component_interface_utils::ServiceException (
254
277
ResponseCode::ERROR_PLANNER_UNREADY, " The vehicle pose is not received." );
@@ -257,6 +280,12 @@ void MissionPlanner::on_set_route(
257
280
// Convert request to a new route.
258
281
const auto route = create_route (req);
259
282
283
+ // Check planned routes
284
+ if (route.segments .empty ()) {
285
+ throw component_interface_utils::ServiceException (
286
+ ResponseCode::ERROR_PLANNER_FAILED, " The planned route is empty." );
287
+ }
288
+
260
289
// Update route.
261
290
change_route (route);
262
291
change_state (RouteState::Message::SET);
@@ -287,6 +316,12 @@ void MissionPlanner::on_set_route_points(
287
316
// Plan route.
288
317
const auto route = create_route (req);
289
318
319
+ // Check planned routes
320
+ if (route.segments .empty ()) {
321
+ throw component_interface_utils::ServiceException (
322
+ ResponseCode::ERROR_PLANNER_FAILED, " The planned route is empty." );
323
+ }
324
+
290
325
// Update route.
291
326
change_route (route);
292
327
change_state (RouteState::Message::SET);
@@ -329,28 +364,45 @@ void MissionPlanner::on_change_route(
329
364
throw component_interface_utils::ServiceException (
330
365
ResponseCode::ERROR_INVALID_STATE, " The route hasn't set yet. Cannot reroute." );
331
366
}
367
+ if (!planner_->ready ()) {
368
+ throw component_interface_utils::ServiceException (
369
+ ResponseCode::ERROR_PLANNER_UNREADY, " The planner is not ready." );
370
+ }
332
371
if (!odometry_) {
333
372
throw component_interface_utils::ServiceException (
334
373
ResponseCode::ERROR_PLANNER_UNREADY, " The vehicle pose is not received." );
335
374
}
375
+ if (!normal_route_) {
376
+ throw component_interface_utils::ServiceException (
377
+ ResponseCode::ERROR_PLANNER_UNREADY, " Normal route is not set." );
378
+ }
336
379
337
380
// set to changing state
338
381
change_state (RouteState::Message::CHANGING);
339
382
340
383
// Convert request to a new route.
341
384
const auto new_route = create_route (req);
342
385
386
+ // Check planned routes
387
+ if (new_route.segments .empty ()) {
388
+ change_route (*normal_route_);
389
+ change_state (RouteState::Message::SET);
390
+ res->status .success = false ;
391
+ throw component_interface_utils::ServiceException (
392
+ ResponseCode::ERROR_PLANNER_FAILED, " The planned route is empty." );
393
+ }
394
+
343
395
// check route safety
344
396
if (checkRerouteSafety (*normal_route_, new_route)) {
345
397
// sucess to reroute
346
398
change_route (new_route);
347
- change_state (RouteState::Message::SET);
348
399
res->status .success = true ;
400
+ change_state (RouteState::Message::SET);
349
401
} else {
350
402
// failed to reroute
351
403
change_route (*normal_route_);
352
- change_state (RouteState::Message::SET);
353
404
res->status .success = false ;
405
+ change_state (RouteState::Message::SET);
354
406
throw component_interface_utils::ServiceException (
355
407
ResponseCode::ERROR_REROUTE_FAILED, " New route is not safe. Reroute failed." );
356
408
}
@@ -375,23 +427,36 @@ void MissionPlanner::on_change_route_points(
375
427
throw component_interface_utils::ServiceException (
376
428
ResponseCode::ERROR_PLANNER_UNREADY, " The vehicle pose is not received." );
377
429
}
430
+ if (!normal_route_) {
431
+ throw component_interface_utils::ServiceException (
432
+ ResponseCode::ERROR_PLANNER_UNREADY, " Normal route is not set." );
433
+ }
378
434
379
435
change_state (RouteState::Message::CHANGING);
380
436
381
437
// Plan route.
382
438
const auto new_route = create_route (req);
383
439
440
+ // Check planned routes
441
+ if (new_route.segments .empty ()) {
442
+ change_state (RouteState::Message::SET);
443
+ change_route (*normal_route_);
444
+ res->status .success = false ;
445
+ throw component_interface_utils::ServiceException (
446
+ ResponseCode::ERROR_PLANNER_FAILED, " The planned route is empty." );
447
+ }
448
+
384
449
// check route safety
385
450
if (checkRerouteSafety (*normal_route_, new_route)) {
386
451
// sucess to reroute
387
452
change_route (new_route);
388
- change_state (RouteState::Message::SET);
389
453
res->status .success = true ;
454
+ change_state (RouteState::Message::SET);
390
455
} else {
391
456
// failed to reroute
392
457
change_route (*normal_route_);
393
- change_state (RouteState::Message::SET);
394
458
res->status .success = false ;
459
+ change_state (RouteState::Message::SET);
395
460
throw component_interface_utils::ServiceException (
396
461
ResponseCode::ERROR_REROUTE_FAILED, " New route is not safe. Reroute failed." );
397
462
}
0 commit comments