A fast, offline desktop app for exploring, comparing and reporting on time-series data
CSV · Parquet · MATLAB .mat · ArduPilot .bin · MAVLink .tlog · PX4 .ulg · ROS 2 .mcap · HDF5 · CAN + .dbc
⬇ Download for Windows
· pip install signalviewer
· Documentation
· מדריך בעברית
For flight-test, drone and simulation engineers who have recordings to judge: several runs of the same test, a flight log after a flight, a simulation next to the real thing – often on a closed network. Open the files, see what is wrong, compare, report; then make the same check pass / fail in CI.
- Plot – up to 9 linked plots per tab: Time, X-Y, FFT, spectrogram, map, 3D; two cursors with Δ and statistics.
- Compare runs – every shared signal ranked by how different it is, time-aligned, also per segment (the 2nd AUTO of every flight); the work done on one file is copied to another in one step (its changes, new signals and plots - any of them), linked files keep getting it, and one file's work can be cleared alone.
- Flight logs – ArduPilot, PX4 and MAVLink read directly: flight modes, events, parameters and an automatic health check.
- Live – MAVLink over UDP, TCP or a serial radio, recorded to a
.tlogas it arrives. - Map and 3D – the vehicle, its attitude and its track on an offline map and terrain, in step with the timeline.
- Math – formulas (
2*Speed - RPM/95), filters, derivatives, integrals, coordinate frames (NED / ENU / body / ECEF / LLA); the same change on many signals at once (x*8orsin(x)on each one selected). - Reports – offline HTML, PDF and Word; one per file from the command line.
- CI –
signalviewer-cli check(limits) andcompare(against a golden run) with exit codes and JUnit XML. - Any recording – CAN with a
.dbc, raw binary packets from a layout (ICD), or your own format as a short Python reader.
Under the hood: a Python core (FastAPI + NumPy) and a React / TypeScript UI in one native window. Multi-gigabyte recordings open in seconds, every sample stays available at full resolution, and nothing needs the internet – not even the map and the 3D globe.
Open a file, choose a layout, click signals into plots, then zoom and read values with two cursors.
One template turns latitude / longitude / altitude / attitude signals into a map and a 3D view. Press play and both follow the timeline; Up to the time draws the track as it is flown.
Pick several files: every shared signal is ranked from least to most similar. Click a row to overlay it, align the runs in time automatically, or open the table of all signals.
Open an ArduPilot .bin and the Log panel finds vibration, clipping, battery, EKF and motor
problems. Click a finding to jump to it; click an event to move the cursor there.
Live ▸ MAVLink: connect to a vehicle, a simulator or a ground station that forwards (UDP, TCP or
a serial radio). The link is recorded to a .tlog that opens like any file and grows in live mode;
Follow keeps the last seconds in view.
Higher-quality MP4 versions of these clips are in
docs/media/.
git clone --depth 1 https://github.com/DavidAlpert11/SignalViewer.git # without the history: much smaller
cd SignalViewer
pip install -r requirements.txt
python run.py # opens the desktop window (or the browser)The welcome screen opens each example in one click (a drone flight · the same mission flown twice ·
three car runs to compare · an ArduPilot flight log), or press Ctrl+O and open the files in
examples/:
| File | Try |
|---|---|
examples/run_012.csv |
click Speed, RPM, Throttle, DriveMode into a 2 × 2 layout; press Space and D for two cursors |
examples/run_012.csv + run_013.csv + run_014.csv |
open all three, then Compare in the side rail |
examples/uav_flight.csv |
Templates ▾ → Position on the map & 3D, then press P to play |
examples/uav_flight.csv + uav_flight_windy.csv |
the same mission flown twice, the second in a cross-wind: both tracks on the map, Compare shows where they differ (roll, ground speed, battery) |
examples/copter_flight.bin |
an ArduPilot quad-copter flight: the start card suggests ArduPilot · Full review and points at the vibration burst it found; the Log button has the events, parameters and the whole health check |
| a report per file | python cli.py report --template "ArduPilot · Full review" --out reports/ logs/*.bin (HTML, --format pdf or docx; python cli.py templates lists them) |
| pass / fail in CI | python cli.py check examples/run_01*.csv --checks examples/checks.json --junit results.xml - exit code 1 when a limit is broken, 2 when a file or signal is missing; --template NAME uses the limits saved in a template |
| against a golden run | python cli.py compare examples/run_012.csv examples/run_014.csv --tol-abs 15 - every shared signal, the most different first; outside the tolerance = exit code 1 |
| your own format | python cli.py readers --example writes ~/.signalviewer/readers/example_kv_reader.py: a function marked @reader(extensions=[".kv"]) that returns the time and the signals; files of that type then open like the built-in ones |
| raw binary packets | python cli.py readers --example-icd examples_run.tlm writes a layout (example_bench.icd.json: sync, ids, fields with type / scale / unit / bits / names) and a recording; open the .tlm like any file |
| live data | ArduPilot SITL or MAVProxy on UDP 14550, then Live ▾ → MAVLink → Connect and record |
The demo files are synthetic and are regenerated by python tools/make_demo_data.py (the .bin by
tools/make_example_bin.py, a real DataFlash log; tools/make_test_bin.py makes test logs of any length).
- Windows:
SignalViewer-Setup-X.Y.Z.exefrom the latest release (installs for you only, no administrator rights), or the portable.zip. Linux / macOS: the-portable.7zfor your system. - Python 3.9+:
pip install signalviewer, thensignalviewer- every reader and report; it opens in your browser,pip install "signalviewer[desktop]"gives it its own window. Short of disk space?pip install signalviewer-liteis the core (about 350 MB instead of 760) with the rest as extras (signalviewer-lite[ros],[parquet],[all]…); a file that needs one says which. Install one of the two, not both. - From source:
pip install -r requirements.txtandpython run.py.
Nothing needs the internet at run time - the packages carry Python, every library, the UI, the map and the 3D terrain. The packages are not code-signed yet: on the first start Windows may say Windows protected your PC (More info → Run anyway) and macOS may refuse to open the app (what to do). Building the installer and the portable packages yourself, and running from source: Install.
signalviewer-cli export flight.bin --signals "ATT.Roll,ATT.Pitch" --out roll.csv
signalviewer-cli report --template "ArduPilot · Full review" --out reports/ logs/*.bin
signalviewer-cli check runs/*.csv --checks checks.json --junit results.xml # exit 1 on a broken limit
signalviewer-cli compare golden.csv new/*.csv --tol-pct 2 --allow-outside 0.5 # against a golden run
signalviewer-cli validate # the numerical validation, hereimport signalviewer as sv
t, roll = sv.load("flight.bin").signal("ATT.Roll")
sv.show(t, {"roll x2": 2 * roll}) # into the open appMore - the checks and tolerances files, your own readers, binary layouts, CAN: Command line, Python and formats.
| You mostly… | A good fit | Where Signal Viewer adds |
|---|---|---|
| judge test runs, flight logs and simulation output, often offline | Signal Viewer | – |
| stream ROS topics live | PlotJuggler, Foxglove | comparing recorded runs, pass / fail, reports (it reads their .mcap, .ulg) |
| work inside MATLAB / Simulink | Simulation Data Inspector | no MATLAB licence, flight logs and CAN next to the .mat (a worked example) |
| review one ArduPilot / PX4 flight online | UAV Log Viewer, PX4 Flight Review | offline, several flights side by side, your own limits in CI |
| write the final analysis as a script | Python / MATLAB | a quick look first; sv.load() / sv.show() go both ways |
Nothing leaves the PC: no account, no telemetry; English and Hebrew.
The documentation site - the user guide (עברית), what works (every feature and the keyboard), command line and formats, install and build, offline map and 3D, performance, known limitations, validation (every computation checked against a reference), gallery, development. The same guide is in the app: Help → User guide (F1). Changes: CHANGELOG. Found a problem or want to help? Help → Report a problem… in the app, or CONTRIBUTING.
Signal Viewer – אפליקציה לצפייה, השוואה ודוחות על נתוני זמן: ריצות ניסוי, לוגים של טיסה, תוצאות סימולציה, לוגים של CAN והקלטות בינאריות. עובדת כולה בלי אינטרנט, והקבצים לא יוצאים מהמחשב.
התקנה
- Windows: קובץ ההתקנה
SignalViewer-Setup-X.Y.Z.exeמ־השחרור האחרון (בלי הרשאות מנהל), או ה־zip הנייד. - Python:
pip install signalviewerואזsignalviewer(נפתח בדפדפן; חלון משלו:pip install "signalviewer[desktop]"). - מקוד המקור:
pip install -r requirements.txtואזpython run.py.
מה אפשר לעשות
- לגרור קבצים לחלון: CSV, MATLAB, לוגים של ArduPilot ו־PX4, MAVLink, ROS 2, HDF5, Parquet, CAN עם קובץ .dbc.
- לבנות תצוגה: עד 9 גרפים מקושרים בטאב, שני סמנים עם הפרש וסטטיסטיקה, FFT, ספקטרוגרם, מפה ותלת־ממד.
- להשוות ריצות: כל הסיגנלים המשותפים מדורגים לפי מידת השוני, יישור זמן אוטומטי, אותו מקטע בכל ריצה – גם סימולציה מול הטיסה שלה. העבודה שנעשתה על קובץ אחד מועתקת לקובץ אחר בצעד אחד (שינויים, סיגנלים חדשים, גרפים - כל אחד מהם), קבצים מקושרים ממשיכים לקבל אותה, ואפשר לנקות עבודה של קובץ אחד בלבד.
- לחשב: נוסחאות, מסננים, נגזרות ואינטגרלים – גם על סיגנלים רבים בבת אחת – ופעולות Python משלכם.
- לשתף: דוחות HTML, PDF ו־Word, סשנים ותבניות.
- לבדוק אוטומטית ב־CI: הפקודות
signalviewer-cli checkו־compareמחזירות עבר/נכשל ו־JUnit XML. - לסמוך על המספרים: כל חישוב נבדק מול ערך ייחוס (
signalviewer-cli validate), והקוראים נבדקו על לוגים של כלי טיס אמיתיים.
מדריך מלא בעברית: docs/GUIDE.he.md, וגם בתוך האפליקציה: עזרה ← מדריך למשתמש (F1). מה חדש בכל גרסה: CHANGELOG. מצאתם בעיה? עזרה ← דיווח על בעיה… באפליקציה. רוצים לתרום? CONTRIBUTING.
Signal Viewer is released under the MIT License: free to use, change and ship, also commercially, as long as the copyright notice stays with it.
It ships with third-party parts under their own licences: uPlot (MIT,
backend/app/report_assets/uPlot.LICENSE), the report fonts (SIL Open Font License,
backend/app/report_assets/fonts/OFL-LICENSE.txt), CesiumJS (Apache-2.0), and map data from
OpenStreetMap (© OpenStreetMap contributors, ODbL), Natural Earth (public domain) and the AWS
Terrain Tiles (see Offline map data). Python and JavaScript libraries keep
their own licences (requirements.txt, frontend/package.json).





