rviz_visualizer.py
Go to the documentation of this file.
1 from .. import pinocchio_pywrap_default as pin
2 from ..utils import npToTuple
3 
4 from . import BaseVisualizer
5 
6 import warnings
7 
8 try:
9  import hppfcl
10 
11  WITH_HPP_FCL_BINDINGS = True
12 except ImportError:
13  WITH_HPP_FCL_BINDINGS = False
14 
15 
16 def create_capsule_markers(marker_ref, oMg, d, l):
17  """Make capsule using two sphere and one cylinder"""
18  from copy import deepcopy
19  from visualization_msgs.msg import Marker
20  from geometry_msgs.msg import Point
21 
22  displacment = pin.SE3.Identity()
23 
24  displacment.translation[2] = l / 2.0
25  oMsphere_1 = oMg * displacment
26  displacment.translation[2] = -l / 2.0
27  oMsphere_2 = oMg * displacment
28 
29  marker_cylinder = marker_ref
30  marker_cylinder.type = Marker.CYLINDER
31  marker_cylinder.scale = Point(d, d, l)
32  marker_cylinder.pose = SE3ToROSPose(oMg)
33 
34  marker_sphere_1 = deepcopy(marker_ref)
35  marker_sphere_1.id += 10000 # How to ensure this id is not taken ?
36  marker_sphere_1.type = Marker.SPHERE
37  marker_sphere_1.scale = Point(d, d, d)
38  marker_sphere_1.pose = SE3ToROSPose(oMsphere_1)
39 
40  marker_sphere_2 = deepcopy(marker_ref)
41  marker_sphere_2.id += 20000 # How to ensure this id is not taken ?
42  marker_sphere_2.type = Marker.SPHERE
43  marker_sphere_2.scale = Point(d, d, d)
44  marker_sphere_2.pose = SE3ToROSPose(oMsphere_2)
45 
46  return [marker_cylinder, marker_sphere_1, marker_sphere_2]
47 
48 
49 def SE3ToROSPose(oMg):
50  """Converts SE3 matrix to ROS geometry_msgs/Pose format"""
51  from geometry_msgs.msg import Pose, Point, Quaternion
52 
53  xyz_quat = pin.SE3ToXYZQUATtuple(oMg)
54  return Pose(position=Point(*xyz_quat[:3]), orientation=Quaternion(*xyz_quat[3:]))
55 
56 
57 class RVizVisualizer(BaseVisualizer):
58  """A Pinocchio display using RViz"""
59 
60  class Viewer:
61  app = None
62  viz = None
63  viz_manager = None
64 
66  self,
67  viewer=None,
68  windowName="python-pinocchio",
69  loadModel=False,
70  initRosNode=True,
71  ):
72  """Init RVizViewer by starting a ros node (or not) and creating an RViz window."""
73  from rospy import init_node, WARN
74  from rosgraph import is_master_online
75  from rviz import bindings as rviz
76  from python_qt_binding.QtWidgets import QApplication
77 
78  if not is_master_online(): # Checks the master uri
79  # ROS Master is offline
80  warnings.warn(
81  "Error while importing the viz client.\n"
82  "Check whether ROS master (roscore) is properly started",
83  category=UserWarning,
84  stacklevel=2,
85  )
86  return None
87 
88  if initRosNode:
89  init_node("pinocchio_viewer", anonymous=True, log_level=WARN)
90 
91  if viewer == None:
93  self.viewer.app = QApplication([])
94  self.viewer.viz = rviz.VisualizationFrame()
95  self.viewer.viz.setSplashPath("")
96  self.viewer.viz.initialize()
97  self.viewer.viz.setWindowTitle(windowName + "[*]")
98  self.viewer.viz_manager = self.viewer.viz.getManager()
99  self.viewer.viz.show()
100  else:
101  self.viewer = viewer
102 
103  if loadModel:
104  self.loadViewerModel()
105 
106  return self.viewer
107 
108  def loadViewerModel(self, rootNodeName="pinocchio"):
109  """Create the displays in RViz and create publishers for the MarkerArray"""
110  from rospy import Publisher
111  from visualization_msgs.msg import MarkerArray
112 
113  # Visuals
114  self.visuals_publisher = Publisher(
115  rootNodeName + "_visuals", MarkerArray, queue_size=1, latch=True
116  )
117  self.visual_Display = self.viewer.viz_manager.createDisplay(
118  "rviz/MarkerArray", rootNodeName + "_visuals", True
119  )
120  self.visual_Display.subProp("Marker Topic").setValue(rootNodeName + "_visuals")
121  self.visual_ids = []
122 
123  # Collisions
124  self.collisions_publisher = Publisher(
125  rootNodeName + "_collisions", MarkerArray, queue_size=1, latch=True
126  )
127  self.collision_Display = self.viewer.viz_manager.createDisplay(
128  "rviz/MarkerArray", rootNodeName + "_collisions", True
129  )
130  self.collision_Display.subProp("Marker Topic").setValue(
131  rootNodeName + "_collisions"
132  )
133  self.collision_ids = []
134 
135  # Group
136  root_group = self.viewer.viz_manager.getRootDisplayGroup()
137  self.group_Display = self.viewer.viz_manager.createDisplay(
138  "rviz/Group", rootNodeName, True
139  )
140  self.group_Display.addChild(
141  root_group.takeChild(self.visual_Display)
142  ) # Remove display from root group and add it to robot group
143  self.group_Display.addChild(
144  root_group.takeChild(self.collision_Display)
145  ) # Remove display from root group and add it to robot group
146 
147  self.seq = 0
148  self.display()
149 
150  def clean(self):
151  """Delete all the objects from the whole scene"""
152  if hasattr(self, "collisions_publisher"):
153  self._clean(self.collisions_publisher)
154  self.collision_ids = []
155 
156  if hasattr(self, "visuals_publisher"):
157  self._clean(self.visuals_publisher)
158  self.visual_ids = []
159 
160  def display(self, q=None):
161  """Display the robot at configuration q in the viz by placing all the bodies."""
162  # Update the robot kinematics and geometry.
163  if q is not None:
164  pin.forwardKinematics(self.model, self.data, q)
165 
166  if self.collision_model is not None and hasattr(self, "collisions_publisher"):
167  pin.updateGeometryPlacements(
168  self.model, self.data, self.collision_model, self.collision_data
169  )
170  self.collision_ids = self._plot(
172  self.collision_model,
173  self.collision_data,
174  self.collision_ids,
175  )
176 
177  if self.visual_model is not None and hasattr(self, "visuals_publisher"):
178  pin.updateGeometryPlacements(
179  self.model, self.data, self.visual_model, self.visual_data
180  )
181  self.visual_ids = self._plot(
182  self.visuals_publisher,
183  self.visual_model,
184  self.visual_data,
185  self.visual_ids,
186  )
187 
188  def _plot(self, publisher, model, data, previous_ids=()):
189  """Create markers for each object of the model and publish it as MarkerArray (also delete unused previously created markers)"""
190  from rospy import get_rostime
191  from std_msgs.msg import Header, ColorRGBA
192  from geometry_msgs.msg import Point
193  from visualization_msgs.msg import MarkerArray, Marker
194 
195  self.seq += 1
196  header = Header(
197  frame_id="map", seq=self.seq, stamp=get_rostime()
198  ) # Common header for every marker
199 
200  marker_array = MarkerArray()
201  for obj in model.geometryObjects:
202  obj_id = model.getGeometryId(obj.name)
203 
204  # Prepare marker
205  marker = Marker()
206  marker.id = obj_id
207  marker.header = header
208  marker.action = Marker.ADD # same as Marker.MODIFY
209  marker.pose = SE3ToROSPose(data.oMg[obj_id])
210  marker.color = ColorRGBA(*obj.meshColor)
211 
212  if obj.meshTexturePath != "":
213  warnings.warn(
214  "Textures are not supported in RVizVisualizer (for "
215  + obj.name
216  + ")",
217  category=UserWarning,
218  stacklevel=2,
219  )
220 
221  # Create geometry
222  geom = obj.geometry
223  if WITH_HPP_FCL_BINDINGS and isinstance(geom, hppfcl.ShapeBase):
224  # append a primitive geometry
225  if isinstance(geom, hppfcl.Cylinder):
226  d, l = 2 * geom.radius, 2 * geom.halfLength
227  marker.type = Marker.CYLINDER
228  marker.scale = Point(d, d, l)
229  marker_array.markers.append(marker)
230  elif isinstance(geom, hppfcl.Box):
231  size = npToTuple(2.0 * geom.halfSide)
232  marker.type = Marker.CUBE
233  marker.scale = Point(*size)
234  marker_array.markers.append(marker)
235  elif isinstance(geom, hppfcl.Sphere):
236  d = 2 * geom.radius
237  marker.type = Marker.SPHERE
238  marker.scale = Point(d, d, d)
239  marker_array.markers.append(marker)
240  elif isinstance(geom, hppfcl.Capsule):
241  d, l = 2 * geom.radius, 2 * geom.halfLength
242  marker_array.markers.extend(
243  create_capsule_markers(marker, data.oMg[obj_id], d, l)
244  )
245  else:
246  msg = "Unsupported geometry type for %s (%s)" % (
247  obj.name,
248  type(geom),
249  )
250  warnings.warn(msg, category=UserWarning, stacklevel=2)
251  continue
252  else:
253  # append a mesh
254  marker.type = Marker.MESH_RESOURCE # Custom mesh
255  marker.scale = Point(*npToTuple(obj.meshScale))
256  marker.mesh_resource = "file://" + obj.meshPath
257  marker_array.markers.append(marker)
258 
259  # Remove unused markers
260  new_ids = [marker.id for marker in marker_array.markers]
261  for old_id in previous_ids:
262  if not old_id in new_ids:
263  marker_remove = Marker()
264  marker_remove.header = header
265  marker_remove.id = old_id
266  marker_remove.action = Marker.DELETE
267  marker_array.markers.append(marker_remove)
268 
269  # Publish markers
270  publisher.publish(marker_array)
271 
272  # Return list of markers id
273  return new_ids
274 
275  def _clean(self, publisher):
276  """Delete all the markers from a topic (use one marker with action DELETEALL)"""
277  from rospy import get_rostime
278  from std_msgs.msg import Header
279  from visualization_msgs.msg import MarkerArray, Marker
280 
281  # Increment seq number
282  self.seq += 1
283 
284  # Prepare a clean_all marker
285  marker = Marker()
286  marker.header = Header(frame_id="map", seq=self.seq, stamp=get_rostime())
287  marker.action = Marker.DELETEALL
288 
289  # Add the marker to a MarkerArray
290  marker_array = MarkerArray(markers=[marker])
291 
292  # Publish marker
293  publisher.publish(marker_array)
294 
295  def displayCollisions(self, visibility):
296  """Set whether to display collision objects or not"""
297  self.collision_Display.setEnabled(visibility)
298 
299  def displayVisuals(self, visibility):
300  """Set whether to display visual objects or not"""
301  self.visual_Display.setEnabled(visibility)
302 
303  def sleep(self, dt):
304  from python_qt_binding.QtTest import QTest
305 
306  QTest.qWait(1e3 * dt)
307 
308 
309 __all__ = ["RVizVisualizer"]
pinocchio.visualize.rviz_visualizer.RVizVisualizer.visual_ids
visual_ids
Definition: rviz_visualizer.py:121
pinocchio.visualize.rviz_visualizer.RVizVisualizer._plot
def _plot(self, publisher, model, data, previous_ids=())
Definition: rviz_visualizer.py:188
pinocchio.visualize.rviz_visualizer.RVizVisualizer.group_Display
group_Display
Definition: rviz_visualizer.py:137
pinocchio.visualize.rviz_visualizer.RVizVisualizer.seq
seq
Definition: rviz_visualizer.py:147
pinocchio.visualize.rviz_visualizer.RVizVisualizer.Viewer
Definition: rviz_visualizer.py:60
pinocchio.visualize.rviz_visualizer.RVizVisualizer.clean
def clean(self)
Definition: rviz_visualizer.py:150
pinocchio.visualize.rviz_visualizer.RVizVisualizer
Definition: rviz_visualizer.py:57
simulation-pendulum.type
type
Definition: simulation-pendulum.py:18
pinocchio::python::context::Quaternion
Eigen::Quaternion< Scalar, Options > Quaternion
Definition: bindings/python/context/generic.hpp:49
pinocchio.visualize.rviz_visualizer.RVizVisualizer.displayVisuals
def displayVisuals(self, visibility)
Definition: rviz_visualizer.py:299
pinocchio.visualize.rviz_visualizer.RVizVisualizer.sleep
def sleep(self, dt)
Definition: rviz_visualizer.py:303
pinocchio.visualize.rviz_visualizer.create_capsule_markers
def create_capsule_markers(marker_ref, oMg, d, l)
Definition: rviz_visualizer.py:16
pinocchio.visualize.rviz_visualizer.RVizVisualizer.visuals_publisher
visuals_publisher
Definition: rviz_visualizer.py:114
pinocchio.visualize.rviz_visualizer.RVizVisualizer.displayCollisions
def displayCollisions(self, visibility)
Definition: rviz_visualizer.py:295
pinocchio.utils.npToTuple
def npToTuple(M)
Definition: bindings/python/pinocchio/utils.py:23
pinocchio.visualize.rviz_visualizer.RVizVisualizer._clean
def _clean(self, publisher)
Definition: rviz_visualizer.py:275
pinocchio.visualize.rviz_visualizer.RVizVisualizer.initViewer
def initViewer(self, viewer=None, windowName="python-pinocchio", loadModel=False, initRosNode=True)
Definition: rviz_visualizer.py:65
pinocchio.visualize.rviz_visualizer.RVizVisualizer.collision_ids
collision_ids
Definition: rviz_visualizer.py:133
pinocchio.visualize.rviz_visualizer.RVizVisualizer.loadViewerModel
def loadViewerModel(self, rootNodeName="pinocchio")
Definition: rviz_visualizer.py:108
pinocchio.visualize.rviz_visualizer.SE3ToROSPose
def SE3ToROSPose(oMg)
Definition: rviz_visualizer.py:49
pinocchio.visualize.rviz_visualizer.RVizVisualizer.visual_Display
visual_Display
Definition: rviz_visualizer.py:117
pinocchio.visualize.rviz_visualizer.RVizVisualizer.viewer
viewer
Definition: rviz_visualizer.py:86
pinocchio.visualize.rviz_visualizer.RVizVisualizer.collision_Display
collision_Display
Definition: rviz_visualizer.py:127
pinocchio.visualize.rviz_visualizer.RVizVisualizer.display
def display(self, q=None)
Definition: rviz_visualizer.py:160
pinocchio.visualize.rviz_visualizer.RVizVisualizer.collisions_publisher
collisions_publisher
Definition: rviz_visualizer.py:124


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