def start_server(self, dt): ''' initializes the client connection, and gets image data ''' hostname = "0.0.0.0" if not self._started: count = 0 while True: # Keep trying in case server is not up yet import socket try: from xmlrpclib import ServerProxy # connect to meta server first prox = \ ServerProxy("http://" + hostname + ":5007") # get servers address from the meta server self._ros_uri = prox.startProcess() Logger.info('Server Address\n <%s>', self._ros_uri[0]) # self._client = \ # KeyboardInterface(self._ros_uri, # self._args.image_updates) self._started = True Logger.info('Client Connected...') # use double quote for subscriber name # TODO: convert get_image_data into a list, so # that each key is the image data of a robot self._ros_uri.pop(0) # remove ROS uri self._im_string = self._ros_uri val = [] # store las byte of robot's address for i in range(len(self._ros_uri)): self._robot_id = \ self._ros_uri[i].split('.')[3] rospy.Subscriber( "/output/image_raw/compressed"+ self._robot_id, CompressedImage, self.get_image_data) val.append(self._robot_id) self._robot_id = val[0] # create a robot selection menu robot_menu = Spinner( # default robot showed text=self._ros_uri[0].split('.')[3], # available robots/values values = val, # just for positioning in our example size_hint=(None, None), size=(100, 44), pos_hint={'center_x': .1, 'center_y': .8}) self.add_widget(robot_menu) robot_menu.bind(text=self.selected_robot) robot_menu_label = \ Label(text='Select a robot:', pos_hint={'center_x': .1, 'center_y': .87}) self.add_widget(robot_menu_label) from threading import Thread spin_thread = Thread(target=lambda: rospy.spin()) spin_thread.start() break except socket.error: count += 1 import time time.sleep(.5) if count > 100: waiting = 'Waiting for meta server at %s' uri="http://" + hostname + ":12345" Logger.info(waiting, uri)