Dynamically reset the interface to expose the services / topics / params whose names are passed as args
        The interface class can be specified with a module to be dynamically imported
        :param publishers:
        :param subscribers:
        :param services:
        :param topics: BW COMPAT ONLY !
        :param params:
        :return:

def setup(self, *args, **kwargs):
        """
        Dynamically reset the interface to expose the services / topics / params whose names are passed as args
        The interface class can be specified with a module to be dynamically imported
        :param publishers:
        :param subscribers:
        :param services:
        :param topics: BW COMPAT ONLY !
        :param params:
        :return:
        """

        #BWCOMPAT
        if kwargs.get('topics'):
            if kwargs.get('publishers'):
                kwargs['publishers'] = kwargs.get('publishers', []) + kwargs.get('topics', [])
            else:
                kwargs['publishers'] = kwargs.get('topics', [])
            if kwargs.get('subscribers'):
                kwargs['subscribers'] = kwargs.get('subscribers', []) + kwargs.get('topics', [])
            else:
                kwargs['subscribers'] = kwargs.get('topics', [])
        kwargs.pop('topics')

        # We can now import RosInterface and setup will be done ( we re in another process ).
        # TODO : context to make it cleaner (maybe use zmp.Node context ?)
        if isinstance(self.interface_class, tuple):
            m = None
            class_name = self.interface_class[-1]  # last element is always the class_name
            if len(self.interface_class) >= 3:
                # load the relative module, will raise ImportError if module cannot be loaded
                m = importlib.import_module(self.interface_class[1], self.interface_class[0])
            elif len(self.interface_class) == 2:
                # load the relative module, will raise ImportError if module cannot be loaded
                m = importlib.import_module(self.interface_class[0])
            # get the class, will raise AttributeError if class cannot be found
            self.interface_class = getattr(m, class_name)

        if not (
                # TODO : we should pre check all the used members are present...
                hasattr(self.interface_class, 'services')
                # TODO : etc.
        ):
            raise PyrosException("The interface class is missing some members to be used as an interface. Aborting Setup. {interface_class}".format(**locals()))

        self.interface = self.interface_class(*args, **kwargs)
        return self.interface