From 28cbf45fe358947105f3fe8bfd47fc0713b41ebd Mon Sep 17 00:00:00 2001 From: Nikhil <87761277+Nikhil-Singhal-06@users.noreply.github.com> Date: Wed, 6 Mar 2024 14:30:39 +0100 Subject: [PATCH] update docs: py_trees_ros_viewer (#15) --- docs/how_to_run.rst | 57 +++++++++++++++++++++++++++++++-- docs/images/py_tree_viewer.png | Bin 0 -> 23950 bytes 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 docs/images/py_tree_viewer.png diff --git a/docs/how_to_run.rst b/docs/how_to_run.rst index ba8251a4..18fe7f2a 100644 --- a/docs/how_to_run.rst +++ b/docs/how_to_run.rst @@ -29,6 +29,59 @@ information of py_trees and parser: ros2 run scenario_execution scenario_execution $(PATH_TO_SCENARIO_FILE) -t -d -Using RVIZ to trigger scenario ------------------------------- +Visualize Scenario with PyTrees ROS Viewer +------------------------------------------ +Before getting started, ensure that the PyQt5 version 5.14 Python library is installed. You can check PyQt5 version using the following command: + +.. code-block:: bash + + pip freeze | grep -i pyqt + +If any PyQt5 libraries are detected, it's recommended to uninstall them to avoid conflicts: + +.. code-block:: bash + + pip3 uninstall PyQt5 PyQt5-Qt5 PyQt5-sip PyQtWebEngine PyQtWebEngine-Qt5 + +Additionally, if the default PyQtWebEngine is present, remove it using: + +.. code-block:: bash + + sudo apt remove python3-pyqt5.qtwebengine + +Next, install PyQt and PyQtWebEngine version 5.14: + +.. code-block:: bash + + pip install PyQt5==5.14 + pip install PyQtWebEngine==5.14 + +Once PyQt is set up, clone the ``py_trees_ros_viewer`` repository: + +.. code-block:: bash + + git clone git@github.com:splintered-reality/py_trees_ros_viewer.git + +After cloning, build the package using ``colcon build`` and source the workspace. + +Now, to open the viewer, execute the following command: + +.. code-block:: bash + + py-trees-tree-viewer --no-sandbox + +Finally, in a separate terminal, run the scenario file to visualize the behavior tree. + +Example: + +.. code-block:: bash + + ros2 launch scenario_execution scenario_launch.py scenario:=examples/example_scenario/hello_world.osc + +.. figure:: images/py_tree_viewer.png + :alt: Behavior Tree Viewer + + +Please note that this method has been tested on Ubuntu 22.04. If you are using any other distribution, please ensure that +PyQtEngine works on your machine and render web pages correctly. diff --git a/docs/images/py_tree_viewer.png b/docs/images/py_tree_viewer.png new file mode 100644 index 0000000000000000000000000000000000000000..682004993c971da7bce6d842a5e72a0bb1dcf08d GIT binary patch literal 23950 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 literal 0 HcmV?d00001