diff --git a/astrobee/config/communications/comms_bridge.config b/astrobee/config/communications/comms_bridge.config
new file mode 100644
index 0000000000..5b8c1d1094
--- /dev/null
+++ b/astrobee/config/communications/comms_bridge.config
@@ -0,0 +1,96 @@
+-- Copyright (c) 2017, United States Government, as represented by the
+-- Administrator of the National Aeronautics and Space Administration.
+--
+-- All rights reserved.
+--
+-- The Astrobee platform is 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.
+
+require "context"
+
+-- Enable DDS communications on start --
+-- If false, a trigger call will be needed to start communications --
+initialize_dds_on_start = false
+
+-- The verbosity is used to control the output of the underlying ros
+-- publisher/subscriber. Level 2 is the most verbose and will output all of the
+-- output including debug statements. Level 1 will output all output except
+-- debug statements and level 0 will only output warnings and errors. Since
+-- all output statements go directly to the ros log, it is safest to keep it
+-- set to 2.
+verbose = 2
+
+-- ad2pub_delay is a time amount in seconds. The bridge publisher must receive
+-- the adverttisement info message for a topic before it can publish a content
+-- message for that topic. If the bridge publisher receives the content message
+-- before the advertisement info, it will save the content message if the
+-- ad2pub_delay is greater than 0. If the bridge publisher receives the
+-- advertisement info message within the ad2pub_delay time, it will process
+-- and publish the content message. If the comms bridge seems to be dropping
+-- the first few messages, try increasing this value.
+ad2pub_delay = 3.0
+
+links = {
+ -- Logically, there could be up to three two-way links between the three robots. In practice, we
+ -- will probably only have one link.
+ {
+ -- A single link entry has required fields "from" and "to" that specify the robot roles involved
+ -- in the link.
+ -- This link will only work on the ISS since it uses the names of the
+ -- robots on the ISS. Please add more links if Queen goes back to the ISS.
+ from = "Bumble", -- manager
+ to = "Honey", -- actor
+
+ -- The link entry has three optional fields: relay_forward (messages to be relayed only in the
+ -- `from` to `to` direction), relay_backward (to be relayed only in the `to` to `from` direction),
+ -- and relay_both (to be relayed in both directions). Providing all three fields gives the user
+ -- full directional control while minimizing repetition and copy/paste errors.
+
+ -- Each topic entry can contain an input topic and an output topic. The
+ -- in topic is the topic being published on the robot sending the data and
+ -- must be specified. The optional out topic is the name of the topic a
+ -- user wants the data published on in the receiving robot. If the
+ -- out topic is not specified, the comms bridge will set it to be the name
+ -- of the robot sending the data combined with the in topic name. For
+ -- instance, if the from robot was Bumble and the to robot was Honey and
+ -- one of the in topics in the relay forward list was "mgt/ack", then it
+ -- would be published on Honey on topic "bumble/mgt/ack".
+ -- Please note that only one unique in topic can exist in the relay forward
+ -- and relay both lists and the relay backward and relay both lists. It is
+ -- fine to have the same in topic in the relay forward and relay backward
+ -- lists.
+
+ relay_forward = {
+ },
+ relay_backward = {
+ },
+ relay_both = {
+ {in_topic = "gnc/ekf"},
+ {in_topic = "gs/data"},
+ },
+ },
+ {
+ -- This link will only work in the granite lab since it uses the names of
+ -- the robots in the granite lab.
+ from = "Bsharp", -- manager
+ to = "Wannabee", -- actor
+
+ relay_forward = {
+ },
+ relay_backward = {
+ },
+ relay_both = {
+ {in_topic = "gnc/ekf"},
+ {in_topic = "gs/data"},
+ }
+ }
+}
diff --git a/astrobee/config/communications/dds_generic_comms/NDDS_DISCOVERY_PEERS b/astrobee/config/communications/dds_generic_comms/NDDS_DISCOVERY_PEERS
new file mode 100644
index 0000000000..dc71e38323
--- /dev/null
+++ b/astrobee/config/communications/dds_generic_comms/NDDS_DISCOVERY_PEERS
@@ -0,0 +1,6 @@
+;; NDDS_DISCOVERY_PEERS - Discovery Configuration File
+;; This file is used to configure the dds portion of the comms bridge
+; EVERY LINE IN THIS FILE MUST END IN A COMMENT. Even blank lines.
+;
+;; Add the IP addresses of the robots to communicate with
+127.0.0.1 ; Local host is added by default
diff --git a/astrobee/config/communications/dds_generic_comms/RAPID_QOS_PROFILES.xml b/astrobee/config/communications/dds_generic_comms/RAPID_QOS_PROFILES.xml
new file mode 100644
index 0000000000..4643b2feac
--- /dev/null
+++ b/astrobee/config/communications/dds_generic_comms/RAPID_QOS_PROFILES.xml
@@ -0,0 +1,994 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 50, 48, 49, 49, 48, 54,0x32,0x39,0x2e,0x30,0x39,0x34,0x33,0x30,0x30,0x2e,0x48,0x55,0x2d,0x41,0x52,0x43
+
+
+
+
+ 7400
+ 250
+ 2
+ 0
+ 10
+ 1
+ 11
+
+ MASK_DEFAULT
+
+
+ UDPv4
+
+
+
+
+
+ true
+
+
+
+ 4096
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+ dds.flow_controller.token_bucket.MeshFlowController.scheduling_policy
+ DDS_EDF_FLOW_CONTROLLER_SCHED_POLICY
+
+
+ dds.flow_controller.token_bucket.MeshFlowController.token_bucket.max_tokens
+ 12
+
+
+ dds.flow_controller.token_bucket.MeshFlowController.token_bucket.tokens_added_per_period
+ 4
+
+
+ dds.flow_controller.token_bucket.MeshFlowController.token_bucket.tokens_leaked_per_period
+ 0
+
+
+ dds.flow_controller.token_bucket.MeshFlowController.token_bucket.bytes_per_token
+ 1250
+
+
+ dds.flow_controller.token_bucket.MeshFlowController.token_bucket.period.sec
+ 0
+
+
+ dds.flow_controller.token_bucket.MeshFlowController.token_bucket.period.nanosec
+ 5000000
+
+
+
+
+
+
+ dds.transport.UDPv4.builtin.parent.message_size_max
+ 1250
+
+
+ dds.transport.UDPv4.builtin.send_socket_buffer_size
+ 65535
+
+
+ dds.transport.UDPv4.builtin.recv_socket_buffer_size
+ 65535
+
+
+
+
+ dds.transport.shmem.builtin.received_message_count_max
+ 512
+
+
+ dds.transport.shmem.builtin.receive_buffer_size
+ 1048576
+
+
+
+
+ dds.transport.UDPv4.builtin.parent.deny_interfaces
+ 128.102.*,10.10.1.*,10.30.10.*,192.168.3.255,169.254.194.2,192.9.202.1,192.168.5.*,192.168.10.*,192.168.122.*
+
+
+ dds.transport.UDPv4.builtin.parent.deny_multicast_interfaces
+ 128.102.*,10.10.1.*,10.30.10.*,192.168.3.255,169.254.194.2,192.9.202.1,192.168.5.*,192.168.10.*,192.168.122.*
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+
+ ALIVE_THEN_DISPOSED_INSTANCE_REPLACEMENT
+
+
+ ASYNCHRONOUS_PUBLISH_MODE_QOS
+
+
+
+
+
+
+
+
+
+ BEST_EFFORT_RELIABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 5
+
+
+
+
+ BEST_EFFORT_RELIABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 5
+
+
+
+
+
+
+
+
+
+ RELIABLE_RELIABILITY_QOS
+
+
+ KEEP_ALL_HISTORY_QOS
+
+
+
+
+ RELIABLE_RELIABILITY_QOS
+
+
+
+ KEEP_ALL_HISTORY_QOS
+
+
+
+
+
+
+
+
+
+ RELIABLE_RELIABILITY_QOS
+
+
+ TRANSIENT_LOCAL_DURABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 20
+
+
+
+
+ RELIABLE_RELIABILITY_QOS
+
+
+ TRANSIENT_LOCAL_DURABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RELIABLE_RELIABILITY_QOS
+
+
+
+
+ RELIABLE_RELIABILITY_QOS
+
+
+
+
+
+
+
+ TRANSIENT_LOCAL_DURABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 6
+
+
+
+
+ TRANSIENT_LOCAL_DURABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 6
+
+
+
+
+
+
+
+ TRANSIENT_LOCAL_DURABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 1
+
+
+
+
+ TRANSIENT_LOCAL_DURABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 1
+
+
+ 512
+ 4
+ 128
+ 128
+ 512
+ 380
+
+
+
+ 32
+
+ 0
+ 500000000
+
+ 8
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 10
+
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 100
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 1000
+
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 200
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EXCLUSIVE_OWNERSHIP_QOS
+
+
+ 100
+
+
+
+
+ EXCLUSIVE_OWNERSHIP_QOS
+
+
+
+
+
+
+
+
+ 50
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1000
+
+
+
+
+
+
+
+ 1000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ dds.flow_controller.token_bucket.MeshFlowController
+
+
+ KEEP_LAST_HISTORY_QOS
+ 1
+
+
+ 32
+ 32
+ 1
+ 1
+ 32
+
+
+
+
+ 4096
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+ 0
+
+
+
+
+
+
+ 10
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+ 0
+
+
+
+
+
+
+ 10
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 5
+
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7400
+ 250
+ 2
+ 0
+ 10
+ 1
+ 11
+
+
+
+
+ 30000
+ 64
+ 2048
+
+
+
+ UDPv4 | SHMEM
+
+
+ Monitoring UI Application
+
+
+ 65530
+
+
+
+
+ 100
+ 0
+
+
+ 10
+ 0
+
+ LIVELINESS_BASED_REMOTE_PARTICIPANT_PURGE
+
+ 10
+ 0
+
+ 1
+
+ 2
+ 0
+
+
+ 2
+ 0
+
+
+
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+ 0
+ 100000000
+
+
+
+
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+ 0
+ 100000000
+
+
+
+ 0
+ 1
+
+ 5
+ 0
+
+
+ 0
+ 200000000
+
+
+ 0
+ 200000000
+
+ 1000
+ 8
+
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+ 0
+ 0
+
+ 65530
+
+
+ 0
+ 1
+
+ 5
+ 0
+
+
+ 0
+ 200000000
+
+
+ 0
+ 200000000
+
+ 1000
+ 8
+
+ 0
+ 0
+
+
+ 0
+ 0
+
+
+ 0
+ 0
+
+ 65530
+
+
+
+
+
+
+ dds.transport.UDPv4.builtin.recv_socket_buffer_size
+ 1048576
+
+
+
+ dds.transport.UDPv4.builtin.parent.message_size_max
+ 65530
+
+
+ dds.transport.UDPv4.builtin.send_socket_buffer_size
+ 65530
+
+
+
+
+ dds.transport.shmem.builtin.parent.message_size_max
+ 65530
+
+
+ dds.transport.shmem.builtin.receive_buffer_size
+ 65530
+
+
+ dds.transport.shmem.builtin.received_message_count_max
+ 32
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRANSIENT_LOCAL_DURABILITY_QOS
+
+
+
+ RELIABLE_RELIABILITY_QOS
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 1
+
+
+
+
+
+
+
+
+ BEST_EFFORT_RELIABILITY_QOS
+
+
+ KEEP_LAST_HISTORY_QOS
+ 2
+
+
+
+
+
+ TRANSIENT_LOCAL_DURABILITY_QOS
+
+
+
+ RELIABLE_RELIABILITY_QOS
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 1
+
+
+
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 10
+
+
+
+
+
+
+ KEEP_LAST_HISTORY_QOS
+ 10
+
+
+
+
+
diff --git a/astrobee/config/management/fault_table.config b/astrobee/config/management/fault_table.config
index d1f0f7cf1d..aab193af50 100644
--- a/astrobee/config/management/fault_table.config
+++ b/astrobee/config/management/fault_table.config
@@ -110,8 +110,8 @@ subsystems={
}},
}},
{name="communication", nodes={
- {name="astrobee_astrobee_bridge", faults={
- {id=51, warning=false, blocking=false, response=command("noOp"), key="HEARTBEAT_MISSING", description="No Heartbeat from Atrobee to Astrobee Bridge", heartbeat={timeout_sec=1.1, misses=1.0}},
+ {name="comms_bridge", faults={
+ {id=51, warning=false, blocking=false, response=command("noOp"), key="HEARTBEAT_MISSING", description="No Heartbeat from Comms Bridge", heartbeat={timeout_sec=1.1, misses=1.0}},
}},
{name="dds_ros_bridge", faults={
{id=33, warning=false, blocking=true, response=command("fault"), key="HEARTBEAT_MISSING", description="No Heartbeat form DDS ROS Bridge", heartbeat={timeout_sec=1.1, misses=5.0}},
diff --git a/astrobee/config/management/sys_monitor.config b/astrobee/config/management/sys_monitor.config
index cb0cc55ec4..050fffb979 100644
--- a/astrobee/config/management/sys_monitor.config
+++ b/astrobee/config/management/sys_monitor.config
@@ -41,8 +41,8 @@ time_drift_thres_sec = 0.25
nodelet_info={
{name="access_control", manager="mlp_management", type="access_control/AccessControl"},
{name="arm", manager="mlp_arm", type="arm/ArmNodelet"},
- {name="astrobee_astrobee_bridge", manager="mlp_multibridge", type="dds_ros_bridge/AstrobeeAstrobeeBridge"},
{name="choreographer", manager="mlp_mobility", type="choreographer/ChoreographerNodelet"},
+ {name="comms_bridge", manager="mlp_multibridge", type="comms_bridge/CommsBridgeNodelet"},
{name="ctl", manager="llp_gnc", type="ctl/ctl"},
{name="data_bagger", manager="mlp_recording", type="data_bagger/DataBagger"},
{name="dds_ros_bridge", manager="mlp_communications", type="dds_ros_bridge/DdsRosBridge"},
diff --git a/astrobee/launch/robot/MLP.launch b/astrobee/launch/robot/MLP.launch
index 096cafee64..37b473170a 100644
--- a/astrobee/launch/robot/MLP.launch
+++ b/astrobee/launch/robot/MLP.launch
@@ -287,8 +287,8 @@
-
-
+
+
diff --git a/communications/comms_bridge/CMakeLists.txt b/communications/comms_bridge/CMakeLists.txt
new file mode 100644
index 0000000000..a9f6aaf995
--- /dev/null
+++ b/communications/comms_bridge/CMakeLists.txt
@@ -0,0 +1,141 @@
+# Copyright (c) 2017, United States Government, as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+#
+# All rights reserved.
+#
+# The Astrobee platform is 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.
+
+
+cmake_minimum_required(VERSION 3.0)
+project(comms_bridge)
+
+## Compile as C++14, supported in ROS Kinetic and newer
+add_compile_options(-std=c++14)
+
+if (USE_DDS)
+## Find catkin macros and libraries
+find_package(catkin2 REQUIRED COMPONENTS
+ roscpp
+ nodelet
+ message_generation
+ message_runtime
+ image_transport
+ std_msgs
+ sensor_msgs
+ config_reader
+ ff_util
+ ff_msgs
+ topic_tools
+ dds_msgs
+)
+
+
+# System dependencies are found with CMake's conventions
+# find_package(Eigen3 REQUIRED)
+find_package(Boost 1.54.0 QUIET REQUIRED COMPONENTS filesystem system iostreams thread program_options timer)
+
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../../cmake")
+
+if (USE_CTC)
+ set(SORACORE_ROOT_DIR ${ARM_CHROOT_DIR}/usr)
+else (USE_CTC)
+ set(SORACORE_ROOT_DIR /usr)
+endif (USE_CTC)
+
+set(MIRO_ROOT_DIR ${SORACORE_ROOT_DIR})
+
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# find Qt version according to OS
+find_program(LSB_RELEASE_EXEC lsb_release)
+execute_process(COMMAND "${LSB_RELEASE_EXEC}" --short --release OUTPUT_VARIABLE LSB_RELEASE_VERSION_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+if (${LSB_RELEASE_VERSION_SHORT} VERSION_GREATER 18.04)
+ find_package(Qt5Xml REQUIRED)
+else ()
+ find_package(Qt4 4.6.0 REQUIRED QtXml)
+endif ()
+
+find_package(Miro REQUIRED)
+find_package(RtiDds REQUIRED)
+find_package(Soracore REQUIRED)
+
+catkin_package(
+ LIBRARIES comms_bridge
+ CATKIN_DEPENDS message_runtime std_msgs nodelet config_reader ff_util ff_msgs dds_msgs
+)
+
+###########
+## Build ##
+###########
+
+# Specify additional locations of header files
+include_directories(
+ include
+ ${catkin_INCLUDE_DIRS}
+ ${RTIDDS_INCLUDE_DIR}
+ ${SORACORE_INCLUDE_DIRS}
+ ${MIRO_INCLUDE_DIR}
+ ${QT_INCLUDE_DIR}
+ ${QT_INCLUDE_DIR}/Qt
+ ${Boost_INCLUDE_DIRS}
+)
+
+file(GLOB cc_files
+ "src/*.cpp"
+)
+
+# Declare C++ libraries
+add_library(comms_bridge
+ ${cc_files}
+)
+target_compile_definitions(comms_bridge PUBLIC ${RTIDDS_DEFINE_FLAGS})
+add_dependencies(comms_bridge ${catkin_EXPORTED_TARGETS})
+target_link_libraries(comms_bridge rapidIo Qt5::Xml ${catkin_LIBRARIES} ${Boost_LIBRARIES})
+
+
+#add_library(comms_bridge_pub
+# src/bridge_publisher.cpp
+# src/dds_ros_bridge_publisher.cpp
+# src/bridge_publisher_nodelet.cpp
+#)
+#add_dependencies(comms_bridge_pub ${catkin_EXPORTED_TARGETS} )
+#target_link_libraries(comms_bridge_pub
+# rapidIo Qt5::Xml ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} )
+
+
+#############
+## Install ##
+#############
+# Mark libraries for installation
+install(TARGETS ${PROJECT_NAME}
+ ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+ LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
+ RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
+)
+
+# Mark nodelet_plugin for installation
+install(FILES nodelet_plugins.xml
+ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
+)
+
+# Mark launch files for installation
+install(DIRECTORY launch/
+ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
+ PATTERN ".svn" EXCLUDE)
+
+else (USE_DDS)
+ find_package(catkin REQUIRED COMPONENTS)
+ catkin_package()
+endif (USE_DDS)
diff --git a/communications/comms_bridge/include/comms_bridge/bridge_publisher.h b/communications/comms_bridge/include/comms_bridge/bridge_publisher.h
new file mode 100644
index 0000000000..d8a4202697
--- /dev/null
+++ b/communications/comms_bridge/include/comms_bridge/bridge_publisher.h
@@ -0,0 +1,138 @@
+/* Copyright (c) 2017, United States Government, as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ *
+ * All rights reserved.
+ *
+ * The Astrobee platform is 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.
+ */
+
+#ifndef COMMS_BRIDGE_BRIDGE_PUBLISHER_H_
+#define COMMS_BRIDGE_BRIDGE_PUBLISHER_H_
+
+/*
+ Virtual base class for the subscriber (input side) of a generic ROS bridge
+ Actual implementation depends on an inheriting class
+ */
+
+#include
+
+#include
+#include
+
+#include
+#include
+#include