Giter VIP home page Giter VIP logo

plotjuggler's Introduction

PlotJuggler

windows ubuntu macos ROS1 ROS2 Tweet

Gold Sponsor: Greenzie

PlotJuggler 3.9

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.
  • Understand 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, which 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 learn how to use PlotJuggler, check the tutorials here:

Tutorial 1 Tutorial 2 Tutorial 3

Supported plugins

Some plugins 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

Snap (recommended in Ubuntu, to ROS users too)

The snap contains a version of PlotJuggler that can work with either ROS1 or ROS2.

Get it from the Snap Store

To install it in Ubuntu 22.04, with ROS2 support, run:

sudo snap install plotjuggler

If you are still using ROS1 (Ubuntu 20.04), install instead:

sudo snap install plotjuggler-ros

Windows Binary installer

This installer does not include ROS plugins.

Windows Installer: PlotJuggler-Windows-3.9.0-installer

Debian packages for ROS User

Install the ROS packages with:

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

ROS plugins are available in a separate repository: https://github.com/PlotJuggler/plotjuggler-ros-plugins

Please take a look at the instructions in that repository if you want to compile PJ and its ROS plugins from source.

Compile from source

You can find the detailed instructions here: COMPILE.md.

Sponsorship and commercial support

PlotJuggler required a lot of work to develop and maintain; my goal is to build the most intuitive and powerful tool to visualize data and timeseries.

If you find PlotJuggler useful, consider donating PayPal or becoming a Github Sponsor.

If you need to extend any of the functionalities of PlotJuggler to cover a specific need or to parse your custom data formats, you can receive commercial support from the main author, Davide Faconti.

License

PlotJuggler is released under the Mozilla Public License Version 2.0, which allows users to develop closed-source plugins.

Please note that some third-party dependencies (including Qt) use the GNU Lesser General Public License.

Star History

Star History Chart

Contributors

plotjuggler's People

Contributors

aeudes avatar agoessling avatar alkaes avatar bartimaeus- avatar bonkuraps avatar bresch avatar bsilvereagle avatar csavur avatar d-walsh avatar erickisos avatar facontidavide avatar faisal-shah avatar gerardopardo avatar guillaumebeuzeboc avatar hugal31 avatar jbendes avatar jlmcmchl avatar kartikmohta avatar manuelvalch avatar markcutler avatar mirkoferrati avatar ozzdemir avatar philgauthier avatar romainreignier avatar simonsag96 avatar siyuchen1 avatar tobias-fischer avatar v-lopez avatar veimox avatar zdavkeos avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

plotjuggler's Issues

ordering of array messages in left sidebar

Currently array messages in the left sidebar are grouped alphabetically, but the case where you have over 10 data fields in a message leads to strange ordering. E.G. you will have

variable_0
variable_1
variable_10
variable_11
...
variable_19
variable_2
variable_20

If the variable has the same name the ordering should be based on numbering

Feature request full screen mode

Again awesome tool.

A nice to have feature would be to be able to remove most of GUI elements when my plot has been configured set.

Sometimes I would like to have a plot on a corner of my screen so I can work on other stuff while I am monitoring it.

My best approach was to create a new window for the plot, but even with that I'd say 40% or more of the screen space is used by widgets that at this moment are not needed.

My best approach is this:
image

I wish we could have something like this:
image

It's a minor feature, and if noone has done it by then, I will try to do it in july when I'll have more free time.

Data name tab completion

It would be great to have the ability to tab complete data for rostopics that have a lot of subfields.

Compare data from bag/realtime?

Is it somehow possible to show data from a topic loaded from a bagfile, and at the same time show data from a topic with the same name recorded realtime over ROS? I've seen the "rename fields" feature, but no "rename topics" feature.

Click and drag

I love the package for rosbag inspection. Thanks for the work

Is there a way to click and drag the plot? Additionally is there any way I can contribute to documentation? I'd be happy to do a PR for the readme, but if you'd prefer a wiki etc I'd do that too.

[Feature Request] Clicking point shows x,y value of data ala MATLAB

@facontidavide I hope you don't get overwhelmed by all these issues, I just want to put ideas on paper so they are there for the future. Also feel free to tell me what you won't prioritize so I can make PRs where you don't have bandwidth.

