base_visualizer.py
Go to the documentation of this file.
1 from .. import pinocchio_pywrap_default as pin
2 from ..shortcuts import createDatas
3 
4 import time
5 import numpy as np
6 import os.path as osp
7 import abc
8 
9 try:
10  import imageio
11 
12  IMAGEIO_SUPPORT = True
13 except ImportError:
14  IMAGEIO_SUPPORT = False
15 
16 
17 class BaseVisualizer(abc.ABC):
18  """Pinocchio visualizers are employed to easily display a model at a given configuration.
19  BaseVisualizer is not meant to be directly employed, but only to provide a uniform interface and a few common methods.
20  New visualizers should extend this class and override its methods as neeeded.
21  """
22 
23  _video_writer = None
24 
25  _video_writer = None
26 
27  def __init__(
28  self,
29  model=pin.Model(),
30  collision_model=None,
31  visual_model=None,
32  copy_models=False,
33  data=None,
34  collision_data=None,
35  visual_data=None,
36  ):
37  """Construct a display from the given model, collision model, and visual model.
38  If copy_models is True, the models are copied. Otherwise, they are simply kept as a reference."""
39 
40  if copy_models:
41  self.model = model.copy()
42  self.collision_model = collision_model.copy()
43  self.visual_model = visual_model.copy()
44  else:
45  self.model = model
46  self.collision_model = collision_model
47  self.visual_model = visual_model
48 
49  if data is None:
50  self.data = self.model.createData()
51  else:
52  self.data = data
53 
54  if collision_data is None and self.collision_model is not None:
56  else:
57  self.collision_data = collision_data
58 
59  if visual_data is None and self.visual_model is not None:
60  self.visual_data = self.visual_model.createData()
61  else:
62  self.visual_data = visual_data
63 
64  def rebuildData(self):
65  """Re-build the data objects. Needed if the models were modified.
66  Warning: this will delete any information stored in all data objects."""
67  self.data, self.collision_data, self.visual_data = createDatas(
68  self.model, self.collision_model, self.visual_model
69  )
70 
71  def getViewerNodeName(self, geometry_object, geometry_type):
72  """Return the name of the geometry object inside the viewer."""
73  pass
74 
75  def initViewer(self, *args, **kwargs):
76  """Init the viewer by loading the gui and creating a window."""
77  pass
78 
79  def loadViewerModel(self, *args, **kwargs):
80  """Create the scene displaying the robot meshes in the viewer"""
81  pass
82 
83  def reload(self, new_geometry_object, geometry_type=None):
84  """Reload a geometry_object given by its type"""
85  pass
86 
87  def clean(self):
88  """Delete all the objects from the whole scene"""
89  pass
90 
91  @abc.abstractmethod
92  def display(self, q=None):
93  """Display the robot at configuration q or refresh the rendering
94  from the current placements contained in data by placing all the bodies in the viewer."""
95 
96  @abc.abstractmethod
97  def displayCollisions(self, visibility):
98  """Set whether to display collision objects or not."""
99 
100  @abc.abstractmethod
101  def displayVisuals(self, visibility):
102  """Set whether to display visual objects or not."""
103 
104  @abc.abstractmethod
106  """Set the visualizer background color."""
107 
108  @abc.abstractmethod
109  def setCameraTarget(self, target):
110  """Set the camera target."""
111 
112  @abc.abstractmethod
113  def setCameraPosition(self, position: np.ndarray):
114  """Set the camera's 3D position."""
115 
116  @abc.abstractmethod
117  def setCameraZoom(self, zoom: float):
118  """Set camera zoom value."""
119 
120  @abc.abstractmethod
121  def setCameraPose(self, pose: np.ndarray = np.eye(4)):
122  """Set camera 6D pose using a 4x4 matrix."""
123 
124  @abc.abstractmethod
125  def captureImage(self, w=None, h=None):
126  """Captures an image from the viewer and returns an RGB array."""
127 
128  @abc.abstractmethod
130  """Disable camera manual control"""
131 
132  @abc.abstractmethod
134  """Enable camera manual control"""
135 
136  @abc.abstractmethod
137  def drawFrameVelocities(self, *args, **kwargs):
138  """Draw current frame velocities."""
139 
140  def sleep(self, dt):
141  time.sleep(dt)
142 
143  def has_video_writer(self):
144  return self._video_writer is not None
145 
146  def play(self, q_trajectory, dt=None, callback=None, capture=False, **kwargs):
147  """Play a trajectory with given time step. Optionally capture RGB images and returns them."""
148  nsteps = len(q_trajectory)
149  if not capture:
150  capture = self.has_video_writer()
151 
152  imgs = []
153  for i in range(nsteps):
154  t0 = time.time()
155  self.display(q_trajectory[i])
156  if callback is not None:
157  callback(i, **kwargs)
158  if capture:
159  img_arr = self.captureImage()
160  if not self.has_video_writer():
161  imgs.append(img_arr)
162  else:
163  self._video_writer.append_data(img_arr)
164  t1 = time.time()
165  elapsed_time = t1 - t0
166  if dt is not None and elapsed_time < dt:
167  self.sleep(dt - elapsed_time)
168  if capture and not self.has_video_writer():
169  return imgs
170 
171  def create_video_ctx(self, filename=None, fps=30, directory=None, **kwargs):
172  """Create a video recording context, generating the output filename if necessary.
173 
174  Code inspired from https://github.com/petrikvladimir/RoboMeshCat.
175  """
176  if not IMAGEIO_SUPPORT:
177  import warnings, contextlib
178 
179  warnings.warn(
180  "Video context cannot be created because imageio is not available.",
181  UserWarning,
182  )
183  return contextlib.nullcontext()
184  if filename is None:
185  if directory is None:
186  from tempfile import gettempdir
187 
188  directory = gettempdir()
189  f_fmt = "%Y%m%d_%H%M%S"
190  ext = "mp4"
191  filename = time.strftime("{}.{}".format(f_fmt, ext))
192  filename = osp.join(directory, filename)
193  return VideoContext(self, fps, filename)
194 
195 
197  def __init__(self, viz, fps, filename, **kwargs):
198  self.viz = viz
199  self.vid_writer = imageio.get_writer(filename, fps=fps, **kwargs)
200 
201  def __enter__(self):
202  print("[Entering video recording context]")
203  self.viz._video_writer = self.vid_writer
204 
205  def __exit__(self, *args):
206  self.vid_writer.close()
207  self.viz._video_writer = None
208 
209 
210 __all__ = ["BaseVisualizer"]
pinocchio.visualize.base_visualizer.BaseVisualizer.disableCameraControl
def disableCameraControl(self)
Definition: base_visualizer.py:129
pinocchio.visualize.base_visualizer.VideoContext.vid_writer
vid_writer
Definition: base_visualizer.py:199
pinocchio.visualize.base_visualizer.BaseVisualizer.has_video_writer
def has_video_writer(self)
Definition: base_visualizer.py:143
pinocchio.visualize.base_visualizer.BaseVisualizer.setCameraPose
def setCameraPose(self, np.ndarray pose=np.eye(4))
Definition: base_visualizer.py:121
pinocchio.visualize.base_visualizer.BaseVisualizer.displayCollisions
def displayCollisions(self, visibility)
Definition: base_visualizer.py:97
pinocchio.visualize.base_visualizer.BaseVisualizer.visual_model
visual_model
Definition: base_visualizer.py:34
pinocchio.visualize.base_visualizer.BaseVisualizer.setBackgroundColor
def setBackgroundColor(self)
Definition: base_visualizer.py:105
pinocchio.visualize.base_visualizer.BaseVisualizer.collision_model
collision_model
Definition: base_visualizer.py:33
pinocchio.visualize.base_visualizer.BaseVisualizer.visual_data
visual_data
Definition: base_visualizer.py:51
pinocchio.visualize.base_visualizer.BaseVisualizer._video_writer
_video_writer
Definition: base_visualizer.py:23
pinocchio.visualize.base_visualizer.BaseVisualizer.data
data
Definition: base_visualizer.py:41
pinocchio.visualize.base_visualizer.VideoContext.__init__
def __init__(self, viz, fps, filename, **kwargs)
Definition: base_visualizer.py:197
pinocchio.visualize.base_visualizer.BaseVisualizer.sleep
def sleep(self, dt)
Definition: base_visualizer.py:140
pinocchio.visualize.base_visualizer.BaseVisualizer.rebuildData
def rebuildData(self)
Definition: base_visualizer.py:64
pinocchio.visualize.base_visualizer.BaseVisualizer.getViewerNodeName
def getViewerNodeName(self, geometry_object, geometry_type)
Definition: base_visualizer.py:71
pinocchio.visualize.base_visualizer.BaseVisualizer.drawFrameVelocities
def drawFrameVelocities(self, *args, **kwargs)
Definition: base_visualizer.py:137
pinocchio.visualize.base_visualizer.VideoContext.__enter__
def __enter__(self)
Definition: base_visualizer.py:201
pinocchio.visualize.base_visualizer.BaseVisualizer.setCameraZoom
def setCameraZoom(self, float zoom)
Definition: base_visualizer.py:117
pinocchio.shortcuts.createDatas
def createDatas(*models)
Definition: shortcuts.py:79
pinocchio.visualize.base_visualizer.BaseVisualizer.setCameraPosition
def setCameraPosition(self, np.ndarray position)
Definition: base_visualizer.py:113
pinocchio.visualize.base_visualizer.BaseVisualizer.captureImage
def captureImage(self, w=None, h=None)
Definition: base_visualizer.py:125
pinocchio.visualize.base_visualizer.BaseVisualizer.reload
def reload(self, new_geometry_object, geometry_type=None)
Definition: base_visualizer.py:83
pinocchio::createData
ConstraintDataTpl< Scalar, Options, ConstraintCollectionTpl > createData(const ConstraintModelTpl< Scalar, Options, ConstraintCollectionTpl > &cmodel)
Definition: constraint-model-visitor.hpp:248
pinocchio.visualize.base_visualizer.BaseVisualizer.setCameraTarget
def setCameraTarget(self, target)
Definition: base_visualizer.py:109
pinocchio.visualize.base_visualizer.BaseVisualizer.create_video_ctx
def create_video_ctx(self, filename=None, fps=30, directory=None, **kwargs)
Definition: base_visualizer.py:171
pinocchio.visualize.base_visualizer.BaseVisualizer.displayVisuals
def displayVisuals(self, visibility)
Definition: base_visualizer.py:101
pinocchio.visualize.base_visualizer.BaseVisualizer.display
def display(self, q=None)
Definition: base_visualizer.py:92
pinocchio.visualize.base_visualizer.BaseVisualizer.__init__
def __init__(self, model=pin.Model(), collision_model=None, visual_model=None, copy_models=False, data=None, collision_data=None, visual_data=None)
Definition: base_visualizer.py:27
pinocchio.visualize.base_visualizer.BaseVisualizer.model
model
Definition: base_visualizer.py:32
pinocchio.visualize.base_visualizer.BaseVisualizer.enableCameraControl
def enableCameraControl(self)
Definition: base_visualizer.py:133
pinocchio.visualize.base_visualizer.VideoContext
Definition: base_visualizer.py:196
pinocchio.visualize.base_visualizer.BaseVisualizer
Definition: base_visualizer.py:17
pinocchio.visualize.base_visualizer.VideoContext.viz
viz
Definition: base_visualizer.py:198
pinocchio.visualize.base_visualizer.VideoContext.__exit__
def __exit__(self, *args)
Definition: base_visualizer.py:205
pinocchio.visualize.base_visualizer.BaseVisualizer.play
def play(self, q_trajectory, dt=None, callback=None, capture=False, **kwargs)
Definition: base_visualizer.py:146
pinocchio.visualize.base_visualizer.BaseVisualizer.clean
def clean(self)
Definition: base_visualizer.py:87
pinocchio.visualize.base_visualizer.BaseVisualizer.loadViewerModel
def loadViewerModel(self, *args, **kwargs)
Definition: base_visualizer.py:79
pinocchio.visualize.base_visualizer.BaseVisualizer.collision_data
collision_data
Definition: base_visualizer.py:46
path
pinocchio.visualize.base_visualizer.BaseVisualizer.initViewer
def initViewer(self, *args, **kwargs)
Definition: base_visualizer.py:75


pinocchio
Author(s):
autogenerated on Tue Jun 25 2024 02:42:34