2 import pinocchio
as pin
4 from numpy.linalg
import norm
7 def df_dq(model, func, q, h=1e-9):
8 """Perform df/dq by num_diff. q is in the lie manifold.
9 :params func: function to differentiate f : np.array -> np.array
10 :params q: configuration value at which f is differentiated. type np.array
17 res =
zero([len(f0), model.nv])
18 for iq
in range(model.nv):
20 res[:, iq] = (func(pin.integrate(model, q, dq)) - f0) / h
27 self.
rmodel = rmodel = pin.buildSampleModelHumanoid()
28 self.
rdata = rmodel.createData()
31 self.
rmodel.lowerPositionLimit[:3] = -1.0
32 self.
rmodel.upperPositionLimit[:3] = -1.0
33 self.
q = pin.randomConfiguration(rmodel)
41 q, vq = self.
q, self.
vq
44 pin.computeAllTerms(rmodel, rdata, q, vq)
45 dvc_dq = pin.getCenterOfMassVelocityDerivatives(rmodel, rdata)
49 """Compute COM velocity"""
50 pin.centerOfMass(rmodel, rdata_fd, q, vq)
51 return rdata_fd.vcom[0].
copy()
53 dvc_dqn =
df_dq(rmodel,
lambda _q: calc_vc(_q, vq), q)
55 self.assertTrue(np.allclose(dvc_dq, dvc_dqn, atol=np.sqrt(self.
precision)))
58 if __name__ ==
"__main__":