When viewing data with points user should be able to click on a specific point and see its exact x,y value.

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!

Difficulty compiling plotjuggler

I'm trying to install plotjuggler for the first time and I'm encountering issues similar to #56, it seems some of the dependencies in the readme aren't up to date. Specifically,

  • an error for missing qt web sockets
  • a warning for messing benchmark (what repository is this from exactly?)

Here are the steps I took, I'm on kinetic:

cd myworkspace/src
sudo apt-get -y install qtbase5-dev libqt5svg5-dev
git clone https://github.com/facontidavide/PlotJuggler.git
git clone https://github.com/Eurecat/abseil-cpp
git clone https://github.com/facontidavide/ros_type_introspection
catkin build plotjuggler

This gives me the following error:

Warnings   << ros_type_introspection:make /home/ahundt/src/costar_ws/logs/ros_type_introspection/build.make.000.log                                                                                                                                                                    
/home/ahundt/src/costar_ws/src/ros_type_introspection/src/ros_introspection.cpp: In member function ‘void RosIntrospection::Parser::registerRenamingRules(const RosIntrospection::ROSType&, const std::vector<RosIntrospection::SubstitutionRule>&)’:
/home/ahundt/src/costar_ws/src/ros_type_introspection/src/ros_introspection.cpp:141:47: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
     if( rule_set.find( rule ) == rule_set.end() )
                                               ^
In file included from /usr/include/c++/5/bits/hashtable.h:35:0,
                 from /usr/include/c++/5/unordered_set:47,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_introspection.hpp:38,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/src/ros_introspection.cpp:42:
