openpilot v0.11.1 release
date: 2026-06-04T09:49:56 master commit: c0ab3550eca2e9daf197c46b7e4b24aa9637cf2e
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# PlotJuggler
|
||||
|
||||
[PlotJuggler](https://github.com/facontidavide/PlotJuggler) is a tool to quickly visualize time series data, and we've written plugins to parse openpilot logs. Check out our plugins: https://github.com/commaai/PlotJuggler.
|
||||
|
||||
## Installation
|
||||
|
||||
Once you've [set up the openpilot environment](../README.md), this command will download PlotJuggler and install our plugins:
|
||||
|
||||
`cd tools/plotjuggler && ./juggle.py --install`
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
$ ./juggle.py -h
|
||||
usage: juggle.py [-h] [--demo] [--can] [--stream] [--layout [LAYOUT]] [--install] [--dbc DBC]
|
||||
[route_or_segment_name]
|
||||
|
||||
A helper to run PlotJuggler on openpilot routes
|
||||
|
||||
positional arguments:
|
||||
route_or_segment_name
|
||||
The route or segment name to plot (cabana share URL accepted) (default: None)
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--demo Use the demo route instead of providing one (default: False)
|
||||
--can Parse CAN data (default: False)
|
||||
--stream Start PlotJuggler in streaming mode (default: False)
|
||||
--layout [LAYOUT] Run PlotJuggler with a pre-defined layout (default: None)
|
||||
--install Install or update PlotJuggler + plugins (default: False)
|
||||
--dbc DBC Set the DBC name to load for parsing CAN data. If not set, the DBC will be automatically
|
||||
inferred from the logs. (default: None)
|
||||
|
||||
```
|
||||
|
||||
Example using route name:
|
||||
|
||||
`./juggle.py "5beb9b58bd12b691/0000010a--a51155e496"`
|
||||
|
||||
Examples using segment:
|
||||
|
||||
`./juggle.py "5beb9b58bd12b691/0000010a--a51155e496/1"`
|
||||
|
||||
`./juggle.py "5beb9b58bd12b691/0000010a--a51155e496/1/q" # use qlogs`
|
||||
|
||||
Example using segment range:
|
||||
|
||||
`./juggle.py "5beb9b58bd12b691/0000010a--a51155e496/0:1"`
|
||||
|
||||
## Streaming
|
||||
|
||||
Explore live data from your car! Follow these steps to stream from your comma device to your laptop:
|
||||
- Enable wifi tethering on your comma device
|
||||
- [SSH into your device](https://github.com/commaai/openpilot/wiki/SSH) and run `cd /data/openpilot && ./cereal/messaging/bridge`
|
||||
- On your laptop, connect to the device's wifi hotspot
|
||||
- Start PlotJuggler with `ZMQ=1 ./juggle.py --stream`, find the `Cereal Subscriber` plugin in the dropdown under Streaming, and click `Start`.
|
||||
|
||||
If streaming to PlotJuggler from a replay on your PC, simply run: `./juggle.py --stream` and start the cereal subscriber.
|
||||
|
||||
## Demo
|
||||
|
||||
For a quick demo, go through the installation step and run this command:
|
||||
|
||||
`./juggle.py --demo --layout=layouts/tuning.xml`
|
||||
|
||||
## Layouts
|
||||
|
||||
If you create a layout that's useful for others, consider upstreaming it.
|
||||
|
||||
### Tuning
|
||||
|
||||
Use this layout to improve your car's tuning and generate plots for tuning PRs. Also see the [tuning wiki](https://github.com/commaai/openpilot/wiki/Tuning) and tuning PR template.
|
||||
|
||||
`--layout layouts/tuning.xml`
|
||||
|
||||
|
||||

|
||||
Executable
+158
@@ -0,0 +1,158 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import sys
|
||||
import platform
|
||||
import shutil
|
||||
import subprocess
|
||||
import tarfile
|
||||
import tempfile
|
||||
import requests
|
||||
import argparse
|
||||
from functools import partial
|
||||
|
||||
from opendbc.car.fingerprints import MIGRATION
|
||||
from openpilot.common.basedir import BASEDIR
|
||||
from openpilot.common.swaglog import cloudlog
|
||||
from openpilot.tools.cabana.dbc.generate_dbc_json import generate_dbc_dict
|
||||
from openpilot.tools.lib.logreader import LogReader, ReadMode, save_log
|
||||
from openpilot.selfdrive.test.process_replay.migration import migrate_all
|
||||
|
||||
juggle_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
os.environ['LD_LIBRARY_PATH'] = os.environ.get('LD_LIBRARY_PATH', '') + f":{juggle_dir}/bin/"
|
||||
|
||||
DEMO_ROUTE = "5beb9b58bd12b691/0000010a--a51155e496"
|
||||
RELEASES_URL = "https://github.com/commaai/PlotJuggler/releases/download/latest"
|
||||
INSTALL_DIR = os.path.join(juggle_dir, "bin")
|
||||
PLOTJUGGLER_BIN = os.path.join(juggle_dir, "bin/plotjuggler")
|
||||
MINIMUM_PLOTJUGGLER_VERSION = (3, 5, 2)
|
||||
MAX_STREAMING_BUFFER_SIZE = 1000
|
||||
|
||||
|
||||
def print_jotpluggler_banner():
|
||||
purple = "\033[95m" if sys.stdout.isatty() else ""
|
||||
reset = "\033[0m" if purple else ""
|
||||
print(f"{purple}+-------------------------------------------------------------+{reset}")
|
||||
print(f"{purple}|{reset} JotPluggler is the future! Try it like this: {purple}|{reset}")
|
||||
print(f"{purple}|{reset} ./tools/jotpluggler/jotpluggler --demo --layout tuning {purple}|{reset}")
|
||||
print(f"{purple}|{reset} {purple}|{reset}")
|
||||
print(f"{purple}|{reset} PlotJuggler will be deleted soon. {purple}|{reset}")
|
||||
print(f"{purple}|{reset} Missing a feature? Open an issue or post in #dev-openpilot. {purple}|{reset}")
|
||||
print(f"{purple}+-------------------------------------------------------------+{reset}")
|
||||
|
||||
|
||||
def install():
|
||||
m = f"{platform.system()}-{platform.machine()}"
|
||||
supported = ("Linux-x86_64", "Linux-aarch64", "Darwin-arm64")
|
||||
if m not in supported:
|
||||
raise Exception(f"Unsupported platform: '{m}'. Supported platforms: {supported}")
|
||||
|
||||
if os.path.exists(INSTALL_DIR):
|
||||
shutil.rmtree(INSTALL_DIR)
|
||||
os.mkdir(INSTALL_DIR)
|
||||
|
||||
url = os.path.join(RELEASES_URL, m + ".tar.gz")
|
||||
with requests.get(url, stream=True, timeout=10) as r, tempfile.NamedTemporaryFile() as tmp:
|
||||
r.raise_for_status()
|
||||
with open(tmp.name, 'wb') as tmpf:
|
||||
for chunk in r.iter_content(chunk_size=1024 * 1024):
|
||||
tmpf.write(chunk)
|
||||
|
||||
with tarfile.open(tmp.name) as tar:
|
||||
tar.extractall(path=INSTALL_DIR, filter="data")
|
||||
|
||||
|
||||
def get_plotjuggler_version():
|
||||
out = subprocess.check_output([PLOTJUGGLER_BIN, "-v"], encoding="utf-8").strip()
|
||||
version = out.split(" ")[1]
|
||||
return tuple(map(int, version.split(".")))
|
||||
|
||||
|
||||
def start_juggler(fn=None, dbc=None, layout=None, route_or_segment_name=None, platform=None):
|
||||
env = os.environ.copy()
|
||||
env["BASEDIR"] = BASEDIR
|
||||
env["PATH"] = f"{INSTALL_DIR}:{os.getenv('PATH', '')}"
|
||||
if dbc:
|
||||
if os.path.exists(dbc):
|
||||
dbc = os.path.abspath(dbc)
|
||||
env["DBC_NAME"] = dbc
|
||||
|
||||
extra_args = ""
|
||||
if fn is not None:
|
||||
extra_args += f" -d {os.path.abspath(fn)}"
|
||||
if layout is not None:
|
||||
extra_args += f" -l {os.path.abspath(layout)}"
|
||||
if route_or_segment_name is not None:
|
||||
extra_args += f" --window_title \"{route_or_segment_name}{f' ({platform})' if platform is not None else ''}\""
|
||||
|
||||
cmd = f'{PLOTJUGGLER_BIN} --buffer_size {MAX_STREAMING_BUFFER_SIZE} --plugin_folders {INSTALL_DIR}{extra_args}'
|
||||
subprocess.call(cmd, shell=True, env=env, cwd=juggle_dir)
|
||||
|
||||
|
||||
def process(can, lr):
|
||||
return [d for d in lr if can or d.which() not in ['can', 'sendcan'] and not d.which().startswith('customReserved')]
|
||||
|
||||
|
||||
def juggle_route(route_or_segment_name, can, layout, dbc, should_migrate):
|
||||
lr = LogReader(route_or_segment_name, default_mode=ReadMode.AUTO_INTERACTIVE)
|
||||
|
||||
all_data = lr.run_across_segments(24, partial(process, can))
|
||||
if should_migrate:
|
||||
all_data = migrate_all(all_data)
|
||||
|
||||
# Infer DBC name from logs
|
||||
platform = None
|
||||
if dbc is None:
|
||||
try:
|
||||
CP = lr.first('carParams')
|
||||
platform = MIGRATION.get(CP.carFingerprint, CP.carFingerprint)
|
||||
dbc = generate_dbc_dict()[platform]
|
||||
except Exception:
|
||||
cloudlog.exception("Failed to get DBC name from logs!")
|
||||
|
||||
with tempfile.NamedTemporaryFile(suffix='.rlog', dir=juggle_dir) as tmp:
|
||||
save_log(tmp.name, all_data, compress=False)
|
||||
del all_data
|
||||
start_juggler(tmp.name, dbc, layout, route_or_segment_name, platform)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="A helper to run PlotJuggler on openpilot routes",
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
|
||||
parser.add_argument("--demo", action="store_true", help="Use the demo route instead of providing one")
|
||||
parser.add_argument("--can", action="store_true", help="Parse CAN data")
|
||||
parser.add_argument("--stream", action="store_true", help="Start PlotJuggler in streaming mode")
|
||||
parser.add_argument("--no-migration", action="store_true", help="Do not perform log migration")
|
||||
parser.add_argument("--layout", nargs='?', help="Run PlotJuggler with a pre-defined layout")
|
||||
parser.add_argument("--install", action="store_true", help="Install or update PlotJuggler + plugins")
|
||||
parser.add_argument("--dbc", help="Set the DBC name to load for parsing CAN data. If not set, the DBC will be automatically inferred from the logs.")
|
||||
parser.add_argument("route_or_segment_name", nargs='?', help="The route or segment name to plot (cabana share URL accepted)")
|
||||
|
||||
if len(sys.argv) == 1:
|
||||
print_jotpluggler_banner()
|
||||
print()
|
||||
parser.print_help()
|
||||
sys.exit()
|
||||
args = parser.parse_args()
|
||||
|
||||
print_jotpluggler_banner()
|
||||
print()
|
||||
|
||||
if args.install:
|
||||
install()
|
||||
sys.exit()
|
||||
|
||||
if not os.path.exists(PLOTJUGGLER_BIN):
|
||||
print("PlotJuggler is missing. Downloading...")
|
||||
install()
|
||||
|
||||
if get_plotjuggler_version() < MINIMUM_PLOTJUGGLER_VERSION:
|
||||
print("PlotJuggler is out of date. Installing update...")
|
||||
install()
|
||||
|
||||
if args.stream:
|
||||
start_juggler(layout=args.layout)
|
||||
else:
|
||||
route_or_segment_name = DEMO_ROUTE if args.demo else args.route_or_segment_name.strip()
|
||||
juggle_route(route_or_segment_name, args.can, args.layout, args.dbc, not args.no_migration)
|
||||
@@ -0,0 +1,86 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab containers="1" tab_name="tab1">
|
||||
<Container>
|
||||
<DockSplitter sizes="0.33362;0.33276;0.33362" count="3" orientation="-">
|
||||
<DockArea name="CAN RX">
|
||||
<plot style="Lines" flip_y="false" mode="TimeSeries" flip_x="false">
|
||||
<range top="1101.875000" left="0.000000" bottom="-26.875000" right="60.526742"/>
|
||||
<limitY/>
|
||||
<curve name="/pandaStates/0/canState0/totalRxCnt" color="#f14cc1">
|
||||
<transform alias="/pandaStates/0/canState0/totalRxCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve name="/pandaStates/0/canState1/totalRxCnt" color="#9467bd">
|
||||
<transform alias="/pandaStates/0/canState1/totalRxCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve name="/pandaStates/0/canState2/totalRxCnt" color="#ff7f0e">
|
||||
<transform alias="/pandaStates/0/canState2/totalRxCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="CAN TX">
|
||||
<plot style="Lines" flip_y="false" mode="TimeSeries" flip_x="false">
|
||||
<range top="455.100000" left="0.000000" bottom="-11.100000" right="60.526742"/>
|
||||
<limitY/>
|
||||
<curve name="/pandaStates/0/canState0/totalTxCnt" color="#17becf">
|
||||
<transform alias="/pandaStates/0/canState0/totalTxCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve name="/pandaStates/0/canState1/totalTxCnt" color="#bcbd22">
|
||||
<transform alias="/pandaStates/0/canState1/totalTxCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve name="/pandaStates/0/canState2/totalTxCnt" color="#1f77b4">
|
||||
<transform alias="/pandaStates/0/canState2/totalTxCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="CAN errors">
|
||||
<plot style="Lines" flip_y="false" mode="TimeSeries" flip_x="false">
|
||||
<range top="2515.350000" left="0.000000" bottom="-61.350000" right="60.526742"/>
|
||||
<limitY/>
|
||||
<curve name="/pandaStates/0/canState0/totalErrorCnt" color="#1f77b4">
|
||||
<transform alias="/pandaStates/0/canState0/totalErrorCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve name="/pandaStates/0/canState1/totalErrorCnt" color="#d62728">
|
||||
<transform alias="/pandaStates/0/canState1/totalErrorCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve name="/pandaStates/0/canState2/totalErrorCnt" color="#1ac938">
|
||||
<transform alias="/pandaStates/0/canState2/totalErrorCnt[Derivative]" name="Derivative">
|
||||
<options radioChecked="radioCustom" lineEdit="1.0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<customMathEquations/>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab tab_name="SOF / EOF (encodeIdx)" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" sizes="0.500885;0.499115" count="2">
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
|
||||
<range bottom="35000000.000000" left="0.000000" top="65000000.000000" right="630.006367"/>
|
||||
<limitY max="6.5e+07" min="3.5e+07"/>
|
||||
<curve color="#1f77b4" name="/driverEncodeIdx/timestampSof">
|
||||
<transform name="Derivative" alias="/driverEncodeIdx/timestampSof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#d62728" name="/roadEncodeIdx/timestampSof">
|
||||
<transform name="Derivative" alias="/roadEncodeIdx/timestampSof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#1ac938" name="/wideRoadEncodeIdx/timestampSof">
|
||||
<transform name="Derivative" alias="/wideRoadEncodeIdx/timestampSof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
|
||||
<range bottom="35000000.000000" left="0.000000" top="65000000.000000" right="630.006367"/>
|
||||
<limitY max="6.5e+07" min="3.5e+07"/>
|
||||
<curve color="#f14cc1" name="/driverEncodeIdx/timestampEof">
|
||||
<transform name="Derivative" alias="/driverEncodeIdx/timestampEof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#9467bd" name="/roadEncodeIdx/timestampEof">
|
||||
<transform name="Derivative" alias="/roadEncodeIdx/timestampEof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#17becf" name="/wideRoadEncodeIdx/timestampEof">
|
||||
<transform name="Derivative" alias="/wideRoadEncodeIdx/timestampEof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab tab_name="model timings" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" sizes="0.5;0.5" count="2">
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
|
||||
<range bottom="0.015143" left="0.000000" top="0.016865" right="630.006367"/>
|
||||
<limitY/>
|
||||
<curve color="#ff7f0e" name="/modelV2/modelExecutionTime"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
|
||||
<range bottom="-0.100000" left="0.000000" top="0.100000" right="630.006367"/>
|
||||
<limitY/>
|
||||
<curve color="#f14cc1" name="/modelV2/frameDropPerc"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab tab_name="sensor info" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" sizes="1" count="1">
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
|
||||
<range bottom="-0.100000" left="0.000000" top="0.100000" right="630.006367"/>
|
||||
<limitY/>
|
||||
<curve color="#bcbd22" name="/driverCameraState/sensor"/>
|
||||
<curve color="#1f77b4" name="/roadCameraState/sensor"/>
|
||||
<curve color="#d62728" name="/wideRoadCameraState/sensor"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab tab_name="SOF / EOF (cameraState)" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" sizes="0.500885;0.499115" count="2">
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
|
||||
<range bottom="35000000.000000" left="0.000000" top="65000000.000000" right="630.006367"/>
|
||||
<limitY max="6.5e+07" min="3.5e+07"/>
|
||||
<curve color="#1f77b4" name="/driverCameraState/timestampSof">
|
||||
<transform name="Derivative" alias="/driverCameraState/timestampSof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#d62728" name="/roadCameraState/timestampSof">
|
||||
<transform name="Derivative" alias="/roadCameraState/timestampSof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#1ac938" name="/wideRoadCameraState/timestampSof">
|
||||
<transform name="Derivative" alias="/wideRoadCameraState/timestampSof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
|
||||
<range bottom="35000000.000000" left="0.000000" top="65000000.000000" right="630.006367"/>
|
||||
<limitY max="6.5e+07" min="3.5e+07"/>
|
||||
<curve color="#ff7f0e" name="/driverCameraState/timestampEof">
|
||||
<transform name="Derivative" alias="/driverCameraState/timestampEof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#f14cc1" name="/roadCameraState/timestampEof">
|
||||
<transform name="Derivative" alias="/roadCameraState/timestampEof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#9467bd" name="/wideRoadCameraState/timestampEof">
|
||||
<transform name="Derivative" alias="/wideRoadCameraState/timestampEof[Derivative]">
|
||||
<options lineEdit="1.0" radioChecked="radioCustom"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<customMathEquations/>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget parent="main_window" name="Main Window">
|
||||
<Tab containers="1" tab_name="tab1">
|
||||
<Container>
|
||||
<DockSplitter count="2" sizes="0.500381;0.499619" orientation="-">
|
||||
<DockSplitter count="2" sizes="0.5;0.5" orientation="|">
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" mode="TimeSeries" flip_y="false" flip_x="false">
|
||||
<range right="632.799721" bottom="-17755.925000" top="771630.925000" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve color="#1f77b4" name="/pandaStates/0/canState0/totalRxCnt"/>
|
||||
<curve color="#d62728" name="/pandaStates/0/canState1/totalRxCnt"/>
|
||||
<curve color="#1ac938" name="/pandaStates/0/canState2/totalRxCnt"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" mode="TimeSeries" flip_y="false" flip_x="false">
|
||||
<range right="632.799721" bottom="-18545.500000" top="760365.500000" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve color="#ff7f0e" name="/pandaStates/0/canState0/totalTxCnt"/>
|
||||
<curve color="#f14cc1" name="/pandaStates/0/canState1/totalTxCnt"/>
|
||||
<curve color="#9467bd" name="/pandaStates/0/canState2/totalTxCnt"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
<DockSplitter count="3" sizes="0.333333;0.333333;0.333333" orientation="|">
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" mode="TimeSeries" flip_y="false" flip_x="false">
|
||||
<range right="632.799721" bottom="-1.350000" top="55.350000" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve color="#ff7f0e" name="/pandaStates/0/canState0/totalRxLostCnt"/>
|
||||
<curve color="#f14cc1" name="/pandaStates/0/canState1/totalRxLostCnt"/>
|
||||
<curve color="#9467bd" name="/pandaStates/0/canState2/totalRxLostCnt"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" mode="TimeSeries" flip_y="false" flip_x="false">
|
||||
<range right="632.799721" bottom="-0.050000" top="2.050000" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve color="#17becf" name="/pandaStates/0/canState0/totalTxLostCnt"/>
|
||||
<curve color="#bcbd22" name="/pandaStates/0/canState1/totalTxLostCnt"/>
|
||||
<curve color="#1f77b4" name="/pandaStates/0/canState2/totalTxLostCnt"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" mode="TimeSeries" flip_y="false" flip_x="false">
|
||||
<range right="632.799721" bottom="-0.100000" top="0.100000" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve color="#17becf" name="/pandaStates/0/canState0/busOffCnt"/>
|
||||
<curve color="#1ac938" name="/pandaStates/0/canState1/busOffCnt"/>
|
||||
<curve color="#bcbd22" name="/pandaStates/0/canState2/busOffCnt"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget parent="main_window" name="Main Window">
|
||||
<Tab tab_name="tab1" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="5" sizes="0.2;0.2;0.2;0.2;0.2">
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
|
||||
<range top="1.025000" bottom="-0.025000" left="0.018309" right="59.674401"/>
|
||||
<limitY/>
|
||||
<curve color="#1f77b4" name="/carControl/enabled"/>
|
||||
<curve color="#d62728" name="/pandaStates/0/controlsAllowed"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
|
||||
<range top="27.087398" bottom="-0.905168" left="0.018309" right="59.674401"/>
|
||||
<limitY/>
|
||||
<curve color="#9467bd" name="/carState/cumLagMs"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
|
||||
<range top="1.025000" bottom="-0.025000" left="0.018309" right="59.674401"/>
|
||||
<limitY/>
|
||||
<curve color="#1f77b4" name="/pandaStates/0/safetyRxInvalid"/>
|
||||
<curve color="#e801ce" name="/pandaStates/0/safetyRxChecksInvalid"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
|
||||
<range top="158.850000" bottom="-2.850000" left="0.018309" right="59.674401"/>
|
||||
<limitY/>
|
||||
<curve color="#d62728" name="/pandaStates/0/safetyTxBlocked"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" flip_x="false" mode="TimeSeries" flip_y="false">
|
||||
<range top="1.025000" bottom="-0.025000" left="0.018309" right="59.674401"/>
|
||||
<limitY/>
|
||||
<curve color="#1ac938" name="/carState/gasPressed"/>
|
||||
<curve color="#ff7f0e" name="/carState/brakePressed"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<customMathEquations/>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
@@ -0,0 +1,62 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget parent="main_window" name="Main Window">
|
||||
<Tab tab_name="tab1" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" sizes="0.24977;0.250689;0.24977;0.24977" count="4">
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" flip_x="false" style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" right="1678.753571" bottom="-0.025000" top="1.025000"/>
|
||||
<limitY/>
|
||||
<curve name="/gpsLocationExternal/hasFix" color="#1f77b4"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" flip_x="false" style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" right="1678.753571" bottom="-0.425000" top="17.425000"/>
|
||||
<limitY/>
|
||||
<curve name="/gpsLocationExternal/satelliteCount" color="#d62728"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" flip_x="false" style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" right="1678.753571" bottom="0.000000" top="3.000000"/>
|
||||
<limitY max="3" min="0"/>
|
||||
<curve name="/gpsLocationExternal/horizontalAccuracy" color="#1ac938"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" flip_x="false" style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" right="1678.753571" bottom="-17.262000" top="766.374004"/>
|
||||
<limitY/>
|
||||
<curve name="/gpsLocationExternal/horizontalAccuracy" color="#1ac938"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad CSV">
|
||||
<default time_axis="" delimiter="0"/>
|
||||
</plugin>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="DataLoad ULog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
<plugin ID="UDP Server"/>
|
||||
<plugin ID="WebSocket Server"/>
|
||||
<plugin ID="ZMQ Subscriber"/>
|
||||
<plugin ID="Fast Fourier Transform"/>
|
||||
<plugin ID="Quaternion to RPY"/>
|
||||
<plugin ID="CSV Exporter"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<customMathEquations/>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab tab_name="tab1" containers="1">
|
||||
<Container>
|
||||
<DockSplitter count="3" sizes="0.333805;0.33239;0.333805" orientation="-">
|
||||
<DockArea name="...">
|
||||
<plot mode="TimeSeries" style="Lines" flip_y="false" flip_x="false">
|
||||
<range bottom="0.368228" right="196.811937" left="76.646983" top="32.070386"/>
|
||||
<limitY/>
|
||||
<curve name="haversine distance [m]" color="#1f77b4"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot mode="TimeSeries" style="Lines" flip_y="false" flip_x="false">
|
||||
<range bottom="-0.259115" right="196.811937" left="76.646983" top="12.637299"/>
|
||||
<limitY/>
|
||||
<curve name="/carState/vEgo" color="#17becf"/>
|
||||
<curve name="/gpsLocationExternal/speed" color="#bcbd22"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockSplitter count="2" sizes="0.500516;0.499484" orientation="|">
|
||||
<DockArea name="...">
|
||||
<plot mode="TimeSeries" style="Lines" flip_y="false" flip_x="false">
|
||||
<range bottom="-0.100000" right="196.811937" left="76.646983" top="0.100000"/>
|
||||
<limitY/>
|
||||
<curve name="/liveLocationKalmanDEPRECATED/positionGeodetic/std/0" color="#d62728"/>
|
||||
<curve name="/liveLocationKalmanDEPRECATED/positionGeodetic/std/1" color="#1ac938"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot mode="TimeSeries" style="Lines" flip_y="false" flip_x="false">
|
||||
<range bottom="-0.449385" right="196.811937" left="76.646983" top="7.160833"/>
|
||||
<limitY/>
|
||||
<curve name="/gpsLocationExternal/horizontalAccuracy" color="#ff7f0e"/>
|
||||
<curve name="/gpsLocationExternal/verticalAccuracy" color="#f14cc1"/>
|
||||
<curve name="/gpsLocationExternal/speedAccuracy" color="#9467bd"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<customMathEquations>
|
||||
<snippet name="haversine distance [m]">
|
||||
<global>R = 6378.137 -- Radius of earth in KM</global>
|
||||
<function>-- Compute the Haversine distance between
|
||||
-- two points defined by latitude and longitude.
|
||||
-- Return the distance in meters
|
||||
lat1, lon1 = value, v1
|
||||
lat2, lon2 = v2, v3
|
||||
dLat = (lat2 - lat1) * math.pi / 180
|
||||
dLon = (lon2 - lon1) * math.pi / 180
|
||||
a = math.sin(dLat/2) * math.sin(dLat/2) +
|
||||
math.cos(lat1 * math.pi / 180) * math.cos(lat2 * math.pi / 180) *
|
||||
math.sin(dLon/2) * math.sin(dLon/2)
|
||||
c = 2 * math.atan(math.sqrt(a), math.sqrt(1-a))
|
||||
d = R * c
|
||||
distance = d * 1000 -- meters
|
||||
return distance</function>
|
||||
<linked_source>/gpsLocationExternal/latitude</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/gpsLocationExternal/longitude</v1>
|
||||
<v2>/liveLocationKalmanDEPRECATED/positionGeodetic/value/0</v2>
|
||||
<v3>/liveLocationKalmanDEPRECATED/positionGeodetic/value/1</v3>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
</customMathEquations>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
@@ -0,0 +1,100 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab tab_name="tab1" containers="1">
|
||||
<Container>
|
||||
<DockSplitter sizes="0.166588;0.167062;0.166113;0.166588;0.167062;0.166588" orientation="-" count="6">
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" flip_y="false" style="Lines" mode="TimeSeries">
|
||||
<range right="2280.128382" left="0.000000" top="1.025000" bottom="-0.025000"/>
|
||||
<limitY/>
|
||||
<curve color="#ff7f0e" name="/livePose/inputsOK"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" flip_y="false" style="Lines" mode="TimeSeries">
|
||||
<range right="2280.128382" left="0.000000" top="14.542814" bottom="-5.586039"/>
|
||||
<limitY/>
|
||||
<curve color="#f14cc1" name="/accelerometer/acceleration/v/0"/>
|
||||
<curve color="#9467bd" name="/accelerometer/acceleration/v/1"/>
|
||||
<curve color="#17becf" name="/accelerometer/acceleration/v/2"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" flip_y="false" style="Lines" mode="TimeSeries">
|
||||
<range right="2280.128382" left="0.000000" top="0.988911" bottom="-0.745939"/>
|
||||
<limitY/>
|
||||
<curve color="#d62728" name="/gyroscope/gyroUncalibrated/v/0"/>
|
||||
<curve color="#1ac938" name="/gyroscope/gyroUncalibrated/v/1"/>
|
||||
<curve color="#ff7f0e" name="/gyroscope/gyroUncalibrated/v/2"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" flip_y="false" style="Lines" mode="TimeSeries">
|
||||
<range right="2280.128382" left="0.000000" top="1.025000" bottom="-0.025000"/>
|
||||
<limitY/>
|
||||
<curve color="#17becf" name="/accelerometer/__valid"/>
|
||||
<curve color="#bcbd22" name="/gyroscope/__valid"/>
|
||||
<curve color="#f14cc1" name="/carState/__valid"/>
|
||||
<curve color="#1ac938" name="/liveCalibration/__valid"/>
|
||||
<curve color="#9467bd" name="/cameraOdometry/__valid"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" flip_y="false" style="Lines" mode="TimeSeries">
|
||||
<range right="2280.128382" left="0.000000" top="1000000000.292252" bottom="999999999.735447"/>
|
||||
<limitY/>
|
||||
<curve color="#1f77b4" name="/gyroscope/__logMonoTime">
|
||||
<transform alias="/gyroscope/__logMonoTime[Derivative]" name="Derivative">
|
||||
<options lineEdit="1.0" radioChecked="radioActual"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#d62728" name="/accelerometer/__logMonoTime">
|
||||
<transform alias="/accelerometer/__logMonoTime[Derivative]" name="Derivative">
|
||||
<options lineEdit="1.0" radioChecked="radioActual"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_x="false" flip_y="false" style="Lines" mode="TimeSeries">
|
||||
<range right="2280.128382" left="0.000000" top="20790107743.932232" bottom="-529653831.495853"/>
|
||||
<limitY/>
|
||||
<curve color="#bcbd22" name="/accelerometer/timestamp">
|
||||
<transform alias="/accelerometer/timestamp[Derivative]" name="Derivative">
|
||||
<options lineEdit="1.0" radioChecked="radioActual"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve color="#1f77b4" name="/gyroscope/timestamp">
|
||||
<transform alias="/gyroscope/timestamp[Derivative]" name="Derivative">
|
||||
<options lineEdit="1.0" radioChecked="radioActual"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad CSV">
|
||||
<default delimiter="0" time_axis=""/>
|
||||
</plugin>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="DataLoad ULog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
<plugin ID="UDP Server"/>
|
||||
<plugin ID="ZMQ Subscriber"/>
|
||||
<plugin ID="Fast Fourier Transform"/>
|
||||
<plugin ID="Quaternion to RPY"/>
|
||||
<plugin ID="CSV Exporter"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab tab_name="tab1" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" sizes="0.250401;0.249599;0.250401;0.249599" count="4">
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" flip_x="false" mode="TimeSeries" style="Lines">
|
||||
<range right="126.285782" top="1.391623" left="104.907277" bottom="-2.563614"/>
|
||||
<limitY/>
|
||||
<curve name="/carState/aEgo" color="#f14cc1"/>
|
||||
<curve name="/longitudinalPlan/accels/0" color="#9467bd"/>
|
||||
<curve name="/carControl/actuators/accel" color="#17becf"/>
|
||||
<curve name="/carOutput/actuatorsOutput/accel" color="#d62728"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" flip_x="false" mode="TimeSeries" style="Lines">
|
||||
<range right="126.285782" top="1.184960" left="104.907277" bottom="-1.811222" />
|
||||
<limitY/>
|
||||
<curve name="/controlsState/upAccelCmd" color="#1f77b4"/>
|
||||
<curve name="/controlsState/uiAccelCmd" color="#d62728"/>
|
||||
<curve name="/controlsState/ufAccelCmd" color="#1ac938"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" flip_x="false" mode="TimeSeries" style="Lines">
|
||||
<range right="126.285782" top="15.862889" left="104.907277" bottom="-0.568809" />
|
||||
<limitY/>
|
||||
<curve name="/carState/vEgo" color="#1ac938"/>
|
||||
<curve name="/longitudinalPlan/speeds/0" color="#ff7f0e"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" flip_x="false" mode="TimeSeries" style="Lines">
|
||||
<range right="126.285782" top="1.025000" left="104.907277" bottom="-0.025000" />
|
||||
<limitY/>
|
||||
<curve name="/carControl/longActive" color="#1f77b4"/>
|
||||
<curve name="/carState/gasPressed" color="#d62728"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<customMathEquations/>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab containers="1" tab_name="tab1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="4" sizes="0.249724;0.250829;0.249724;0.249724">
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" flip_x="false" mode="TimeSeries">
|
||||
<range left="0.000450" top="6.050533" right="2483.624998" bottom="-7.599037"/>
|
||||
<limitY/>
|
||||
<curve color="#1ac938" name="Actual lateral accel (roll compensated)"/>
|
||||
<curve color="#ff7f0e" name="Desired lateral accel (roll compensated)"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" flip_x="false" mode="TimeSeries">
|
||||
<range left="0.000450" top="5.384416" right="2483.624998" bottom="-7.503945"/>
|
||||
<limitY/>
|
||||
<curve color="#1ac938" name="roll compensated lateral acceleration"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" flip_x="false" mode="TimeSeries">
|
||||
<range left="0.000450" top="1.050000" right="2483.624998" bottom="-1.050000"/>
|
||||
<limitY/>
|
||||
<curve color="#0097ff" name="/carState/steeringPressed"/>
|
||||
<curve color="#d62728" name="/carOutput/actuatorsOutput/torque"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" flip_x="false" mode="TimeSeries">
|
||||
<range left="0.000450" top="80.762969" right="2483.624998" bottom="-2.181837"/>
|
||||
<limitY/>
|
||||
<curve color="#f14cc1" name="/carState/vEgo">
|
||||
<transform alias="/carState/vEgo[Scale/Offset]" name="Scale/Offset">
|
||||
<options value_offset="0" time_offset="0" value_scale="2.23694"/>
|
||||
</transform>
|
||||
</curve>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<customMathEquations>
|
||||
<snippet name="roll compensated lateral acceleration">
|
||||
<global></global>
|
||||
<function>if (v3 == 0 and v4 == 1) then
|
||||
return (value * v1 ^ 2) - (v2 * 9.81)
|
||||
end
|
||||
return 0</function>
|
||||
<linked_source>/controlsState/curvature</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/vEgo</v1>
|
||||
<v2>/liveParameters/roll</v2>
|
||||
<v3>/carState/steeringPressed</v3>
|
||||
<v4>/carControl/latActive</v4>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="Desired lateral accel (roll compensated)">
|
||||
<global></global>
|
||||
<function>return (value * v1 ^ 2) - (v2 * 9.81)</function>
|
||||
<linked_source>/controlsState/desiredCurvature</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/vEgo</v1>
|
||||
<v2>/liveParameters/roll</v2>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="Actual lateral accel (roll compensated)">
|
||||
<global></global>
|
||||
<function>return (value * v1 ^ 2) - (v2 * 9.81)</function>
|
||||
<linked_source>/controlsState/curvature</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/vEgo</v1>
|
||||
<v2>/liveParameters/roll</v2>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
</customMathEquations>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab tab_name="tab1" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="4" sizes="0.249729;0.250814;0.249729;0.249729">
|
||||
<DockArea name="...">
|
||||
<plot mode="TimeSeries" flip_x="false" flip_y="false" style="Lines">
|
||||
<range top="102.500000" right="59.992103" left="0.000000" bottom="-2.500000"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/cpuUsagePercent/0" color="#1f77b4"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/1" color="#d62728"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/2" color="#1ac938"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/3" color="#ff7f0e"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/4" color="#f14cc1"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/5" color="#9467bd"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/6" color="#17becf"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/7" color="#bcbd22"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot mode="TimeSeries" flip_x="false" flip_y="false" style="Lines">
|
||||
<range top="64.005001" right="59.992103" left="0.000000" bottom="51.195000"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/cpuTempC/0" color="#d62728"/>
|
||||
<curve name="/deviceState/cpuTempC/1" color="#1ac938"/>
|
||||
<curve name="/deviceState/cpuTempC/2" color="#ff7f0e"/>
|
||||
<curve name="/deviceState/cpuTempC/3" color="#f14cc1"/>
|
||||
<curve name="/deviceState/cpuTempC/4" color="#9467bd"/>
|
||||
<curve name="/deviceState/cpuTempC/5" color="#17becf"/>
|
||||
<curve name="/deviceState/cpuTempC/6" color="#bcbd22"/>
|
||||
<curve name="/deviceState/cpuTempC/7" color="#1f77b4"/>
|
||||
<curve name="/deviceState/gpuTempC/0" color="#d62728"/>
|
||||
<curve name="/deviceState/gpuTempC/1" color="#1ac938"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot mode="TimeSeries" flip_x="false" flip_y="false" style="Lines">
|
||||
<range top="37.371108" right="59.992103" left="0.000000" bottom="-0.911490"/>
|
||||
<limitY/>
|
||||
<curve name="/modelV2/frameDropPerc" color="#f14cc1"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot mode="TimeSeries" flip_x="false" flip_y="false" style="Lines">
|
||||
<range top="-3.593455" right="59.992103" left="0.000000" bottom="-12.190956"/>
|
||||
<limitY/>
|
||||
<curve name="/carState/cumLagMs" color="#9467bd"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
@@ -0,0 +1,107 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab containers="1" tab_name="tab1">
|
||||
<Container>
|
||||
<DockSplitter count="6" orientation="-" sizes="0.166785;0.166785;0.166075;0.166785;0.166785;0.166785">
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="87.987497" bottom="75.912497" right="301.842654"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/cpuTempC/0" color="#1f77b4"/>
|
||||
<curve name="/deviceState/cpuTempC/1" color="#d62728"/>
|
||||
<curve name="/deviceState/cpuTempC/2" color="#1ac938"/>
|
||||
<curve name="/deviceState/cpuTempC/3" color="#ff7f0e"/>
|
||||
<curve name="/deviceState/cpuTempC/4" color="#f14cc1"/>
|
||||
<curve name="/deviceState/cpuTempC/5" color="#9467bd"/>
|
||||
<curve name="/deviceState/cpuTempC/6" color="#17becf"/>
|
||||
<curve name="/deviceState/cpuTempC/7" color="#bcbd22"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="85.861052" bottom="66.496950" right="301.842654"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/pmicTempC/0" color="#1f77b4"/>
|
||||
<curve name="/deviceState/gpuTempC/0" color="#d62728"/>
|
||||
<curve name="/deviceState/gpuTempC/1" color="#1ac938"/>
|
||||
<curve name="/deviceState/memoryTempC" color="#f14cc1"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="86.207876" bottom="70.665918" right="301.842654"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/maxTempC" color="#1f77b4"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="1.025000" bottom="-0.025000" right="301.842654"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/thermalStatus" color="#1f77b4"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockSplitter count="3" orientation="|" sizes="0.333124;0.333752;0.333124">
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="12.057358" bottom="4.843517" right="301.842654"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/powerDrawW" color="#ff7f0e"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="100.000000" bottom="0.000000" right="301.842654"/>
|
||||
<limitY min="0" max="100"/>
|
||||
<curve name="/deviceState/fanSpeedPercentDesired" color="#9467bd"/>
|
||||
<curve name="/pandaStates/0/fanPower" color="#1f77b4"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="5018.400000" bottom="255.600000" right="301.842654"/>
|
||||
<limitY/>
|
||||
<curve name="/peripheralState/fanSpeedRpm" color="#1f77b4"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
<DockSplitter count="2" orientation="|" sizes="0.502513;0.497487">
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="100.025000" bottom="14.975000" right="301.842654"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/cpuUsagePercent/0" color="#1f77b4"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/1" color="#d62728"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/2" color="#1ac938"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/3" color="#ff7f0e"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range left="0.006955" top="102.500000" bottom="-2.500000" right="301.842654"/>
|
||||
<limitY/>
|
||||
<curve name="/deviceState/cpuUsagePercent/4" color="#f14cc1"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/5" color="#9467bd"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/6" color="#17becf"/>
|
||||
<curve name="/deviceState/cpuUsagePercent/7" color="#bcbd22"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<customMathEquations/>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,250 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab containers="1" tab_name="Lateral Plan Conformance">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="4" sizes="0.250949;0.249051;0.250949;0.249051">
|
||||
<DockArea name="desired vs actual lateral acceleration (closer means better conformance to plan)">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="1.858161" bottom="-1.823407" right="1138.891674" left="0.000194"/>
|
||||
<limitY/>
|
||||
<curve name="/controlsState/lateralControlState/torqueState/actualLateralAccel" color="#1f77b4"/>
|
||||
<curve name="/controlsState/lateralControlState/torqueState/desiredLateralAccel" color="#d62728"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="desired vs actual lateral acceleration, road-roll factored out (closer means better conformance to plan)">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="2.749816" bottom="-3.723091" right="1138.891674" left="0.000194"/>
|
||||
<limitY/>
|
||||
<curve name="Actual lateral accel (roll compensated)" color="#1ac938"/>
|
||||
<curve name="Desired lateral accel (roll compensated)" color="#ff7f0e"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="controller feed-forward vs actuator output (closer means controller prediction is more accurate)">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="1.978032" bottom="-1.570956" right="1138.891674" left="0.000194"/>
|
||||
<limitY/>
|
||||
<curve name="/carOutput/actuatorsOutput/torque" color="#9467bd">
|
||||
<transform alias="/carOutput/actuatorsOutput/torque[Scale/Offset]" name="Scale/Offset">
|
||||
<options value_offset="0" value_scale="-1" time_offset="0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve name="/controlsState/lateralControlState/torqueState/f" color="#1f77b4"/>
|
||||
<curve name="/carState/steeringPressed" color="#ff000f"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="vehicle speed">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="105.981304" bottom="-2.709314" right="1138.891674" left="0.000194"/>
|
||||
<limitY/>
|
||||
<curve name="carState.vEgo mph" color="#d62728"/>
|
||||
<curve name="carState.vEgo kmh" color="#1ac938"/>
|
||||
<curve name="/carState/vEgo" color="#ff7f0e"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab containers="1" tab_name="Vehicle Dynamics">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="3" sizes="0.334282;0.331437;0.334282">
|
||||
<DockArea name="configured-initial vs online-learned steerRatio, set configured value to match learned">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="19.665784" bottom="19.359553" right="1138.816328" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/carParams/steerRatio" color="#1f77b4"/>
|
||||
<curve name="/liveParameters/steerRatio" color="#1ac938"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="configured-initial vs online-learned tireStiffnessRatio, set configured value to match learned">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="1.112210" bottom="0.995631" right="1138.816328" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/carParams/tireStiffnessFactor" color="#d62728"/>
|
||||
<curve name="/liveParameters/stiffnessFactor" color="#ff7f0e"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="live steering angle offsets for straight-ahead driving, large values here may indicate alignment problems">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="-1.081041" bottom="-4.494133" right="1138.816328" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/liveParameters/angleOffsetAverageDeg" color="#f14cc1"/>
|
||||
<curve name="/liveParameters/angleOffsetDeg" color="#9467bd"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab containers="1" tab_name="Actuator Performance">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="3" sizes="0.333333;0.333333;0.333333">
|
||||
<DockArea name="offline-calculated vs online-learned lateral accel scaling factor, accel obtained from 100% actuator output">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="1.216110" bottom="0.539474" right="1138.920072" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/liveTorqueParameters/latAccelFactorFiltered" color="#1f77b4"/>
|
||||
<curve name="/liveTorqueParameters/latAccelFactorRaw" color="#d62728"/>
|
||||
<curve name="/carParams/lateralTuning/torque/latAccelFactor" color="#1c9222"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="learned lateral accel offset, vehicle-specific compensation to obtain true zero lateral accel">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="-0.304367" bottom="-0.418688" right="1138.920072" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/liveTorqueParameters/latAccelOffsetFiltered" color="#1ac938"/>
|
||||
<curve name="/liveTorqueParameters/latAccelOffsetRaw" color="#ff7f0e"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="offline-calculated vs online-learned EPS friction factor, necessary to start moving the steering wheel">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="0.226389" bottom="0.158050" right="1138.920072" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/liveTorqueParameters/frictionCoefficientFiltered" color="#f14cc1"/>
|
||||
<curve name="/liveTorqueParameters/frictionCoefficientRaw" color="#9467bd"/>
|
||||
<curve name="/carParams/lateralTuning/torque/friction" color="#1c9222"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab containers="1" tab_name="Actuator Delay">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="3" sizes="0.30441;0.358464;0.337127">
|
||||
<DockArea name="actuator lag learning state, 0 = learning, 1 = learned/applying, 2 = invalid">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="1.025000" bottom="-0.025000" right="1138.749979" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/liveDelay/status" color="#ff7f0e"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="offline default vs online estimated steering actuator lag">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="0.419648" bottom="0.318362" right="1138.749979" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/liveDelay/lateralDelay" color="#1f77b4"/>
|
||||
<curve name="/liveDelay/lateralDelayEstimate" color="#d62728"/>
|
||||
<curve name="opendbc default steering lag" color="#1ac938"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="online estimated steering actuator lag, standard deviation">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="0.067320" bottom="-0.001642" right="1138.749979" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/liveDelay/lateralDelayEstimateStd" color="#f14cc1"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab containers="1" tab_name="Controls Performance">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="4" sizes="0.265655;0.251898;0.245731;0.236717">
|
||||
<DockArea name="rate-of-change limits on steering actuator (blue = original, green = rate-limited before CAN output)">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="1.050000" bottom="-1.050000" right="1138.891921" left="0.000194"/>
|
||||
<limitY/>
|
||||
<curve name="/carControl/actuators/torque" color="#0c00f2"/>
|
||||
<curve name="/carOutput/actuatorsOutput/torque" color="#2cd63a"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="controller feed-forward vs actuator output (closer means controller prediction is more accurate)">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="1.978032" bottom="-1.570956" right="1138.891921" left="0.000194"/>
|
||||
<limitY/>
|
||||
<curve name="/carOutput/actuatorsOutput/torque" color="#9467bd">
|
||||
<transform alias="/carOutput/actuatorsOutput/torque[Scale/Offset]" name="Scale/Offset">
|
||||
<options value_offset="0" value_scale="-1.0" time_offset="0"/>
|
||||
</transform>
|
||||
</curve>
|
||||
<curve name="/controlsState/lateralControlState/torqueState/f" color="#1f77b4"/>
|
||||
<curve name="/carState/steeringPressed" color="#ff000f"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="proportional, integral, and feed-forward terms (actuator output = sum of PIF terms)">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="2.099784" bottom="-4.027542" right="1138.891921" left="0.000194"/>
|
||||
<limitY/>
|
||||
<curve name="/controlsState/lateralControlState/torqueState/f" color="#0ab027"/>
|
||||
<curve name="/controlsState/lateralControlState/torqueState/p" color="#d62728"/>
|
||||
<curve name="/controlsState/lateralControlState/torqueState/i" color="#ffaf00"/>
|
||||
<curve name="Zero" color="#756a6a"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="road roll angle, from openpilot localizer">
|
||||
<plot flip_y="false" style="Lines" mode="TimeSeries" flip_x="false">
|
||||
<range top="0.109446" bottom="-0.045525" right="1138.891921" left="0.000194"/>
|
||||
<limitY/>
|
||||
<curve name="/liveParameters/roll" color="#f14cc1"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad CSV">
|
||||
<default delimiter="0" time_axis=""/>
|
||||
</plugin>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="DataLoad ULog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
<plugin ID="UDP Server"/>
|
||||
<plugin ID="ZMQ Subscriber"/>
|
||||
<plugin ID="Fast Fourier Transform"/>
|
||||
<plugin ID="Quaternion to RPY"/>
|
||||
<plugin ID="Reactive Script Editor">
|
||||
<library code="--[[ Helper function to create a series from arrays

 new_series: a series previously created with ScatterXY.new(name)
 prefix: prefix of the timeseries, before the index of the array
 suffix_X: suffix to complete the name of the series containing the X value. If [nil], use the index of the array.
 suffix_Y: suffix to complete the name of the series containing the Y value
 timestamp: usually the tracker_time variable
 
 Example:
 
 Assuming we have multiple series in the form:
 
 /trajectory/node.{X}/position/x
 /trajectory/node.{X}/position/y
 
 where {N} is the index of the array (integer). We can create a reactive series from the array with:
 
 new_series = ScatterXY.new("my_trajectory") 
 CreateSeriesFromArray( new_series, "/trajectory/node", "position/x", "position/y", tracker_time );
--]]

