def run_rosrun(self, data): rosrun_commands = utils.list_rosorun_commands() if data.get('command') in rosrun_commands: cmd = 'PYTHONUNBUFFERED=false rosrun ' + data.get('command') + ' ' + data.get('args') process = Popen(cmd, shell=True, stdout=PIPE) # Note: The launched rosnode-name does not appear the soon after roslaunch is executed. # Therefore, sleep is neccessary to wait it finishes to launch. time.sleep(2) msg = { 'uuid': self.id, 'rosnodes': rosnode.get_node_names(), 'rostopics': utils.list_rostopics() } self.sio.emit('update_rosnodes', json.dumps(msg), namespace=self.nms) while True: output = process.stdout.readline() if output == '' and process.poll() is not None: break if output: msg = { "cmd": data.get('command').replace(" ", "-"), "robotUuid": self.id, "log": output.strip(), } self.sio.emit('rosrun_log', json.dumps(msg), namespace=self.nms) print(output.strip()) process.poll()
def connect(self): ros_root = rospkg.get_ros_root() r = rospkg.RosPack() manifest = r.get_manifest('rowma_ros') rowma_ros_version = manifest.version launch_commands = utils.list_launch_commands() rosrun_commands = utils.list_rosorun_commands() rostopics = utils.list_rostopics() uuid = os.environ.get('UUID', self.id) msg = { 'uuid': uuid, 'launch_commands': launch_commands, 'rosnodes': rosnode.get_node_names(), 'rosrun_commands': rosrun_commands, 'rowma_ros_version': rowma_ros_version, 'rostopics': rostopics, 'reconnection': self.reconnecting } api_key = os.environ.get('API_KEY') if api_key: msg['api_key'] = api_key self.sio.emit('register_robot', json.dumps(msg), namespace=self.nms) utils.print_success('connection established')
def unsubscribe_rostopic(self, data): utils.print_debug(data) self.subscribers = list(filter(lambda s: s['topic'] != data.get('topic'), self.subscribers)) msg = { 'uuid': self.id, 'rosnodes': rosnode.get_node_names(), 'rostopics': utils.list_rostopics() } self.sio.emit('update_rosnodes', json.dumps(msg), namespace=self.nms)
def kill_rosnodes(self, data): rosnode.kill_nodes(data.get('rosnodes')) # Note: The launched rosnode-name does not appear the soon after roslaunch is executed. # Therefore, sleep is neccessary to wait it finishes to launch. time.sleep(2) msg = { 'uuid': self.id, 'rosnodes': rosnode.get_node_names(), 'rostopics': utils.list_rostopics() } self.sio.emit('update_rosnodes', json.dumps(msg), namespace=self.nms) print('killed')