def test_application(self): conf_dir = '../../config' filename = test_data('ro2018-spider-gps-imu.json', conf_dir) conf = config_load(filename, application=MyTestRobot) self.assertTrue(conf['robot']['modules']['app']['driver'].endswith( 'lib.test_config:MyTestRobot')) conf = config_load(filename, application='osgar.lib.test_config:MyTestRobot') self.assertTrue(conf['robot']['modules']['app']['driver'].endswith( 'lib.test_config:MyTestRobot'))
def test_multiple_config_files(self): conf_dir = '../../config' filename1 = test_data('ro2018-spider-gps-imu.json', conf_dir) filename2 = test_data('ro2018-czu-waypoints.json', conf_dir) conf = config_load(filename1, filename2) self.assertIn('maxspeed', conf['robot']['modules']['app']['init']) self.assertIn('out', conf['robot']['modules']['app'])
def launch(app, description, prefix): parser = argparse.ArgumentParser(description=description) subparsers = parser.add_subparsers(help='sub-command help', dest='command') subparsers.required = True parser_run = subparsers.add_parser('run', help='run on real HW') parser_run.add_argument('config', nargs='+', help='configuration file') parser_run.add_argument('--note', help='add description') parser_replay = subparsers.add_parser('replay', help='replay from logfile') parser_replay.add_argument('logfile', help='recorded log file') parser_replay.add_argument( '--force', '-F', dest='force', action='store_true', help='force replay even for failing output asserts') parser_replay.add_argument('--config', nargs='+', help='force alternative configuration file') parser_replay.add_argument('--verbose', '-v', help="verbose mode", action='store_true') args = parser.parse_args() if args.command == 'replay': args.module = 'app' game = replay(args, application=app) game.verbose = args.verbose game.run() elif args.command == 'run': cfg = config_load(*args.config, application=app) record(cfg, log_prefix=prefix)
def main(record=record): import logging logging.basicConfig( level=logging.DEBUG, format='%(asctime)s %(name)-16s %(levelname)-8s %(message)s', ) parser = argparse.ArgumentParser( description='Record run on real HW with given configuration') parser.add_argument('config', nargs='+', help='configuration file') parser.add_argument('--note', help='add description') parser.add_argument('--duration', help='recording duration (sec), default infinite', type=float) parser.add_argument('--log', help='force record log filename') parser.add_argument('--application', help='import string to application', default=None) args = parser.parse_args() prefix = os.path.basename(args.config[0]).split('.')[0] + '-' cfg = config_load(*args.config, application=args.application) record(cfg, log_prefix=prefix, duration_sec=args.duration, log_filename=args.log)
def replay(args, application=None): log = LogReader(args.logfile, only_stream_id=0) print("original args:", next(log)[-1]) # old arguments config_str = next(log)[-1] config = literal_eval(config_str.decode('ascii')) if args.config is not None: config = config_load(*args.config, application=application) names = logger.lookup_stream_names(args.logfile) if args.debug: print("streams:") for i, name in enumerate(names): print(f" {i+1:2d} {name}") module = args.module assert module in config['robot']['modules'], ( module, list(config['robot']['modules'].keys())) module_config = config['robot']['modules'][module] inputs = {} for edge_from, edge_to in config['robot']['links']: if edge_to.split('.')[0] == module: if edge_from not in names: g_logger.warning('Missing name: %s' % edge_from) names.append(edge_from) inputs[1 + names.index(edge_from)] = edge_to.split('.')[1] outputs = { i + 1: out.split('.')[1] for i, out in enumerate(names) if out.startswith(f"{module}.") } if args.debug: print("inputs:") for i, name in sorted(inputs.items()): print(f" {i:2d} {name}") print("outputs:") for i, name in sorted(outputs.items()): print(f" {i:2d} {name}") if args.force: reader = LogReader(args.logfile, only_stream_id=inputs.keys()) bus = LogBusHandlerInputsOnly(reader, inputs=inputs) else: streams = list(inputs.keys()) + list(outputs.keys()) reader = LogReader(args.logfile, only_stream_id=streams) bus = LogBusHandler(reader, inputs, outputs) driver_name = module_config['driver'] module_class = get_class_by_name(driver_name) module_instance = module_class(module_config.get('init', {}), bus=bus) bus.node = module_instance # needed for slots return module_instance
def replay(args, application=None): log = LogReader(args.logfile, only_stream_id=0) print("original args:", next(log)[-1]) # old arguments config_str = next(log)[-1] config = literal_eval(config_str.decode('ascii')) if args.config is not None: config = config_load(*args.config) names = logger.lookup_stream_names(args.logfile) print("stream names:") for name in names: print(" ", name) module = args.module assert module in config['robot']['modules'], ( module, list(config['robot']['modules'].keys())) module_config = config['robot']['modules'][module] input_names = module_config['in'] output_names = module_config['out'] print("inputs:", input_names) print("outputs:", output_names) inputs = {} for edge_from, edge_to in config['robot']['links']: if edge_to.split('.')[0] == module: if edge_from not in names: logging.warning(f'Missing name: {edge_from}') names.append(edge_from) inputs[1 + names.index(edge_from)] = edge_to.split('.')[1] # start reading log from the beginning again if args.force: log = LogReader(args.logfile, only_stream_id=inputs.keys()) bus = LogBusHandlerInputsOnly(log, inputs=inputs) else: outputs = dict([(1 + names.index('.'.join([module, name])), name) for name in output_names]) streams = list(inputs.keys()) + list(outputs.keys()) log = LogReader(args.logfile, only_stream_id=streams) bus = LogBusHandler(log, inputs=inputs, outputs=outputs) driver_name = module_config['driver'] if driver_name == 'application': assert application is not None module_class = application else: module_class = get_class_by_name(driver_name) module_instance = module_class(module_config['init'], bus=bus) bus.node = module_instance return module_instance
def main(): import argparse import os from osgar.lib.config import config_load from osgar.record import record parser = argparse.ArgumentParser(description='SubT Teambase') parser.add_argument('config', nargs='+', help='configuration file') parser.add_argument('--note', help='add description') parser.add_argument('--log', nargs='?', help='record log filename') parser.add_argument('--robot-name', required=True, help='T<simulated seconds>F* name') args = parser.parse_args() cfg = config_load(*args.config) cfg['robot']['modules']['app']['init']['robot_name'] = args.robot_name prefix = os.path.basename(args.config[0]).split('.')[0] + '-' record(cfg, prefix, args.log)
def main(): import argparse from osgar.lib.config import load as config_load from osgar.record import Recorder from osgar.logger import LogWriter, LogReader parser = argparse.ArgumentParser(description='SubT Challenge') subparsers = parser.add_subparsers(help='sub-command help', dest='command') subparsers.required = True parser_run = subparsers.add_parser('run', help='run on real HW') parser_run.add_argument('config', nargs='+', help='configuration file') parser_run.add_argument('--note', help='add description') parser_replay = subparsers.add_parser('replay', help='replay from logfile') parser_replay.add_argument('logfile', help='recorded log file') parser_replay.add_argument('--force', '-F', dest='force', action='store_true', help='force replay even for failing output asserts') parser_replay.add_argument('--config', nargs='+', help='force alternative configuration file') args = parser.parse_args() if args.command == 'replay': from osgar.replay import replay args.module = 'app' game = replay(args, application=SubTChallenge) game.play() elif args.command == 'run': # To reduce latency spikes as described in https://morepypy.blogspot.com/2019/01/pypy-for-low-latency-systems.html. # Increased latency leads to uncontrolled behavior and robot either missing turns or hitting walls. # Disabled garbage collection needs to be paired with gc.collect() at place(s) that are not time sensitive. gc.disable() # support simultaneously multiple platforms prefix = os.path.basename(args.config[0]).split('.')[0] + '-' log = LogWriter(prefix=prefix, note=str(sys.argv)) config = config_load(*args.config) log.write(0, bytes(str(config), 'ascii')) # write configuration robot = Recorder(config=config['robot'], logger=log, application=SubTChallenge) game = robot.modules['app'] # TODO nicer reference robot.start() game.play() robot.finish()
parser_run = subparsers.add_parser('run', help='run on real HW') parser_run.add_argument('config', nargs='+', help='configuration file') parser_run.add_argument('--note', help='add description') parser_replay = subparsers.add_parser('replay', help='replay from logfile') parser_replay.add_argument('logfile', help='recorded log file') parser_replay.add_argument( '--force', '-F', dest='force', action='store_true', help='force replay even for failing output asserts') parser_replay.add_argument('--config', nargs='+', help='force alternative configuration file') args = parser.parse_args() if args.command == 'replay': from osgar.replay import replay args.module = 'app' app = replay(args, application=RoboOrienteering2018) app.play() elif args.command == 'run': cfg = config_load(*args.config, application=RoboOrienteering2018) record(cfg, 'ro2018-') else: assert False, args.command # unsupported command # vim: expandtab sw=4 ts=4
nargs='+', help='force alternative configuration file') args = parser.parse_args() if args.command == 'replay': from osgar.replay import replay args.module = 'app' game = replay(args, application=SubTChallenge) game.play() elif args.command == 'run': # To reduce latency spikes as described in https://morepypy.blogspot.com/2019/01/pypy-for-low-latency-systems.html. # Increased latency leads to uncontrolled behavior and robot either missing turns or hitting walls. # Disabled garbage collection needs to be paired with gc.collect() at place(s) that are not time sensitive. gc.disable() # support simultaneously multiple platforms prefix = os.path.basename(args.config[0]).split('.')[0] + '-' log = LogWriter(prefix=prefix, note=str(sys.argv)) config = config_load(*args.config) log.write(0, bytes(str(config), 'ascii')) # write configuration robot = Recorder(config=config['robot'], logger=log, application=SubTChallenge) game = robot.modules['app'] # TODO nicer reference robot.start() game.play() robot.finish() # vim: expandtab sw=4 ts=4
parser_run.add_argument('--timeout', help='seconds before stopping (default: %(default)s)', type=int, default=10) parser_replay = subparsers.add_parser('replay', help='replay from logfile') parser_replay.add_argument('logfile', help='recorded log file') parser_replay.add_argument('--force', '-F', dest='force', action='store_true', help='force replay even for failing output asserts') parser_replay.add_argument('--config', nargs='+', help='force alternative configuration file') parser_replay.add_argument('--verbose', '-v', help="verbose mode", action='store_true') args = parser.parse_args() print(args) if args.command == 'replay': args.module = 'app' game = replay(args, application=Go) game.verbose = args.verbose game.run() elif args.command == 'run': prefix = 'go-' + os.path.basename(args.config[0]).split('.')[0] + '-' cfg = config_load(*args.config, application=Go) # apply overrides from command line cfg['robot']['modules']['app']['init']['dist'] = args.dist cfg['robot']['modules']['app']['init']['timeout'] = args.timeout if args.speed is not None: cfg['robot']['modules']['app']['init']['max_speed'] = args.speed record(cfg, prefix) # vim: expandtab sw=4 ts=4
def test_load_config_files(self): conf_dir = '../../config' filename = test_data('ro2018-spider-gps-imu.json', conf_dir) conf = config_load(filename) self.assertEqual(conf['version'], 2)
parser_replay = subparsers.add_parser('replay', help='replay from logfile') parser_replay.add_argument('logfile', help='recorded log file') parser_replay.add_argument( '--force', '-F', dest='force', action='store_true', help='force replay even for failing output asserts') parser_replay.add_argument('--config', nargs='+', help='force alternative configuration file') parser_replay.add_argument('--verbose', '-v', help="verbose mode", action='store_true') args = parser.parse_args() if args.command == 'replay': from osgar.replay import replay args.module = 'app' game = replay(args, application=SICKRobot2018) game.verbose = args.verbose game.play() elif args.command == 'run': cfg = config_load(*args.config, application=SICKRobot2018) record(cfg, 'eduro-') # vim: expandtab sw=4 ts=4
subparsers.required = True parser_run = subparsers.add_parser('run', help='run on real HW') parser_run.add_argument('config', nargs='+', help='configuration file') parser_run.add_argument('--note', help='add description') parser_replay = subparsers.add_parser('replay', help='replay from logfile') parser_replay.add_argument('logfile', help='recorded log file') parser_replay.add_argument('--force', '-F', dest='force', action='store_true', help='force replay even for failing output asserts') parser_replay.add_argument('--config', nargs='+', help='force alternative configuration file') parser_replay.add_argument('--verbose', '-v', help="verbose mode", action='store_true') args = parser.parse_args() if args.command == 'replay': from replay import replay args.module = 'app' game = replay(args, application=SICKRobot2018) game.verbose = args.verbose game.play() elif args.command == 'run': log = LogWriter(prefix='eduro-', note=str(sys.argv)) config = config_load(*args.config) log.write(0, bytes(str(config), 'ascii')) # write configuration robot = Recorder(config=config['robot'], logger=log, application=SICKRobot2018) game = robot.modules['app'] # TODO nicer reference robot.start() game.play() robot.finish() # vim: expandtab sw=4 ts=4
def main(): import argparse from osgar.lib.config import config_load from osgar.record import record parser = argparse.ArgumentParser(description='SubT Challenge') subparsers = parser.add_subparsers(help='sub-command help', dest='command') subparsers.required = True parser_run = subparsers.add_parser('run', help='run on real HW') parser_run.add_argument('config', nargs='+', help='configuration file') parser_run.add_argument('--note', help='add description') parser_run.add_argument('--walldist', help='distance for wall following (default: %(default)sm)', default=1.0, type=float) parser_run.add_argument('--side', help='which side to follow', choices=['left', 'right', 'auto'], required=True) parser_run.add_argument('--speed', help='maximum speed (default: from config)', type=float) parser_run.add_argument('--timeout', help='seconds of exploring before going home (default: %(default)s)', type=int, default=10*60) parser_run.add_argument('--log', nargs='?', help='record log filename') parser_run.add_argument('--init-offset', help='inital 3D offset accepted as a string of comma separated values (meters)') parser_run.add_argument('--init-path', help='inital path to be followed from (0, 0). 2D coordinates are separated by ;') parser_run.add_argument('--start-paused', dest='start_paused', action='store_true', help='start robota Paused and wait for LoRa Contine command') parser_replay = subparsers.add_parser('replay', help='replay from logfile') parser_replay.add_argument('logfile', help='recorded log file') parser_replay.add_argument('--force', '-F', dest='force', action='store_true', help='force replay even for failing output asserts') parser_replay.add_argument('--config', nargs='+', help='force alternative configuration file') args = parser.parse_args() if args.command == 'replay': from osgar.replay import replay args.module = 'app' app = replay(args, application=SubTChallenge) app.play() elif args.command == 'run': # To reduce latency spikes as described in https://morepypy.blogspot.com/2019/01/pypy-for-low-latency-systems.html. # Increased latency leads to uncontrolled behavior and robot either missing turns or hitting walls. # Disabled garbage collection needs to be paired with gc.collect() at place(s) that are not time sensitive. gc.disable() cfg = config_load(*args.config, application=SubTChallenge) # apply overrides from command line cfg['robot']['modules']['app']['init']['walldist'] = args.walldist if args.side == 'auto': cfg['robot']['modules']['app']['init']['right_wall'] = 'auto' else: cfg['robot']['modules']['app']['init']['right_wall'] = args.side == 'right' cfg['robot']['modules']['app']['init']['timeout'] = args.timeout if args.init_offset is not None: x, y, z = [float(x) for x in args.init_offset.split(',')] cfg['robot']['modules']['app']['init']['init_offset'] = [int(x*1000), int(y*1000), int(z*1000)] if args.init_path is not None: cfg['robot']['modules']['app']['init']['init_path'] = args.init_path if args.speed is not None: cfg['robot']['modules']['app']['init']['max_speed'] = args.speed cfg['robot']['modules']['app']['init']['start_paused'] = args.start_paused prefix = os.path.basename(args.config[0]).split('.')[0] + '-' record(cfg, prefix, args.log)