-
Notifications
You must be signed in to change notification settings - Fork 5
/
arm3dconstraint.py
61 lines (51 loc) · 1.88 KB
/
arm3dconstraint.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from robots import loadTalosArm
from scipy.optimize import fmin_slsqp
import pinocchio
from pinocchio.utils import *
from numpy.linalg import norm,inv,pinv,eig,svd
m2a = lambda m: np.array(m.flat)
a2m = lambda a: np.matrix(a).T
robot = loadTalosArm()
robot.initDisplay(loadModel=True)
class OptimProblem:
def __init__(self,rmodel,rdata,gview=None):
self.rmodel = rmodel
self.rdata = rdata
self.refEff = [ .3, 0.3, 0.3 ] # Target position
self.idEff = rmodel.getFrameId('gripper_left_fingertip_2_link')
self.refQ = rmodel.neutralConfiguration
self.initDisplay(gview)
def cost(self,x):
q = a2m(x)
self.residuals = m2a(q-self.refQ)
return sum(self.residuals**2)
def constraint(self,x):
q = a2m(x)
pinocchio.forwardKinematics(self.rmodel,self.rdata,q)
pinocchio.updateFramePlacements(self.rmodel,self.rdata)
M = self.rdata.oMf[self.idEff]
self.eq = m2a(M.translation) - self.refEff
return self.eq.flat
@property
def bounds(self):
return [ (10*l,u) for l,u in zip(self.rmodel.lowerPositionLimit.flat,
self.rmodel.upperPositionLimit.flat) ]
def initDisplay(self,gview=None):
self.gview = gview
if gview is None: return
self.gobj = "world/target3d"
self.gview.addSphere(self.gobj,.03,[1,0,0,1])
self.gview.applyConfiguration(self.gobj,self.refEff+[0,0,0,1])
self.gview.refresh()
def callback(self,x):
import time
q = a2m(x)
robot.display(q)
time.sleep(1e-2)
pbm = OptimProblem(robot.model,robot.model.createData(),robot.viewer.gui)
x0 = m2a(robot.q0)
result = fmin_slsqp(x0 = x0,
func = pbm.cost,
f_eqcons = pbm.constraint,
callback = pbm.callback)
qopt = a2m(result)