From 588a74cd3119c6ffffe92fbd8c1eb9ca29949b8f Mon Sep 17 00:00:00 2001
From: Mansard <nmansard@laas.fr>
Date: Tue, 6 Sep 2011 15:33:40 +0200
Subject: [PATCH] ivigit.

---
 python/mocap/imit.py | 411 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 411 insertions(+)
 create mode 100644 python/mocap/imit.py

diff --git a/python/mocap/imit.py b/python/mocap/imit.py
new file mode 100644
index 0000000..654c4cd
--- /dev/null
+++ b/python/mocap/imit.py
@@ -0,0 +1,411 @@
+#_____________________________________________________________________________________________
+#********************************************************************************************
+#
+#  Robot motion (HRP2 14 small) using:
+#  - ONLY OPERATIONAL TASKS
+#  - Joint limits (position and velocity)
+#_____________________________________________________________________________________________
+#*********************************************************************************************
+
+import sys
+from optparse import OptionParser
+from dynamic_graph import plug
+from dynamic_graph.sot.core import *
+from dynamic_graph.sot.core.math_small_entities import Derivator_of_Matrix
+from dynamic_graph.sot.dynamics import *
+from dynamic_graph.sot.dyninv import *
+import dynamic_graph.script_shortcuts
+from dynamic_graph.script_shortcuts import optionalparentheses
+from dynamic_graph.matlab import matlab
+sys.path.append('..')
+from meta_task_dyn_6d import MetaTaskDyn6d
+from attime import attime
+from numpy import *
+from robotSpecific import pkgDataRootDir,modelName,robotDimension,initialConfig,gearRatio,inertiaRotor
+from mocap_parser import MocapParser,MocapParserTimed
+from matrix_util import matrixToTuple
+
+#-----------------------------------------------------------------------------
+# --- ROBOT SIMU -------------------------------------------------------------
+#-----------------------------------------------------------------------------
+
+robotName = 'hrp14small'
+robotDim  = robotDimension[robotName]
+RobotClass = RobotDynSimu
+robot      = RobotClass("robot")
+robot.resize(robotDim)
+dt = 1e-3
+
+# Initial configuration
+robot.set( ( 0,0,0.6487,0,0,0,0,0,-0.453786,0.872665,-0.418879,0,0,0,-0.453786,0.872665,-0.418879,0,0,0,0,0,0.261799,-0.174533,0,-0.523599,0,0,0.174533,0.261799,0.174533,0,-0.523599,0,0,0.174533 ) )
+
+# Init config, both hands in place, com in the center of the polygon.
+#robot.set((0.047605478333881616, 0.0069670567778655663, 0.70217819698128325, 0.033271671746594733, -0.14633177925107063, -0.0043665416399416524, 0.0060395105648764135, -0.044264063566775931, 0.10843367835692867, 0.20411254610434074, -0.16600602326644109, 0.011755310912801515, 0.0060134908716506048, -0.044087946756041933, 0.21121791020744213, -0.0023194171097636559, -0.06235944098204433, 0.011577286094383481, -0.031867567519300713, 0.0034122542878611364, -0.00018994268250045398, 0.017828376138565111, 0.57116020077409424, -0.20030039713333259, -0.035022771905715559, -1.4854699434782164, 0.033323186696575108, -0.98274234563896556, 0.1745446596832258, 0.67308873547891679, 0.22219955983304274, 0.048809070665574876, -1.412474883412113, -0.083661057118875753, -0.78534673513887354, 0.17410999723730466))
+
+# ------------------------------------------------------------------------------
+# --- VIEWER -------------------------------------------------------------------
+# ------------------------------------------------------------------------------
+
+try:
+    import robotviewer
+
+    def stateFullSize(robot):
+        return [float(val) for val in robot.state.value]+10*[0.0]
+    RobotClass.stateFullSize = stateFullSize
+    robot.viewer = robotviewer.client('XML-RPC')
+    #robot.viewer = robotviewer.client('CORBA')
+    # Check the connection
+    robot.viewer.updateElementConfig('hrp',robot.stateFullSize())
+
+    def refreshView( robot ):
+       robot.viewer.updateElementConfig('hrp',robot.stateFullSize())
+    RobotClass.refresh = refreshView
+
+    def incrementView(robot,dt):
+        robot.incrementNoView(dt)
+        robot.refresh()
+        #if zmp.zmp.time > 0:
+        #    robot.viewer.updateElementConfig('zmp',[zmp.zmp.value[0],zmp.zmp.value[1],0,0,0,0])
+    RobotClass.incrementNoView = RobotClass.increment
+    RobotClass.increment = incrementView
+
+    def setView( robot,*args ):
+        robot.setNoView(*args)
+        robot.refresh()
+    RobotClass.setNoView = RobotClass.set
+    RobotClass.set = setView
+    robot.refresh()
+
+except:
+    print "No robot viewer, sorry."
+    class RobotViewerFaked:
+        def update(*args): void
+        def updateElementConfig(*args): void
+    robot.viewer = RobotViewerFaked()
+
+
+#-------------------------------------------------------------------------------
+#----- MAIN LOOP ---------------------------------------------------------------
+#-------------------------------------------------------------------------------
+
+def inc():
+    updateMocap()
+    robot.increment(dt)
+    # Execute a function at time t, if specified with t.add(...)
+    attime.run(robot.control.time)
+    zmpup()
+
+from ThreadInterruptibleLoop import *
+@loopInThread
+def loop():
+    try:
+        inc()
+    except:
+        tr.dump()
+        print ' -- Robot has stopped --'
+runner=loop()
+
+@optionalparentheses
+def go(): runner.play()
+@optionalparentheses
+def stop(): runner.pause()
+@optionalparentheses
+def next(): inc()
+
+# --- shortcuts -------------------------------------------------
+@optionalparentheses
+def q():
+    if 'dyn' in globals(): print dyn.ffposition.__repr__()
+    print robot.state.__repr__()
+@optionalparentheses
+def qdot(): print robot.control.__repr__()
+@optionalparentheses
+def iter():         print 'iter = ',robot.state.time
+@optionalparentheses
+def status():       print runner.isPlay
+
+@optionalparentheses
+def r():
+    mp.refresh()
+@optionalparentheses
+def m():
+    mp.hlp_mocapCoord()
+    mp.refresh()
+@optionalparentheses
+def n(): mp.hlp_showNumber()
+@optionalparentheses
+def t():
+    mp.hlp_toggle()
+    mp.refresh()
+
+
+#-----------------------------------------------------------------------------
+#---- DYN --------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+
+modelDir  = pkgDataRootDir[robotName]
+xmlDir    = pkgDataRootDir[robotName]
+specificitiesPath = xmlDir + '/HRP2SpecificitiesSmall.xml'
+jointRankPath     = xmlDir + '/HRP2LinkJointRankSmall.xml'
+
+dyn = Dynamic("dyn")
+dyn.setFiles(modelDir, modelName[robotName],specificitiesPath,jointRankPath)
+dyn.parse()
+
+dyn.inertiaRotor.value = inertiaRotor[robotName]
+dyn.gearRatio.value    = gearRatio[robotName]
+
+plug(robot.state,dyn.position)
+plug(robot.velocity,dyn.velocity)
+dyn.acceleration.value = robotDim*(0.,)
+
+dyn.ffposition.unplug()
+dyn.ffvelocity.unplug()
+dyn.ffacceleration.unplug()
+
+dyn.setProperty('ComputeBackwardDynamics','true')
+dyn.setProperty('ComputeAccelerationCoM','true')
+
+robot.control.unplug()
+
+#-----------------------------------------------------------------------------
+#--- MOCAP TRACKER -----------------------------------------------------------
+#-----------------------------------------------------------------------------
+
+
+class MocapTracker(MocapParserTimed):
+    class TaskAssociation:
+        def __init__(self,task,mocap):
+            self.task = task
+            self.mocap = mocap
+    def __init__(self,*args):
+        MocapParserTimed.__init__(self,*args)
+        self.jointMap = dict()
+    def addJointMap( self,jointName,metaTask ): 
+        joint=None
+        for i,j in enumerate(self.joints):
+            if j.name==jointName: joint=i
+        if joint==None:
+            print "Error, joint name ",jointName," does not correspond to a mocap node."
+        self.jointMap[jointName] = MocapTracker.TaskAssociation(metaTask,joint)
+    def rmJointMap( self,jointName):
+        if jointName in jointMap.keys():
+            del jointMap[jointName]
+        else: print "Error, joint name ",jointName," is not stored yet."
+    def update(self):
+        MocapParserTimed.update(self)
+        for n,p in self.jointMap.iteritems():
+            p.task.ref = self.jointPosition(p.mocap)
+
+#-----------------------------------------------------------------------------
+mp = MocapTracker('yoga/','yoga/outputJointsYogaTR')
+mp.setLinksMap()
+mp.assignDisplayObjects()
+mp.setRobotViewer( robot.viewer )
+mp.with_dispRobot = False
+mp.with_dispJoints= True
+mp.with_dispLinks = False
+mp.hideLinks()
+mp.delayTime = 0
+
+
+
+#-----------------------------------------------------------------------------
+# --- OPERATIONAL TASKS (For HRP2-14)---------------------------------------------
+#-----------------------------------------------------------------------------
+
+# --- Op task for the waist ------------------------------
+taskWaist = MetaTaskDyn6d('taskWaist',dyn,'waist','waist')
+taskChest = MetaTaskDyn6d('taskChest',dyn,'chest','chest')
+taskHead = MetaTaskDyn6d('taskHead',dyn,'head','gaze')
+taskrh = MetaTaskDyn6d('rh',dyn,'rh','right-wrist')
+tasklh = MetaTaskDyn6d('lh',dyn,'lh','left-wrist')
+
+for task in [ taskWaist, taskChest, taskHead, taskrh, tasklh ]:
+    taskWaist.feature.frame('current')
+    taskWaist.gain.setConstant(100)
+    taskWaist.task.dt.value = dt
+
+#-----------------------------------------------------------------------------
+# --- OTHER TASKS ------------------------------------------------------------
+#-----------------------------------------------------------------------------
+
+# --- TASK COM ------------------------------------------------------
+dyn.setProperty('ComputeCoM','true')
+
+featureCom    = FeatureGeneric('featureCom')
+featureComDes = FeatureGeneric('featureComDes')
+plug(dyn.com,featureCom.errorIN)
+plug(dyn.Jcom,featureCom.jacobianIN)
+featureCom.sdes.value = 'featureComDes'
+
+taskCom = TaskDynPD('taskCom')
+taskCom.add('featureCom')
+plug(dyn.velocity,taskCom.qdot)
+taskCom.dt.value = dt
+
+gCom = GainAdaptive('gCom')
+plug(taskCom.error,gCom.error)
+plug(gCom.gain,taskCom.controlGain)
+
+#-----------------------------------------------------------------------------
+# --- SOT Dyn OpSpaceH: SOT controller  --------------------------------------
+#-----------------------------------------------------------------------------
+
+sot = SolverDynReduced('sot')
+sot.setSize(robotDim-6)
+#sot.damping.value = 2e-2
+sot.breakFactor.value = 10
+
+plug(dyn.inertiaReal,sot.matrixInertia)
+plug(dyn.dynamicDrift,sot.dyndrift)
+plug(dyn.velocity,sot.velocity)
+
+plug(sot.solution, robot.control)
+
+#For the integration of q = int(int(qddot)).
+plug(sot.acceleration,robot.acceleration)
+
+#-----------------------------------------------------------------------------
+# ---- CONTACT: Contact definition -------------------------------------------
+#-----------------------------------------------------------------------------
+
+#supportLF = ((0.03,-0.03,-0.03,0.03),(-0.015,-0.015,0.015,0.015),(-0.105,-0.105,-0.105,-0.105))
+#supportRF = ((0.03,-0.03,-0.03,0.03),(-0.015,-0.015,0.015,0.015),(-0.105,-0.105,-0.105,-0.105))
+supportLF = ((0.11,-0.08,-0.08,0.11),(-0.045,-0.045,0.07,0.07),(-0.105,-0.105,-0.105,-0.105))
+supportRF = ((0.11,-0.08,-0.08,0.11),(-0.07,-0.07,0.045,0.045),(-0.105,-0.105,-0.105,-0.105))
+
+# Left foot contact
+contactLF = MetaTaskDyn6d('contact_lleg',dyn,'lf','left-ankle')
+contactLF.feature.frame('desired')
+
+# Right foot contact
+contactRF = MetaTaskDyn6d('contact_rleg',dyn,'rf','right-ankle')
+contactRF.feature.frame('desired')
+
+#-----------------------------------------------------------------------------
+#--- ZMP ---------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+zmp = ZmpEstimator('zmp')
+def computeZmp():
+    p=zeros((4,0))
+    f=zeros((0,1))
+    if '_RF_p' in [s.name for s in sot.signals()]:
+        Mr=matrix(dyn.rf.value)
+        fr=matrix(sot._RF_fn.value).transpose()
+        pr=matrix(sot._RF_p.value+((1,1,1,1),))
+        p=hstack((p,Mr*pr))
+        f=vstack((f,fr))
+    if '_LF_p' in [s.name for s in sot.signals()]:
+        Ml=matrix(dyn.lf.value)
+        fl=matrix(sot._LF_fn.value).transpose()
+        pl=matrix(sot._LF_p.value+((1,1,1,1),))
+        p=hstack((p,Ml*pl))
+        f=vstack((f,fl))
+    zmp=p*f/sum(f)
+    return zmp
+def zmpup():
+    zmp.zmp.value = tuple(computeZmp()[0:3].transpose().tolist()[0])
+    zmp.zmp.time = sot.solution.time
+@optionalparentheses
+def pl():
+    if '_LF_p' in [s.name for s in sot.signals()]:
+        Ml=matrix(dyn.lf.value)
+        pl=matrix(sot._LF_p.value+((1,1,1,1),))
+        return (Ml*pl)[0:3,:]
+@optionalparentheses
+def pr():
+    if '_RF_p' in [s.name for s in sot.signals()]:
+        Mr=matrix(dyn.rf.value)
+        pr=matrix(sot._RF_p.value+((1,1,1,1),))
+        return (Mr*pr)[0:3,:]
+
+
+
+#-----------------------------------------------------------------------------
+# --- TRACE ------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+
+from dynamic_graph.tracer import *
+tr = Tracer('tr')
+tr.open('/tmp/','step_','.dat')
+
+tr.add('dyn.com','com')
+tr.add('dyn.waist','waist')
+tr.add('dyn.rh','rh')
+tr.add('zmp.zmp','')
+tr.add('dyn.position','')
+tr.add('dyn.velocity','')
+tr.add('robot.acceleration','robot_acceleration')
+tr.add('robot.control','')
+tr.add('gCom.gain','com_gain')
+tr.add(contactLF.task.name+'.error','lf')
+tr.add(contactRF.task.name+'.error','rf')
+
+tr.start()
+robot.after.addSignal('tr.triger')
+robot.after.addSignal(contactLF.task.name+'.error')
+robot.after.addSignal('dyn.rf')
+robot.after.addSignal('dyn.lf')
+robot.after.addSignal('sot.forcesNormal')
+
+#-----------------------------------------------------------------------------
+# --- FUNCTIONS TO PUSH/PULL/UP/DOWN TASKS -----------------------------------
+
+#-----------------------------------------------------------------------------
+# --- RUN --------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+
+mp.setPositionMethod("KM")
+mp.refresh()
+mp.pause()
+mp.timeScale = 2
+
+dyn.rf.recompute(0)
+dyn.lf.recompute(0)
+Mrfr = matrix(dyn.rf.value)
+Mrfm = matrix(mp.jointPosition_M(8,0))
+Mlfr = matrix(dyn.lf.value)
+Mlfm = matrix(mp.jointPosition_M(8,0))
+#mp.Kw = Mrfr*Mrfm.I
+#mp.Kw[0:3,0:3] = eye(3)
+mp.Kw[0:3,0:3] = eye(3)
+mp.Kw[0:3,3] = Mrfr[0:3,3]-Mrfm[0:3,3]
+
+
+def updateMocap():
+    mp.update()
+
+sot.clear()
+
+sot.addContactFromTask(contactLF.task.name,'LF')
+sot.addContactFromTask(contactRF.task.name,'RF')
+sot._RF_p.value = supportRF
+sot._LF_p.value = supportLF
+
+featureComDes.errorIN.value = ( 0.01, 0.,  0.8077 )
+featureCom.selec.value = "11"
+gCom.setConstant( 500.0 )
+sot.push('taskCom')
+
+sot.push(taskrh.task.name)
+sot.push(tasklh.task.name)
+taskrh.feature.selec.value = '111'
+taskrh.gain.setConstant(500)
+tasklh.feature.selec.value = '111'
+tasklh.gain.setConstant(500)
+
+mp.addJointMap("Rhand",taskrh)
+mp.addJointMap("Lhand",tasklh)
+
+
+inc()
+#go()
+
+#attime(2, lambda: mp.forward())
+#attime(2, lambda: taskrh.gain.setConstant(2/dt))
+#attime(2, lambda: tasklh.gain.setConstant(2/dt))
+
+mrh=eye(4)
+mrh[0:3,3] = (0,0,-0.2)
+taskrh.opmodif = matrixToTuple(mrh)
-- 
GitLab