diff --git a/drone/modules/animation.py b/drone/modules/animation.py index fa38ae6..cc67b59 100644 --- a/drone/modules/animation.py +++ b/drone/modules/animation.py @@ -52,6 +52,18 @@ def get_stats(frames): stats.append([frame.number, frame.action, frame.delay]) return stats +def get_table(frames, header): + table = [] + for frame in frames: + array = [] + for name in header: + array.append(getattr(frame, name)) + table.append(array) + return table + +def get_default_header(): + return["number", "action", "delay", "x", "y", "z", "yaw", "red", "green", "blue"] + def get_start_frame_index(frames): index = 0 for frame in frames: diff --git a/tools/animation_info.py b/tools/animation_info.py new file mode 100644 index 0000000..e61f002 --- /dev/null +++ b/tools/animation_info.py @@ -0,0 +1,91 @@ +import os +import sys +import shutil +import logging +import argparse +from tabulate import tabulate + +logging.basicConfig( # TODO all prints as logs + level=logging.INFO, # INFO + stream=sys.stdout, + format="%(asctime)s [%(name)-7.7s] [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s", + handlers=[ + logging.StreamHandler(sys.stdout), + ]) + +logger = logging.getLogger(__name__) + +# Add parent dir to PATH to import messaging_lib and config_lib +current_dir = (os.path.dirname(os.path.realpath(__file__))) +root_dir = os.path.realpath(os.path.join(current_dir,'..')) +lib_dir = os.path.realpath(os.path.join(root_dir, 'lib')) +modules_dir = os.path.realpath(os.path.join(root_dir, 'drone/modules')) +sys.path.insert(0, lib_dir) +sys.path.insert(0, modules_dir) + +from config import ConfigManager + +def load_config(config): + config_dir = 'animation_config/config' + spec_path = os.path.join(config_dir,'spec') + if not os.path.exists(spec_path): + try: + os.makedirs(spec_path) + except OSError: + logger.debug("Creation of the directory {} failed".format(spec_path)) + else: + logger.debug("Successfully created the directory {}".format(spec_path)) + + client_config_dir = os.path.realpath(os.path.join(root_dir,"drone/config")) + client_config_path = os.path.realpath(os.path.join(client_config_dir,"client.ini")) + client_configspec_path = os.path.realpath(os.path.join(client_config_dir,"spec/configspec_client.ini")) + shutil.copy(client_configspec_path, spec_path) + if os.path.exists(client_config_path): + shutil.copy(client_config_path, config_dir) + config.load_config_and_spec(os.path.join(config_dir,'client.ini')) + +config = ConfigManager() + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Get animation info") + parser.add_argument('animation', nargs='?', default='../examples/animations/basic/basic.csv', + help="Path to animation. Default is ../examples/animations/basic/basic.csv.") + parser.add_argument('--config', action='store_true', + help="Set this option to print config info.") + args = parser.parse_args() + + if args.config: + print("\nLoading config copy from drone") + load_config(config) + if args.config: + print("\nConfig name: {} | version: {}".format(config.config_name, config.config_version)) + print("Config animation settings:") + for key, value in config.animation.items(): + if key == 'OUTPUT': + print('\tOUTPUT:') + for key, value in config.animation_output.items(): + print("\t\t{}: {}".format(key, value)) + else: + print("\t{}: {}".format(key, value)) + print("Config flight settings:") + for key, value in config.flight.items(): + print("\t{}: {}".format(key, value)) + print("\nLoading animation {}".format(args.animation)) + import animation + a = animation.Animation(args.animation, config) + print("\nAnimation id: {} | state: {}".format(a.id, a.state)) + print("Frames separation:") + print("\tStatic begin frames: {}".format(animation.get_numbers(a.transformed_frames[:a.takeoff_index]))) + print("\tTakeoff frames: {}".format(animation.get_numbers(a.transformed_frames[a.takeoff_index:a.route_index]))) + print("\tRoute frames: {}".format(animation.get_numbers(a.transformed_frames[a.route_index:a.land_index]))) + print("\tLand frames: {}".format(animation.get_numbers(a.transformed_frames[a.land_index:a.static_end_index]))) + print("\tStatic end frames: {}".format(animation.get_numbers(a.transformed_frames[a.static_end_index:]))) + header = animation.get_default_header() + print("\nOutput frames on fly start action:") + data = animation.get_table(a.output_frames, header) + print (tabulate(data, headers=header)) + print("\nOutput frames in takeoff start action:") + data = animation.get_table(a.output_frames_takeoff, header) + print (tabulate(data, headers=header)) + +shutil.rmtree('animation_config') \ No newline at end of file