/usr/include/c++/5/bits/hashtable_policy.h:317:5: note: candidate 1: bool std::__detail::operator==(const std::__detail::_Node_iterator_base<_Value, _Cache_hash_code>&, const std::__detail::_Node_iterator_base<_Value, _Cache_hash_code>&) [with _Value = RosIntrospection::SubstitutionRule; bool _Cache_hash_code = true]
     operator==(const _Node_iterator_base<_Value, _Cache_hash_code>& __x,
     ^
In file included from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_type.hpp:42:0,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_field.hpp:42,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_message.hpp:39,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/stringtree_leaf.hpp:43,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_introspection.hpp:39,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/src/ros_introspection.cpp:42:
/home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/utils/variant.hpp:140:6: note: candidate 2: bool RosIntrospection::operator==(const T&, const RosIntrospection::Variant&) [with T = std::__detail::_Node_iterator<RosIntrospection::SubstitutionRule, true, true>]
 bool operator ==(const T& num, const Variant& var)
      ^
/home/ahundt/src/costar_ws/src/ros_type_introspection/src/ros_introspection.cpp:141:47: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
     if( rule_set.find( rule ) == rule_set.end() )
                                               ^
In file included from /usr/include/c++/5/bits/hashtable.h:35:0,
                 from /usr/include/c++/5/unordered_set:47,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_introspection.hpp:38,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/src/ros_introspection.cpp:42:
/usr/include/c++/5/bits/hashtable_policy.h:317:5: note: candidate 1: bool std::__detail::operator==(const std::__detail::_Node_iterator_base<_Value, _Cache_hash_code>&, const std::__detail::_Node_iterator_base<_Value, _Cache_hash_code>&) [with _Value = RosIntrospection::SubstitutionRule; bool _Cache_hash_code = true]
     operator==(const _Node_iterator_base<_Value, _Cache_hash_code>& __x,
     ^
In file included from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_type.hpp:42:0,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_field.hpp:42,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_message.hpp:39,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/stringtree_leaf.hpp:43,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/ros_introspection.hpp:39,
                 from /home/ahundt/src/costar_ws/src/ros_type_introspection/src/ros_introspection.cpp:42:
/home/ahundt/src/costar_ws/src/ros_type_introspection/include/ros_type_introspection/utils/variant.hpp:134:6: note: candidate 2: bool RosIntrospection::operator==(const RosIntrospection::Variant&, const T&) [with T = std::__detail::_Node_iterator<RosIntrospection::SubstitutionRule, true, true>]
 bool operator ==(const Variant& var, const T& num)
      ^
cd /home/ahundt/src/costar_ws/build/ros_type_introspection; catkin build --get-env ros_type_introspection | catkin env -si  /usr/bin/make --jobserver-fds=6,7 -j; cd -
.......................................................................................................................................................................................................................................................................................
Finished  <<< ros_type_introspection                [ 9.8 seconds ]                                                                                                                                                                                                                    
Starting  >>> plotjuggler                                                                                                                                                                                                                                                              
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Errors     << plotjuggler:cmake /home/ahundt/src/costar_ws/logs/plotjuggler/build.cmake.001.log                                                                                                                                                                                        
CMake Error at /usr/lib/x86_64-linux-gnu/cmake/Qt5/Qt5Config.cmake:26 (find_package):
  Could not find a package configuration file provided by "Qt5WebSockets"
  with any of the following names:

    Qt5WebSocketsConfig.cmake
    qt5websockets-config.cmake

  Add the installation prefix of "Qt5WebSockets" to CMAKE_PREFIX_PATH or set
  "Qt5WebSockets_DIR" to a directory containing one of the above files.  If
  "Qt5WebSockets" provides a separate development package or SDK, be sure it
  has been installed.
Call Stack (most recent call first):
  plugins/DataStreamServer/CMakeLists.txt:8 (find_package)


cd /home/ahundt/src/costar_ws/build/plotjuggler; catkin build --get-env plotjuggler | catkin env -si  /usr/local/bin/cmake /home/ahundt/src/costar_ws/src/PlotJuggler --no-warn-unused-cli -DCATKIN_DEVEL_PREFIX=/home/ahundt/src/costar_ws/devel/.private/plotjuggler -DCMAKE_INSTALL_PREFIX=/home/ahundt/src/costar_ws/install; cd -
.......................................................................................................................................................................................................................................................................................
Failed     << plotjuggler:cmake                     [ Exited with code 1 ]                                                                                                                                                                                                             
Failed    <<< plotjuggler                           [ 1.7 seconds ]                                                                                                                                                                                                                    
[build] Summary: 2 of 3 packages succeeded.                                                                                                                                                                                                                                            
[build]   Ignored:   110 packages were skipped or are blacklisted.                                                                                                                                                                                                                     
[build]   Warnings:  1 packages succeeded with warnings.                                                                                                                                                                                                                               
[build]   Abandoned: None.                                                                                                                                                                                                                                                             
[build]   Failed:    1 packages failed.                                                                                                                                                                                                                                                
[build] Runtime: 16.8 seconds total.                                                                                                                                                                                                                                                   
[build] Note: Workspace packages have changed, please re-source setup files to use them.

cc: @Chunting

Renaming rules problem persists

Ok, I tried in a completely different machine and setup, and plotjuggler is now working without any additional rules, but when I add either of the following rules, it crashes:

  • <rule pattern="nodes.#/resident_memory" alias="nodes.#/name" substitution="@/resident_memory" />
  • <rule pattern="nodes.#/resident_memory_percentage" alias="nodes.#/name" substitution="@/resident_memory_percentage" />
  • <rule pattern="nodes.#/all_memory_percentage" alias="nodes.#/name" substitution="@/all_memory_percentage" />
  • <rule pattern="nodes.#/cputime_percentage" alias="nodes.#/name" substitution="@/cputime_percentage" />

Again, if I, for example, change "resident_memory" to "resident_mem", everything is working perfectly!

'DataLoad ROS Bags' throws exception when loading bag

Hi,

I have encountered the following issue: When loading a bag the plugin 'DataLoad ROS Bags' throws an error. The specific text is "Buffer overrun in RosIntrospection::ReadFromBuffer". Here is a screenshot:

screenshot from 2017-11-15 09 49 11

I am using PlotJuggler version 1.3.0 installed from debians using Ubuntu 14.04 and ROS Indigo. I tried compiling from source, but failed. Sorry.

This is the bag I tried to load:

2017-11-15-09-33-32.bag.zip

I contains a single message of type control_msgs/FollowJointTrajectoryGoal with a trajectory with 500 points in it. I wanted to look at the position and velocity trajectories of individual joints using PlotJuggler. Is that usage in principal supported?

Best,
Georg.

Loading valid .csv results in "Selected time in notstrictly monotonic" error

The first time I load a csv file to PlotJuggler there is a pop-up asking to select the time axis. The file is loaded correctly. When I want to load another file with same data structure, there is "Selected time in notstrictly monotonic" error.

The only way I can get data to be loaded correctly then, is to change the name of time axis in the csv.

Example files (extensions changed to txt due to Github restrictions):
test.txt
test2.txt

Present the csv file name

Hi, could you please add a new feature that provides the csv file name in the titlebar?
Since sometimes I plot the different csv files whose labels are identical, it's not inconvenient to tell them.
image

Thanks.
Chunting
2018_03_07_18_11_29.zip

Issue loading sensor_msgs/Image messages from a rosbag

Hi,

Thanks for the great work on PlotJuggler (great name btw).

I seem to have found an issue when loading sensor_msgs/Image messages from a rosbag.
I am currently using the latest master version.

Error message displayed:

The plugin [DataLoad ROS bags] thrown the following exception: 

 Buffer overrun in deserializeIntoFlatContainer (blob)

I am not the owner of the rosbag thus cannot share it unfortunately.
Let me know if there is any other piece of information that would help resolving this issue.

Alex

Gray Publishers label

Hey, thank you for the tool.

The Publishers is not enabled and I am unable to subscribe to any topic.

PlotJuggler version: 1.3
ros: Kinetic
Ubuntu 16.04

Thanks

Stream in a non ros-based environment

Hello @facontidavide !

First thank you for your big contribution to the ROS community. PlotJuggler is really easy to use and as already saved me a lot of debug and figure creation time.

I am now unfortunately working on a non ros-based project on Windows, so I cannot use PlotJuggler for streaming any more...

Could it be possible somehow to include PlotJuggler as a new Widget inside my QT based application to stream some variables ?

Jimmy

axis is stick to [-0.1, 0.1]

I used the streaming function, when I add the pose.x to the plot the y axis is somehow stick to [-0.1, 0.1] which I can not zoom in and out.

"Segmentation fault (core dumped)" error

Hello,

I am eager to use your program. I have just installed 1.3.0 version of PlotJuggler using catkin_make on my Ubuntu14.04 ros-indigo installed machine. Firstly, I tried to use the dummy data with argument "-t" and it visualized them successfully. When I record a rosbag file and tried visualize I had an error of "Segmentation fault (core dumped)".

I attached the rosbag file. I would be grateful if you could help me on my problem?

Thanks in advance.

2017-11-14-16-34-23.bag.zip

Feature request: Clear line data

Thanks for the awesome package. One thing that I'd consider useful would be selectively clearing data of a single line (though not removing the "line object" itself), so that I can replay a bagfile and have the line data only from the last replay.

Problem with repeated values on x-axis

A repeated value on the x-axis inhibits further plotting. This file demonstrates the issue. Upon loading the file, if I select _Column_0 as the time axis, which has identical values in rows 3 and 4, when I try to add e.g. column A to the plot area, only the first two values of A will be plotted.

My actual use case is a dataset of densely sampled (1ms) data. Occasionally, I will have two data points with the same timestamp, which is not really an issue, however, it seems to prevent PlotJuggler from correctly plotting the data.

This is with the currrent master head.

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)

"Compatible formats" save dialog option unclear

At least on my Ubuntu, the "save plot to file" dialog suggests it can save the plot as "Compatible formats", but there is no listing of what formats are compatible. There is also no warning/error message when you give the file an unsupported extension.

snimek obrazovky porizeny 2017-03-28 15 14 01

Rule renaming issue

I am trying to create a ruleset for my package. Everything is working as expected, except for the following rule:

<rule pattern="nodes.#/resident_memory_percentage" alias="nodes.#/name" substitution="@/resident_memory_percentage" />

If I use the rule above, I get a malloc() exception. If I use the rule below instead, everything is working perfectly:

<rule pattern="nodes.#/resident_memory_percentage" alias="nodes.#/name" substitution="@/resident_memory_percen" />

The difference between the two is the string length of the subsctitution field.
The crash happens in:

  • "resident_memory_percentage"
  • "resident_memory_percentag"
  • "resident_memory_percenta"
  • "resident_memory_percent"

and stops at "resident_memory_percen".

The problem most probably lies in the ros_type_introspection package (in renamer.cpp at the "applyNameTransform" method?), but since it was encountered while using plotjuggler, I posted the issue here.

plot dataA vs dataB instead of dataA vs time

Hi!
I want to plot real time trajectories of my robots using this. I am getting data as Pose2d message. Is it possible to plot X-coordinate vs Y-coordinate on a plot? Right now I can only plot as time series.

Thanks,
Bhargav

Behaviour when trying to plot a ROS message without stamp

Hello,

the behaviour of PlotJuggler is strange, when you try to plot a ROS topic where the messages have no timestamp in the header. Basically it only reads one message and displays it.
It took me a while to figure out what the problem is. Obviously there should be a stamp in the message, but maybe PlotJuggler could just display an error message to make it clearer to the user.

Here is a picture how it looks like.

no_header_bug

I tested it on Ubuntu 16.04 with ROS Kinetic using the current master branch.

I can also send you a rosbag, but I guess it's the same with any stamp less message.
I'm glad to help, if you need any further information.

Axis settings

I have been working with Plotjuggler and one thing I really miss is being able to set fix values for the axis. Would it possible to do it?

Build failed (Ubuntu 14.04 ROS indigo)

Hi,

I have cloned the latest version from the git and followed the steps for installation. My installations failed at the make step inside the build folder. Here is what I am getting.

$~/PlotJuggler/build$ make 
Scanning dependencies of target colorwidgets_automoc
[  0%] Automoc for target colorwidgets
Generating moc_color_palette.cpp
Generating moc_color_preview.cpp
Generating moc_color_wheel.cpp
Generating moc_swatch.cpp
[  0%] Built target colorwidgets_automoc
Scanning dependencies of target colorwidgets
[  0%] Building CXX object color_widgets/CMakeFiles/colorwidgets.dir/src/color_names.cpp.o
[  1%] Building CXX object color_widgets/CMakeFiles/colorwidgets.dir/src/color_palette.cpp.o
[  2%] Building CXX object color_widgets/CMakeFiles/colorwidgets.dir/src/color_utils.cpp.o
/home/alex-d/PlotJuggler/color_widgets/src/color_utils.cpp: In function ‘QColor color_widgets::detail::color_from_lch(qreal, qreal, qreal, qreal)’:
/home/alex-d/PlotJuggler/color_widgets/src/color_utils.cpp:30:30: error: ‘fmod’ is not a member of ‘std’
     qreal x = chroma*(1-qAbs(std::fmod(h1,2)-1));
                              ^
/home/alex-d/PlotJuggler/color_widgets/src/color_utils.cpp:30:30: note: suggested alternative:
In file included from /usr/include/features.h:374:0,
                 from /usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h:39,
                 from /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h:482,
                 from /usr/include/c++/5/utility:68,
                 from /usr/include/c++/5/algorithm:60,
                 from /usr/include/qt5/QtCore/qglobal.h:82,
                 from /usr/include/qt5/QtGui/qrgb.h:45,
                 from /usr/include/qt5/QtGui/qcolor.h:45,
                 from /usr/include/qt5/QtGui/QColor:1,
                 from /home/alex-d/PlotJuggler/./color_widgets/include/color_utils.hpp:22,
                 from /home/alex-d/PlotJuggler/color_widgets/src/color_utils.cpp:22:
/usr/include/x86_64-linux-gnu/bits/mathcalls.h:187:1: note:   ‘fmod’
 __MATHCALL (fmod,, (_Mdouble_ __x, _Mdouble_ __y));
 ^
/home/alex-d/PlotJuggler/color_widgets/src/color_utils.cpp: In function ‘QColor color_widgets::detail::color_from_hsl(qreal, qreal, qreal, qreal)’:
/home/alex-d/PlotJuggler/color_widgets/src/color_utils.cpp:58:30: error: ‘fmod’ is not a member of ‘std’
     qreal x = chroma*(1-qAbs(std::fmod(h1,2)-1));
                              ^
/home/alex-d/PlotJuggler/color_widgets/src/color_utils.cpp:58:30: note: suggested alternative:
In file included from /usr/include/features.h:374:0,
                 from /usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h:39,
                 from /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h:482,
                 from /usr/include/c++/5/utility:68,
                 from /usr/include/c++/5/algorithm:60,
                 from /usr/include/qt5/QtCore/qglobal.h:82,
                 from /usr/include/qt5/QtGui/qrgb.h:45,
                 from /usr/include/qt5/QtGui/qcolor.h:45,
                 from /usr/include/qt5/QtGui/QColor:1,
                 from /home/alex-d/PlotJuggler/./color_widgets/include/color_utils.hpp:22,
                 from /home/alex-d/PlotJuggler/color_widgets/src/color_utils.cpp:22:
/usr/include/x86_64-linux-gnu/bits/mathcalls.h:187:1: note:   ‘fmod’
 __MATHCALL (fmod,, (_Mdouble_ __x, _Mdouble_ __y));
 ^
make[2]: *** [color_widgets/CMakeFiles/colorwidgets.dir/src/color_utils.cpp.o] Error 1
make[1]: *** [color_widgets/CMakeFiles/colorwidgets.dir/all] Error 2
make: *** [all] Error 2

Can you suggest something. Thanks.

License clarification

Just want to check whether it's GPL (as per the LICENSE in the root dir) or LGPL (as per the package.xml)?

Build Errors

Hi,

I am using the master branch (ubuntu 14.04 ) and trying to build but getting following errors : Any help would be great! Thanks

[ 74%] Generating qrc_resource.cpp
Scanning dependencies of target PlotJuggler
[ 75%] Building CXX object plotter_gui/CMakeFiles/PlotJuggler.dir/aboutdialog.cpp.o
[ 75%] Building CXX object plotter_gui/CMakeFiles/PlotJuggler.dir/axis_limits_dialog.cpp.o
[ 76%] Building CXX object plotter_gui/CMakeFiles/PlotJuggler.dir/main.cpp.o
In file included from /home/ankit-d/PlotJuggler/plotter_gui/mainwindow.h:17:0,
                 from /home/ankit-d/PlotJuggler/plotter_gui/main.cpp:1:
/home/ankit-d/PlotJuggler/plotter_gui/realslider.h: In member function ‘void RealSlider::setRealValue(double)’:
/home/ankit-d/PlotJuggler/plotter_gui/realslider.h:53:15: error: ‘round’ is not a member of ‘std’
     int pos = std::round( (double)(maximum() - minimum()) * ratio  + minimum())
               ^
/home/ankit-d/PlotJuggler/plotter_gui/realslider.h:53:15: note: suggested alternative:
In file included from /usr/include/features.h:374:0,
                 from /usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h:39,
                 from /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h:482,
                 from /usr/include/c++/5/utility:68,
                 from /usr/include/c++/5/algorithm:60,
                 from /usr/include/qt5/QtCore/qglobal.h:82,
                 from /usr/include/qt5/QtGui/qwindowdefs.h:45,
                 from /usr/include/qt5/QtWidgets/qwidget.h:45,
                 from /usr/include/qt5/QtWidgets/qmainwindow.h:45,
                 from /usr/include/qt5/QtWidgets/QMainWindow:1,
                 from /home/ankit-d/PlotJuggler/plotter_gui/mainwindow.h:4,
                 from /home/ankit-d/PlotJuggler/plotter_gui/main.cpp:1:
/usr/include/x86_64-linux-gnu/bits/mathcalls.h:309:1: note:   ‘round’
 __MATHCALLX (round,, (_Mdouble_ __x), (__const__));
 ^
make[2]: *** [plotter_gui/CMakeFiles/PlotJuggler.dir/main.cpp.o] Error 1
make[1]: *** [plotter_gui/CMakeFiles/PlotJuggler.dir/all] Error 2
make: *** [all] Error 2

Remove data from plot

Is it possible to remove data from a plot once it has been added?

If not this would be a great feature

Crash loading bag with 2 topics of nav_msgs/Odometry

  • Version used 1.0.7
  • Attached two bags with the same topics, one is a few seconds long the other is longer.

The short one (named Error_opening.bag) crashes after selecting both topics inside the rosbag with the error:

terminate called after throwing an instance of 'std::runtime_error'
what(): can't deserialize this stuff: Header

The same happened when I tried the ROS Topic Streamer on those two topics at the same time.

The other bag is fine.

bags.zip

Saving plot to file requires a file extension

Right now saving a plot to a file requires the user to put .png, .jpg, etc in the filename.

Additionally if the user puts something that is not supported (E.G. no file extension or a bad one such as ".txt") there is no warning or error, the dialog goes away but no file is created.

Default extensions should be selected for this functionality for a user

PlotJuggler layout start via launch file

Hey there,

I wish, that PlogJuggler would be able to be started via launch files with a predefined layout. Unfortunately this is not possible actually if you start gazebo in paused mode (In case your predefined layout contains topics that are first published when gazebo is started).

Currently it is like this: I Start plotjuggler with a predefined layout from a launch file then it says it cannot open the topics of this layout cause the topics are not yet published (because gazebo is started in paused mode)

That is why it would be better that plotjuggler just prints a message like:

waiting for topics to come in.... (When loading a layout that has topics which are not published yet)

Hope you can do this improvement on the code :)