function CreateSeriesFromArray( new_series, prefix, suffix_X, suffix_Y, timestamp )
 
 --- clear previous values
 new_series:clear()
 
 --- Append points to new_series
 index = 0
 while(true) do

 x = index;
 -- if not nil, get the X coordinate from a series
 if suffix_X ~= nil then 
 series_x = TimeseriesView.find( string.format( "%s.%d/%s", prefix, index, suffix_X) )
 if series_x == nil then break end
 x = series_x:atTime(timestamp)	 
 end
 
 series_y = TimeseriesView.find( string.format( "%s.%d/%s", prefix, index, suffix_Y) )
 if series_y == nil then break end 
 y = series_y:atTime(timestamp)
 
 new_series:push_back(x,y)
 index = index+1
 end
end

--[[ Similar to the built-in function GetSeriesNames(), but select only the names with a give prefix. --]]

function GetSeriesNamesByPrefix(prefix)
 -- GetSeriesNames(9 is a built-in function
 all_names = GetSeriesNames()
 filtered_names = {}
 for i, name in ipairs(all_names) do
 -- check the prefix
 if name:find(prefix, 1, #prefix) then
 table.insert(filtered_names, name);
 end
 end
 return filtered_names
end

--[[ Modify an existing series, applying offsets to all their X and Y values

 series: an existing timeseries, obtained with TimeseriesView.find(name)
 delta_x: offset to apply to each x value
 delta_y: offset to apply to each y value 
 
--]]

function ApplyOffsetInPlace(series, delta_x, delta_y)
 -- use C++ indeces, not Lua indeces
 for index=0, series:size()-1 do
 x,y = series:at(index)
 series:set(index, x + delta_x, y + delta_y)
 end
end
"/>
|
||||
<scripts/>
|
||||
</plugin>
|
||||
<plugin ID="CSV Exporter"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<customMathEquations>
|
||||
<snippet name="carState.vEgo kmh">
|
||||
<global></global>
|
||||
<function>return value * 3.6</function>
|
||||
<linked_source>/carState/vEgo</linked_source>
|
||||
</snippet>
|
||||
<snippet name="carState.vEgo mph">
|
||||
<global></global>
|
||||
<function>return value * 2.23694</function>
|
||||
<linked_source>/carState/vEgo</linked_source>
|
||||
</snippet>
|
||||
<snippet name="Desired lateral accel (roll compensated)">
|
||||
<global></global>
|
||||
<function>return (value * v1 ^ 2) - (v2 * 9.81)</function>
|
||||
<linked_source>/controlsState/desiredCurvature</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/vEgo</v1>
|
||||
<v2>/liveParameters/roll</v2>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="Actual lateral accel (roll compensated)">
|
||||
<global></global>
|
||||
<function>return (value * v1 ^ 2) - (v2 * 9.81)</function>
|
||||
<linked_source>/controlsState/curvature</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/vEgo</v1>
|
||||
<v2>/liveParameters/roll</v2>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="opendbc default steering lag">
|
||||
<global></global>
|
||||
<function>return value + 0.2</function>
|
||||
<linked_source>/carParams/steerActuatorDelay</linked_source>
|
||||
</snippet>
|
||||
<snippet name="Zero">
|
||||
<global></global>
|
||||
<function>return (0)</function>
|
||||
<linked_source>/carState/canValid</linked_source>
|
||||
</snippet>
|
||||
</customMathEquations>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,300 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root version="2.3.8">
|
||||
<tabbed_widget parent="main_window" name="Main Window">
|
||||
<Tab tab_name="Lateral" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="5" sizes="0.200458;0.199313;0.200458;0.199313;0.200458">
|
||||
<DockArea name="Velocity [m/s]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.253354" top="29.954036" bottom="-0.841715" right="631.055584"/>
|
||||
<limitY/>
|
||||
<curve color="#0072b2" name="/carState/vEgo"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Curvature [1/m] True [blue] Vehicle Model [purple] Plan [green]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" top="0.006648" bottom="-0.003150" right="631.055209"/>
|
||||
<limitY/>
|
||||
<curve color="#009e73" name="engaged curvature plan"/>
|
||||
<curve color="#785ef0" name="engaged curvature vehicle model"/>
|
||||
<curve color="#0072b2" name="engaged curvature yaw"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Roll [rad]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" top="0.166067" bottom="-1.598381" right="631.038276"/>
|
||||
<limitY/>
|
||||
<curve color="#ffb000" name="/carControl/orientationNED/0"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Engaged [green] Steering Pressed [blue]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.252984" top="1.025000" bottom="-0.025000" right="631.055584"/>
|
||||
<limitY/>
|
||||
<curve color="#009e73" name="/selfdriveState/enabled"/>
|
||||
<curve color="#0072b2" name="/carState/steeringPressed"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Steering Limited: Rate [orange] Saturated [magenta]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.253354" top="1.025000" bottom="-0.025000" right="631.055584"/>
|
||||
<limitY/>
|
||||
<curve name="steering rate limited" color="#ffb000"/>
|
||||
<curve name="/controlsState/lateralControlState/pidState/saturated" color="#dc267f"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab tab_name="Longitudinal" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="5" sizes="0.1875;0.1875;0.1875;0.1875;0.25">
|
||||
<DockArea name="Velocity [m/s] True [blue] Plan [green] Cruise [magenta]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" top="42.713492" bottom="-1.041792" right="631.055584"/>
|
||||
<limitY/>
|
||||
<curve color="#dc267f" name="/carState/cruiseState/speed"/>
|
||||
<curve color="#009e73" name="/longitudinalPlan/speeds/0"/>
|
||||
<curve color="#0072b2" name="/carState/vEgo"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Acceleration [m/s^2] True [blue] Actuator [purple] Plan [green]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.253354" top="0.808303" bottom="-1.213305" right="631.055759"/>
|
||||
<limitY/>
|
||||
<curve color="#009e73" name="engaged_accel_plan"/>
|
||||
<curve color="#785ef0" name="engaged_accel_actuator"/>
|
||||
<curve color="#0072b2" name="engaged_accel_actual"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Pitch [rad]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" top="0.158854" bottom="-0.594843" right="631.038276"/>
|
||||
<limitY/>
|
||||
<curve color="#ffb000" name="/carControl/orientationNED/1"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Engaged [green] Gas [orange] Brake [magenta]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.253354" top="1.025000" bottom="-0.025000" right="631.055759"/>
|
||||
<limitY/>
|
||||
<curve color="#009e73" name="/carControl/enabled"/>
|
||||
<curve color="#ffb000" name="/carState/gasPressed"/>
|
||||
<curve color="#dc267f" name="/carState/brakePressed"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="State [blue: off,pid,stop,start] Source [green: cruise,lead0,lead1,lead2,e2e]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.253620" top="5.125000" bottom="-0.125000" right="631.055759"/>
|
||||
<limitY/>
|
||||
<curve color="#0072b2" name="/carControl/actuators/longControlState"/>
|
||||
<curve color="#009e73" name="/longitudinalPlan/longitudinalPlanSource"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<Tab tab_name="Lateral Debug" containers="1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" count="4" sizes="0.25;0.25;0.25;0.25">
|
||||
<DockArea name="Controller F [magenta] P [purple] I [blue]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="0.000000" top="1.000000" bottom="0.000000" right="1.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/controlsState/lateralControlState/pidState/f" color="#f14cc1"/>
|
||||
<curve name="/controlsState/lateralControlState/pidState/p" color="#9467bd"/>
|
||||
<curve name="/controlsState/lateralControlState/pidState/i" color="#17becf"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Driver Torque [blue] EPS Torque [green]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.253354" top="2690.999030" bottom="-3450.198981" right="631.055584"/>
|
||||
<limitY/>
|
||||
<curve color="#009e73" name="/carState/steeringTorqueEps"/>
|
||||
<curve color="#0072b2" name="/carState/steeringTorque"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Engaged [green] Steering Pressed [blue]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.253354" top="1.025000" bottom="-0.025000" right="631.055759"/>
|
||||
<limitY/>
|
||||
<curve color="#009e73" name="/carControl/enabled"/>
|
||||
<curve color="#0072b2" name="/carState/steeringPressed"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="Steering Limited: Rate [orange] Saturated [magenta]">
|
||||
<plot style="Lines" mode="TimeSeries">
|
||||
<range left="1.253354" top="1.025000" bottom="-0.025000" right="631.055584"/>
|
||||
<limitY/>
|
||||
<curve name="steering rate limited" color="#ffb000"/>
|
||||
<curve name="/controlsState/lateralControlState/pidState/saturated" color="#dc267f"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<customMathEquations>
|
||||
<snippet name="engaged curvature yaw">
|
||||
<global>engage_delay = 5
|
||||
last_bad_time = -engage_delay</global>
|
||||
<function>curvature = value / v3
|
||||
pressed = v1
|
||||
enabled = v2
|
||||
|
||||
if (pressed == 1 or enabled == 0) then
|
||||
last_bad_time = time
|
||||
end
|
||||
|
||||
if (time > last_bad_time + engage_delay) then
|
||||
return curvature
|
||||
else
|
||||
return 0
|
||||
end</function>
|
||||
<linked_source>/carControl/angularVelocity/2</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/steeringPressed</v1>
|
||||
<v2>/carControl/enabled</v2>
|
||||
<v3>/carState/vEgo</v3>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="engaged curvature vehicle model">
|
||||
<global>engage_delay = 5
|
||||
last_bad_time = -engage_delay</global>
|
||||
<function>curvature = value
|
||||
pressed = v1
|
||||
enabled = v2
|
||||
|
||||
if (pressed == 1 or enabled == 0) then
|
||||
last_bad_time = time
|
||||
end
|
||||
|
||||
if (time > last_bad_time + engage_delay) then
|
||||
return value
|
||||
else
|
||||
return 0
|
||||
end</function>
|
||||
<linked_source>/controlsState/curvature</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/steeringPressed</v1>
|
||||
<v2>/carControl/enabled</v2>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="engaged curvature plan">
|
||||
<global>engage_delay = 5
|
||||
last_bad_time = -engage_delay</global>
|
||||
<function>curvature = value
|
||||
pressed = v1
|
||||
enabled = v2
|
||||
|
||||
if (pressed == 1 or enabled == 0) then
|
||||
last_bad_time = time
|
||||
end
|
||||
|
||||
if (time > last_bad_time + engage_delay) then
|
||||
return value
|
||||
else
|
||||
return 0
|
||||
end</function>
|
||||
<linked_source>/modelV2/action/desiredCurvature</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/steeringPressed</v1>
|
||||
<v2>/carControl/enabled</v2>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="engaged_accel_actual">
|
||||
<global>engage_delay = 5
|
||||
last_bad_time = -engage_delay</global>
|
||||
<function>accel = value
|
||||
brake = v1
|
||||
gas = v2
|
||||
enabled = v3
|
||||
|
||||
if (brake ~= 0 or gas ~= 0 or enabled == 0) then
|
||||
last_bad_time = time
|
||||
end
|
||||
|
||||
if (time > last_bad_time + engage_delay) then
|
||||
return value
|
||||
else
|
||||
return 0
|
||||
end</function>
|
||||
<linked_source>/carState/aEgo</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/brakePressed</v1>
|
||||
<v2>/carState/gasPressed</v2>
|
||||
<v3>/carControl/enabled</v3>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="engaged_accel_plan">
|
||||
<global>engage_delay = 5
|
||||
last_bad_time = -engage_delay</global>
|
||||
<function>accel = value
|
||||
brake = v1
|
||||
gas = v2
|
||||
enabled = v3
|
||||
|
||||
if (brake ~= 0 or gas ~= 0 or enabled == 0) then
|
||||
last_bad_time = time
|
||||
end
|
||||
|
||||
if (time > last_bad_time + engage_delay) then
|
||||
return value
|
||||
else
|
||||
return 0
|
||||
end</function>
|
||||
<linked_source>/longitudinalPlan/accels/0</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/brakePressed</v1>
|
||||
<v2>/carState/gasPressed</v2>
|
||||
<v3>/carControl/enabled</v3>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="engaged_accel_actuator">
|
||||
<global>engage_delay = 5
|
||||
last_bad_time = -engage_delay</global>
|
||||
<function>accel = value
|
||||
brake = v1
|
||||
gas = v2
|
||||
enabled = v3
|
||||
|
||||
if (brake ~= 0 or gas ~= 0 or enabled == 0) then
|
||||
last_bad_time = time
|
||||
end
|
||||
|
||||
if (time > last_bad_time + engage_delay) then
|
||||
return value
|
||||
else
|
||||
return 0
|
||||
end</function>
|
||||
<linked_source>/carControl/actuators/accel</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carState/brakePressed</v1>
|
||||
<v2>/carState/gasPressed</v2>
|
||||
<v3>/carControl/enabled</v3>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
<snippet name="steering rate limited">
|
||||
<global></global>
|
||||
<function>return (math.abs(value - v1) > 0.001 or math.abs(v2 - v3) > 0.05) and 1 or 0</function>
|
||||
<linked_source>/carControl/actuators/torque</linked_source>
|
||||
<additional_sources>
|
||||
<v1>/carOutput/actuatorsOutput/torque</v1>
|
||||
<v2>/carControl/actuators/steeringAngleDeg</v2>
|
||||
<v3>/carOutput/actuatorsOutput/steeringAngleDeg</v3>
|
||||
</additional_sources>
|
||||
</snippet>
|
||||
</customMathEquations>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<root>
|
||||
<tabbed_widget name="Main Window" parent="main_window">
|
||||
<Tab containers="1" tab_name="tab1">
|
||||
<Container>
|
||||
<DockSplitter orientation="-" sizes="0.333333;0.333333;0.333333" count="3">
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" flip_x="false" flip_y="false" mode="TimeSeries">
|
||||
<range right="134.825489" top="4402341.574525" bottom="-107369.555525" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/gpsLocationExternal/horizontalAccuracy" color="#1f77b4"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" flip_x="false" flip_y="false" mode="TimeSeries">
|
||||
<range right="134.825489" top="1.025000" bottom="-0.025000" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/gpsLocationExternal/flags" color="#d62728"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
<DockArea name="...">
|
||||
<plot style="Lines" flip_x="false" flip_y="false" mode="TimeSeries">
|
||||
<range right="134.825489" top="6.150000" bottom="-0.150000" left="0.000000"/>
|
||||
<limitY/>
|
||||
<curve name="/ubloxGnss/measurementReport/numMeas" color="#1ac938"/>
|
||||
</plot>
|
||||
</DockArea>
|
||||
</DockSplitter>
|
||||
</Container>
|
||||
</Tab>
|
||||
<currentTabIndex index="0"/>
|
||||
</tabbed_widget>
|
||||
<use_relative_time_offset enabled="1"/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
<Plugins>
|
||||
<plugin ID="DataLoad Rlog"/>
|
||||
<plugin ID="Cereal Subscriber"/>
|
||||
</Plugins>
|
||||
<customMathEquations/>
|
||||
<snippets/>
|
||||
<!-- - - - - - - - - - - - - - - -->
|
||||
</root>
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
import os
|
||||
import glob
|
||||
import shutil
|
||||
import signal
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
import pytest
|
||||
|
||||
from openpilot.common.basedir import BASEDIR
|
||||
from openpilot.common.timeout import Timeout
|
||||
from openpilot.tools.plotjuggler.juggle import DEMO_ROUTE, install
|
||||
|
||||
PJ_DIR = os.path.join(BASEDIR, "tools/plotjuggler")
|
||||
|
||||
class TestPlotJuggler:
|
||||
|
||||
@pytest.mark.skipif(not shutil.which('qmake'), reason="Qt not installed")
|
||||
def test_demo(self):
|
||||
install()
|
||||
|
||||
pj = os.path.join(PJ_DIR, "juggle.py")
|
||||
with subprocess.Popen(f'QT_QPA_PLATFORM=offscreen {pj} "{DEMO_ROUTE}/:2"',
|
||||
stderr=subprocess.PIPE, shell=True, start_new_session=True) as p:
|
||||
# Wait for "Done reading Rlog data" signal from the plugin
|
||||
output = "\n"
|
||||
with Timeout(180, error_msg=output):
|
||||
while output.splitlines()[-1] != "Done reading Rlog data":
|
||||
output += p.stderr.readline().decode("utf-8")
|
||||
|
||||
# ensure plotjuggler didn't crash after exiting the plugin
|
||||
time.sleep(2)
|
||||
assert p.poll() is None
|
||||
os.killpg(os.getpgid(p.pid), signal.SIGTERM)
|
||||
|
||||
assert "Raw file read failed" not in output
|
||||
|
||||
# TODO: also test that layouts successfully load
|
||||
def test_layouts(self, subtests):
|
||||
bad_strings = (
|
||||
# if a previously loaded file is defined,
|
||||
# PJ will throw a warning when loading the layout
|
||||
"fileInfo",
|
||||
"previouslyLoaded_Datafiles",
|
||||
)
|
||||
for fn in glob.glob(os.path.join(PJ_DIR, "layouts/*")):
|
||||
name = os.path.basename(fn)
|
||||
with subtests.test(layout=name):
|
||||
with open(fn) as f:
|
||||
layout = f.read()
|
||||
violations = [s for s in bad_strings if s in layout]
|
||||
assert len(violations) == 0, f"These should be stripped out of the layout: {str(violations)}"
|
||||
Reference in New Issue
Block a user