Example #1
0
    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)