From 6b80573477b748d3cc71d81d664c30d5fc51b0e6 Mon Sep 17 00:00:00 2001 From: Paul Bovbel Date: Wed, 23 Jan 2019 15:44:15 -0500 Subject: [PATCH] Allow external use of ros1_bridge library factories --- CMakeLists.txt | 1 + include/ros1_bridge/bridge.hpp | 47 +++-------------- src/bridge.cpp | 93 ++++++++++++++++++++++++++++++++++ src/dynamic_bridge.cpp | 6 --- 4 files changed, 100 insertions(+), 47 deletions(-) create mode 100755 src/bridge.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d4a51df5..71230b06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -135,6 +135,7 @@ custom_executable(simple_bridge "src/simple_bridge.cpp" add_library(${PROJECT_NAME} SHARED "src/builtin_interfaces_factories.cpp" "src/convert_builtin_interfaces.cpp" + "src/bridge.cpp" ${generated_files}) ament_target_dependencies(${PROJECT_NAME} ${prefixed_ros1_message_packages} diff --git a/include/ros1_bridge/bridge.hpp b/include/ros1_bridge/bridge.hpp index 21f4bdd4..2be59484 100755 --- a/include/ros1_bridge/bridge.hpp +++ b/include/ros1_bridge/bridge.hpp @@ -69,6 +69,9 @@ get_factory( const std::string & ros1_type_name, const std::string & ros2_type_name); +std::unique_ptr +get_service_factory(const std::string &, const std::string &, const std::string &); + Bridge1to2Handles create_bridge_from_1_to_2( ros::NodeHandle ros1_node, @@ -78,20 +81,7 @@ create_bridge_from_1_to_2( size_t subscriber_queue_size, const std::string & ros2_type_name, const std::string & ros2_topic_name, - size_t publisher_queue_size) -{ - auto factory = get_factory(ros1_type_name, ros2_type_name); - auto ros2_pub = factory->create_ros2_publisher( - ros2_node, ros2_topic_name, publisher_queue_size); - - auto ros1_sub = factory->create_ros1_subscriber( - ros1_node, ros1_topic_name, subscriber_queue_size, ros2_pub); - - Bridge1to2Handles handles; - handles.ros1_subscriber = ros1_sub; - handles.ros2_publisher = ros2_pub; - return handles; -} + size_t publisher_queue_size); Bridge2to1Handles create_bridge_from_2_to_1( @@ -103,20 +93,7 @@ create_bridge_from_2_to_1( const std::string & ros1_type_name, const std::string & ros1_topic_name, size_t publisher_queue_size, - rclcpp::PublisherBase::SharedPtr ros2_pub = nullptr) -{ - auto factory = get_factory(ros1_type_name, ros2_type_name); - auto ros1_pub = factory->create_ros1_publisher( - ros1_node, ros1_topic_name, publisher_queue_size); - - auto ros2_sub = factory->create_ros2_subscriber( - ros2_node, ros2_topic_name, subscriber_queue_size, ros1_pub, ros2_pub); - - Bridge2to1Handles handles; - handles.ros2_subscriber = ros2_sub; - handles.ros1_publisher = ros1_pub; - return handles; -} + rclcpp::PublisherBase::SharedPtr ros2_pub = nullptr); BridgeHandles create_bidirectional_bridge( @@ -125,19 +102,7 @@ create_bidirectional_bridge( const std::string & ros1_type_name, const std::string & ros2_type_name, const std::string & topic_name, - size_t queue_size = 10) -{ - printf("create bidirectional bridge for topic [%s]\n", topic_name.c_str()); - BridgeHandles handles; - handles.bridge1to2 = create_bridge_from_1_to_2( - ros1_node, ros2_node, - ros1_type_name, topic_name, queue_size, ros2_type_name, topic_name, queue_size); - handles.bridge2to1 = create_bridge_from_2_to_1( - ros2_node, ros1_node, - ros2_type_name, topic_name, queue_size, ros1_type_name, topic_name, queue_size, - handles.bridge1to2.ros2_publisher); - return handles; -} + size_t queue_size = 10); } // namespace ros1_bridge diff --git a/src/bridge.cpp b/src/bridge.cpp new file mode 100755 index 00000000..25eb74f3 --- /dev/null +++ b/src/bridge.cpp @@ -0,0 +1,93 @@ +// Copyright 2015 Open Source Robotics Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "ros1_bridge/bridge.hpp" + + +namespace ros1_bridge +{ + +Bridge1to2Handles +create_bridge_from_1_to_2( + ros::NodeHandle ros1_node, + rclcpp::Node::SharedPtr ros2_node, + const std::string & ros1_type_name, + const std::string & ros1_topic_name, + size_t subscriber_queue_size, + const std::string & ros2_type_name, + const std::string & ros2_topic_name, + size_t publisher_queue_size) +{ + auto factory = get_factory(ros1_type_name, ros2_type_name); + auto ros2_pub = factory->create_ros2_publisher( + ros2_node, ros2_topic_name, publisher_queue_size); + + auto ros1_sub = factory->create_ros1_subscriber( + ros1_node, ros1_topic_name, subscriber_queue_size, ros2_pub); + + Bridge1to2Handles handles; + handles.ros1_subscriber = ros1_sub; + handles.ros2_publisher = ros2_pub; + return handles; +} + +Bridge2to1Handles +create_bridge_from_2_to_1( + rclcpp::Node::SharedPtr ros2_node, + ros::NodeHandle ros1_node, + const std::string & ros2_type_name, + const std::string & ros2_topic_name, + size_t subscriber_queue_size, + const std::string & ros1_type_name, + const std::string & ros1_topic_name, + size_t publisher_queue_size, + rclcpp::PublisherBase::SharedPtr ros2_pub) +{ + auto factory = get_factory(ros1_type_name, ros2_type_name); + auto ros1_pub = factory->create_ros1_publisher( + ros1_node, ros1_topic_name, publisher_queue_size); + + auto ros2_sub = factory->create_ros2_subscriber( + ros2_node, ros2_topic_name, subscriber_queue_size, ros1_pub, ros2_pub); + + Bridge2to1Handles handles; + handles.ros2_subscriber = ros2_sub; + handles.ros1_publisher = ros1_pub; + return handles; +} + +BridgeHandles +create_bidirectional_bridge( + ros::NodeHandle ros1_node, + rclcpp::Node::SharedPtr ros2_node, + const std::string & ros1_type_name, + const std::string & ros2_type_name, + const std::string & topic_name, + size_t queue_size) +{ + printf("create bidirectional bridge for topic [%s]\n", topic_name.c_str()); + BridgeHandles handles; + handles.bridge1to2 = create_bridge_from_1_to_2( + ros1_node, ros2_node, + ros1_type_name, topic_name, queue_size, ros2_type_name, topic_name, queue_size); + handles.bridge2to1 = create_bridge_from_2_to_1( + ros2_node, ros1_node, + ros2_type_name, topic_name, queue_size, ros1_type_name, topic_name, queue_size, + handles.bridge1to2.ros2_publisher); + return handles; +} + +} // namespace ros1_bridge diff --git a/src/dynamic_bridge.cpp b/src/dynamic_bridge.cpp index 4ee4abf6..848188e2 100644 --- a/src/dynamic_bridge.cpp +++ b/src/dynamic_bridge.cpp @@ -41,12 +41,6 @@ std::mutex g_bridge_mutex; -namespace ros1_bridge -{ -std::unique_ptr -get_service_factory(const std::string &, const std::string &, const std::string &); -} - struct Bridge1to2HandlesAndMessageTypes { ros1_bridge::Bridge1to2Handles bridge_handles;