コード例 #1
0
 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)
コード例 #2
0
 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()