@@ -45,6 +45,16 @@ RouteState::_state_type RouteInterface::get_state() const
45
45
return state_.state ;
46
46
}
47
47
48
+ std::optional<LaneletRoute> RouteInterface::get_route () const
49
+ {
50
+ return route_;
51
+ }
52
+
53
+ void RouteInterface::change_route ()
54
+ {
55
+ route_ = std::nullopt;
56
+ }
57
+
48
58
void RouteInterface::change_state (RouteState::_state_type state)
49
59
{
50
60
state_.stamp = clock_->now ();
@@ -136,8 +146,9 @@ void RouteSelector::on_route(const LaneletRoute::ConstSharedPtr msg)
136
146
void RouteSelector::on_clear_route_main (
137
147
ClearRoute::Request::SharedPtr req, ClearRoute::Response::SharedPtr res)
138
148
{
139
- // Save the request to resume from MRM.
149
+ // Save the request and clear old route to resume from MRM.
140
150
main_request_ = std::monostate{};
151
+ main_.change_route ();
141
152
142
153
// During MRM, only change the state.
143
154
if (mrm_operating_) {
@@ -153,9 +164,10 @@ void RouteSelector::on_clear_route_main(
153
164
void RouteSelector::on_set_waypoint_route_main (
154
165
SetWaypointRoute::Request::SharedPtr req, SetWaypointRoute::Response::SharedPtr res)
155
166
{
156
- // Save the request to resume from MRM.
167
+ // Save the request and clear old route to resume from MRM.
157
168
req->uuid = uuid::generate_if_empty (req->uuid );
158
169
main_request_ = req;
170
+ main_.change_route ();
159
171
160
172
// During MRM, only change the state.
161
173
if (mrm_operating_) {
@@ -171,9 +183,10 @@ void RouteSelector::on_set_waypoint_route_main(
171
183
void RouteSelector::on_set_lanelet_route_main (
172
184
SetLaneletRoute::Request::SharedPtr req, SetLaneletRoute::Response::SharedPtr res)
173
185
{
174
- // Save the request to resume from MRM.
186
+ // Save the request and clear old route to resume from MRM.
175
187
req->uuid = uuid::generate_if_empty (req->uuid );
176
188
main_request_ = req;
189
+ main_.change_route ();
177
190
178
191
// During MRM, only change the state.
179
192
if (mrm_operating_) {
@@ -227,7 +240,18 @@ void RouteSelector::on_set_lanelet_route_mrm(
227
240
228
241
ResponseStatus RouteSelector::resume_main_route (ClearRoute::Request::SharedPtr req)
229
242
{
230
- const auto create_resume_request = [](const auto request) {
243
+ const auto create_lanelet_request = [](const LaneletRoute & route) {
244
+ // NOTE: The start_pose.is not included in the request.
245
+ const auto r = std::make_shared<SetLaneletRoute::Request>();
246
+ r->header = route.header ;
247
+ r->goal_pose = route.goal_pose ;
248
+ r->segments = route.segments ;
249
+ r->uuid = route.uuid ;
250
+ r->allow_modification = route.allow_modification ;
251
+ return r;
252
+ };
253
+
254
+ const auto create_goal_request = [](const auto & request) {
231
255
const auto r = std::make_shared<SetWaypointRoute::Request>();
232
256
r->header = request->header ;
233
257
r->goal_pose = request->goal_pose ;
@@ -236,18 +260,27 @@ ResponseStatus RouteSelector::resume_main_route(ClearRoute::Request::SharedPtr r
236
260
return r;
237
261
};
238
262
239
- // Resume main route using the saved request.
263
+ // Clear the route if there is no request for the main route .
240
264
if (std::holds_alternative<std::monostate>(main_request_)) {
241
265
return service_utils::sync_call (cli_clear_route_, req);
242
266
}
267
+
268
+ // Attempt to resume the main route if there is a planned route.
269
+ if (const auto route = main_.get_route ()) {
270
+ const auto r = create_lanelet_request (route.value ());
271
+ const auto status = service_utils::sync_call (cli_set_lanelet_route_, r);
272
+ RCLCPP_INFO_STREAM (get_logger (), " lanelet resume: " << std::boolalpha << status.success );
273
+ if (status.success ) return status;
274
+ }
275
+
276
+ // If resuming fails, replan main route using the goal.
243
277
// NOTE: Clear the waypoints to avoid returning. Remove this once resuming is supported.
244
- if (auto request = std::get_if<WaypointRequest>(&main_request_)) {
245
- const auto r = create_resume_request (*request);
278
+ if (const auto request = std::get_if<WaypointRequest>(&main_request_)) {
279
+ const auto r = create_goal_request (*request);
246
280
return service_utils::sync_call (cli_set_waypoint_route_, r);
247
281
}
248
- // NOTE: Clear the segments to avoid returning. Remove this once resuming is supported.
249
- if (auto request = std::get_if<LaneletRequest>(&main_request_)) {
250
- const auto r = create_resume_request (*request);
282
+ if (const auto request = std::get_if<LaneletRequest>(&main_request_)) {
283
+ const auto r = create_goal_request (*request);
251
284
return service_utils::sync_call (cli_set_waypoint_route_, r);
252
285
}
253
286
throw std::logic_error (" route_selector: unknown main route request" );
0 commit comments