dcrba.py
Go to the documentation of this file.
1 #
2 # Copyright (c) 2016 CNRS
3 #
4 
5 
6 import lambdas
7 import numpy as np
8 import pinocchio as pin
9 from lambdas import (
10  FCross,
11  MCross,
12  Mcross,
13  adj,
14  adjdual,
15  ancestors,
16  iv,
17  parent,
18  quad,
19  td,
20 )
21 from numpy.linalg import norm
22 from pinocchio.robot_wrapper import RobotWrapper
23 from pinocchio.utils import rand
24 
25 
26 def hessian(robot, q, crossterms=False):
27  """
28  Compute the Hessian tensor of all the robot joints.
29  If crossterms, then also compute the Si x Si terms,
30  that are not part of the true Hessian but enters in some computations like VRNEA.
31  """
33  H = np.zeros([6, robot.model.nv, robot.model.nv])
34  pin.computeJointJacobians(robot.model, robot.data, q)
35  J = robot.data.J
36  skiplast = -1 if not crossterms else None
37  for joint_i in range(1, robot.model.njoints):
38  for joint_j in ancestors(joint_i)[:skiplast]: # j is a child of i
39  for i in iv(joint_i):
40  for j in iv(joint_j):
41  Si = J[:, i]
42  Sj = J[:, j]
43  H[:, i, j] = np.asarray(Mcross(Sj, Si))[:, 0]
44  return H
45 
46 
47 # CRBA ====> Mp[i,j] += Si.transpose()*Yk*Sj
48 # D-CRBA ==> TSi Y Sj + Si Y TSj - Si YSdx Sj + Si SdxY Sj
49 # Term a = term d && term b = term c --- or are null
50 # -> term a is null if j<=diff
51 # -> term d is null if diff>k
52 # -> then a-d is nonzero only when k>=diff>j
53 # Due to simplification, terms cancel to the following:
54 # if i<d (always true) M[i,j,d] = Si.T Yd TjSd (= -Si.T Yd Sd x Sj)
55 # if j<d (possibly false) M[i,j,d] += TdSi.T Yd Sd (= +Si.T Sdx Yd Sj)
56 # where Yd is the composite inertia of the minimal subtree rooted either at j or d.
57 
58 
59 class DCRBA:
60  """
61  Compute the derivative (tangent application) of the mass matrix M wrt q,
62  which is a NVxNVxNV tensor.
63  """
64 
65  def __init__(self, robot):
66  self.robot = robot
68 
69  def pre(self, q):
70  robot = self.robot
71  self.H = hessian(robot, q)
72  self.J = robot.data.J.copy()
73  pin.crba(robot.model, robot.data, q)
74  self.Y = [
75  (robot.data.oMi[i] * robot.data.Ycrb[i]).matrix()
76  for i in range(0, robot.model.njoints)
77  ]
78 
79  self.dM = np.zeros(
80  [
81  robot.model.nv,
82  ]
83  * 3
84  )
85 
86  def __call__(self):
87  robot = self.robot
88  J = self.J
89  Y = self.Y
90  dM = self.dM
91  H = self.H
92 
93  for j in range(robot.model.njoints - 1, 0, -1):
94  for joint_diff in range(
95  1, robot.model.njoints
96  ): # diff should be a descendant or ancestor of j
97  if j not in ancestors(joint_diff) and joint_diff not in ancestors(j):
98  continue
99 
100  for i in ancestors(min(parent(joint_diff), j)):
101  i0, i1 = iv(i)[0], iv(i)[-1] + 1
102  j0, j1 = iv(j)[0], iv(j)[-1] + 1
103 
104  Si = J[:, i0:i1]
105  Sj = J[:, j0:j1]
106 
107  for d in iv(joint_diff):
108  T_iSd = np.array(H[:, d, i0:i1]) # this is 0 if d<=i (<=j)
109  T_jSd = np.array(H[:, d, j0:j1]) # this is 0 is d<=j
110 
111  """
112  # d<i => TiSd=0
113  assert( norm(T_iSd)<1e-6 or not joint_diff<i )
114  # d<j => TjSd=0
115  assert( norm(T_jSd)<1e-6 or not joint_diff<j )
116  # TiSd=0 => TjSd=0
117  assert( norm(T_jSd)<1e-6 or not norm(T_iSd)<1e-6 )
118  assert( norm(T_iSd)>1e-6 )
119  """
120 
121  Yd = Y[max(j, joint_diff)]
122 
123  dM[i0:i1, j0:j1, d] = T_iSd.T * Yd * Sj
124  if j < joint_diff:
125  dM[i0:i1, j0:j1, d] += Si.T * Yd * T_jSd
126 
127  # Make dM triangular by copying strict-upper triangle to lower
128  # one.
129  if i != j:
130  dM[j0:j1, i0:i1, d] = dM[i0:i1, j0:j1, d].T
131  else:
132  dM[j0:j1, i0:i1, d] += np.triu(dM[i0:i1, j0:j1, d], 1).T
133 
134  return dM
135 
136 
137 # -----------------------------------------------------------------------------------
138 # -----------------------------------------------------------------------------------
139 # -----------------------------------------------------------------------------------
140 class VRNEA:
141  """
142  Compute the C tensor so that nle(q,vq) = vq C vq.
143  Noting Cv = C*vq for an arbitrary robot velocity vq:
144  Since Mdot = (Cv+Cv')/2, then C = dCv/dvq and dM/dq = (Cv+Cv')
145 
146  Q is index by i,j,k i.e. tau_k = v.T*Q[:,:,k]*v
147  At level k, Qk is a lower triangular matrix (same shape as H) where:
148  * rows i s.t. i>k are equals to Sk.T*Ycrb_i*S_ixS_j (j the col index),
149  * rows i s.t. i<=k are equals to Sk.T*Ycrb_k*S_ixS_j (j the col index)
150  To avoid the call to Ycrb_i>k, the first par is set up while computing Q_k
151  """
152 
153  def __init__(self, robot):
154  self.robot = robot
155  lambdas.setRobotArgs(robot)
156  self.YJ = np.zeros([6, robot.model.nv])
157  self.Q = np.zeros(
158  [
159  robot.model.nv,
160  ]
161  * 3
162  )
163 
164  def __call__(self, q):
165  robot = self.robot
166  H = hessian(robot, q, crossterms=True)
167  J = robot.data.J
168  YJ = self.YJ
169  Q = self.Q
170 
171  # The terms in SxS YS corresponds to f = vxYv
172  # The terms in S YSxS corresponds to a = vxv (==> f = Yvxv)
173  for k in range(robot.model.njoints - 1, 0, -1):
174  k0, k1 = iv(k)[0], iv(k)[-1] + 1
175  Yk = (robot.data.oMi[k] * robot.data.Ycrb[k]).matrix()
176  _Sk = J[:, k0:k1]
177  for j in ancestors(k): # Fill YJ = [ ... Yk*Sj ... ]_j
178  j0, j1 = iv(j)[0], iv(j)[-1] + 1
179  YJ[:, j0:j1] = Yk * J[:, j0:j1]
180 
181  # Fill the diagonal of the current level of Q = Q[k,:k,:k]
182  for i in ancestors(k):
183  i0, i1 = iv(i)[0], iv(i)[-1] + 1
184  _Si = J[:, i0:i1]
185 
186  Q[k0:k1, i0:i1, i0:i1] = -td(
187  H[:, k0:k1, i0:i1], YJ[:, i0:i1], [0, 0]
188  ) # = (Si x Sk)' * Yk Si
189 
190  # Fill the nondiag of the current level Q[k,:k,:k]
191  for j in ancestors(i)[:-1]:
192  j0, j1 = iv(j)[0], iv(j)[-1] + 1
193  _Sj = J[:, j0:j1]
194 
195  # = Sk' * Yk * Si x Sj
196  Q[k0:k1, i0:i1, j0:j1] = td(
197  YJ[:, k0:k1], H[:, i0:i1, j0:j1], [0, 0]
198  )
199  # = (Si x Sk)' * Yk Sj
200  Q[k0:k1, i0:i1, j0:j1] -= td(
201  H[:, k0:k1, i0:i1], YJ[:, j0:j1], [0, 0]
202  )
203  # = (Sj x Sk)' * Yk Si
204  Q[k0:k1, j0:j1, i0:i1] = -td(
205  H[:, k0:k1, j0:j1], YJ[:, i0:i1], [0, 0]
206  )
207 
208  # Fill the border elements of levels below k
209  # Q[kk,k,:] and Q[kk,:,k] with kk<k
210  for kk in ancestors(k)[:-1]:
211  kk0, kk1 = iv(kk)[0], iv(kk)[-1] + 1
212  _Skk = J[:, kk0:kk1]
213 
214  for j in ancestors(k):
215  j0, j1 = iv(j)[0], iv(j)[-1] + 1
216  _Sj = J[:, j0:j1]
217 
218  # = Skk' Yk Sk x Sj = (Yk Skk)' Sk x Sj
219  if k != j:
220  Q[kk0:kk1, k0:k1, j0:j1] = td(
221  YJ[:, kk0:kk1], H[:, k0:k1, j0:j1], [0, 0]
222  )
223  # = (Sk x Skk)' Yk Sj
224  Q[kk0:kk1, k0:k1, j0:j1] += td(
225  H[:, k0:k1, kk0:kk1].T, YJ[:, j0:j1], [2, 0]
226  )
227  # = (Sj x Skk)' Yk Sk
228  # Switch because j can be > or < than kk
229  if j < kk:
230  Q[kk0:kk1, j0:j1, k0:k1] = -Q[j0:j1, kk0:kk1, k0:k1].transpose(
231  1, 0, 2
232  )
233  elif j >= kk:
234  Q[kk0:kk1, j0:j1, k0:k1] = td(
235  H[:, j0:j1, kk0:kk1].T, YJ[:, k0:k1], [2, 0]
236  )
237 
238  return Q
239 
240 
241 # -----------------------------------------------------------------------------------
242 # -----------------------------------------------------------------------------------
243 # -----------------------------------------------------------------------------------
244 class Coriolis:
245  def __init__(self, robot):
246  self.robot = robot
247  lambdas.setRobotArgs(robot)
248  NV = robot.model.nv
249  _NJ = robot.model.njoints
250  self.C = np.zeros([NV, NV])
251  self.YS = np.zeros([6, NV])
252  self.Sxv = np.zeros([6, NV])
253 
254  def __call__(self, q, vq):
255  robot = self.robot
256  _NV = robot.model.nv
257  NJ = robot.model.njoints
258  C = self.C
259  YS = self.YS
260  Sxv = self.Sxv
261  H = hessian(robot, q)
262 
263  pin.computeAllTerms(robot.model, robot.data, q, vq)
264  J = robot.data.J
265  oMi = robot.data.oMi
266  v = [(oMi[i] * robot.data.v[i]).vector for i in range(NJ)]
267  Y = [(oMi[i] * robot.data.Ycrb[i]).matrix() for i in range(NJ)]
268 
269  # --- Precomputations
270  # Centroidal matrix
271  for j in range(NJ):
272  j0, j1 = iv(j)[0], iv(j)[-1] + 1
273  YS[:, j0:j1] = Y[j] * J[:, j0:j1]
274 
275  # velocity-jacobian cross products.
276  for j in range(NJ):
277  j0, j1 = iv(j)[0], iv(j)[-1] + 1
278  vj = v[j]
279  Sxv[:, j0:j1] = adj(vj) * J[:, j0:j1]
280 
281  # --- Main loop
282  for i in range(NJ - 1, 0, -1):
283  i0, i1 = iv(i)[0], iv(i)[-1] + 1
284  Yi = Y[i]
285  Si = J[:, i0:i1]
286  vp = v[robot.model.parents[i]]
287 
288  SxvY = Sxv[:, i0:i1].T * Yi
289  for j in ancestors(i):
290  j0, j1 = iv(j)[0], iv(j)[-1] + 1
291  Sj = J[:, j0:j1]
292 
293  # COR ===> Si' Yi Sj x vj
294  C[i0:i1, j0:j1] = YS[:, i0:i1].T * Sxv[:, j0:j1]
295  # CEN ===> Si' vi x Yi Sj = - (Si x vi)' Yi Sj
296  C[i0:i1, j0:j1] -= SxvY * Sj
297 
298  vxYS = adjdual(v[i]) * Yi * Si
299  YSxv = Yi * Sxv[:, i0:i1]
300  Yv = Yi * vp
301  for ii in ancestors(i)[:-1]:
302  ii0, ii1 = iv(ii)[0], iv(ii)[-1] + 1
303  Sii = J[:, ii0:ii1]
304  # COR ===> Sii' Yi Si x vi
305  C[ii0:ii1, i0:i1] = Sii.T * YSxv
306  # CEN ===> Sii' vi x Yi Si = (Sii x vi)' Yi Si
307  C[ii0:ii1, i0:i1] += Sii.T * vxYS
308  # CEN ===> Sii' Si x Yi vi = (Sii x Si)' Yi vi
309  C[ii0:ii1, i0:i1] += np.array(
310  td(H[:, i0:i1, ii0:ii1], Yv, [0, 0])[:, :, 0]
311  )
312 
313  return C
314 
315 
316 # --- DRNEA -------------------------------------------------------------------------
317 # --- DRNEA -------------------------------------------------------------------------
318 # --- DRNEA -------------------------------------------------------------------------
319 
320 
321 class DRNEA:
322  def __init__(self, robot):
323  self.robot = robot
324  lambdas.setRobotArgs(robot)
325 
326  def __call__(self, q, vq, aq):
327  robot = self.robot
328  pin.rnea(robot.model, robot.data, q, vq, aq)
329  NJ = robot.model.njoints
330  NV = robot.model.nv
331  J = robot.data.J
332  oMi = robot.data.oMi
333  v = [(oMi[i] * robot.data.v[i]).vector for i in range(NJ)]
334  a = [(oMi[i] * robot.data.a_gf[i]).vector for i in range(NJ)]
335  f = [(oMi[i] * robot.data.f[i]).vector for i in range(NJ)]
336  Y = [(oMi[i] * robot.model.inertias[i]).matrix() for i in range(NJ)]
337  Ycrb = [(oMi[i] * robot.data.Ycrb[i]).matrix() for i in range(NJ)]
338 
339  Tkf = [np.zeros([6, NV]) for i in range(NJ)]
340  Yvx = [np.zeros([6, 6]) for i in range(NJ)]
341 
342  def adjf(f):
343  return -np.bmat(
344  [
345  [np.zeros([3, 3]), pin.skew(f[:3])],
346  [pin.skew(f[:3]), pin.skew(f[3:])],
347  ]
348  )
349 
350  R = self.R = np.zeros([NV, NV])
351 
352  for i in reversed(
353  range(1, NJ)
354  ): # i is the torque index : dtau_i = R[i,:] dq
355  i0, i1 = iv(i)[0], iv(i)[-1] + 1
356  Yi = Y[i]
357  Yci = Ycrb[i]
358  Si = J[:, i0:i1]
359  _vi = v[i]
360  _ai = a[i]
361  _fi = f[i]
362  _aqi = aq[i0:i1]
363  vqi = vq[i0:i1]
364  _dvi = Si * vqi
365  li = parent(i)
366 
367  Yvx[i] += Y[i] * adj(v[i])
368  Yvx[i] -= adjf(Y[i] * v[i])
369  Yvx[i] -= adjdual(v[i]) * Yi
370 
371  Yvx[li] += Yvx[i]
372 
373  for k in ancestors(i): # k is the derivative index: dtau = R[:,k] dq_k
374  k0, k1 = iv(k)[0], iv(k)[-1] + 1
375  Sk = J[:, k0:k1]
376  lk = parent(k)
377 
378  # Si' Yi Tk ai = Si' Yi ( Sk x (ai-alk) + (vi-vlk) x (Sk x vlk) )
379  # Tk Si' Yi ai = Si' Yi ( - Sk x a[lk] + (vi-vlk) x (Sk x vlk) )
380  Tkf = Yci * (-MCross(Sk, a[lk]) + MCross(MCross(Sk, v[lk]), v[lk]))
381 
382  # Tk Si' fs = Tk Si' Ycrb[i] ai + Si' Ys (vs-vi) x (Sk x vlk)
383  # = "" + Si' Ys vs x (Sk x vlk) - Si' Ys vi x (Sk x vlk) # noqa E501
384  Tkf += Yvx[i] * MCross(Sk, v[lk])
385 
386  R[i0:i1, k0:k1] = Si.T * Tkf
387  if i == k:
388  for kk in ancestors(k)[:-1]:
389  kk0, kk1 = iv(kk)[0], iv(kk)[-1] + 1
390  Skk = J[:, kk0:kk1]
391  R[kk0:kk1, k0:k1] = Skk.T * FCross(Sk, f[i])
392  R[kk0:kk1, k0:k1] += Skk.T * Tkf
393 
394  self.a = a
395  self.v = v
396  self.f = f
397  self.Y = Y
398  self.Ycrb = Ycrb
399  self.Yvx = Yvx
400 
401  return R
402 
403 
404 # -----------------------------------------------------------------------------------
405 # -----------------------------------------------------------------------------------
406 # -----------------------------------------------------------------------------------
407 # --- UNIT TEST ---
408 if __name__ == "__main__":
409  np.random.seed(0)
410 
411  robot = RobotWrapper(
412  "/home/nmansard/src/pinocchio/pinocchio/models/romeo/urdf/romeo.urdf",
413  [
414  "/home/nmansard/src/pinocchio/pinocchio/models/romeo/",
415  ],
416  pin.JointModelFreeFlyer(),
417  )
418  q = rand(robot.model.nq)
419  q[3:7] /= norm(q[3:7])
420  vq = rand(robot.model.nv)
421 
422  # --- HESSIAN ---
423  # --- HESSIAN ---
424  # --- HESSIAN ---
425  H = hessian(robot, q)
426 
427  # Compute the Hessian matrix H using RNEA, so that acor = v*H*v
428  vq1 = vq * 0
429  Htrue = np.zeros([6, robot.model.nv, robot.model.nv])
430  for joint_i in range(1, robot.model.njoints):
431  for joint_j in ancestors(joint_i)[:-1]:
432  for i in iv(joint_i):
433  for j in iv(joint_j):
434  vq1 *= 0
435  vq1[i] = vq1[j] = 1.0
436  pin.computeAllTerms(robot.model, robot.data, q, vq1)
437  Htrue[:, i, j] = (
438  robot.data.oMi[joint_i] * robot.data.a[joint_i]
439  ).vector.T
440 
441  print("Check hessian = \t\t", norm(H - Htrue))
442 
443  # --- dCRBA ---
444  # --- dCRBA ---
445  # --- dCRBA ---
446 
447  dcrba = DCRBA(robot)
448  dcrba.pre(q)
449  Mp = dcrba()
450 
451  # --- Validate dM/dq by finite diff
452  dM = np.zeros(
453  [
454  robot.model.nv,
455  ]
456  * 3
457  )
458  eps = 1e-6
459  dq = np.zeros(robot.model.nv)
460 
461  for diff in range(robot.model.nv):
462  dM[:, :, diff] = -pin.crba(robot.model, robot.data, q)
463 
464  dq *= 0
465  dq[diff] = eps
466  qdq = pin.integrate(robot.model, q, dq)
467 
468  dM[:, :, diff] += pin.crba(robot.model, robot.data, qdq)
469 
470  dM /= eps
471 
472  print(
473  "Check dCRBA = \t\t\t",
474  max([norm(Mp[:, :, diff] - dM[:, :, diff]) for diff in range(robot.model.nv)]),
475  )
476 
477  # --- vRNEA ---
478  # --- vRNEA ---
479  # --- vRNEA ---
480 
481  vrnea = VRNEA(robot)
482  Q = vrnea(q)
483 
484  # --- Compute C from rnea, for future check
485  robot.model.gravity = pin.Motion.Zero()
486 
487  def rnea0(q, vq):
488  return pin.nle(robot.model, robot.data, q, vq)
489 
490  vq1 = vq * 0
491  C = np.zeros(
492  [
493  robot.model.nv,
494  ]
495  * 3
496  )
497  for i in range(robot.model.nv):
498  vq1 *= 0
499  vq1[i] = 1
500  C[:, i, i] = rnea0(q, vq1).T
501 
502  for i in range(robot.model.nv):
503  for j in range(robot.model.nv):
504  if i == j:
505  continue
506  vq1 *= 0
507  vq1[i] = vq1[j] = 1.0
508  C[:, i, j] = (rnea0(q, vq1).T - C[:, i, i] - C[:, j, j]) / 2
509 
510  print("Check d/dv rnea = \t\t", norm(quad(Q, vq) - rnea0(q, vq)))
511  print("Check C = Q+Q.T = \t\t", norm((Q + Q.transpose(0, 2, 1)) / 2 - C))
512  print("Check dM = C+C.T /2 \t\t", norm(Mp - (C + C.transpose(1, 0, 2))))
513  print(
514  "Check dM = Q+Q.T+Q.T+Q.T /2 \t",
515  norm(
516  Mp
517  - (Q + Q.transpose(0, 2, 1) + Q.transpose(1, 0, 2) + Q.transpose(2, 0, 1))
518  / 2
519  ),
520  )
521 
522  # --- CORIOLIS
523  # --- CORIOLIS
524  # --- CORIOLIS
525  coriolis = Coriolis(robot)
526  C = coriolis(q, vq)
527  print("Check coriolis \t\t\t", norm(C * vq - rnea0(q, vq)))
528 
529  # --- DRNEA
530  # --- DRNEA
531  # --- DRNEA
532  drnea = DRNEA(robot)
533  aq = rand(robot.model.nv)
534  R = drnea(q, vq, aq)
535 
536  NV = robot.model.nv
537  Rd = np.zeros([NV, NV])
538  eps = 1e-8
539  r0 = pin.rnea(robot.model, robot.data, q, vq, aq).copy()
540  for i in range(NV):
541  dq = np.zeros(NV)
542  dq[i] = eps
543  qdq = pin.integrate(robot.model, q, dq)
544  Rd[:, i] = (pin.rnea(robot.model, robot.data, qdq, vq, aq) - r0) / eps
545  print("Check drnea \t\t\t", norm(Rd - R))
dcrba.VRNEA.YJ
YJ
Definition: dcrba.py:156
dcrba.Coriolis.__call__
def __call__(self, q, vq)
Definition: dcrba.py:254
dcrba.rnea0
def rnea0(q, vq)
Definition: dcrba.py:487
dcrba.Coriolis.YS
YS
Definition: dcrba.py:251
pinocchio.robot_wrapper.RobotWrapper
Definition: bindings/python/pinocchio/robot_wrapper.py:15
lambdas.parent
parent
Definition: lambdas.py:21
lambdas.adjdual
adjdual
Definition: lambdas.py:81
dcrba.coriolis
coriolis
Definition: dcrba.py:525
dcrba.DCRBA.Y
Y
Definition: dcrba.py:74
dcrba.DCRBA
Definition: dcrba.py:59
dcrba.VRNEA.__init__
def __init__(self, robot)
Definition: dcrba.py:153
dcrba.Coriolis
Definition: dcrba.py:244
dcrba.DRNEA.Ycrb
Ycrb
Definition: dcrba.py:398
dcrba.DRNEA.v
v
Definition: dcrba.py:395
dcrba.DRNEA.__call__
def __call__(self, q, vq, aq)
Definition: dcrba.py:326
dcrba.DCRBA.robot
robot
Definition: dcrba.py:66
dcrba.Coriolis.robot
robot
Definition: dcrba.py:246
dcrba.DCRBA.__init__
def __init__(self, robot)
Definition: dcrba.py:65
dcrba.DRNEA.Yvx
Yvx
Definition: dcrba.py:399
pinocchio::cholesky::min
JointCollectionTpl const DataTpl< Scalar, Options, JointCollectionTpl > const Eigen::MatrixBase< Mat > & min
Definition: cholesky.hpp:89
dcrba.DRNEA.robot
robot
Definition: dcrba.py:323
dcrba.VRNEA.__call__
def __call__(self, q)
Definition: dcrba.py:164
dcrba.DRNEA.Y
Y
Definition: dcrba.py:397
dcrba.Coriolis.C
C
Definition: dcrba.py:250
dcrba.VRNEA
Definition: dcrba.py:140
dcrba.VRNEA.robot
robot
Definition: dcrba.py:154
dcrba.hessian
def hessian(robot, q, crossterms=False)
Definition: dcrba.py:26
dcrba.DCRBA.__call__
def __call__(self)
Definition: dcrba.py:86
dcrba
Definition: dcrba.py:1
dcrba.Coriolis.Sxv
Sxv
Definition: dcrba.py:252
pinocchio.utils
Definition: bindings/python/pinocchio/utils.py:1
dcrba.DRNEA.f
f
Definition: dcrba.py:396
dcrba.DCRBA.dM
dM
Definition: dcrba.py:79
lambdas.MCross
MCross
Definition: lambdas.py:74
lambdas.adj
adj
Definition: lambdas.py:78
pinocchio.robot_wrapper
Definition: bindings/python/pinocchio/robot_wrapper.py:1
dcrba.vrnea
vrnea
Definition: dcrba.py:481
dcrba.DCRBA.J
J
Definition: dcrba.py:72
dcrba.VRNEA.Q
Q
Definition: dcrba.py:157
lambdas.Mcross
Mcross
Definition: lambdas.py:68
dcrba.drnea
drnea
Definition: dcrba.py:532
dcrba.DRNEA.__init__
def __init__(self, robot)
Definition: dcrba.py:322
dcrba.Coriolis.__init__
def __init__(self, robot)
Definition: dcrba.py:245
lambdas.iv
iv
Definition: lambdas.py:22
pinocchio::copy
void copy(const ModelTpl< Scalar, Options, JointCollectionTpl > &model, const DataTpl< Scalar, Options, JointCollectionTpl > &origin, DataTpl< Scalar, Options, JointCollectionTpl > &dest, KinematicLevel kinematic_level)
Copy part of the data from origin to dest. Template parameter can be used to select at which differen...
Definition: copy.hpp:42
dcrba.DRNEA
Definition: dcrba.py:321
dcrba.DCRBA.pre
def pre(self, q)
Definition: dcrba.py:69
lambdas.setRobotArgs
def setRobotArgs(robot)
Definition: lambdas.py:58
lambdas.quad
quad
Definition: lambdas.py:87
lambdas.td
td
Definition: lambdas.py:86
dcrba.DRNEA.a
a
Definition: dcrba.py:394
pinocchio.utils.rand
def rand(n)
Definition: bindings/python/pinocchio/utils.py:41
lambdas.ancestors
list ancestors
Definition: lambdas.py:28
dcrba.DRNEA.R
R
Definition: dcrba.py:350
CppAD::max
AD< Scalar > max(const AD< Scalar > &x, const AD< Scalar > &y)
Definition: autodiff/cppad.hpp:181
lambdas.FCross
FCross
Definition: lambdas.py:75
dcrba.DCRBA.H
H
Definition: dcrba.py:71


pinocchio
Author(s):
autogenerated on Sun Dec 22 2024 03:41:08