diff --git a/tools/plotjuggler/README.md b/tools/plotjuggler/README.md index c39a24eb01..02220eabe8 100644 --- a/tools/plotjuggler/README.md +++ b/tools/plotjuggler/README.md @@ -13,18 +13,27 @@ Once you've cloned openpilot, run this command inside this directory: ``` batman@z840-openpilot:~/openpilot/tools/plotjuggler$ ./juggle.py -h -usage: juggle.py [-h] [route_name] [segment_number] +usage: juggle.py [-h] [--qlog] [--layout [LAYOUT]] [route_name] [segment_number] PlotJuggler plugin for reading rlogs positional arguments: - route_name The name of the route that will be plotted. (default: None) - segment_number The index of the segment that will be plotted (default: None) + route_name The name of the route that will be plotted. (default: None) + segment_number The index of the segment that will be plotted (default: None) optional arguments: - -h, --help show this help message and exit + -h, --help show this help message and exit + --qlog Use qlogs (default: False) + --layout [LAYOUT] Run PlotJuggler with a pre-defined layout (default: None) ``` Example: `./juggle.py "0982d79ebb0de295|2021-01-17--17-13-08"` + +## Demo: + +For a quick demo of what PlotJuggler can do, go through the installation step and use this command: + +`./juggle.py "https://commadataci.blob.core.windows.net/openpilotci/d83f36766f8012a5/2020-02-05--18-42-21/0/rlog.bz2" --layout=demo_layout.xml` + diff --git a/tools/plotjuggler/demo_layout.xml b/tools/plotjuggler/demo_layout.xml new file mode 100644 index 0000000000..d3769e8ef1 --- /dev/null +++ b/tools/plotjuggler/demo_layout.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + prevX = 0 +prevY = 0 +is_first = true + if (is_first) then + is_first = false + prevX = time + prevY = value +end + +dx = time - prevX +dy = value - prevY +prevX = time +prevY = value + +return dy/dx + /carState/vEgo + + + + + + diff --git a/tools/plotjuggler/juggle.py b/tools/plotjuggler/juggle.py index b648835f02..d7b5791892 100755 --- a/tools/plotjuggler/juggle.py +++ b/tools/plotjuggler/juggle.py @@ -24,7 +24,7 @@ def load_segment(segment_name): print(f"Error parsing {segment_name}: {e}") return [] -def juggle_file(fn, dbc=None): +def juggle_file(fn, dbc=None, layout=None): env = os.environ.copy() env["BASEDIR"] = BASEDIR @@ -32,9 +32,12 @@ def juggle_file(fn, dbc=None): env["DBC_NAME"] = dbc pj = os.getenv("PLOTJUGGLER_PATH", "plotjuggler") - subprocess.call(f'{pj} --plugin_folders {os.path.join(juggle_dir, "bin")} -d {fn}', shell=True, env=env, cwd=juggle_dir) + extra_args = "" + if layout is not None: + extra_args += f'-l {layout}' + subprocess.call(f'{pj} --plugin_folders {os.path.join(juggle_dir, "bin")} -d {fn} {extra_args}', shell=True, env=env, cwd=juggle_dir) -def juggle_route(route_name, segment_number, qlog): +def juggle_route(route_name, segment_number, qlog, layout): if route_name.startswith("http://") or route_name.startswith("https://"): logs = [route_name] @@ -74,13 +77,14 @@ def juggle_route(route_name, segment_number, qlog): save_log(tempfile.name, all_data, compress=False) del all_data - juggle_file(tempfile.name, dbc) + juggle_file(tempfile.name, dbc, layout) def get_arg_parser(): parser = argparse.ArgumentParser(description="PlotJuggler plugin for reading rlogs", formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("--qlog", action="store_true", help="Use qlogs") + parser.add_argument("--layout", nargs='?', help="Run PlotJuggler with a pre-defined layout") parser.add_argument("route_name", nargs='?', help="The name of the route that will be plotted.") parser.add_argument("segment_number", type=int, nargs='?', help="The index of the segment that will be plotted") return parser @@ -91,4 +95,4 @@ if __name__ == "__main__": arg_parser.print_help() sys.exit() args = arg_parser.parse_args(sys.argv[1:]) - juggle_route(args.route_name, args.segment_number, args.qlog) + juggle_route(args.route_name, args.segment_number, args.qlog, args.layout)