def run(self): ''' ''' if self._masteruri: found = False service_names = interface_finder.get_listmaster_service(self._masteruri, self._wait, check_host=self._check_host) err_msg = '' for service_name in service_names: rospy.logdebug("service 'list_masters' found on %s as %s", self._masteruri, service_name) if self._wait: rospy.wait_for_service(service_name) socket.setdefaulttimeout(3) discoverMasters = rospy.ServiceProxy(service_name, DiscoverMasters) try: resp = discoverMasters() except rospy.ServiceException as e: err_msg = "Service call 'list_masters' failed: %s" % utf8(e) rospy.logwarn(err_msg) self.err_signal.emit(self._masteruri, "Service call '%s' failed: %s" % (service_name, err_msg), False) else: if resp.masters: self.master_list_signal.emit(self._masteruri, service_name, resp.masters) found = True else: self.err_signal.emit(self._masteruri, "local 'master_discovery' reports empty master list, it seems he has a problem", False) finally: socket.setdefaulttimeout(None) if not found: self.err_signal.emit(self._masteruri, "no service 'list_masters' found on %s" % self._masteruri, False)
def obtain_masters(self): ''' This method use the service 'list_masters' of the master_discoverer to get the list of discovered ROS master. Based on this list the L{SyncThread} for synchronization will be created. @see: U{fkie_master_discovery.interface_finder.get_listmaster_service() <http://docs.ros.org/api/fkie_master_discovery/html/modules.html#interface-finder-module>} ''' if not rospy.is_shutdown(): service_names = interface_finder.get_listmaster_service(masteruri_from_master(), False, check_host=self._check_host) for service_name in service_names: try: with self.__lock: try: socket.setdefaulttimeout(5) discoverMasters = rospy.ServiceProxy(service_name, DiscoverMasters) resp = discoverMasters() masters = [] master_names = [m.name for m in resp.masters] rospy.loginfo("ROS masters obtained from '%s': %s", service_name, master_names) for m in resp.masters: if self._can_sync(m.name): # do not sync to the master, if it is in ignore list or not in filled sync list masters.append(m.name) self.update_master(m.name, m.uri, m.last_change.to_sec(), m.last_change_local.to_sec(), m.discoverer_name, m.monitoruri, m.online) for key in set(self.masters.keys()) - set(masters): self.remove_master(self.masters[key].name) except rospy.ServiceException as e: rospy.logwarn("ERROR Service call 'list_masters' failed: %s", str(e)) except: import traceback rospy.logwarn("ERROR while initial list masters: %s", traceback.format_exc()) finally: socket.setdefaulttimeout(None) self.update_timer = threading.Timer(self.UPDATE_INTERVALL, self.obtain_masters) self.update_timer.start()