panda3d_visualizer.py
Go to the documentation of this file.
1 import warnings
2 
3 import numpy as np
4 
5 from .. import pinocchio_pywrap_default as pin
6 from ..utils import npToTuple
7 from .base_visualizer import BaseVisualizer
8 
9 try:
10  import hppfcl
11 
12  WITH_HPP_FCL_BINDINGS = True
13 except ImportError:
14  WITH_HPP_FCL_BINDINGS = False
15 
16 
18  """
19  A Pinocchio display using panda3d engine.
20  """
21 
22  def initViewer(self, viewer=None, load_model=False, open=True): # pylint: disable=arguments-differ
23  """Init the viewer by attaching to / creating a GUI viewer."""
24  self.visual_group = None
25  self.collision_group = None
26  self.display_visuals = False
27  self.display_collisions = False
28  self.viewer = viewer
29 
30  from panda3d_viewer import Viewer as Panda3dViewer
31 
32  if viewer is None:
33  if not open:
34  self.viewer = Panda3dViewer(
35  window_title="python-pinocchio", window_type="offscreen"
36  )
37  else:
38  self.viewer = Panda3dViewer(window_title="python-pinocchio")
39 
40  if load_model:
41  self.loadViewerModel(group_name=self.model.name)
42 
43  def loadViewerModel(self, group_name, color=None): # pylint: disable=arguments-differ
44  """Create a group of nodes displaying the robot meshes in the viewer."""
45  self.visual_group = group_name + "/visuals"
46  self.collision_group = group_name + "/collisions"
47 
48  self.viewer.append_group(self.visual_group)
49  self.viewer.append_group(self.collision_group)
50 
51  def append(root, obj):
52  geom = obj.geometry
53  if WITH_HPP_FCL_BINDINGS and isinstance(geom, hppfcl.ShapeBase):
54  # append a primitive geometry
55  if isinstance(geom, hppfcl.Capsule):
56  r, fl = geom.radius, 2 * geom.halfLength
57  self.viewer.append_capsule(root, obj.name, r, fl)
58  elif isinstance(geom, hppfcl.Cylinder):
59  r, fl = geom.radius, 2 * geom.halfLength
60  self.viewer.append_cylinder(root, obj.name, r, fl)
61  elif isinstance(geom, hppfcl.Box):
62  size = npToTuple(2.0 * geom.halfSide)
63  self.viewer.append_box(root, obj.name, size)
64  elif isinstance(geom, hppfcl.Sphere):
65  self.viewer.append_sphere(root, obj.name, geom.radius)
66  else:
67  msg = f"Unsupported geometry type for {obj.name} ({type(geom)})"
68  warnings.warn(msg, category=UserWarning, stacklevel=2)
69  return
70  else:
71  # append a mesh
72  scale = npToTuple(obj.meshScale)
73  self.viewer.append_mesh(root, obj.name, obj.meshPath, scale)
74 
75  if obj.overrideMaterial:
76  rgba = npToTuple(obj.meshColor)
77  path = obj.meshTexturePath
78  self.viewer.set_material(root, obj.name, rgba, path)
79  elif color is not None:
80  self.viewer.set_material(root, obj.name, color)
81 
82  self.displayVisuals(False)
83  self.displayCollisions(False)
84 
85  for obj in self.visual_model.geometryObjects:
86  append(self.visual_group, obj)
87 
88  for obj in self.collision_model.geometryObjects:
89  append(self.collision_group, obj)
90 
91  self.displayVisuals(True)
92 
93  def getViewerNodeName(self, geometry_object, geometry_type):
94  """Return the name of the geometry object inside the viewer."""
95  if geometry_type is pin.GeometryType.VISUAL:
96  return self.visual_group + "/" + geometry_object.name
97  elif geometry_type is pin.GeometryType.COLLISION:
98  return self.collision_group + "/" + geometry_object.name
99 
100  def display(self, q=None):
101  """
102  Display the robot at configuration q in the viewer by placing all the bodies.
103  """
104  if q is not None:
105  pin.forwardKinematics(self.model, self.data, q)
106 
107  def move(group, model, data):
108  pin.updateGeometryPlacements(self.model, self.data, model, data)
109  name_pose_dict = {}
110  for obj in model.geometryObjects:
111  oMg = data.oMg[model.getGeometryId(obj.name)]
112  x, y, z, qx, qy, qz, qw = pin.SE3ToXYZQUATtuple(oMg)
113  name_pose_dict[obj.name] = (x, y, z), (qw, qx, qy, qz)
114  self.viewer.move_nodes(group, name_pose_dict)
115 
116  if self.display_visuals:
117  move(self.visual_group, self.visual_model, self.visual_data)
118 
119  if self.display_collisions:
120  move(self.collision_group, self.collision_model, self.collision_data)
121 
122  def displayCollisions(self, visibility):
123  """Set whether to display collision objects or not."""
124  self.viewer.show_group(self.collision_group, visibility)
125  self.display_collisions = visibility
126 
127  def displayVisuals(self, visibility):
128  """Set whether to display visual objects or not."""
129  self.viewer.show_group(self.visual_group, visibility)
130  self.display_visuals = visibility
131 
133  raise NotImplementedError()
134 
135  def setCameraTarget(self, target):
136  raise NotImplementedError()
137 
138  def setCameraPosition(self, position: np.ndarray):
139  raise NotImplementedError()
140 
141  def setCameraZoom(self, zoom: float):
142  raise NotImplementedError()
143 
144  def setCameraPose(self, pose: np.ndarray):
145  raise NotImplementedError()
146 
147  def captureImage(self, w=None, h=None):
148  rgb = self.viewer.get_screenshot(requested_format="RGB")
149  if rgb is None:
150  raise RuntimeError("Failed to capture image from viewer")
151  return rgb
152 
154  raise NotImplementedError()
155 
157  raise NotImplementedError()
158 
159  def drawFrameVelocities(self, *args, **kwargs):
160  raise NotImplementedError()
161 
162 
163 __all__ = ["Panda3dVisualizer"]
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.captureImage
def captureImage(self, w=None, h=None)
Definition: panda3d_visualizer.py:147
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.setCameraTarget
def setCameraTarget(self, target)
Definition: panda3d_visualizer.py:135
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.viewer
viewer
Definition: panda3d_visualizer.py:28
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.displayVisuals
def displayVisuals(self, visibility)
Definition: panda3d_visualizer.py:127
pinocchio::updateGeometryPlacements
void updateGeometryPlacements(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const DataTpl< Scalar, Options, JointCollectionTpl > &data, const GeometryModel &geom_model, GeometryData &geom_data)
Update the placement of the geometry objects according to the current joint placements contained in d...
pinocchio.visualize.base_visualizer.BaseVisualizer.displayCollisions
def displayCollisions(self, visibility)
Definition: base_visualizer.py:107
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.display
def display(self, q=None)
Definition: panda3d_visualizer.py:100
pinocchio.visualize.base_visualizer.BaseVisualizer.visual_model
visual_model
Definition: base_visualizer.py:41
pinocchio.visualize.base_visualizer.BaseVisualizer.collision_model
collision_model
Definition: base_visualizer.py:40
pinocchio.visualize.base_visualizer.BaseVisualizer.visual_data
visual_data
Definition: base_visualizer.py:58
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.display_visuals
display_visuals
Definition: panda3d_visualizer.py:26
pinocchio.visualize.base_visualizer.BaseVisualizer.data
data
Definition: base_visualizer.py:48
pinocchio::forwardKinematics
void forwardKinematics(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, DataTpl< Scalar, Options, JointCollectionTpl > &data, const Eigen::MatrixBase< ConfigVectorType > &q, const Eigen::MatrixBase< TangentVectorType1 > &v, const Eigen::MatrixBase< TangentVectorType2 > &a)
Update the joint placements, spatial velocities and spatial accelerations according to the current jo...
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.visual_group
visual_group
Definition: panda3d_visualizer.py:24
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.displayCollisions
def displayCollisions(self, visibility)
Definition: panda3d_visualizer.py:122
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.setBackgroundColor
def setBackgroundColor(self)
Definition: panda3d_visualizer.py:132
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.loadViewerModel
def loadViewerModel(self, group_name, color=None)
Definition: panda3d_visualizer.py:43
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.setCameraZoom
def setCameraZoom(self, float zoom)
Definition: panda3d_visualizer.py:141
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.collision_group
collision_group
Definition: panda3d_visualizer.py:25
pinocchio.visualize.base_visualizer.BaseVisualizer.displayVisuals
def displayVisuals(self, visibility)
Definition: base_visualizer.py:111
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.setCameraPose
def setCameraPose(self, np.ndarray pose)
Definition: panda3d_visualizer.py:144
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.drawFrameVelocities
def drawFrameVelocities(self, *args, **kwargs)
Definition: panda3d_visualizer.py:159
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.setCameraPosition
def setCameraPosition(self, np.ndarray position)
Definition: panda3d_visualizer.py:138
pinocchio.utils.npToTuple
def npToTuple(M)
Definition: bindings/python/pinocchio/utils.py:22
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.enableCameraControl
def enableCameraControl(self)
Definition: panda3d_visualizer.py:156
pinocchio.visualize.base_visualizer.BaseVisualizer.model
model
Definition: base_visualizer.py:39
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.initViewer
def initViewer(self, viewer=None, load_model=False, open=True)
Definition: panda3d_visualizer.py:22
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.disableCameraControl
def disableCameraControl(self)
Definition: panda3d_visualizer.py:153
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.display_collisions
display_collisions
Definition: panda3d_visualizer.py:27
pinocchio.visualize.base_visualizer.BaseVisualizer
Definition: base_visualizer.py:18
boost::fusion::append
result_of::push_front< V const, T >::type append(T const &t, V const &v)
Append the element T at the front of boost fusion vector V.
Definition: fusion.hpp:32
pinocchio.visualize.base_visualizer.BaseVisualizer.loadViewerModel
def loadViewerModel(self, *args, **kwargs)
Definition: base_visualizer.py:86
pinocchio.visualize.base_visualizer.BaseVisualizer.collision_data
collision_data
Definition: base_visualizer.py:53
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer
Definition: panda3d_visualizer.py:17
pinocchio.visualize.panda3d_visualizer.Panda3dVisualizer.getViewerNodeName
def getViewerNodeName(self, geometry_object, geometry_type)
Definition: panda3d_visualizer.py:93


pinocchio
Author(s):
autogenerated on Wed May 28 2025 02:41:21