gepetto_visualizer.py
Go to the documentation of this file.
1 from .. import pinocchio_pywrap_default as pin
2 from ..shortcuts import buildModelsFromUrdf, createDatas
3 from ..utils import npToTuple
4 
5 import numpy as np
6 from numpy.linalg import norm
7 
8 from . import BaseVisualizer
9 
10 import warnings
11 
12 try:
13  import hppfcl
14 
15  WITH_HPP_FCL_BINDINGS = True
16 except:
17  WITH_HPP_FCL_BINDINGS = False
18 
19 
20 class GepettoVisualizer(BaseVisualizer):
21  """A Pinocchio display using Gepetto Viewer"""
22 
23  def getViewerNodeName(self, geometry_object, geometry_type):
24  """Return the name of the geometry object inside the viewer"""
25  if geometry_type is pin.GeometryType.VISUAL:
26  return self.viewerVisualGroupName + "/" + geometry_object.name
27  elif geometry_type is pin.GeometryType.COLLISION:
28  return self.viewerCollisionGroupName + "/" + geometry_object.name
29 
31  self,
32  viewer=None,
33  windowName="python-pinocchio",
34  sceneName="world",
35  loadModel=False,
36  ):
37  """Init GepettoViewer by loading the gui and creating a window."""
38 
39  try:
40  import gepetto.corbaserver
41  except ImportError:
42  import warnings
43 
44  msg = (
45  "Error while importing the viewer client.\n"
46  "Check whether gepetto-gui is properly installed"
47  )
48  warnings.warn(msg, category=UserWarning, stacklevel=2)
49 
50  try:
51  self.viewer = gepetto.corbaserver.Client() if viewer is None else viewer
52  gui = self.viewer.gui
53 
54  # Create window
55  window_l = gui.getWindowList()
56  if not windowName in window_l:
57  self.windowID = self.viewer.gui.createWindow(windowName)
58  else:
59  self.windowID = self.viewer.gui.getWindowID(windowName)
60 
61  # Create scene if needed
62  scene_l = gui.getSceneList()
63  if sceneName not in scene_l:
64  gui.createScene(sceneName)
65  self.sceneName = sceneName
66  gui.addSceneToWindow(sceneName, self.windowID)
67 
68  if loadModel:
69  self.loadViewerModel()
70  except:
71  import warnings
72 
73  msg = (
74  "Error while starting the viewer client.\n"
75  "Check whether gepetto-viewer is properly started"
76  )
77  warnings.warn(msg, category=UserWarning, stacklevel=2)
78 
79  def loadPrimitive(self, meshName, geometry_object):
80  gui = self.viewer.gui
81 
82  meshColor = geometry_object.meshColor
83 
84  geom = geometry_object.geometry
85  if isinstance(geom, hppfcl.Capsule):
86  return gui.addCapsule(
87  meshName, geom.radius, 2.0 * geom.halfLength, npToTuple(meshColor)
88  )
89  elif isinstance(geom, hppfcl.Cylinder):
90  return gui.addCylinder(
91  meshName, geom.radius, 2.0 * geom.halfLength, npToTuple(meshColor)
92  )
93  elif isinstance(geom, hppfcl.Box):
94  w, h, d = npToTuple(2.0 * geom.halfSide)
95  return gui.addBox(meshName, w, h, d, npToTuple(meshColor))
96  elif isinstance(geom, hppfcl.Sphere):
97  return gui.addSphere(meshName, geom.radius, npToTuple(meshColor))
98  elif isinstance(geom, hppfcl.Cone):
99  return gui.addCone(
100  meshName, geom.radius, 2.0 * geom.halfLength, npToTuple(meshColor)
101  )
102  elif isinstance(geom, hppfcl.Plane) or isinstance(geom, hppfcl.Halfspace):
103  res = gui.createGroup(meshName)
104  if not res:
105  return False
106  planeName = meshName + "/plane"
107  res = gui.addFloor(planeName)
108  if not res:
109  return False
110  normal = geom.n
111  rot = pin.Quaternion.FromTwoVectors(normal, pin.ZAxis)
112  alpha = geom.d / norm(normal, 2) ** 2
113  trans = alpha * normal
114  plane_offset = pin.SE3(rot, trans)
115  gui.applyConfiguration(planeName, pin.SE3ToXYZQUATtuple(plane_offset))
116  elif isinstance(geom, hppfcl.Convex):
117  pts = [
118  npToTuple(geom.points(geom.polygons(f)[i]))
119  for f in range(geom.num_polygons)
120  for i in range(3)
121  ]
122  gui.addCurve(meshName, pts, npToTuple(meshColor))
123  gui.setCurveMode(meshName, "TRIANGLES")
124  gui.setLightingMode(meshName, "ON")
125  gui.setBoolProperty(meshName, "BackfaceDrawing", True)
126  return True
127  elif isinstance(geom, hppfcl.ConvexBase):
128  pts = [npToTuple(geom.points(i)) for i in range(geom.num_points)]
129  gui.addCurve(meshName, pts, npToTuple(meshColor))
130  gui.setCurveMode(meshName, "POINTS")
131  gui.setLightingMode(meshName, "OFF")
132  return True
133  else:
134  msg = "Unsupported geometry type for %s (%s)" % (
135  geometry_object.name,
136  type(geom),
137  )
138  warnings.warn(msg, category=UserWarning, stacklevel=2)
139  return False
140 
141  def loadViewerGeometryObject(self, geometry_object, geometry_type):
142  """Load a single geometry object"""
143 
144  gui = self.viewer.gui
145 
146  meshName = self.getViewerNodeName(geometry_object, geometry_type)
147  meshPath = geometry_object.meshPath
148  meshTexturePath = geometry_object.meshTexturePath
149  meshScale = geometry_object.meshScale
150  meshColor = geometry_object.meshColor
151 
152  try:
153  if WITH_HPP_FCL_BINDINGS and isinstance(
154  geometry_object.geometry, hppfcl.ShapeBase
155  ):
156  success = self.loadPrimitive(meshName, geometry_object)
157  else:
158  if meshName == "":
159  msg = "Display of geometric primitives is supported only if pinocchio is build with HPP-FCL bindings."
160  warnings.warn(msg, category=UserWarning, stacklevel=2)
161  return
162  success = gui.addMesh(meshName, meshPath)
163  if not success:
164  return
165  except Exception as e:
166  msg = "Error while loading geometry object: %s\nError message:\n%s" % (
167  geometry_object.name,
168  e,
169  )
170  warnings.warn(msg, category=UserWarning, stacklevel=2)
171  return
172 
173  gui.setScale(meshName, npToTuple(meshScale))
174  if geometry_object.overrideMaterial:
175  gui.setColor(meshName, npToTuple(meshColor))
176  if meshTexturePath != "":
177  gui.setTexture(meshName, meshTexturePath)
178 
179  def loadViewerModel(self, rootNodeName="pinocchio"):
180  """Create the scene displaying the robot meshes in gepetto-viewer"""
181 
182  # Start a new "scene" in this window, named "world", with just a floor.
183  gui = self.viewer.gui
184  self.viewerRootNodeName = self.sceneName + "/" + rootNodeName
185 
186  if not gui.nodeExists(self.viewerRootNodeName):
187  gui.createGroup(self.viewerRootNodeName)
188 
189  self.viewerCollisionGroupName = self.viewerRootNodeName + "/" + "collisions"
190  if not gui.nodeExists(self.viewerCollisionGroupName):
191  gui.createGroup(self.viewerCollisionGroupName)
192 
193  self.viewerVisualGroupName = self.viewerRootNodeName + "/" + "visuals"
194  if not gui.nodeExists(self.viewerVisualGroupName):
195  gui.createGroup(self.viewerVisualGroupName)
196 
197  # iterate over visuals and create the meshes in the viewer
198  if self.collision_model is not None:
199  for collision in self.collision_model.geometryObjects:
200  self.loadViewerGeometryObject(collision, pin.GeometryType.COLLISION)
201  # Display collision if we have them and there is no visual
202  self.displayCollisions(
203  self.collision_model is not None and self.visual_model is None
204  )
205 
206  if self.visual_model is not None:
207  for visual in self.visual_model.geometryObjects:
208  self.loadViewerGeometryObject(visual, pin.GeometryType.VISUAL)
209  self.displayVisuals(self.visual_model is not None)
210 
211  # Finally, refresh the layout to obtain your first rendering.
212  gui.refresh()
213 
214  def display(self, q=None):
215  """Display the robot at configuration q in the viewer by placing all the bodies."""
216  if "viewer" not in self.__dict__:
217  return
218 
219  gui = self.viewer.gui
220  # Update the robot kinematics and geometry.
221  if q is not None:
222  pin.forwardKinematics(self.model, self.data, q)
223 
224  if self.display_collisions:
225  pin.updateGeometryPlacements(
226  self.model, self.data, self.collision_model, self.collision_data
227  )
228  gui.applyConfigurations(
229  [
230  self.getViewerNodeName(collision, pin.GeometryType.COLLISION)
231  for collision in self.collision_model.geometryObjects
232  ],
233  [
234  pin.SE3ToXYZQUATtuple(
235  self.collision_data.oMg[
236  self.collision_model.getGeometryId(collision.name)
237  ]
238  )
239  for collision in self.collision_model.geometryObjects
240  ],
241  )
242 
243  if self.display_visuals:
244  pin.updateGeometryPlacements(
245  self.model, self.data, self.visual_model, self.visual_data
246  )
247  gui.applyConfigurations(
248  [
249  self.getViewerNodeName(visual, pin.GeometryType.VISUAL)
250  for visual in self.visual_model.geometryObjects
251  ],
252  [
253  pin.SE3ToXYZQUATtuple(
254  self.visual_data.oMg[
255  self.visual_model.getGeometryId(visual.name)
256  ]
257  )
258  for visual in self.visual_model.geometryObjects
259  ],
260  )
261 
262  gui.refresh()
263 
264  def displayCollisions(self, visibility):
265  """Set whether to display collision objects or not"""
266  gui = self.viewer.gui
267  self.display_collisions = visibility
268  if self.collision_model is None:
269  return
270 
271  if visibility:
272  visibility_mode = "ON"
273  else:
274  visibility_mode = "OFF"
275 
276  for collision in self.collision_model.geometryObjects:
277  nodeName = self.getViewerNodeName(collision, pin.GeometryType.COLLISION)
278  gui.setVisibility(nodeName, visibility_mode)
279 
280  def displayVisuals(self, visibility):
281  """Set whether to display visual objects or not"""
282  gui = self.viewer.gui
283  self.display_visuals = visibility
284  if self.visual_model is None:
285  return
286 
287  if visibility:
288  visibility_mode = "ON"
289  else:
290  visibility_mode = "OFF"
291 
292  for visual in self.visual_model.geometryObjects:
293  nodeName = self.getViewerNodeName(visual, pin.GeometryType.VISUAL)
294  gui.setVisibility(nodeName, visibility_mode)
295 
297  raise NotImplementedError()
298 
299  def setCameraTarget(self, target):
300  raise NotImplementedError()
301 
302  def setCameraPosition(self, position: np.ndarray):
303  raise NotImplementedError()
304 
305  def setCameraZoom(self, zoom: float):
306  raise NotImplementedError()
307 
308  def setCameraPose(self, pose: np.ndarray):
309  raise NotImplementedError()
310 
311  def captureImage(self, w=None, h=None):
312  raise NotImplementedError()
313 
315  raise NotImplementedError()
316 
318  raise NotImplementedError()
319 
320  def drawFrameVelocities(self, *args, **kwargs):
321  raise NotImplementedError()
322 
323 
324 __all__ = ["GepettoVisualizer"]
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.displayVisuals
def displayVisuals(self, visibility)
Definition: gepetto_visualizer.py:280
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.viewerRootNodeName
viewerRootNodeName
Definition: gepetto_visualizer.py:184
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.loadViewerGeometryObject
def loadViewerGeometryObject(self, geometry_object, geometry_type)
Definition: gepetto_visualizer.py:141
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.setBackgroundColor
def setBackgroundColor(self)
Definition: gepetto_visualizer.py:296
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.disableCameraControl
def disableCameraControl(self)
Definition: gepetto_visualizer.py:314
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.setCameraPosition
def setCameraPosition(self, np.ndarray position)
Definition: gepetto_visualizer.py:302
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.displayCollisions
def displayCollisions(self, visibility)
Definition: gepetto_visualizer.py:264
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.sceneName
sceneName
Definition: gepetto_visualizer.py:59
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.setCameraPose
def setCameraPose(self, np.ndarray pose)
Definition: gepetto_visualizer.py:308
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.initViewer
def initViewer(self, viewer=None, windowName="python-pinocchio", sceneName="world", loadModel=False)
Definition: gepetto_visualizer.py:30
simulation-pendulum.type
type
Definition: simulation-pendulum.py:18
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.setCameraZoom
def setCameraZoom(self, float zoom)
Definition: gepetto_visualizer.py:305
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.enableCameraControl
def enableCameraControl(self)
Definition: gepetto_visualizer.py:317
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.display
def display(self, q=None)
Definition: gepetto_visualizer.py:214
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.windowID
windowID
Definition: gepetto_visualizer.py:51
pinocchio.utils.npToTuple
def npToTuple(M)
Definition: bindings/python/pinocchio/utils.py:23
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.drawFrameVelocities
def drawFrameVelocities(self, *args, **kwargs)
Definition: gepetto_visualizer.py:320
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.display_collisions
display_collisions
Definition: gepetto_visualizer.py:267
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.captureImage
def captureImage(self, w=None, h=None)
Definition: gepetto_visualizer.py:311
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.display_visuals
display_visuals
Definition: gepetto_visualizer.py:283
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.viewerVisualGroupName
viewerVisualGroupName
Definition: gepetto_visualizer.py:193
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.viewerCollisionGroupName
viewerCollisionGroupName
Definition: gepetto_visualizer.py:189
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.setCameraTarget
def setCameraTarget(self, target)
Definition: gepetto_visualizer.py:299
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.loadPrimitive
def loadPrimitive(self, meshName, geometry_object)
Definition: gepetto_visualizer.py:79
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.getViewerNodeName
def getViewerNodeName(self, geometry_object, geometry_type)
Definition: gepetto_visualizer.py:23
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer
Definition: gepetto_visualizer.py:20
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.viewer
viewer
Definition: gepetto_visualizer.py:45
pinocchio.visualize.gepetto_visualizer.GepettoVisualizer.loadViewerModel
def loadViewerModel(self, rootNodeName="pinocchio")
Definition: gepetto_visualizer.py:179


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