From 209a31c8156d9ac312acfe1e13ef713ca02909df Mon Sep 17 00:00:00 2001 From: William Woodall Date: Wed, 4 Mar 2015 16:31:22 -0800 Subject: [PATCH] replacing ros_middleware with rmw --- rclcpp/CMakeLists.txt | 2 +- rclcpp/include/rclcpp/client.hpp | 50 +++++++++++-------- rclcpp/include/rclcpp/executor.hpp | 42 ++++++++-------- rclcpp/include/rclcpp/node_impl.hpp | 27 +++++----- rclcpp/include/rclcpp/service.hpp | 50 +++++++++++-------- rclcpp/package.xml | 2 +- .../CMakeLists.txt | 4 +- .../get_available_rmw_implementations.cmake | 4 +- .../get_default_rmw_implementation.cmake | 4 +- .../package.xml | 8 +-- .../rmw_implementation-extras.cmake | 12 +++++ ...ros_middleware_implementation-extras.cmake | 12 ----- 12 files changed, 117 insertions(+), 100 deletions(-) rename {ros_middleware_implementation => rmw_implementation}/CMakeLists.txt (60%) rename ros_middleware_implementation/cmake/get_available_ros_middleware_implementations.cmake => rmw_implementation/cmake/get_available_rmw_implementations.cmake (62%) rename ros_middleware_implementation/cmake/get_default_ros_middleware_implementation.cmake => rmw_implementation/cmake/get_default_rmw_implementation.cmake (92%) rename {ros_middleware_implementation => rmw_implementation}/package.xml (64%) create mode 100644 rmw_implementation/rmw_implementation-extras.cmake delete mode 100644 ros_middleware_implementation/ros_middleware_implementation-extras.cmake diff --git a/rclcpp/CMakeLists.txt b/rclcpp/CMakeLists.txt index 4ec6c3d..66ded28 100644 --- a/rclcpp/CMakeLists.txt +++ b/rclcpp/CMakeLists.txt @@ -4,7 +4,7 @@ project(rclcpp) find_package(ament_cmake REQUIRED) -ament_export_dependencies(ros_middleware_interface) +ament_export_dependencies(rmw) ament_export_include_directories(include) diff --git a/rclcpp/include/rclcpp/client.hpp b/rclcpp/include/rclcpp/client.hpp index fa702bb..7507b01 100644 --- a/rclcpp/include/rclcpp/client.hpp +++ b/rclcpp/include/rclcpp/client.hpp @@ -16,22 +16,21 @@ #ifndef RCLCPP_RCLCPP_CLIENT_HPP_ #define RCLCPP_RCLCPP_CLIENT_HPP_ -#include - -#include -#include - -#include -#include #include #include +#include #include +#include + +#include +#include + namespace rclcpp { // Forward declaration for friend statement -namespace node {class Node;} +namespace executor {class Executor;} namespace client { @@ -42,18 +41,26 @@ class ClientBase public: RCLCPP_MAKE_SHARED_DEFINITIONS(ClientBase); - ClientBase( - ros_middleware_interface::ClientHandle client_handle, - std::string &service_name) - : client_handle_(client_handle), service_name_(service_name) + ClientBase(rmw_client_t * client_handle, + const std::string &service_name) + : client_handle_(client_handle), service_name_(service_name) {} + ~ClientBase() + { + if (client_handle_ != nullptr) + { + rmw_destroy_client(client_handle_); + client_handle_ = nullptr; + } + } + std::string get_service_name() { return this->service_name_; } - ros_middleware_interface::ClientHandle get_client_handle() + const rmw_client_t * get_client_handle() { return this->client_handle_; } @@ -65,7 +72,7 @@ public: private: RCLCPP_DISABLE_COPY(ClientBase); - ros_middleware_interface::ClientHandle client_handle_; + rmw_client_t * client_handle_; std::string service_name_; }; @@ -82,9 +89,9 @@ public: RCLCPP_MAKE_SHARED_DEFINITIONS(Client); - Client(ros_middleware_interface::ClientHandle client_handle, - std::string& service_name) - : ClientBase(client_handle, service_name) + Client(rmw_client_t * client_handle, + const std::string& service_name) + : ClientBase(client_handle, service_name) {} std::shared_ptr create_response() @@ -94,12 +101,14 @@ public: std::shared_ptr create_request_header() { - return std::shared_ptr(new ros_middleware_interface::RequestId()); + // TODO(wjwwood): This should probably use rmw_request_id's allocator. + // (since it is a C type) + return std::shared_ptr(new rmw_request_id_t); } void handle_response(std::shared_ptr &response, std::shared_ptr &req_id) { - auto typed_req_id = std::static_pointer_cast(req_id); + auto typed_req_id = std::static_pointer_cast(req_id); auto typed_response = std::static_pointer_cast(response); int64_t sequence_number = typed_req_id->sequence_number; auto tuple = this->pending_requests_[sequence_number]; @@ -121,7 +130,8 @@ public: typename ServiceT::Request::Ptr &request, CallbackType cb) { - int64_t sequence_number = ::ros_middleware_interface::send_request(get_client_handle(), request.get()); + int64_t sequence_number = + rmw_send_request(get_client_handle(), request.get()); SharedPromise call_promise = std::make_shared(); SharedFuture f(call_promise->get_future()); diff --git a/rclcpp/include/rclcpp/executor.hpp b/rclcpp/include/rclcpp/executor.hpp index 132690b..90e7473 100644 --- a/rclcpp/include/rclcpp/executor.hpp +++ b/rclcpp/include/rclcpp/executor.hpp @@ -178,10 +178,9 @@ protected: { std::shared_ptr request = service->create_request(); std::shared_ptr request_header = service->create_request_header(); - bool taken = ros_middleware_interface::take_request( - service->service_handle_, - request.get(), - request_header.get()); + bool taken = rmw_take_request(service->service_handle_, + request.get(), + request_header.get()); if (taken) { service->handle_request(request, request_header); @@ -200,10 +199,9 @@ protected: { std::shared_ptr response = client->create_response(); std::shared_ptr request_header = client->create_request_header(); - bool taken = ros_middleware_interface::take_response( - client->client_handle_, - response.get(), - request_header.get()); + bool taken = rmw_take_response(client->client_handle_, + response.get(), + request_header.get()); if (taken) { client->handle_response(response, request_header); @@ -290,33 +288,33 @@ protected: // Use the number of services to allocate memory in the handles size_t number_of_services = services.size(); - ros_middleware_interface::ServiceHandles service_handles; - service_handles.service_count_ = number_of_services; - // TODO: Avoid redundant malloc's - service_handles.services_ = static_cast( + rmw_services_t service_handles; + service_handles.service_count = number_of_services; + // TODO(esteve): Avoid redundant malloc's + service_handles.services = static_cast( std::malloc(sizeof(void *) * number_of_services)); - if (service_handles.services_ == NULL) + if (service_handles.services == NULL) { - // TODO: Use a different error here? maybe std::bad_alloc? + // TODO(esteve): Use a different error here? maybe std::bad_alloc? throw std::runtime_error("Could not malloc for service pointers."); } // Then fill the ServiceHandles with ready services size_t service_handle_index = 0; for (auto &service : services) { - service_handles.services_[service_handle_index] = \ - service->service_handle_.data_; + service_handles.services[service_handle_index] = \ + service->service_handle_->data; service_handle_index += 1; } // Use the number of clients to allocate memory in the handles size_t number_of_clients = clients.size(); - ros_middleware_interface::ClientHandles client_handles; - client_handles.client_count_ = number_of_clients; + rmw_clients_t client_handles; + client_handles.client_count = number_of_clients; // TODO: Avoid redundant malloc's - client_handles.clients_ = static_cast( + client_handles.clients = static_cast( std::malloc(sizeof(void *) * number_of_clients)); - if (client_handles.clients_ == NULL) + if (client_handles.clients == NULL) { // TODO: Use a different error here? maybe std::bad_alloc? throw std::runtime_error("Could not malloc for client pointers."); @@ -325,8 +323,8 @@ protected: size_t client_handle_index = 0; for (auto &client : clients) { - client_handles.clients_[client_handle_index] = \ - client->client_handle_.data_; + client_handles.clients[client_handle_index] = \ + client->client_handle_->data; client_handle_index += 1; } diff --git a/rclcpp/include/rclcpp/node_impl.hpp b/rclcpp/include/rclcpp/node_impl.hpp index 45081f4..a3048e8 100644 --- a/rclcpp/include/rclcpp/node_impl.hpp +++ b/rclcpp/include/rclcpp/node_impl.hpp @@ -21,6 +21,7 @@ #include #include +#include #include @@ -166,13 +167,13 @@ Node::create_client( std::string service_name, rclcpp::callback_group::CallbackGroup::SharedPtr group) { - namespace rmi = ::ros_middleware_interface; + using rosidl_generator_cpp::get_service_type_support_handle; + auto service_type_support_handle = + get_service_type_support_handle(); - auto &service_type_support_handle = rmi::get_service_type_support_handle(); - - auto client_handle = rmi::create_client(this->node_handle_, - service_type_support_handle, - service_name.c_str()); + auto client_handle = rmw_create_client(this->node_handle_, + service_type_support_handle, + service_name.c_str()); using namespace rclcpp::client; @@ -184,7 +185,7 @@ Node::create_client( { if (!group_in_node(group)) { - // TODO: use custom exception + // TODO(esteve): use custom exception throw std::runtime_error("Cannot create client, group not in node."); } group->add_client(cli_base_ptr); @@ -206,13 +207,13 @@ Node::create_service( std::shared_ptr&)> callback, rclcpp::callback_group::CallbackGroup::SharedPtr group) { - namespace rmi = ::ros_middleware_interface; + using rosidl_generator_cpp::get_service_type_support_handle; + auto service_type_support_handle = + get_service_type_support_handle(); - auto &service_type_support_handle = rmi::get_service_type_support_handle(); - - auto service_handle = rmi::create_service(this->node_handle_, - service_type_support_handle, - service_name.c_str()); + auto service_handle = rmw_create_service(this->node_handle_, + service_type_support_handle, + service_name.c_str()); using namespace rclcpp::service; diff --git a/rclcpp/include/rclcpp/service.hpp b/rclcpp/include/rclcpp/service.hpp index 04d644e..a279566 100644 --- a/rclcpp/include/rclcpp/service.hpp +++ b/rclcpp/include/rclcpp/service.hpp @@ -16,11 +16,11 @@ #ifndef RCLCPP_RCLCPP_SERVICE_HPP_ #define RCLCPP_RCLCPP_SERVICE_HPP_ +#include #include +#include -#include -#include -#include +#include #include @@ -29,7 +29,7 @@ namespace rclcpp { // Forward declaration for friend statement -namespace node {class Node;} +namespace executor {class Executor;} namespace service { @@ -40,18 +40,26 @@ class ServiceBase public: RCLCPP_MAKE_SHARED_DEFINITIONS(ServiceBase); - ServiceBase( - ros_middleware_interface::ServiceHandle service_handle, - std::string &service_name) - : service_handle_(service_handle), service_name_(service_name) + ServiceBase(rmw_service_t * service_handle, + const std::string service_name) + : service_handle_(service_handle), service_name_(service_name) {} + ~ServiceBase() + { + if (service_handle_ != nullptr) + { + rmw_destroy_service(service_handle_); + service_handle_ = nullptr; + } + } + std::string get_service_name() { return this->service_name_; } - ros_middleware_interface::ServiceHandle get_service_handle() + const rmw_service_t * get_service_handle() { return this->service_handle_; } @@ -63,7 +71,7 @@ public: private: RCLCPP_DISABLE_COPY(ServiceBase); - ros_middleware_interface::ServiceHandle service_handle_; + rmw_service_t * service_handle_; std::string service_name_; }; @@ -77,11 +85,10 @@ public: std::shared_ptr&)> CallbackType; RCLCPP_MAKE_SHARED_DEFINITIONS(Service); - Service( - ros_middleware_interface::ServiceHandle service_handle, - std::string &service_name, - CallbackType callback) - : ServiceBase(service_handle, service_name), callback_(callback) + Service(rmw_service_t * service_handle, + const std::string &service_name, + CallbackType callback) + : ServiceBase(service_handle, service_name), callback_(callback) {} std::shared_ptr create_request() @@ -91,23 +98,24 @@ public: std::shared_ptr create_request_header() { - return std::shared_ptr(new ros_middleware_interface::RequestId()); + // TODO(wjwwood): This should probably use rmw_request_id's allocator. + // (since it is a C type) + return std::shared_ptr(new rmw_request_id_t); } void handle_request(std::shared_ptr &request, std::shared_ptr &req_id) { auto typed_request = std::static_pointer_cast(request); - auto typed_req_id = std::static_pointer_cast(req_id); + auto typed_req_id = std::static_pointer_cast(req_id); auto response = std::shared_ptr(new typename ServiceT::Response); callback_(typed_request, response); send_response(typed_req_id, response); } - void send_response( - std::shared_ptr &req_id, - std::shared_ptr &response) + void send_response(std::shared_ptr &req_id, + std::shared_ptr &response) { - ::ros_middleware_interface::send_response(get_service_handle(), req_id.get(), response.get()); + rmw_send_response(get_service_handle(), req_id.get(), response.get()); } private: diff --git a/rclcpp/package.xml b/rclcpp/package.xml index 39bb7d8..887c418 100644 --- a/rclcpp/package.xml +++ b/rclcpp/package.xml @@ -8,5 +8,5 @@ ament_cmake - ros_middleware_interface + rmw diff --git a/ros_middleware_implementation/CMakeLists.txt b/rmw_implementation/CMakeLists.txt similarity index 60% rename from ros_middleware_implementation/CMakeLists.txt rename to rmw_implementation/CMakeLists.txt index 0cf34ea..4469842 100644 --- a/ros_middleware_implementation/CMakeLists.txt +++ b/rmw_implementation/CMakeLists.txt @@ -1,11 +1,11 @@ cmake_minimum_required(VERSION 2.8.3) -project(ros_middleware_implementation NONE) +project(rmw_implementation NONE) find_package(ament_cmake REQUIRED) ament_package( - CONFIG_EXTRAS "ros_middleware_implementation-extras.cmake" + CONFIG_EXTRAS "rmw_implementation-extras.cmake" ) install( diff --git a/ros_middleware_implementation/cmake/get_available_ros_middleware_implementations.cmake b/rmw_implementation/cmake/get_available_rmw_implementations.cmake similarity index 62% rename from ros_middleware_implementation/cmake/get_available_ros_middleware_implementations.cmake rename to rmw_implementation/cmake/get_available_rmw_implementations.cmake index 2a0ca70..71ddf63 100644 --- a/ros_middleware_implementation/cmake/get_available_ros_middleware_implementations.cmake +++ b/rmw_implementation/cmake/get_available_rmw_implementations.cmake @@ -4,7 +4,7 @@ # :param var: the output variable name containing the package names # :type var: list of strings # -function(get_available_ros_middleware_implementations var) - ament_index_get_resources(middleware_implementations "ros_middleware_implementation") +function(get_available_rmw_implementations var) + ament_index_get_resources(middleware_implementations "rmw_implementation") set(${var} ${middleware_implementations} PARENT_SCOPE) endfunction() diff --git a/ros_middleware_implementation/cmake/get_default_ros_middleware_implementation.cmake b/rmw_implementation/cmake/get_default_rmw_implementation.cmake similarity index 92% rename from ros_middleware_implementation/cmake/get_default_ros_middleware_implementation.cmake rename to rmw_implementation/cmake/get_default_rmw_implementation.cmake index 772c7e0..7391f62 100644 --- a/ros_middleware_implementation/cmake/get_default_ros_middleware_implementation.cmake +++ b/rmw_implementation/cmake/get_default_rmw_implementation.cmake @@ -7,8 +7,8 @@ # :param var: the output variable name containing the package name # :type var: string # -function(get_default_ros_middleware_implementation var) - get_available_ros_middleware_implementations(middleware_implementations) +function(get_default_rmw_implementation var) + get_available_rmw_implementations(middleware_implementations) if("${middleware_implementations} " STREQUAL " ") message(FATAL_ERROR "Could not find any ROS middleware implementation.") diff --git a/ros_middleware_implementation/package.xml b/rmw_implementation/package.xml similarity index 64% rename from ros_middleware_implementation/package.xml rename to rmw_implementation/package.xml index aaf2843..b909c62 100644 --- a/ros_middleware_implementation/package.xml +++ b/rmw_implementation/package.xml @@ -1,6 +1,6 @@ - ros_middleware_implementation + rmw_implementation 0.0.0 The decision which ROS middleware implementation should be used for C++. Dirk Thomas @@ -9,7 +9,7 @@ ament_cmake ament_cmake - ros_middleware_connext_cpp - ros_middleware_connext_xtypes_dynamic_cpp - ros_middleware_opensplice_cpp + rmw_connext_cpp + rmw_connext_xtypes_dynamic_cpp + rmw_opensplice_cpp diff --git a/rmw_implementation/rmw_implementation-extras.cmake b/rmw_implementation/rmw_implementation-extras.cmake new file mode 100644 index 0000000..5132588 --- /dev/null +++ b/rmw_implementation/rmw_implementation-extras.cmake @@ -0,0 +1,12 @@ +# copied from rmw_implementation/rmw_implementation-extras.cmake + +include("${rmw_implementation_DIR}/get_available_rmw_implementations.cmake") +include("${rmw_implementation_DIR}/get_default_rmw_implementation.cmake") + +get_default_rmw_implementation(_middleware_implementation) +find_package("${_middleware_implementation}" REQUIRED) + +# TODO should never need definitions and include dirs? +list(APPEND rmw_implementation_DEFINITIONS ${${_middleware_implementation}_DEFINITIONS}) +list(APPEND rmw_implementation_INCLUDE_DIRS ${${_middleware_implementation}_INCLUDE_DIRS}) +list(APPEND rmw_implementation_LIBRARIES ${${_middleware_implementation}_LIBRARIES}) diff --git a/ros_middleware_implementation/ros_middleware_implementation-extras.cmake b/ros_middleware_implementation/ros_middleware_implementation-extras.cmake deleted file mode 100644 index 4f57cc4..0000000 --- a/ros_middleware_implementation/ros_middleware_implementation-extras.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# copied from ros_middleware_implementation/ros_middleware_implementation-extras.cmake - -include("${ros_middleware_implementation_DIR}/get_available_ros_middleware_implementations.cmake") -include("${ros_middleware_implementation_DIR}/get_default_ros_middleware_implementation.cmake") - -get_default_ros_middleware_implementation(_middleware_implementation) -find_package("${_middleware_implementation}" REQUIRED) - -# TODO should never need definitions and include dirs? -list(APPEND ros_middleware_implementation_DEFINITIONS ${${_middleware_implementation}_DEFINITIONS}) -list(APPEND ros_middleware_implementation_INCLUDE_DIRS ${${_middleware_implementation}_INCLUDE_DIRS}) -list(APPEND ros_middleware_implementation_LIBRARIES ${${_middleware_implementation}_LIBRARIES})