15 #include "nav2_util/lifecycle_service_client.hpp"
21 #include "lifecycle_msgs/srv/change_state.hpp"
22 #include "lifecycle_msgs/srv/get_state.hpp"
24 using nav2::generate_internal_node;
25 using std::chrono::milliseconds;
26 using std::make_shared;
28 using namespace std::chrono_literals;
33 LifecycleServiceClient::LifecycleServiceClient(
34 const string & lifecycle_node_name)
35 : node_(generate_internal_node(lifecycle_node_name +
"_lifecycle_client")),
36 change_state_(lifecycle_node_name +
"/change_state", node_,
38 get_state_(lifecycle_node_name +
"/get_state", node_,
43 while (!get_state_.wait_for_service(2s)) {
45 node_->get_logger(),
"Waiting for service %s...", get_state_.getServiceName().c_str());
50 bool LifecycleServiceClient::change_state(
51 const uint8_t transition,
52 const milliseconds transition_timeout,
53 const milliseconds wait_for_service_timeout)
55 if (!change_state_.wait_for_service(wait_for_service_timeout)) {
56 throw std::runtime_error(
"change_state service is not available!");
59 auto request = std::make_shared<lifecycle_msgs::srv::ChangeState::Request>();
60 request->transition.id = transition;
61 if (transition_timeout > 0ms) {
62 auto response = change_state_.invoke(request, transition_timeout);
63 return response.get();
65 auto response = std::make_shared<lifecycle_msgs::srv::ChangeState::Response>();
66 return change_state_.invoke(request, response);
70 uint8_t LifecycleServiceClient::get_state(
71 const milliseconds timeout)
73 if (!get_state_.wait_for_service(timeout)) {
74 throw std::runtime_error(
"get_state service is not available!");
77 auto request = std::make_shared<lifecycle_msgs::srv::GetState::Request>();
78 auto result = get_state_.invoke(request, timeout);
79 return result->current_state.id;