diff --git a/scripts/python/simusmall.py b/scripts/python/simusmall.py new file mode 100644 index 0000000000000000000000000000000000000000..44f0730c723080e02fffeba70f8369308b72108f --- /dev/null +++ b/scripts/python/simusmall.py @@ -0,0 +1,290 @@ +#!/usr/bin/python + +from dynamic_graph import plug +import dynamic_graph.sot.core as sotcore +from dynamic_graph.sot.core.robot_simu import RobotSimu +from dynamic_graph.sot.core.vector_constant import VectorConstant +from dynamic_graph.sot.core.matrix_constant import MatrixConstant +from dynamic_graph.sot.core.unary_op import RPYToMatrix +from dynamic_graph.sot.core.derivator import Derivator_of_Vector +from dynamic_graph.sot.dynamics.dynamic_hrp2 import DynamicHrp2 +from dynamic_graph.sot.dynamics.angle_estimator import AngleEstimator +from dynamic_graph.sot.dynamics.waist_attitude_from_sensor \ + import WaistPoseFromSensorAndContact +from dynamic_graph.sot.core.feature_point6d import FeaturePoint6d +from dynamic_graph.sot.core.feature_point6d_relative import FeaturePoint6dRelative +from dynamic_graph.sot.core.feature_generic import FeatureGeneric +from dynamic_graph.sot.core.feature_joint_limits import FeatureJointLimits +from dynamic_graph.sot.core.binary_op import Compose_R_and_T +from dynamic_graph.sot.core.task import Task +from dynamic_graph.sot.core.constraint import Constraint +from dynamic_graph.sot.core.gain_adaptive import GainAdaptive +from dynamic_graph.sot.core.sot import SOT + +print "Creating the small dynamic" + +dyn = DynamicHrp2('dyn') +dyn2 = DynamicHrp2('dyn2') + +#import dynfilessmall +dyn2.setFiles('/home/florent/devel/sot/unstable/share/hrp2_10-small/', + 'HRP2JRLmainSmall.wrl', + '/home/florent/devel/sot/unstable/share/hrp2_10-small/' + + 'HRP2SpecificitiesSmall.xml', + '/home/florent/devel/sot/unstable/share/hrp2_10-small/' + + 'HRP2LinkJointRankSmall.xml') +dyn.setFiles('/home/florent/devel/sot/unstable/share/hrp2_10-small/', + 'HRP2JRLmainSmall.wrl', + '/home/florent/devel/sot/unstable/share/hrp2_10-small/' + + 'HRP2SpecificitiesSmall.xml', + '/home/florent/devel/sot/unstable/share/hrp2_10-small/' + + 'HRP2LinkJointRankSmall.xml') + + +dyn2.parse() +zero = VectorConstant('zero') +zero.resize(36) + +plug(zero.signal('out'), dyn2.signal('position')) +plug(zero.signal('out'), dyn2.signal('velocity')) +plug(zero.signal('out'), dyn2.signal('acceleration')) + +dyn2ffposzero = VectorConstant('dyn2ffposzero') + +dyn2ffposzero.set((0.,0.,0.,0.,0.,0.)) + +plug(dyn2ffposzero.signal('out'), dyn2.signal('ffposition')) + +dyn2.createOpPoint('0', 'right-wrist') +dyn2.createOpPoint('lh', 'left-wrist') +dyn2.createOpPoint('rleg', 'right-ankle') +dyn2.createOpPoint('lleg', 'left-ankle') +dyn2.createOpPoint('chest', 'chest') + +dyn2.setProperty('ComputeVelocity', 'false') +dyn2.setProperty('ComputeCoM', 'false') +dyn2.setProperty('ComputeAccelerationCoM', 'false') +dyn2.setProperty('ComputeMomentum', 'false') +dyn2.setProperty('ComputeZMP', 'false') +dyn2.setProperty('ComputeBackwardDynamics', 'false') + +dyn.signal('gearRatio').value = (0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,207.69,381.54,0.,0.,219.23,231.25,266.67,250.0,145.45,350.0,0.,0.,0.,0.,0.,0.,0.,0.) +dyn.signal('inertiaRotor').value = (0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,69.6e-7,69.6e-7,0.,0.,69.6e-7,66.0e-7,10.0e-7,66.0e-7,11.0e-7,10.0e-7,0.,0.,0.,0.,0.,0.,0.,0.) + +# ---------------------------------------------------- +# --- FLEX ------------------------------------------- +# ---------------------------------------------------- + +# ------- Flex based kinematics +flex = AngleEstimator('flex') +flex.setFromSensor(False) + +plug(dyn2.signal('lleg'), flex.signal('contactEmbeddedPosition')) +plug(dyn2.signal('chest'), flex.signal('sensorEmbeddedPosition')) + +attitudeSensor = RPYToMatrix('attitudeSensor') + +# plug attitudeSensor.out flex.sensorWorldRotation +plug(flex.signal('waistWorldPoseRPY'), dyn.signal('ffposition')) + +# --- Flexibility velocity +flexV = Derivator_of_Vector('flexV') +plug(flex.signal('angles'), flexV.signal('in')) + +# --- PosFF from leg contact + sensor # DEPRECIATED +posKF = WaistPoseFromSensorAndContact('posKF') +plug(dyn2.signal('lleg'), posKF.signal('contact')) +plug(dyn2.signal('chest'), posKF.signal('position')) +posKF.setFromSensor(True) + +# --- DYN With true posFF +dyn.parse() +plug(zero.signal('out'), dyn.signal('velocity')) +plug(zero.signal('out'), dyn.signal('acceleration')) +plug(flex.signal('waistWorldPoseRPY'), dyn.signal('ffposition')) + +# ---------------------------------------------------- +# --- TASKS ------------------------------------------ +# ---------------------------------------------------- + +# -- TASK Manip +dyn.createOpPoint('0', 'right-wrist') +dyn.createOpPoint('rleg', 'right-ankle') +dyn.createOpPoint('lleg', 'left-ankle') + +p6 = FeaturePoint6d('p6') +p6d = FeaturePoint6d('p6d') + +comp = Compose_R_and_T('comp') +eye3 = MatrixConstant('eye3') +I3 = ((1., 0., 0.), + (0., 1., 0.), + (0., 0., 1.)) + +eye3.set(I3) +plug(eye3.signal('out'), comp.signal('in1')) + +t = VectorConstant('t') +# WAIST +t.set((0., 0.095, 0.563816)) + +# HAND +t.set((0.25, -0.5, .85)) +plug(t.signal('out'), comp.signal('in2')) + +plug(comp.signal('out'), p6d.signal('position')) +plug(dyn.signal('J0'), p6.signal('Jq')) +plug(dyn.signal('0'), p6.signal('position')) +p6.signal('sdes').value = p6d + +task = Task('task') +task.add('p6') +gain = GainAdaptive('gain') +gain.setConstant(.2) +plug(task.signal('error'), gain.signal('error')) +plug(gain.signal('gain'), task.signal('controlGain')) + +R3 = ((0., 0., -1.), + (0., 1., 0.), + (1., 0., 0.)) +eye3.set(R3) + +p6.signal('selec').value = '000111' +p6.frame('current') + +# --- COM +dyn.setProperty('ComputeCoM', 'true') +# dyn.setProperty ComputeVelocity true +# dyn.setProperty ComputeMomentum true +# dyn.setProperty ComputeZMP true + +featureCom = FeatureGeneric('featureCom') +plug(dyn.signal('com'), featureCom.signal('errorIN')) +plug(dyn.signal('Jcom'), featureCom.signal('jacobianIN')) +# set featureCom.selec 111 + +featureComDes = FeatureGeneric('featureComDes') +# set featureComDes.errorIN [2](0,-0) +featureCom.signal('sdes').value = featureComDes + +taskCom = Task('taskCom') +taskCom.add('featureCom') + +taskCom.signal('controlGain').value = .3 +# set taskCom.controlGain 1 + +# --- CHEST +featureChest = FeatureGeneric('featureChest') +featureChest.signal('jacobianIN').value = ((0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.),(0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.)) + +featureChest.signal('errorIN').value =(0.,0.) +taskChest = Task('taskChest') +taskChest.add('featureChest') +taskChest.signal('controlGain').value = 1. + +# --- Task Chest for blocking the chest joints +# new FeatureGeneric featureChest +# set featureChest.jacobianIN [2,36]((0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)) +# set featureChest.errorIN [2](0,0) +# new Task taskChest +# taskChest.add featureChest +# set taskChest.controlGain 1 + +# --- Task RightArm for blocking the right arm +featureRightArm = FeatureGeneric('featureRightArm') +featureRightArm.signal('jacobianIN').value = reduce(lambda jac, i : jac + ((22+i)*(0.,)+(1.,)+(13-i)*(0.,),), range(7), ()) +featureRightArm.signal('errorIN').value = (0.,0.,0.,0.,0.,0.,0.) +taskRightArm = Task('taskRightArm') +taskRightArm.add('featureRightArm') +taskRightArm.signal('controlGain').value = 1. + +# --- Task LeftArm for blocking the left arm +featureLeftArm = FeatureGeneric('featureLeftArm') +featureLeftArm.signal('jacobianIN').value = reduce(lambda jac, i : jac + ((29+i)*(0.,)+(1.,)+(6-i)*(0.,),), range(7), ()) +featureLeftArm.signal('errorIN').value = 7*(0,) +taskLeftArm = Task('taskLeftArm') +taskLeftArm.add('featureLeftArm') +taskLeftArm.signal('controlGain').value = 1 + +# --- Joint Limits +featureJl = FeatureJointLimits('featureJl') +featureJl.actuate() +plug(dyn.signal('position'), featureJl.signal('joint')) +plug(dyn.signal('upperJl'), featureJl.signal('upperJl')) +plug(dyn.signal('lowerJl'), featureJl.signal('lowerJl')) +taskJl = Task('taskJl') +taskJl.add('featureJl') +taskJl.signal('controlGain').value = .1 + +# --- LEGS +featureLegs = FeatureGeneric('featureLegs') +jacobianLegs = MatrixConstant('jacobianLegs') +jac = 12*[36*[0.]] +jac[0][6] = 1. +jac[1][7] = 1. +jac[2][8] = 1. +jac[3][9] = 1. +jac[4][10] = 1. +jac[5][11] = 1. +jac[6][12] = 1. +jac[7][13] = 1. +jac[8][14] = 1. +jac[9][15] = 1. +jac[10][16] = 1. +jac[11][17] = 1. +jac = tuple(map(tuple, jac)) +plug(jacobianLegs.signal('out'), featureLegs.signal('jacobianIN')) + +vectorLegs = VectorConstant('vectorLegs') +vectorLegs.set(7*(0.,)) +plug(vectorLegs.signal('out'), featureLegs.signal('errorIN')) +# set featureLegs.errorIN [12](0,0,0,0,0,0,0,0,0,0,0,0) +taskLegs = Task('taskLegs') +taskLegs.add('featureLegs') +taskLegs.signal('controlGain').value = 1. + +# --- TWOFEET +featureTwofeet = FeaturePoint6dRelative('featureTwofeet') +plug(dyn.signal('Jrleg'), featureTwofeet.signal('Jq')) +plug(dyn.signal('Jlleg'), featureTwofeet.signal('JqRef')) +plug(dyn.signal('rleg'), featureTwofeet.signal('position')) +plug(dyn.signal('lleg'), featureTwofeet.signal('positionRef')) + +taskTwofeet = Task('taskTwofeet') +taskTwofeet.add('featureTwofeet') +taskTwofeet.signal('controlGain').value = 0. + +# --- CONTACT CONSTRAINT +legs = Constraint('legs') +legs.addJacobian('dyn.Jlleg') + +# --- SOT +sot = SOT('sot') +sot.signal('damping').value = 1e-6 +sot.addConstraint('legs') +sot.setNumberDofs(36) + +# plug dyn.inertia sot.weight +# sot.push taskTwofeet +# sot.push taskLegs +# sot.push task +# sot.push taskCom +# sot.push taskChest +# sot.gradient taskJl + +featureComDes.signal('errorIN').value = (0.004,-0.09,.6) + +zeroCom = VectorConstant('zeroCom') +zeroCom.set(36*(0.,)) + + +dyn.createOpPoint('Waist', 'waist') + +OpenHRP = RobotSimu('OpenHRP') +OpenHRP.set((0.,0.,0.,0.,0.,0.,0.,0.,-1.04720,2.09440,-1.04720,0.,0.,0.,-1.04720,2.09440,-1.04720,0.,0.0000,0.,-0.,-0.,0.17453,-0.17453,-0.17453,-0.87266,0.,-0.,0.1,0.17453,-0.17453,-0.17453,-0.87266,0.,-0.,0.1)) + +plug(sot.signal('control'), OpenHRP.signal('control')) +plug(OpenHRP.signal('state'), dyn.signal('position')) +plug(OpenHRP.signal('state'), dyn2.signal('position')) +plug(OpenHRP.signal('attitude'), posKF.signal('attitudeIN')) +plug(OpenHRP.signal('attitude'), flex.signal('sensorWorldRotation'))