Changing X axis curve not working

I am not sure if this is the right place to post this. I tried as per the manual, using right click drag to set the x axis variable. I tried with different files and streams, it just doesn't work. It plots it on the y axis and the overlay of "set as x axis" never appears. Am I doing something wrong or is this a bug? Is there anything else I need to provide to fix this?

Importing data from CSV files

First of all, thanks a lot for a great tool!

So far, I have been using PlotJuggler with rosbags and it has worked flawlessly. Now I'm trying to use it with .csv files and I can't quite figure out how the importing works. I'm using version 1.0.4 installed from the ROS Kinetic apt package ros-kinetic-plotjuggler.

For example, I create a .csv file in Pandas using the following commands:

import pandas as pd
import matplotlib as plt
df = pd.DataFrame(np.random.randn(6,4), index=[1,2,3,4,5,6], columns=list('ABCD'))
df.to_csv('test.csv')

the output is this file (the extension has been changed to .txt because GitHub does not support attaching .csv files to issues). When loading the data into PlotJuggler, I get the following warning:

Selected time in not strictly  monotonic. Do you want to abort?
(Clicking "NO" you continue loading)

When clicking No I can see the data in the left pane, however, when trying to plot the data against the index vector, i.e., right-dragging the index vector to the plot pane and then left-dragging the data columns, this is the result I get:
plotjuggler_037
Btw. I did maximize both the vertical and the horizontal zoom. When maximizing the vertical zoom, the following gets printed to the console from which I started PlotJuggler:

