typename rclcpp::service::Service<ServiceT>::SharedPtr Node::create_service( const std::string & service_name, CallbackT && callback, const rmw_qos_profile_t & qos_profile, rclcpp::callback_group::CallbackGroup::SharedPtr group) { rclcpp::service::AnyServiceCallback<ServiceT> any_service_callback; any_service_callback.set(std::forward<CallbackT>(callback)); rcl_service_options_t service_options = rcl_service_get_default_options(); service_options.qos = qos_profile; auto serv = service::Service<ServiceT>::make_shared( node_handle_, service_name, any_service_callback, service_options); auto serv_base_ptr = std::dynamic_pointer_cast<service::ServiceBase>(serv); if (group) { if (!group_in_node(group)) { // TODO(jacquelinekay): use custom exception throw std::runtime_error("Cannot create service, group not in node."); } group->add_service(serv_base_ptr); } else { default_callback_group_->add_service(serv_base_ptr); } number_of_services_++; if (rcl_trigger_guard_condition(¬ify_guard_condition_) != RCL_RET_OK) { throw std::runtime_error( std::string( "Failed to notify waitset on service creation: ") + rmw_get_error_string()); } return serv; }
void NodeServices::add_service( rclcpp::service::ServiceBase::SharedPtr service_base_ptr, rclcpp::callback_group::CallbackGroup::SharedPtr group) { if (group) { if (!node_base_->callback_group_in_node(group)) { // TODO(jacquelinekay): use custom exception throw std::runtime_error("Cannot create service, group not in node."); } group->add_service(service_base_ptr); } else { node_base_->get_default_callback_group()->add_service(service_base_ptr); } // Notify the executor that a new service was created using the parent Node. { auto notify_guard_condition_lock = node_base_->acquire_notify_guard_condition_lock(); if (rcl_trigger_guard_condition(node_base_->get_notify_guard_condition()) != RCL_RET_OK) { throw std::runtime_error( std::string("Failed to notify waitset on service creation: ") + rmw_get_error_string() ); } } }
typename rclcpp::service::Service<ServiceT>::SharedPtr Node::create_service( const std::string & service_name, CallbackT && callback, const rmw_qos_profile_t & qos_profile, rclcpp::callback_group::CallbackGroup::SharedPtr group) { using rosidl_generator_cpp::get_service_type_support_handle; auto service_type_support_handle = get_service_type_support_handle<ServiceT>(); rclcpp::service::AnyServiceCallback<ServiceT> any_service_callback; any_service_callback.set(std::forward<CallbackT>(callback)); rmw_service_t * service_handle = rmw_create_service( node_handle_.get(), service_type_support_handle, service_name.c_str(), &qos_profile); if (!service_handle) { // *INDENT-OFF* (prevent uncrustify from making unecessary indents here) throw std::runtime_error( std::string("could not create service: ") + rmw_get_error_string_safe()); // *INDENT-ON* } auto serv = service::Service<ServiceT>::make_shared( node_handle_, service_handle, service_name, any_service_callback); auto serv_base_ptr = std::dynamic_pointer_cast<service::ServiceBase>(serv); if (group) { if (!group_in_node(group)) { // TODO(jacquelinekay): use custom exception throw std::runtime_error("Cannot create service, group not in node."); } group->add_service(serv_base_ptr); } else { default_callback_group_->add_service(serv_base_ptr); } number_of_services_++; return serv; }