| #!/usr/bin/python |
| |
| import sys |
| import numpy |
| from frc971.analysis.plotter import Plotter |
| import argparse |
| |
| def ReadPlotDefinitions(filename): |
| """ |
| Read a file with plotting definitions. |
| |
| A plotting definition is a single line that defines what data to search for |
| in order to plot it. The following in a file would duplicate the default |
| behaviour: |
| |
| fridge goal height |
| fridge goal angle |
| fridge goal velocity |
| fridge goal angular_velocity |
| fridge output left_arm |
| fridge output right_arm |
| fridge output left_elevator |
| fridge output right_elevator |
| |
| Lines are ignored if they start with a hash mark (i.e. '#'). |
| |
| Lines that end with a "-b X" where X is a number then it designates that line |
| as plotting a boolean value. X is the value plotted when the boolean is true. |
| When the boolean is false then the values is plotted as zero. For example, |
| the following boolean value is drawn to toggle between 2.0 and 0 when the |
| boolean is True and False, respectively: |
| |
| fridge status zeroed -b 2.0 |
| |
| Args: |
| filename: The name of the file to read the definitions from. |
| |
| Returns: |
| [[str]]: The definitions in the specified file. |
| """ |
| defs = [] |
| with open(filename) as fd: |
| for line in fd: |
| raw_defs = line.split() |
| |
| # Only add to the list of definitions if the line's not empty and it |
| # doesn't start with a hash. |
| if raw_defs and not raw_defs[0].startswith('#'): |
| defs.append(raw_defs) |
| |
| return defs |
| |
| |
| def maybeint(x): |
| try: |
| return int(x) |
| except ValueError: |
| return x |
| |
| |
| def main(): |
| # Parse all command line arguments. |
| arg_parser = argparse.ArgumentParser(description='Log Plotter') |
| arg_parser.add_argument('log_file', metavar='LOG_FILE', type=str, \ |
| help='The file from which to read logs and plot.') |
| arg_parser.add_argument('--plot-defs', '-p', action='store', type=str, \ |
| help='Read the items to plot from this file.') |
| arg_parser.add_argument('--no-binary', '-n', action='store_true', \ |
| help='Don\'t print the binary name in the legend.') |
| |
| args = arg_parser.parse_args(sys.argv[1:]) |
| |
| p = Plotter() |
| |
| # If the user defines the list of data to plot in a file, read it from there. |
| if args.plot_defs: |
| defs = ReadPlotDefinitions(args.plot_defs) |
| for definition in defs: |
| mapped_definitions = map(maybeint, definition[2:]) |
| p.Add(definition[0], definition[1], *mapped_definitions) |
| |
| # Otherwise use a pre-defined set of data to plot. |
| else: |
| p.Add('fridge', 'goal', 'height') |
| p.Add('fridge', 'goal', 'angle') |
| p.Add('fridge', 'goal', 'velocity') |
| p.Add('fridge', 'goal', 'angular_velocity') |
| |
| p.Add('fridge', 'output', 'left_arm') |
| p.Add('fridge', 'output', 'right_arm') |
| p.Add('fridge', 'output', 'left_elevator') |
| p.Add('fridge', 'output', 'right_elevator') |
| |
| p.PlotFile(args.log_file, args.no_binary) |
| |
| if __name__ == '__main__': |
| main() |