invalid X0/X1 range in PlotWidget::maximumRangeY
invalid X0/X1 range in PlotWidget::maximumRangeY
invalid X0/X1 range in PlotWidget::maximumRangeY
invalid X0/X1 range in PlotWidget::maximumRangeY

I expect to see this plot:
df_plot
which is what I get by:

df.plot()
plt.show()

Am I missing something obvious?

Installation under ROS

I have a doubt about the installation under ROS.

I clone the repository under catkin_ws/src and ran catkin build from catkin-tools. I guess this is correct as I can run rosrun plotjuggler PlotJuggler. Are these the only steps?

If I want to use PlotJuggler both with and without ROS, I guess I have to also make the classical installation. Am I right?

Use tree view in the left side ListWidget

Parsing rosbags usally generates very long name that use a lot of real-estate on the screen.
It must be possible to switch to a more compact "tree-view" representation

PlotJuggler Installation[Question]

I am trying to install the Cmake package by running:

PlotJuggler$ cmake CMakeLists.txt

However I am getting the following output:

  CMake Error at CMakeLists.txt:40 (add_subdirectory):
  add_subdirectory given source "qwt/src" which is not an existing directory.

Do I need to build something else before I build this?

Thanks in advance!

Installation issue

I managed to compile PlotJuggler but not to install it. sudo make install return make: *** No rule to make target 'install'. Stop.

Easy reload of files

Hi,

just an enhancement request to have a function for reloading the same data file.
I am currently working with a .csv data file which I generate with some code and then visualize with PlotJuggler.
Now every time I generate a new data set I have to click on "Load data from: x.csv" and reselect the time axis index. It would be awesome to just have a button (or even a shortcut like F5) to reload the last file with the same time axis.
But as I said, it's just an enhancement and it already works quiet well.

Thanks again for your amazing tool! It should be the standard plotter in ROS 😃

Pause streaming with Space Key

Hi,
I think it would be very nice to have the ability to start/stop streaming using the space key :)

Best regards,
Marc

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.