robot_wrapper.py
Go to the documentation of this file.
1 #
2 # Copyright (c) 2015-2020 CNRS INRIA
3 #
4 
5 from . import pinocchio_pywrap_default as pin
6 from . import utils
7 from .shortcuts import buildModelsFromUrdf, createDatas, buildModelsFromSdf
8 
9 import numpy as np
10 
11 
12 class RobotWrapper(object):
13  @staticmethod
15  filename, package_dirs=None, root_joint=None, verbose=False, meshLoader=None
16  ):
17  robot = RobotWrapper()
18  robot.initFromURDF(filename, package_dirs, root_joint, verbose, meshLoader)
19  return robot
20 
22  self,
23  filename,
24  package_dirs=None,
25  root_joint=None,
26  verbose=False,
27  meshLoader=None,
28  ):
29  model, collision_model, visual_model = buildModelsFromUrdf(
30  filename, package_dirs, root_joint, verbose, meshLoader
31  )
32  RobotWrapper.__init__(
33  self,
34  model=model,
35  collision_model=collision_model,
36  visual_model=visual_model,
37  )
38 
39  @staticmethod
41  filename,
42  package_dirs=None,
43  root_joint=None,
44  root_link_name="",
45  parent_guidance=[],
46  verbose=False,
47  meshLoader=None,
48  ):
49  robot = RobotWrapper()
50  robot.initFromSDF(
51  filename,
52  package_dirs,
53  root_joint,
54  root_link_name,
55  parent_guidance,
56  verbose,
57  meshLoader,
58  )
59  return robot
60 
62  self,
63  filename,
64  package_dirs=None,
65  root_joint=None,
66  root_link_name="",
67  parent_guidance=[],
68  verbose=False,
69  meshLoader=None,
70  ):
71  model, constraint_models, collision_model, visual_model = buildModelsFromSdf(
72  filename,
73  package_dirs,
74  root_joint,
75  root_link_name,
76  parent_guidance,
77  verbose,
78  meshLoader,
79  )
80  RobotWrapper.__init__(
81  self,
82  model=model,
83  collision_model=collision_model,
84  visual_model=visual_model,
85  )
86  self.constraint_models = constraint_models
87 
88  def __init__(
89  self, model=pin.Model(), collision_model=None, visual_model=None, verbose=False
90  ):
91  self.model = model
92  self.collision_model = collision_model
93  self.visual_model = visual_model
94 
95  self.data, self.collision_data, self.visual_data = createDatas(
96  model, collision_model, visual_model
97  )
98 
99  self.v0 = utils.zero(self.nv)
100  self.q0 = pin.neutral(self.model)
101 
102  self.viz = None
103 
104  @property
105  def nq(self):
106  return self.model.nq
107 
108  @property
109  def nv(self):
110  return self.model.nv
111 
112  def com(self, q=None, v=None, a=None):
113  if q is None:
114  pin.centerOfMass(self.model, self.data)
115  return self.data.com[0]
116  if v is not None:
117  if a is None:
118  pin.centerOfMass(self.model, self.data, q, v)
119  return self.data.com[0], self.data.vcom[0]
120  pin.centerOfMass(self.model, self.data, q, v, a)
121  return self.data.com[0], self.data.vcom[0], self.data.acom[0]
122  return pin.centerOfMass(self.model, self.data, q)
123 
124  def vcom(self, q, v):
125  pin.centerOfMass(self.model, self.data, q, v)
126  return self.data.vcom[0]
127 
128  def acom(self, q, v, a):
129  pin.centerOfMass(self.model, self.data, q, v, a)
130  return self.data.acom[0]
131 
132  def centroidalMomentum(self, q, v):
133  return pin.computeCentroidalMomentum(self.model, self.data, q, v)
134 
135  def centroidalMap(self, q):
136  """
137  Computes the centroidal momentum matrix which maps from the joint velocity vector to the centroidal momentum expressed around the center of mass.
138  """
139  return pin.computeCentroidalMap(self.model, self.data, q)
140 
141  def centroidal(self, q, v):
142  """
143  Computes all the quantities related to the centroidal dynamics (hg, Ag and Ig), corresponding to the centroidal momentum, the centroidal map and the centroidal rigid inertia.
144  """
145  pin.ccrba(self.model, self.data, q, v)
146  return (self.data.hg, self.data.Ag, self.data.Ig)
147 
148  def centroidalMomentumVariation(self, q, v, a):
149  return pin.computeCentroidalMomentumTimeVariation(
150  self.model, self.data, q, v, a
151  )
152 
153  def Jcom(self, q):
154  return pin.jacobianCenterOfMass(self.model, self.data, q)
155 
156  def mass(self, q):
157  return pin.crba(self.model, self.data, q)
158 
159  def nle(self, q, v):
160  return pin.nonLinearEffects(self.model, self.data, q, v)
161 
162  def gravity(self, q):
163  return pin.computeGeneralizedGravity(self.model, self.data, q)
164 
165  def forwardKinematics(self, q, v=None, a=None):
166  if v is not None:
167  if a is not None:
168  pin.forwardKinematics(self.model, self.data, q, v, a)
169  else:
170  pin.forwardKinematics(self.model, self.data, q, v)
171  else:
172  pin.forwardKinematics(self.model, self.data, q)
173 
174  def placement(self, q, index, update_kinematics=True):
175  if update_kinematics:
176  pin.forwardKinematics(self.model, self.data, q)
177  return self.data.oMi[index]
178 
179  def velocity(
180  self,
181  q,
182  v,
183  index,
184  update_kinematics=True,
185  reference_frame=pin.ReferenceFrame.LOCAL,
186  ):
187  if update_kinematics:
188  pin.forwardKinematics(self.model, self.data, q, v)
189  return pin.getVelocity(self.model, self.data, index, reference_frame)
190 
192  self,
193  q,
194  v,
195  a,
196  index,
197  update_kinematics=True,
198  reference_frame=pin.ReferenceFrame.LOCAL,
199  ):
200  if update_kinematics:
201  pin.forwardKinematics(self.model, self.data, q, v, a)
202  return pin.getAcceleration(self.model, self.data, index, reference_frame)
203 
205  self,
206  q,
207  v,
208  a,
209  index,
210  update_kinematics=True,
211  reference_frame=pin.ReferenceFrame.LOCAL,
212  ):
213  if update_kinematics:
214  pin.forwardKinematics(self.model, self.data, q, v, a)
215  return pin.getClassicalAcceleration(
216  self.model, self.data, index, reference_frame
217  )
218 
219  def framePlacement(self, q, index, update_kinematics=True):
220  if update_kinematics:
221  pin.forwardKinematics(self.model, self.data, q)
222  return pin.updateFramePlacement(self.model, self.data, index)
223 
225  self,
226  q,
227  v,
228  index,
229  update_kinematics=True,
230  reference_frame=pin.ReferenceFrame.LOCAL,
231  ):
232  if update_kinematics:
233  pin.forwardKinematics(self.model, self.data, q, v)
234  return pin.getFrameVelocity(self.model, self.data, index, reference_frame)
235 
237  self,
238  q,
239  v,
240  a,
241  index,
242  update_kinematics=True,
243  reference_frame=pin.ReferenceFrame.LOCAL,
244  ):
245  if update_kinematics:
246  pin.forwardKinematics(self.model, self.data, q, v, a)
247  return pin.getFrameAcceleration(self.model, self.data, index, reference_frame)
248 
250  self,
251  q,
252  v,
253  a,
254  index,
255  update_kinematics=True,
256  reference_frame=pin.ReferenceFrame.LOCAL,
257  ):
258  if update_kinematics:
259  pin.forwardKinematics(self.model, self.data, q, v, a)
260  return pin.getFrameClassicalAcceleration(
261  self.model, self.data, index, reference_frame
262  )
263 
264  def computeJointJacobian(self, q, index):
265  return pin.computeJointJacobian(self.model, self.data, q, index)
266 
267  def getJointJacobian(self, index, rf_frame=pin.ReferenceFrame.LOCAL):
268  return pin.getJointJacobian(self.model, self.data, index, rf_frame)
269 
270  def computeJointJacobians(self, q):
271  return pin.computeJointJacobians(self.model, self.data, q)
272 
273  def updateGeometryPlacements(self, q=None, visual=False):
274  if visual:
275  geom_model = self.visual_model
276  geom_data = self.visual_data
277  else:
278  geom_model = self.collision_model
279  geom_data = self.collision_data
280 
281  if q is not None:
282  pin.updateGeometryPlacements(
283  self.model, self.data, geom_model, geom_data, q
284  )
285  else:
286  pin.updateGeometryPlacements(self.model, self.data, geom_model, geom_data)
287 
289  pin.framesForwardKinematics(self.model, self.data, q)
290 
291  def buildReducedRobot(self, list_of_joints_to_lock, reference_configuration=None):
292  """
293  Build a reduced robot model given a list of joints to lock.
294  Parameters:
295  \tlist_of_joints_to_lock: list of joint indexes/names to lock.
296  \treference_configuration: reference configuration to compute the
297  placement of the lock joints. If not provided, reference_configuration
298  defaults to the robot's neutral configuration.
299 
300  Returns: a new robot model.
301  """
302 
303  # if joint to lock is a string, try to find its index
304  lockjoints_idx = []
305  for jnt in list_of_joints_to_lock:
306  idx = jnt
307  if isinstance(jnt, str):
308  idx = self.model.getJointId(jnt)
309  lockjoints_idx.append(idx)
310 
311  if reference_configuration is None:
312  reference_configuration = pin.neutral(self.model)
313 
314  model, geom_models = pin.buildReducedModel(
315  model=self.model,
316  list_of_geom_models=[self.visual_model, self.collision_model],
317  list_of_joints_to_lock=lockjoints_idx,
318  reference_configuration=reference_configuration,
319  )
320 
321  return RobotWrapper(
322  model=model, visual_model=geom_models[0], collision_model=geom_models[1]
323  )
324 
325  def getFrameJacobian(self, frame_id, rf_frame=pin.ReferenceFrame.LOCAL):
326  """
327  It computes the Jacobian of frame given by its id (frame_id) either expressed in the
328  local coordinate frame or in the world coordinate frame.
329  """
330  return pin.getFrameJacobian(self.model, self.data, frame_id, rf_frame)
331 
332  def computeFrameJacobian(self, q, frame_id):
333  """
334  Similar to getFrameJacobian but does not need pin.computeJointJacobians and
335  pin.updateFramePlacements to update internal value of self.data related to frames.
336  """
337  return pin.computeFrameJacobian(self.model, self.data, q, frame_id)
338 
339  def rebuildData(self):
340  """Re-build the data objects. Needed if the models were modified.
341  Warning: this will delete any information stored in all data objects."""
342  data, collision_data, visual_data = createDatas(
343  self.model, self.collision_model, self.visual_model
344  )
345  if self.viz is not None:
346  if (
347  id(self.data) == id(self.viz.data)
348  and id(self.collision_data) == id(self.viz.collision_data)
349  and id(self.visual_data) == id(self.viz.visual_data)
350  ):
351  self.viz.data = data
352  self.viz.collision_data = collision_data
353  self.viz.visual_data = visual_data
354  else:
355  self.viz.rebuildData()
356  self.data = data
357  self.collision_data = collision_data
358  self.visual_data = visual_data
359 
360  # --- ACCESS TO NAMES ----
361  # Return the index of the joint whose name is given in argument.
362  def index(self, name):
363  return self.model.getJointId(name)
364 
365  # --- VIEWER ---
366 
367  # for backwards compatibility
368  @property
369  def viewer(self):
370  return self.viz.viewer
371 
372  def setVisualizer(self, visualizer, init=True, copy_models=False):
373  """Set the visualizer. If init is True, the visualizer is initialized with this wrapper's models.
374  If copy_models is also True, the models are copied. Otherwise, they are simply kept as a reference.
375  """
376  if init:
377  visualizer.__init__(
378  self.model, self.collision_model, self.visual_model, copy_models
379  )
380  self.viz = visualizer
381 
382  def getViewerNodeName(self, geometry_object, geometry_type):
383  """For each geometry object, returns the corresponding name of the node in the display."""
384  return self.viz.getViewerNodeName(geometry_object, geometry_type)
385 
386  def initViewer(self, share_data=True, *args, **kwargs):
387  """Init the viewer"""
388  # Set viewer to use to gepetto-gui.
389  if self.viz is None:
390  from .visualize import GepettoVisualizer
391 
392  data, collision_data, visual_data = None, None, None
393  if share_data:
394  data = self.data
395  collision_data = self.collision_data
396  visual_data = self.visual_data
397  self.viz = GepettoVisualizer(
398  self.model,
399  self.collision_model,
400  self.visual_model,
401  not share_data,
402  data,
403  collision_data,
404  visual_data,
405  )
406 
407  self.viz.initViewer(*args, **kwargs)
408 
409  def loadViewerModel(self, *args, **kwargs):
410  """Create the scene displaying the robot meshes in gepetto-viewer"""
411  self.viz.loadViewerModel(*args, **kwargs)
412 
413  def display(self, q):
414  """Display the robot at configuration q in the viewer by placing all the bodies."""
415  self.viz.display(q)
416 
417  def displayCollisions(self, visibility):
418  """Set whether to diplay collision objects or not"""
419  self.viz.displayCollisions(visibility)
420 
421  def displayVisuals(self, visibility):
422  """Set whether to diplay visual objects or not"""
423  self.viz.displayVisuals(visibility)
424 
425  def play(self, q_trajectory, dt):
426  """Play a trajectory with given time step"""
427  self.viz.play(q_trajectory, dt)
428 
429 
430 __all__ = ["RobotWrapper"]
pinocchio.robot_wrapper.RobotWrapper.nq
def nq(self)
Definition: robot_wrapper.py:105
pinocchio.robot_wrapper.RobotWrapper.__init__
def __init__(self, model=pin.Model(), collision_model=None, visual_model=None, verbose=False)
Definition: robot_wrapper.py:88
pinocchio.robot_wrapper.RobotWrapper.play
def play(self, q_trajectory, dt)
Definition: robot_wrapper.py:425
pinocchio.robot_wrapper.RobotWrapper.computeJointJacobian
def computeJointJacobian(self, q, index)
Definition: robot_wrapper.py:264
pinocchio.robot_wrapper.RobotWrapper.constraint_models
constraint_models
Definition: robot_wrapper.py:77
pinocchio.robot_wrapper.RobotWrapper.frameVelocity
def frameVelocity(self, q, v, index, update_kinematics=True, reference_frame=pin.ReferenceFrame.LOCAL)
Definition: robot_wrapper.py:224
pinocchio.robot_wrapper.RobotWrapper.Jcom
def Jcom(self, q)
Definition: robot_wrapper.py:153
pinocchio.robot_wrapper.RobotWrapper.initViewer
def initViewer(self, share_data=True, *args, **kwargs)
Definition: robot_wrapper.py:386
pinocchio.robot_wrapper.RobotWrapper.acom
def acom(self, q, v, a)
Definition: robot_wrapper.py:128
pinocchio.robot_wrapper.RobotWrapper.index
def index(self, name)
Definition: robot_wrapper.py:362
pinocchio.robot_wrapper.RobotWrapper
Definition: robot_wrapper.py:12
pinocchio.robot_wrapper.RobotWrapper.centroidalMomentumVariation
def centroidalMomentumVariation(self, q, v, a)
Definition: robot_wrapper.py:148
pinocchio::id
JointIndex id(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointIdVisitor to get the index of the joint in the kinematic chain.
pinocchio.robot_wrapper.RobotWrapper.velocity
def velocity(self, q, v, index, update_kinematics=True, reference_frame=pin.ReferenceFrame.LOCAL)
Definition: robot_wrapper.py:179
pinocchio.robot_wrapper.RobotWrapper.getViewerNodeName
def getViewerNodeName(self, geometry_object, geometry_type)
Definition: robot_wrapper.py:382
pinocchio.robot_wrapper.RobotWrapper.computeJointJacobians
def computeJointJacobians(self, q)
Definition: robot_wrapper.py:270
pinocchio.robot_wrapper.RobotWrapper.placement
def placement(self, q, index, update_kinematics=True)
Definition: robot_wrapper.py:174
pinocchio.robot_wrapper.RobotWrapper.setVisualizer
def setVisualizer(self, visualizer, init=True, copy_models=False)
Definition: robot_wrapper.py:372
pinocchio.robot_wrapper.RobotWrapper.nv
def nv(self)
Definition: robot_wrapper.py:109
pinocchio.robot_wrapper.RobotWrapper.buildReducedRobot
def buildReducedRobot(self, list_of_joints_to_lock, reference_configuration=None)
Definition: robot_wrapper.py:291
pinocchio.robot_wrapper.RobotWrapper.v0
v0
Definition: robot_wrapper.py:97
pinocchio.robot_wrapper.RobotWrapper.visual_model
visual_model
Definition: robot_wrapper.py:91
pinocchio.robot_wrapper.RobotWrapper.acceleration
def acceleration(self, q, v, a, index, update_kinematics=True, reference_frame=pin.ReferenceFrame.LOCAL)
Definition: robot_wrapper.py:191
pinocchio.robot_wrapper.RobotWrapper.frameAcceleration
def frameAcceleration(self, q, v, a, index, update_kinematics=True, reference_frame=pin.ReferenceFrame.LOCAL)
Definition: robot_wrapper.py:236
pinocchio.shortcuts.buildModelsFromUrdf
Tuple[pin.Model, pin.GeometryModel, pin.GeometryModel] buildModelsFromUrdf(filename, package_dirs=None, root_joint=None, verbose=False, meshLoader=None, geometry_types=[pin.GeometryType.COLLISION, pin.GeometryType.VISUAL])
Definition: shortcuts.py:14
pinocchio.robot_wrapper.RobotWrapper.initFromSDF
def initFromSDF(self, filename, package_dirs=None, root_joint=None, root_link_name="", parent_guidance=[], verbose=False, meshLoader=None)
Definition: robot_wrapper.py:61
pinocchio.robot_wrapper.RobotWrapper.loadViewerModel
def loadViewerModel(self, *args, **kwargs)
Definition: robot_wrapper.py:409
pinocchio.shortcuts.createDatas
def createDatas(*models)
Definition: shortcuts.py:79
pinocchio.robot_wrapper.RobotWrapper.getJointJacobian
def getJointJacobian(self, index, rf_frame=pin.ReferenceFrame.LOCAL)
Definition: robot_wrapper.py:267
pinocchio.robot_wrapper.RobotWrapper.mass
def mass(self, q)
Definition: robot_wrapper.py:156
pinocchio.robot_wrapper.RobotWrapper.initFromURDF
def initFromURDF(self, filename, package_dirs=None, root_joint=None, verbose=False, meshLoader=None)
Definition: robot_wrapper.py:21
pinocchio.robot_wrapper.RobotWrapper.com
def com(self, q=None, v=None, a=None)
Definition: robot_wrapper.py:112
pinocchio.robot_wrapper.RobotWrapper.data
data
Definition: robot_wrapper.py:356
pinocchio.robot_wrapper.RobotWrapper.viewer
def viewer(self)
Definition: robot_wrapper.py:369
pinocchio.robot_wrapper.RobotWrapper.displayCollisions
def displayCollisions(self, visibility)
Definition: robot_wrapper.py:417
pinocchio.robot_wrapper.RobotWrapper.vcom
def vcom(self, q, v)
Definition: robot_wrapper.py:124
pinocchio.robot_wrapper.RobotWrapper.classicalAcceleration
def classicalAcceleration(self, q, v, a, index, update_kinematics=True, reference_frame=pin.ReferenceFrame.LOCAL)
Definition: robot_wrapper.py:204
pinocchio.robot_wrapper.RobotWrapper.framePlacement
def framePlacement(self, q, index, update_kinematics=True)
Definition: robot_wrapper.py:219
pinocchio.shortcuts.buildModelsFromSdf
def buildModelsFromSdf(filename, package_dirs=None, root_joint=None, root_link_name="", parent_guidance=[], verbose=False, meshLoader=None, geometry_types=None)
Definition: shortcuts.py:86
pinocchio.robot_wrapper.RobotWrapper.getFrameJacobian
def getFrameJacobian(self, frame_id, rf_frame=pin.ReferenceFrame.LOCAL)
Definition: robot_wrapper.py:325
pinocchio.robot_wrapper.RobotWrapper.viz
viz
Definition: robot_wrapper.py:100
pinocchio.robot_wrapper.RobotWrapper.centroidalMomentum
def centroidalMomentum(self, q, v)
Definition: robot_wrapper.py:132
pinocchio.robot_wrapper.RobotWrapper.q0
q0
Definition: robot_wrapper.py:98
display
Definition: display.py:1
pinocchio.robot_wrapper.RobotWrapper.visual_data
visual_data
Definition: robot_wrapper.py:93
pinocchio.robot_wrapper.RobotWrapper.collision_model
collision_model
Definition: robot_wrapper.py:90
pinocchio.robot_wrapper.RobotWrapper.computeFrameJacobian
def computeFrameJacobian(self, q, frame_id)
Definition: robot_wrapper.py:332
pinocchio.robot_wrapper.RobotWrapper.rebuildData
def rebuildData(self)
Definition: robot_wrapper.py:339
pinocchio.robot_wrapper.RobotWrapper.displayVisuals
def displayVisuals(self, visibility)
Definition: robot_wrapper.py:421
pinocchio.robot_wrapper.RobotWrapper.gravity
def gravity(self, q)
Definition: robot_wrapper.py:162
pinocchio.robot_wrapper.RobotWrapper.centroidal
def centroidal(self, q, v)
Definition: robot_wrapper.py:141
pinocchio.robot_wrapper.RobotWrapper.collision_data
collision_data
Definition: robot_wrapper.py:357
pinocchio.robot_wrapper.RobotWrapper.framesForwardKinematics
def framesForwardKinematics(self, q)
Definition: robot_wrapper.py:288
pinocchio.robot_wrapper.RobotWrapper.forwardKinematics
def forwardKinematics(self, q, v=None, a=None)
Definition: robot_wrapper.py:165
pinocchio.robot_wrapper.RobotWrapper.frameClassicalAcceleration
def frameClassicalAcceleration(self, q, v, a, index, update_kinematics=True, reference_frame=pin.ReferenceFrame.LOCAL)
Definition: robot_wrapper.py:249
pinocchio.robot_wrapper.RobotWrapper.display
def display(self, q)
Definition: robot_wrapper.py:413
pinocchio.robot_wrapper.RobotWrapper.BuildFromURDF
def BuildFromURDF(filename, package_dirs=None, root_joint=None, verbose=False, meshLoader=None)
Definition: robot_wrapper.py:14
pinocchio.robot_wrapper.RobotWrapper.model
model
Definition: robot_wrapper.py:89
pinocchio.robot_wrapper.RobotWrapper.updateGeometryPlacements
def updateGeometryPlacements(self, q=None, visual=False)
Definition: robot_wrapper.py:273
pinocchio.robot_wrapper.RobotWrapper.BuildFromSDF
def BuildFromSDF(filename, package_dirs=None, root_joint=None, root_link_name="", parent_guidance=[], verbose=False, meshLoader=None)
Definition: robot_wrapper.py:40
pinocchio.robot_wrapper.RobotWrapper.centroidalMap
def centroidalMap(self, q)
Definition: robot_wrapper.py:135
pinocchio.robot_wrapper.RobotWrapper.nle
def nle(self, q, v)
Definition: robot_wrapper.py:159


pinocchio
Author(s):
autogenerated on Sat Jun 1 2024 02:40:38