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_util::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 LifecycleServiceClient::LifecycleServiceClient(
51 const string & lifecycle_node_name,
52 rclcpp::Node::SharedPtr parent_node)
54 change_state_(lifecycle_node_name +
"/change_state", node_,
56 get_state_(lifecycle_node_name +
"/get_state", node_,
61 while (!get_state_.wait_for_service(2s)) {
63 node_->get_logger(),
"Waiting for service %s...", get_state_.getServiceName().c_str());
68 bool LifecycleServiceClient::change_state(
69 const uint8_t transition,
70 const milliseconds transition_timeout,
71 const milliseconds wait_for_service_timeout)
73 if (!change_state_.wait_for_service(wait_for_service_timeout)) {
74 throw std::runtime_error(
"change_state service is not available!");
77 auto request = std::make_shared<lifecycle_msgs::srv::ChangeState::Request>();
78 request->transition.id = transition;
79 if (transition_timeout > 0ms) {
80 auto response = change_state_.invoke(request, transition_timeout);
81 return response.get();
83 auto response = std::make_shared<lifecycle_msgs::srv::ChangeState::Response>();
84 return change_state_.invoke(request, response);
88 uint8_t LifecycleServiceClient::get_state(
89 const milliseconds timeout)
91 if (!get_state_.wait_for_service(timeout)) {
92 throw std::runtime_error(
"get_state service is not available!");
95 auto request = std::make_shared<lifecycle_msgs::srv::GetState::Request>();
96 auto result = get_state_.invoke(request, timeout);
97 return result->current_state.id;