void NodeServices::add_client( rclcpp::client::ClientBase::SharedPtr client_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 client, group not in node."); } group->add_client(client_base_ptr); } else { node_base_->get_default_callback_group()->add_client(client_base_ptr); } // Notify the executor that a new client 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 client creation: ") + rmw_get_error_string() ); } } }
typename client::Client<ServiceT>::SharedPtr Node::create_client( const std::string & service_name, 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>(); rmw_client_t * client_handle = rmw_create_client( this->node_handle_.get(), service_type_support_handle, service_name.c_str(), &qos_profile); if (!client_handle) { // *INDENT-OFF* (prevent uncrustify from making unecessary indents here) throw std::runtime_error( std::string("could not create client: ") + rmw_get_error_string_safe()); // *INDENT-ON* } using rclcpp::client::Client; using rclcpp::client::ClientBase; auto cli = Client<ServiceT>::make_shared( node_handle_, client_handle, service_name); auto cli_base_ptr = std::dynamic_pointer_cast<ClientBase>(cli); if (group) { if (!group_in_node(group)) { // TODO(esteve): use custom exception throw std::runtime_error("Cannot create client, group not in node."); } group->add_client(cli_base_ptr); } else { default_callback_group_->add_client(cli_base_ptr); } number_of_clients_++; return cli; }
typename client::Client<ServiceT>::SharedPtr Node::create_client( const std::string & service_name, const rmw_qos_profile_t & qos_profile, rclcpp::callback_group::CallbackGroup::SharedPtr group) { rcl_client_options_t options = rcl_client_get_default_options(); options.qos = qos_profile; using rclcpp::client::Client; using rclcpp::client::ClientBase; auto cli = Client<ServiceT>::make_shared( node_handle_, service_name, options); auto cli_base_ptr = std::dynamic_pointer_cast<ClientBase>(cli); if (group) { if (!group_in_node(group)) { // TODO(esteve): use custom exception throw std::runtime_error("Cannot create client, group not in node."); } group->add_client(cli_base_ptr); } else { default_callback_group_->add_client(cli_base_ptr); } number_of_clients_++; if (rcl_trigger_guard_condition(¬ify_guard_condition_) != RCL_RET_OK) { throw std::runtime_error( std::string( "Failed to notify waitset on client creation: ") + rmw_get_error_string()); } return cli; }