The Time Series Visualization Tool that you deserve.

Overview

PlotJuggler

CI CI Join the chat at https://gitter.im/PlotJuggler/Lobby Tweet Gold Sponsor: Greenzie

PlotJuggler 3.3

PlotJuggler is a tool to visualize time series that is fast, powerful and intuitive.

Noteworthy features:

  • Simple Drag & Drop user interface.
  • Load data from file.
  • Connect to live streaming of data.
  • Save the visualization layout and configurations to re-use them later.
  • Fast OpenGL visualization.
  • Can handle thousands of timeseries and millions of data points.
  • Transform your data using a simple editor: derivative, moving average, integral, etc…
  • PlotJuggler can be easily extended using plugins.

PlotJuggler

Data sources (file and streaming)

  • Load CSV files.
  • Load ULog (PX4).
  • Subscribe to many different streaming sources: MQTT, Websockets, ZeroMQ, UDP, etc.
  • Understands data formats such as JSON, CBOR, BSON, Message Pack, etc.
  • Well integrated with ROS: open rosbags and/or subscribe to ROS topics (both ROS1 and ROS2).
  • Supports the Lab Streaming Layer, that is used by many devices.
  • Easily add your custom data source and/or formats...

Transform and analyze your data

PlotJuggler makes it easy to visualize data but also to analyze it. You can manipulate your time series using a simple and extendable Transform Editor.

Alternatively, you may use the Custom Function Editor, that allows you to create Multi-input / Single-output functions using a scripting language based on Lua.

If you are not familiar with Lua, don't be afraid, you won't need more than 5 minutes to learn it ;)

Tutorials

To learns how to use PlotJuggler, check the tutorials here:

Tutorial 1 Tutorial 2 Tutorial 3

Supported plugins

Some plugin can be found in a different repository. The individual README files should include all the information needed to compile and use the plugin.

Please submit specific issues, Pull Requests and questions on the related Github repository:

If you want a simple example to learn how to write your own plugins, have a look at PlotJuggler/plotjuggler-sample-plugins

Installation

Binary installers (with basic plugins)

