Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

## [Unreleased]

### Added

- Default visualizer can be changed with `PINOCCHIO_VIEWER` environment variable ([#2419](https://github.com/stack-of-tasks/pinocchio/pull/2419))

### Fixed
- Fix linkage of Boost.Serialization on Windows ([#2400](https://github.com/stack-of-tasks/pinocchio/pull/2400))
- Fix mjcf parser appending of inertias at root joint ([#2403](https://github.com/stack-of-tasks/pinocchio/pull/2403))
Expand Down
10 changes: 8 additions & 2 deletions bindings/python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,14 @@ if(BUILD_PYTHON_INTERFACE)

# --- INSTALL VISUALIZATION SCRIPTS
install_python_files(
MODULE visualize FILES __init__.py base_visualizer.py gepetto_visualizer.py
meshcat_visualizer.py panda3d_visualizer.py rviz_visualizer.py)
MODULE visualize
FILES __init__.py
base_visualizer.py
gepetto_visualizer.py
meshcat_visualizer.py
panda3d_visualizer.py
rviz_visualizer.py
visualizers.py)

# --- STUBS --- #
if(GENERATE_PYTHON_STUBS)
Expand Down
4 changes: 2 additions & 2 deletions bindings/python/pinocchio/robot_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,14 +413,14 @@ def initViewer(self, share_data=True, *args, **kwargs):
"""Init the viewer"""
# Set viewer to use to MeshCat.
if self.viz is None:
from .visualize import MeshcatVisualizer
from .visualize import Visualizer

data, collision_data, visual_data = None, None, None
if share_data:
data = self.data
collision_data = self.collision_data
visual_data = self.visual_data
self.viz = MeshcatVisualizer(
self.viz = Visualizer.default()(
self.model,
self.collision_model,
self.visual_model,
Expand Down
1 change: 1 addition & 0 deletions bindings/python/pinocchio/visualize/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
from .meshcat_visualizer import MeshcatVisualizer
from .panda3d_visualizer import Panda3dVisualizer
from .rviz_visualizer import RVizVisualizer
from .visualizers import Visualizer
55 changes: 55 additions & 0 deletions bindings/python/pinocchio/visualize/visualizers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from enum import Enum
from importlib.util import find_spec
from os import environ

from .base_visualizer import BaseVisualizer
from .gepetto_visualizer import GepettoVisualizer
from .meshcat_visualizer import MeshcatVisualizer
from .panda3d_visualizer import Panda3dVisualizer
from .rviz_visualizer import RVizVisualizer


class Visualizer(Enum):
BASE = BaseVisualizer
GEPETTO = GepettoVisualizer
MESHCAT = MeshcatVisualizer
PANDA3D = Panda3dVisualizer
RVIZ = RVizVisualizer

@classmethod
def default(cls):
"""
Allow user to choose their prefered viewer with eg.
export PINOCCHIO_VIEWER=RVIZ.

Otherwise, try to find one which is installed.
"""
# Allow user to define which viewer they want
if "PINOCCHIO_VIEWER" in environ:
selected = environ["PINOCCHIO_VIEWER"].upper()
if hasattr(cls, selected):
return getattr(cls, selected).value
err = (
f"The visualizer '{selected}' is not available.\n"
"Please set PINOCCHIO_VIEWER to something installed among:\n"
"- meshcat\n"
"- gepetto-viewer\n"
"- panda3d\n"
"- rviz\n"
)
raise ImportError(err)

# Otherwise, use the first available
for v in ["meshcat", "gepetto", "panda3d_viewer", "rviz"]:
if find_spec(v) is not None:
return getattr(cls, v.replace("_viewer", "").upper()).value

err = (
"No visualizer could be found.\n"
"Please install one of those:\n"
"- meshcat\n"
"- gepetto-viewer\n"
"- panda3d\n"
"- rviz\n"
)
raise ImportError(err)