Linux AppImage (compatible with Ubuntu 18.04 or later: PlotJuggler-3.2.0-x86_64.AppImage

Windows Installer: PlotJuggler-Windows-3.1.1-installer

For ROS User

Install the debian packages using:

 sudo apt install ros-<distro>-plotjuggler-ros

Alternatively, you may download the Snaps version that include the ROS1 plugins:

Get it from the Snap Store

How to build

Clone the repository as usual:

git clone https://github.com/facontidavide/PlotJuggler.git

The only binary dependency that you need installed in your system is Qt5. On Ubuntu, the debians can be installed with the the command:

sudo apt -y install qtbase5-dev libqt5svg5-dev libqt5websockets5-dev libqt5opengl5-dev libqt5x11extras5-dev libprotoc-dev

On Fedora:

sudo dnf install qt5-qtbase-devel qt5-qtsvg-devel qt5-websockets-devel qt5-qtopendl-devel qt5-qtx11extras-devel

Then compile using cmake (qmake is NOT supported):

 mkdir build; cd build
 cmake ..
 make
 sudo make install

Note: the plugins need to be installed in the same folder of the executable.

Note for ROS users

To install PlotJuggler, just type:

sudo apt install ros-${ROS_DISTRO}-plotjuggler-ros

To launch PlotJuggler on ROS, use the command:

  rosrun plotjuggler plotjuggler

or, if are using ROS2:

   ros2 run plotjuggler plotjuggler

Since version 3.x, ROS plugins have been moved to a separate repository:

https://github.com/PlotJuggler/plotjuggler-ros-plugins

Refer to the instructions in the this repository if you want to compile PJ and its ROS plugins from source.

If you like PlotJuggler, support it.

PlotJuggler required a lot of work to be developed; my goal is to build the most intuitive and powerfull tool to visualize data and timeseries.

If you find PlotJuggler useful, consider making a donation on PayPal or become a Github Sponsor.

If you use PlotJuggler at work, your company can support the development of those specific features they need.

Contact me for more details.

Stargazers

Stargazers over time

Comments
  • New License

    New License

    Hi,

    as you probably noticed, I decided to switch to MPL-2.,0 license, instead of LGPL.

    My main goal here is to make it easier for some users to create proprietary plugins. They will need to link statically to the plotjuggler_base library and the LGPL make that ... complicated.

    I am asking you if you agree (please answer in this thread), because you contributed in the past with PRs. I think that having your permission is mandatory, for legal reasons.

    @aeudes @GerardoPardo @Bartimaeus- @kartikmohta @v-lopez @alkaes @veimox @efernandez @Tobias-Fischer @eduherminio @adeebshihadeh @jlmcmchl @d-walsh @DorianScholz @romainreignier @csavur @lucasw @PhilGauthier @bresch @potaito @bkueng @SiyuChen1 @jfrascon @azaparov @myd7349 @faisal-shah @amdn @devnexen @zdavkeos @Timple @kristiannoergaardx3d @Hugal31 @krishnachaitanya7 @timonegk @ShiauweiZhao @katzuv @erickisos @martonmiklos @mikaelarguedas @salmagro @matijazigic @TSC21 @simchanu29 @ijnek @ahundt @RanoVeder @copterspace @agoessling @blanzer @RomanBapst @ngpbach @gabm

    opened by facontidavide 39
  • LabStreamlayer (LSL) plugin is developed.

    LabStreamlayer (LSL) plugin is developed.

    Dear Davide,

    This pull request contains the LSL (https://github.com/sccn/liblsl) plugin. The plugin queries LSL stream in a local network, then behaves as a relay that passes data to PlotJuggler.

    We developed this on a weekend project. See below for the contributors:

    • Celal Savur (@csavur)
    • Shitij Kumar (@spk4422)
    • Mazin Ali (@mazinMS)

    Please let me if you have any questions.

    opened by csavur 33
  • Rosbridge integration

    Rosbridge integration

    Hi Guys,

    Spent the last couple of days writing this rosbridge WebSocket backend.

    It's working, not airtight yet.

    I'll keep improving it, I'll be happy to receive comments and help if some of you are able.

    Tnx

    opened by orshefi 24
  • Unable to start PlotJuggler-2.3.6-x86_64.AppImage

    Unable to start PlotJuggler-2.3.6-x86_64.AppImage

    I get this error when starting the AppImage on Ubuntu 16.04: Note: Qt5 and libx11-xcb1 are installed on my system. But should be provided by the AppImage anyway, right?

    ./PlotJuggler-2.3.6-x86_64.AppImage       
    
    This application failed to start because it could not find or load the Qt platform plugin "xcb"
    in "".
    
    Reinstalling the application may fix this problem.
    Stack trace (most recent call last):
    #11   Object "", at 0xffffffffffffffff, in 
    #10   Object "./PlotJuggler-2.3.6-x86_64.AppImage", at 0x4836d8, in _start
    #9    Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fec010ff82f, in __libc_start_main
          Source "/build/glibc-Cl5G7W/glibc-2.23/csu/../csu/libc-start.c", line 291, in __libc_start_main [0x7fec010ff82f]
    #8    Object "./PlotJuggler-2.3.6-x86_64.AppImage", at 0x4823f4, in main
    #7    Object "/tmp/.mount_PlotJuIs0G29/usr/bin/../lib/libQt5Widgets.so.5", at 0x7fec02984a68, in QApplicationPrivate::init()
    #6    Object "/tmp/.mount_PlotJuIs0G29/usr/bin/../lib/libQt5Gui.so.5", at 0x7fec023d059d, in QGuiApplicationPrivate::init()
    #5    Object "/tmp/.mount_PlotJuIs0G29/usr/bin/../lib/libQt5Core.so.5", at 0x7fec01fdfeea, in QCoreApplicationPrivate::init()
    #4    Object "/tmp/.mount_PlotJuIs0G29/usr/bin/../lib/libQt5Gui.so.5", at 0x7fec023ce8bc, in QGuiApplicationPrivate::createEventDispatcher()
    #3    Object "/tmp/.mount_PlotJuIs0G29/usr/bin/../lib/libQt5Gui.so.5", at 0x7fec023ce72e, in QGuiApplicationPrivate::createPlatformIntegration()
    #2    Object "/tmp/.mount_PlotJuIs0G29/usr/bin/../lib/libQt5Core.so.5", at 0x7fec01de0cd0, in QMessageLogger::fatal(char const*, ...) const
    #1    Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fec01116029, in abort
          Source "/build/glibc-Cl5G7W/glibc-2.23/stdlib/abort.c", line 89, in __GI_abort [0x7fec01116029]
    #0    Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fec01114428, in gsignal
          Source "/build/glibc-Cl5G7W/glibc-2.23/signal/../sysdeps/unix/sysv/linux/raise.c", line 54, in __GI_raise [0x7fec01114428]
    Aborted (Signal sent by tkill() 18122 1000)
    [1]    18122 abort      ./PlotJuggler-2.3.6-x86_64.AppImage
    
    bug 
    opened by fivef 24
  • Crash when loading layout file

    Crash when loading layout file

    Thanks for contributing to PlotJuggler. You are great!

    Problem description

    I save a layout file that has a Custom Series called Power (save custom transformations option is selected. It multiplies current and voltage. I then close plotjuggler and reopen it, and load the layout file. It crashes in lua_rawgeti.

    I've attached the layout file.

    This is using main. The crash does not happen on 3.2.

    Steps to reproduce (important)

    See description

    • Describe your platform / Operative System. I'm using MacOS Big Sur. I know MacOS isn't supported. Submitting this in case it happens on other platforms as well.

    • Check if the problem can be reproduced using the dummy data created by the command line argument "-t" or one of the files in the folder "datasamples".

    • If it can't be reproduced with the dummy data, please share the CSV file or the rosbag that can be used to reproduce the problem. layouts.zip

    bug 
    opened by jmailloux 23
  • Can PlotJuggler help with plotting data indexed from multiple clocks?

    Can PlotJuggler help with plotting data indexed from multiple clocks?

    I have data indexed with multiple time samples from 3 separate clocks across 3 separate devices, and I'm trying to visualize the time differences and errors, I've included my specific questions and details below.

    1. Do you think plotjuggler is the right tool for such a use case?
    2. Which of the following would be easiest step to view my data? It is currently logged to disk in a flatbuffers message (like a rosmsg or protobuf). Options include:
      1. dump the data into a rosbag
      2. dump to CSV (must every csv entry be occupied or can some be blank?)
      3. write a custom plugin
      4. another alternative you might advise (is there a way to load json?)

    The key data channels will be:

    • A 3D camera's clock time
      • 6DOF poses of objects the camera can see
    • A robot arm's clock time
      • 7DOF joint angles, and possibly torque
      • 6DOF end effector pose estimate
    • The computer clock time immediately before and after receiving the above two times.

    The actual message data type LogKUKAiiwaFusionTrack.fbs is simply a vector of time stamped messages, which contain other data channels:

    union DeviceState {KUKAiiwaState, FusionTrackMessage}
    // a log file is a series of GRLMessage entities
    // The TimeEvent should contain the necessary data,
    // and only ONE of kukaiiwa or fusionTrack should
    // be filled out for each message.
    table KUKAiiwaFusionTrackMessage {
        // an easy to use ros compatible timestamp
        timestamp:double;
        // a more detailed timestamp based on google cartographer
        // and the triggersync paper
        timeEvent:TimeEvent;
        deviceState:DeviceState;
    }
    
    table LogKUKAiiwaFusionTrack {
      states:[KUKAiiwaFusionTrackMessage];
    }
    

    Here is the time data I record for each device:

    /// Note that all of these time entries are
    /// longs with a minimum step of 100ns,
    /// see google cartographer's cartographer::common::time
    table TimeEvent {
      /// Identifying string for this time stamped data topic
      /// something like "/opticaltracker/00000000/frame" where
      /// 00000000 is the serial number of the optical tracker.
      event_name:string;
      /// The time just before a data update request is made
      local_request_time:long;
      /// Identifying string for the clock used to drive the device
      /// something like "/opticaltracker/00000000/clock"
      /// if it is the clock internal to a sensor like an optical tracker
      device_clock_id:string;
      /// The time provided by the device specified by device_clock_id
      device_time:long;
      /// Identifying string for the clock used to drive the device
      /// or "/control_computer/clock/steady" if the device has no clock
      /// and the time is the desktop computer
      /// running the steady clock (vs clocks which might change time)
      local_clock_id:string;
      /// The time at which the data was received
      local_receive_time:long;
      /// The corrected local time which represents when the sensor
      /// data was actually captured.
      corrected_local_time:long;
      /// Estimated duration of the skew between the device clock
      /// and the local time clock
      clock_skew:long;
      /// The minimum expected delay in transporting the data request
      min_transport_delay:long;
    }
    

    This is based on the rosmsg Event.msg, from a paper called triggersync as follows (there is a TimeStamped version as well):

    string  event_name
    time    local_request_time
    string  device_clock_id
    time    device_time
    string  local_clock_id
    time    local_receive_time
    time    corrected_local_time
    float64 clock_skew
    duration    min_transport_delay
    

    I would appreciate your patience and recommendation, I know this is a very detailed question. Others in my lab use plotjuggler and it is highly regarded, so I'm seeing if I can use it too. Thanks!

    bug question 
    opened by ahundt 23
  • Feature request: equal axis scaling

    Feature request: equal axis scaling

    Dear Davide,

    Here comes another feature request: When using a custom x-axis (dragged with the right mouse button), I can create an x,y position plot which is very nice. However, it would be very useful to have an option for a locked axis ratio such that, e.g. right angles, appear as such in the plot. Like with the Matlab command "axis equal".

    Best regards

    enhancement 
    opened by llvs 20
  • std::runtime_error - Aborted (core dumped) on data load

    std::runtime_error - Aborted (core dumped) on data load

    I am using the newest kinetic debians:

        terminate called after throwing an instance of 'std::runtime_error'
      what():  Unexpected character after type and field 'Definition of custom_msgs/CustomMsg
    Stack trace (most recent call last):
    
    #31   Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fe79b1c682f, in __libc_start_main
          Source "/build/glibc-t3gR2i/glibc-2.23/csu/../csu/libc-start.c", line 291, in __libc_start_main [0x7fe79b1c682f]
    #30   Object "/opt/ros/kinetic/lib/plotjuggler/PlotJuggler", at 0x468829, in main
    #29   Object "/usr/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x7fe79c09bbeb, in QCoreApplication::exec()
    #28   Object "/usr/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x7fe79c093b49, in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)
    #27   Object "/usr/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x7fe79c0ec7ce, in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
    #26   Object "/lib/x86_64-linux-gnu/libglib-2.0.so.0", at 0x7fe79a85549b, in g_main_context_iteration
    #25   Object "/lib/x86_64-linux-gnu/libglib-2.0.so.0", at 0x7fe79a8553ef, in g_main_context_dispatch
    #24   Object "/lib/x86_64-linux-gnu/libglib-2.0.so.0", at 0x7fe79a855196, in g_main_context_dispatch
    #23   Object "/usr/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x7fe79c0ec3c2, in QEventDispatcherGlibPrivate::runTimersOnceWithNormalPriority()
    #22   Object "/usr/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x7fe79c098785, in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*)
    #21   Object "/usr/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x7fe79c09638a, in QCoreApplication::notifyInternal(QObject*, QEvent*)
    #20   Object "/usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5", at 0x7fe79c98e515, in QApplication::notify(QObject*, QEvent*)
    #19   Object "/usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5", at 0x7fe79c98905b, in QApplicationPrivate::notify_helper(QObject*, QEvent*)
    #18   Object "/usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5", at 0x7fe79c982121, in QAction::event(QEvent*)
    #17   Object "/usr/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x7fe79c0c5c00, in QObject::event(QEvent*)
    #16   Object "/usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5", at 0x7fe79c981e1e, in QAction::setIconVisibleInMenu(bool)
    #15   Object "/usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5", at 0x7fe79c981897, in QAction::activate(QAction::ActionEvent)
    #14   Object "/usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5", at 0x7fe79c97f411, in QAction::triggered(bool)
    #13   Object "/usr/lib/x86_64-linux-gnu/libQt5Core.so.5", at 0x7fe79c0c4d29, in QMetaObject::activate(QObject*, int, int, void**)
    #12   Object "/opt/ros/kinetic/lib/plotjuggler/PlotJuggler", at 0x4a39ee, in TabbedPlotWidget::sendTabToNewWindow(PlotMatrix*)
    #11   Object "/opt/ros/kinetic/lib/plotjuggler/PlotJuggler", at 0x47709b, in MainWindow::onActionLoadDataFile(bool)
    #10   Object "/opt/ros/kinetic/lib/plotjuggler/PlotJuggler", at 0x476601, in MainWindow::onActionLoadDataFileImpl(QString, bool)
    #9    Object "/opt/ros/kinetic/lib/plotjuggler/libDataLoadROS.so", at 0x7fe76cf77196, in DataLoadROS::readDataFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)
    #8    Object "/opt/ros/kinetic/lib/libros_type_introspection.so", at 0x7fe76cd3c698, in RosIntrospection::buildROSTypeMapFromDefinition(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
    #7    Object "/opt/ros/kinetic/lib/libros_type_introspection.so", at 0x7fe76cd3c21a, in RosIntrospection::ROSMessage::ROSMessage(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
    #6    Object "/opt/ros/kinetic/lib/libros_type_introspection.so", at 0x7fe76cd3bd19, in RosIntrospection::ROSField::ROSField(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
    #5    Object "/usr/lib/x86_64-linux-gnu/libstdc++.so.6", at 0x7fe79bb1b918, in __cxa_throw
    #4    Object "/usr/lib/x86_64-linux-gnu/libstdc++.so.6", at 0x7fe79bb1b700, in std::terminate()
    #3    Object "/usr/lib/x86_64-linux-gnu/libstdc++.so.6", at 0x7fe79bb1b6b5, in std::rethrow_exception(std::__exception_ptr::exception_ptr)
    #2    Object "/usr/lib/x86_64-linux-gnu/libstdc++.so.6", at 0x7fe79bb1d84c, in __gnu_cxx::__verbose_terminate_handler()
    #1    Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fe79b1dd029, in abort
          Source "/build/glibc-t3gR2i/glibc-2.23/stdlib/abort.c", line 89, in __GI_abort [0x7fe79b1dd029]
    #0    Object "/lib/x86_64-linux-gnu/libc.so.6", at 0x7fe79b1db428, in gsignal
          Source "/build/glibc-t3gR2i/glibc-2.23/signal/../sysdeps/unix/sysv/linux/raise.c", line 54, in __GI_raise [0x7fe79b1db428]
    Aborted (Signal sent by tkill() 26463 1000)
    Aborted (core dumped)
    
    wontfix 
    opened by reinzor 20
  • Doesn't it support Windows now?

    Doesn't it support Windows now?

    Hi, It seems that PlotJuggler does not support windows any more, doesn't it?

    I'm working on an old version which could run on windows, just double check if I can upgrade to the newest one.

    Thanks,

    Chunting

    opened by Chunting 18
  • Custom calculations

    Custom calculations

    Hi, Thanks for this great program !

    This PR adds custom calculations / transforms on plots. To open the dialog you can right click on a curve in the left listWidget, then select the "create math plot" option in the context menu. Example ( where i extract the yaw euler angle from the 4 quaternion values ) : quaternion_to_euler

    Any javascript expression can be used for the calculations.

    Another example (1st order IIR low pass filter) : add_low_pass1 add_low_pass2

    Some remarks :

    Why javascript ? Using some compiled scripting language like cling or lua would have been nicer, but Qt has native support for javascript (using QJSEngine). This makes the building and deploying a lot easier (I only added two words in the main CMakeList.txt).

    XY plot To make the right-click context menu on the FilterableListWidget work, I had to change the way to assign a plot to the X axis. Instead of pressing right click and drag-and-drop, you just have to left-click drag the plot on the X axis. I hope this change doesn't mind you !

    Streaming For the moment the calculations aren't refreshed during streaming, but in the context menu you can manually force a refresh of the expression.

    Sorry for the big commit, this change was a little bit more complicated than expected !

    opened by 1r0b1n0 18
  • Quits on Layout Load

    Quits on Layout Load

    Every time I load a layout PJ quits (and for good measure I made a layout based on building the Main branch [as of today[).

    If I open PJ without loading a layout, it works for awhile and then on doing some specific transformations causes it to crash (non-specific, differs each time).

    Heres the kicker - this is on a Mac but im seeing similar (not exact) issues on Ubuntu. The similar being that specific transformations cause it to crash but not so much the quit on layout load (I know... two specific issues).

    I gather this will be difficult to diagnose (given not officially supported on Mac) but willing to help however needed - something in the libraries when on a Mac.

    Hands down the best data manipulation software available. :)

    Here's the Mac output:

    Stack trace (most recent call last): #31 Object "CoreFoundation", at 0x7fff204e9634, in __CFRunLoopDoSources0 + 242 #30 Object "CoreFoundation", at 0x7fff204e98b4, in __CFRunLoopDoSource0 + 180 #29 Object "CoreFoundation", at 0x7fff204e994c, in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 #28 Object "libqcocoa.dylib", at 0x1099e0f98, in qt_plugin_instance + 199080 #27 Object "QtGui", at 0x108cc213b, in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 203 #26 Object "QtGui", at 0x108cdc329, in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) + 1385 #25 Object "QtGui", at 0x108cdcbdf, in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) + 3615 #24 Object "QtCore", at 0x1094912b6, in QCoreApplication::notifyInternal2(QObject*, QEvent*) + 166 #23 Object "QtWidgets", at 0x108700e02, in QApplication::notify(QObject*, QEvent*) + 466 #22 Object "QtWidgets", at 0x1086ffa56, in QApplicationPrivate::notify_helper(QObject*, QEvent*) + 262 #21 Object "QtWidgets", at 0x1087563de, in QDesktopWidget::qt_metacall(QMetaObject::Call, int, void**) + 4622 #20 Object "QtWidgets", at 0x108757ca5, in QDesktopWidget::qt_metacall(QMetaObject::Call, int, void**) + 10965 #19 Object "QtWidgets", at 0x108700362, in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool, bool) + 898 #18 Object "QtCore", at 0x1094912b6, in QCoreApplication::notifyInternal2(QObject*, QEvent*) + 166 #17 Object "QtWidgets", at 0x108702944, in QApplication::notify(QObject*, QEvent*) + 7444 #16 Object "QtWidgets", at 0x1086ffa56, in QApplicationPrivate::notify_helper(QObject*, QEvent*) + 262 #15 Object "QtWidgets", at 0x108738d0a, in QWidget::event(QEvent*) + 442 #14 Object "QtWidgets", at 0x1087e7e6c, in QAbstractButton::mouseReleaseEvent(QMouseEvent*) + 268 #13 Object "QtWidgets", at 0x1087e6ca9, in QAbstractButton::isCheckable() const + 457 #12 Object "QtWidgets", at 0x1087e6e2f, in QAbstractButton::isCheckable() const + 847 #11 Object "QtCore", at 0x1094c201d, in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 3373 #10 Object "plotjuggler", at 0x107b5369e, in MainWindow::qt_metacall(QMetaObject::Call, int, void**) + 78 #9 Object "plotjuggler", at 0x107b990b8, in MainWindow::on_pushButtonLoadLayout_clicked() + 408 #8 Object "plotjuggler", at 0x107b82430, in MainWindow::loadLayoutFromFile(QString) + 6064 #7 Object "plotjuggler", at 0x107be134e, in LuaCustomFunction::xmlLoadState(QDomElement const&) + 30 #6 Object "plotjuggler", at 0x107be02d2, in LuaCustomFunction::initEngine() + 834 #5 Object "plotjuggler", at 0x107be3026, in void sol::basic_reference<false>::move_assign<false>(sol::basic_reference<false>&&) + 38 #4 Object "plotjuggler", at 0x107c52aa8, in luaL_unref + 40 #3 Object "plotjuggler", at 0x107c2ee90, in lua_rawgeti + 80 #2 Object "libsystem_platform.dylib", at 0x7fff20435d7c, in _sigtramp + 28 #1 Object "plotjuggler", at 0x107c1b1dd, in backward::SignalHandling::sig_handler(int, __siginfo*, void*) + 13 #0 Object "plotjuggler", at 0x107c1b242, in backward::SignalHandling::handleSignal(int, __siginfo*, void*) + 66 zsh: segmentation fault plotjuggler

    bug 
    opened by ryanjAA 16
  • XY curve axis scaling issue when there is a large difference between X and Y values

    XY curve axis scaling issue when there is a large difference between X and Y values

    When loading XY data where there's a large difference between the X and Y values (in the example below two orders of magnitude), the scaling for the other axis becomes unusable (not properly scaled) and unresponsive

    image

    The issue persists after drawing a zoom rectangle, and it is only after the zoom area's X range is sufficiently small that the Y axis scales correctly

    https://user-images.githubusercontent.com/2954254/209258115-a5f9fcc4-9304-4cd5-bab3-231aec41c368.mp4

    Test files attached rectangleXY_bad.csv rectangleXY_good.csv

    opened by Bartimaeus- 1
  • Different values in Plotjuggler and RQT

    Different values in Plotjuggler and RQT

    Thanks for contributing to PlotJuggler. You are great!

    Problem description

    We are implementing a UDP ROS2 bridge as hardware driver and want to evaluate if the informations are parsed correctly. But for some unknown reason, the values of the parsed ROS message are different, depending on where you analyse them. By looking in terminal with ros2 topic echo $TOPIC the values are correct, also when visualizing it with RQT plot (see screenshot). But when using Plotjuggler, the values are mixed in the message attributes. For example plotjuggler shows the information of the attribute "status_count" in "kf_steady_state". It doesnt matter of its on live data or with a recorded rosbag.

    Bildschirmfoto vom 2022-12-06 11-52-02 Correct values in RQT

    Bildschirmfoto vom 2022-12-06 11-52-41 Plot of the same topic as RQT, but Plotjuggler shows wrong values of it. Instead you can see left in topic-view that the information is in "steady_state"

    This bug was found with the following setup:

    • Ubuntu 20.04 / ROS2 Galactic
    • Ubuntu 22.04 / ROS2 Humble

    rosbag.zip Here would be a short rosbag to reproduce the described behavior. The invalid values are in the /genesys/adma/data_scaled(status) topic.

    opened by freak89dutch 3
  • Add CodeQL workflow

    Add CodeQL workflow

    Hi facontidavide/PlotJuggler!

    This is not an automatic, 🤖-generated PR, as you can check in my GitHub profile, I work for GitHub and I am part of the GitHub Security Lab which is helping out with the migration of LGTM configurations to Code Scanning. You might have heard that we've integrated LGTM's underlying CodeQL analysis engine natively into GitHub. The result is GitHub code scanning!

    With LGTM fully integrated into code scanning, we are focused on improving CodeQL within the native GitHub code scanning experience. In order to take advantage of current and future improvements to our analysis capabilities, we suggest you enable code scanning on your repository. Please take a look at our blog post for more information.

    This pull request enables code scanning by adding an auto-generated codeql.yml workflow file for GitHub Actions to your repository — take a look! We tested it before opening this pull request, so all should be working :heavy_check_mark:. In fact, you might already have seen some alerts appear on this pull request!

    Where needed and if possible, we’ve adjusted the configuration to the needs of your particular repository. But of course, you should feel free to tweak it further! Check this page for detailed documentation.

    Questions? Check out the FAQ below!

    FAQ

    Click here to expand the FAQ section

    How often will the code scanning analysis run?

    By default, code scanning will trigger a scan with the CodeQL engine on the following events:

    • On every pull request — to flag up potential security problems for you to investigate before merging a PR.
    • On every push to your default branch and other protected branches — this keeps the analysis results on your repository’s Security tab up to date.
    • Once a week at a fixed time — to make sure you benefit from the latest updated security analysis even when no code was committed or PRs were opened.

    What will this cost?

    Nothing! The CodeQL engine will run inside GitHub Actions, making use of your unlimited free compute minutes for public repositories.

    What types of problems does CodeQL find?

    The CodeQL engine that powers GitHub code scanning is the exact same engine that powers LGTM.com. The exact set of rules has been tweaked slightly, but you should see almost exactly the same types of alerts as you were used to on LGTM.com: we’ve enabled the security-and-quality query suite for you.

    How do I upgrade my CodeQL engine?

    No need! New versions of the CodeQL analysis are constantly deployed on GitHub.com; your repository will automatically benefit from the most recently released version.

    The analysis doesn’t seem to be working

    If you get an error in GitHub Actions that indicates that CodeQL wasn’t able to analyze your code, please follow the instructions here to debug the analysis.

    How do I disable LGTM.com?

    If you have LGTM’s automatic pull request analysis enabled, then you can follow these steps to disable the LGTM pull request analysis. You don’t actually need to remove your repository from LGTM.com; it will automatically be removed in the next few months as part of the deprecation of LGTM.com (more info here).

    Which source code hosting platforms does code scanning support?

    GitHub code scanning is deeply integrated within GitHub itself. If you’d like to scan source code that is hosted elsewhere, we suggest that you create a mirror of that code on GitHub.

    How do I know this PR is legitimate?

    This PR is filed by the official LGTM.com GitHub App, in line with the deprecation timeline that was announced on the official GitHub Blog. The proposed GitHub Action workflow uses the official open source GitHub CodeQL Action. If you have any other questions or concerns, please join the discussion here in the official GitHub community!

    I have another question / how do I get in touch?

    Please join the discussion here to ask further questions and send us suggestions!

    opened by p- 0
  • The program crash when I try to select topics to republish in ros2.

    The program crash when I try to select topics to republish in ros2.

    Platform : Ubuntu 20.04 ; Ros Galatic ; PlotJuggler 3.6.0 屏幕截图 2022-11-01 14:53:48 As the title ,once I click the "OK" botton above, the program crashes.And I build it from src code and try again。the faults are like below. It seems that there is something wrong with the binding between QT5 botton box and the update publisher code segment. 屏幕截图 2022-11-01 14:52:50

    opened by sunjay-lee 0
  • Layout doesn't restore XY plots when multiple sources with prefixes are used

    Layout doesn't restore XY plots when multiple sources with prefixes are used

    1. Add at least two files (no matter what, a use motor_data.csv and its copy)
    2. Create XY plot with any data and also other simple data plot.
    3. Save layout (with or without data source, it doesn't matter).
    4. Delete everything and load the layout back.
    5. XY plots will be empty while simple plots will have data.

    Add prefixes ("motor_data1/") to curve_x and curve_y fields manually in layout file fix the issue, so it looks like PlotJuggler doesn't but should add prefixes for curves x and y on saving.

    Everything is ok if using only single data file, including files like turtle.csv that has prefixed data inside, PlotJuggler adds these prefixes to curves in layout correctly.

    Version 3.6.0, Windows 10

    opened by lukegluke 0
  • [Feature Request] Ability to show enum names corresponsding to ULog data point values

    [Feature Request] Ability to show enum names corresponsding to ULog data point values

    Problem description

    Screenshot from 2022-10-18 18-07-50

    Right now, it is quite cumbersome to debug PX4 flight log in things like vehicle_status/nav_state, as it is a defined ENUM, but as a log analyzer you don't intuitively know which NAVIGATION_STATE it belongs to.

    Desired Result

    This feature request is to have something like this as a final result: Screenshot from 2022-10-18 18-07-50 png

    Idea / Questions

    Idea

    To implement this, like how the ULog Information message is parsed, we can include another message type that includes a mapping between the ENUM constant and it's value for each field of the uORB topics.

    You can read more about ULog Information message definition here: https://docs.px4.io/main/en/dev_log/ulog_file_format.html#i-information-message

    Something like:

    char[value_len] vehicle_status/nav_state::NAVIGATION_STATE_MANUAL=0
    char[value_len] vehicle_status/nav_state::NAVIGATION_STATE_ALTCTL=1
    char[value_len] vehicle_status/nav_state::NAVIGATION_STATE_POSCTL=2
    ...
    

    Can be included in the ULog to give info on Enum value to name mapping necessary to plot the enum name on the screen.

    Question

    Is this something that PlotJuggler already has implemented? (Showing translated 'enum name' from the raw value of the graph) @facontidavide


    FYI @bkueng

    opened by junwoo091400 0
Releases(3.6.0)
Owner
Davide Faconti
C++ enthusiast, passionate about Robotics. Optimizing code for fun and profit.
Davide Faconti
Real-time 2D fluid simulator with lots of visualization options.

Fluid Simulator Building Start by cloning the program and all submodules using the following command: git clone --recursive https://github.com/linusmo

Linus Mossberg 28 Dec 14, 2022
An easy to build CO2 Monitor/Meter with Android and iOS App for real time visualization and charting of air data, data logger, a variety of communication options (BLE, WIFI, MQTT, ESP-Now) and many supported sensors.

CO2-Gadget An easy to build CO2 Monitor/Meter with cell phone App for real time visualization and charting of air data, datalogger, a variety of commu

Mariete 30 Dec 17, 2022
Binary data analysis and visualization tool

Veles - A new age tool for binary analysis It is a very difficult task for a human to notice subtle patterns in large amounts of binary data, however,

CodiLime Sp. z o.o. 874 Dec 18, 2022
This software brings you the possibility to Read and Write the internal Flash of the Nordic nRF52 series with an ESP32

ESP32 nRF52 SWD flasher This software brings you the possibility to Read and Write the internal Flash of the Nordic nRF52 series with an ESP32 using t

null 140 Dec 31, 2022
LM75A temperature sensor library that you can use with STM32F10x series microcontrollers.

STM32F10x-LM75A-Library LM75A temperature sensor library that you can use with STM32F10x series microcontrollers. Launching the LM75A sensor in your a

null 12 Nov 25, 2022
Time-series database

README Akumuli is a time-series database for modern hardware. It can be used to capture, store and process time-series data in real-time. The word "ak

Akumuli.org 816 Dec 30, 2022
LSH/Hypercube kNN and KMeans++ Clustering on polygonic curves and time series

kNN-and-Clustering-on-Time-Series-and-Curves LSH/Hypercube kNN and KMeans++ Clustering on polygonic curves and time series In this project we will exp

Aristi_Papastavrou 15 Nov 1, 2022
Visualization Library is a C++ middleware for high-performance 2D and 3D graphics applications based on OpenGL 1.x-4.x supporting Windows, Linux and Mac OS X.

Visualization Library 2.2 Gallery About Visualization Library is a C++ middleware for high-performance 2D and 3D graphics applications based on the in

Michele 313 Nov 8, 2022
Fluid Visualization - The code compilation is only tested on Arch Linux x86_64

Fluid Visualization The code compilation is only tested on Arch Linux x86_64, Linux kernel 5.15.13-arch1, with gcc 11.1.0, CMake 3.22.1, Xorg X server

krr 2 Jan 30, 2022
A visualization solution for curriculum and course relationships of Hongkong University of Science and Technology(HKUST)

Curriculum Map A visualization solution for curriculum and course relationships of Hongkong University of Science and Technology(HKUST) Notice: Qt v6.

Zory 7 Dec 21, 2022
Superposition Wave Function Visualization for free particle

Superposition Wave Function Visualization for free particle This is a cross platform software that visualizes the Amplitude(the square root of PDF) an

Mohammad Ali 4 Nov 27, 2022
Some hypervisor research notes. There is also a useful exploit template that you can use to verify / falsify any assumptions you may make while auditing code, and for exploit development.

Introduction Over the past few weeks, I've been doing some hypervisor research here and there, with most of my focus being on PCI device emulation cod

Faith 130 Nov 18, 2022
a C program to say hi to you :) also you're cute <3

You're gonna need to be on linux (too lazy for windows) and have gcc installed. * Installing ---------- * 1 --- To install first create a "hi

ibx34 2 Sep 21, 2021
Simple and easy script language for your dead brain, or break time of you.

What is this trush? Shut up, this isnt a trush. Lol This is a easy and simple script language. Change the world. Rotation the world. BIG REVOLUTION OF

zkr 6 May 28, 2021
this package help you to give glassomorphic+ neomrphic both effects to a container (at a time).

duomorphsim this package help you to give glassomorphic+ neomrphic both effects to a container (at a time). Usage DuoMorphicCard need four argument wh

Lokesh Jangid 3 Aug 23, 2021
Pipet - c++ library for building lightweight processing pipeline at compile-time for string obfuscation, aes ciphering or whatever you want

Pipet Pipet is a lightweight c++17 headers-only library than can be used to build simple processing pipelines at compile time. Features Compile-time p

C. G. 60 Dec 12, 2022
Updates the Wii's current system time with the real world time.

Fix Wii System Time This is a homebrew tool I made for the Wii a while ago. It updates the current system time with the real world time via worldtimea

Puzzle 2 Nov 9, 2022
Linux USB driver for the MOTU AVB series interfaces

motu-avb Linux USB driver for the MOTU AVB series interfaces Kernel parameters: samplerate: set the samplerate (its currently fixed at module load) de

null 47 Dec 23, 2022
Use fx-9860 series calculator as a keyboard for computer.

fxKeyboard Use fx-9860 series calculator as a keyboard for computer. WARNING: THIS TOOL MAY DAMAGE YOUR CALCULATOR OR COMPUTER. ALWAYS FOLLOW THE DOC

Myth 10 Mar 1, 2022