def test_body_force_funcs(): bvhFilePath = '../samples/chain_1.bvh' # bvhFilePath = '../samples/chain_6.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 100. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.gravity = (0,0,0) stepsPerFrame = 60 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel.setBodyPositionGlobal(0, (0,1,0)) ################################################################### # apply force == add force # controlModel.applyBodyGenForceGlobal(0, (0,0,100), (0,-100,0), (0,0,0)) # above 1 line == below 2 lines controlModel.applyBodyTorqueGlobal(0, (0,0,100)) controlModel.applyBodyForceGlobal(0, (0,-100,0)) p = [mm.O_Vec3()]*controlModel.getBodyNum() forces = [mm.O_Vec3()] * controlModel.getBodyNum() netForces = [mm.O_Vec3()] * controlModel.getBodyNum() gravityForces = [mm.O_Vec3()] * controlModel.getBodyNum() viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) # viewer.doc.addRenderer('forces', yr.VectorsRenderer(forces, p, (255,0,0))) # viewer.doc.addRenderer('netForces', yr.VectorsRenderer(netForces, p, (0,255,0))) # viewer.doc.addRenderer('gravityForces', yr.VectorsRenderer(gravityForces, p, (0,0,255))) viewer.setMaxFrame(500) def simulateCallback(frame): p[:] = controlModel.getBodyPositionsGlobal() forces[0] = controlModel.getBodyForceLocal(0) netForces[0] = controlModel.getBodyNetForceLocal(0) gravityForces[0] = controlModel.getBodyGravityForceLocal(0) for i in range(stepsPerFrame): vpWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def test_penalty_contact(): wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame wcfg.useDefaultContactModel = False vpWorld = cvw.VpWorld(wcfg) body = cvb.VpBody(vpWorld) body.addBoxGeom((1,.1,1), 1) body.setFrame(mm.p2T((0,.1,0))) vpWorld.initialize() bodyIDsToCheck = range(vpWorld.getBodyNum()) mus = [1.]*len(bodyIDsToCheck) Ks = 1000; Ds = 2*(Ks**.5) viewer = ysv.SimpleViewer() viewer.doc.addRenderer('box', yr.VpBodyRenderer(body, (255,0,0))) viewer.setMaxFrame(100) def simulateCallback(frame): for i in range(stepsPerFrame): bodyIDs, positions, positionLocals, forces = vpWorld.calcPenaltyForce(bodyIDsToCheck, mus, Ks, Ds) vpWorld.applyPenaltyForce(bodyIDs, positionLocals, forces) vpWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer((1/30.)*.4) viewer.show() Fl.run()
def test_OdeControlModel(): # mcfg.defaultContactMode = ode.ContactBounce | ode.ContactSoftERP | ode.ContactSoftCFM # mcfg.defaultJointAxes = [] # mcfg.defaultJointLoStop = mm.deg2Rad(-5) # mcfg.defaultJointHiStop = mm.deg2Rad(5) bvhFilePath = '../samples/block_3_rotate.bvh' motion = yf.readBvhFile(bvhFilePath) motion = motion[30:] AX = numpy.array([1, 0, 0]) AY = numpy.array([0, 1, 0]) AZ = numpy.array([0, 0, 1]) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 mcfg.defaultKp = 100. mcfg.defaultKd = 1. for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) node = mcfg.getNode('body2') node.length = 1 node.offset = (0, 0, .2) # node.jointAxes = [AY] wcfg = ypc.WorldConfig() wcfg.planeHeight = None stepsPerFrame = 30 wcfg.timeStep = (1 / 30.) / stepsPerFrame odeWorld = yow.OdeWorld(wcfg, mcfg) controlModel = OdeControlModel(odeWorld.world, odeWorld.space, motion[0], mcfg) controlModel.fixRootBody() viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer( 'motion', yr.JointMotionRenderer(motion, (0, 0, 255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer( 'model', yr.OdeModelRenderer(controlModel, (255, 255, 255), yr.POLYGON_FILL)) def simulateCallback(frame): for i in range(stepsPerFrame): torques = controlModel.calcPDTorque(motion[frame]) controlModel.applyTorque(torques) odeWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1 / 30.) viewer.show() Fl.run()
def test_hybridDynamics_gravity(): bvhFilePath = '../samples/chain_1.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. # wcfg.gravity = (0,0,0) stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) controlModel2 = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel.initializeHybridDynamics() controlModel2.initializeHybridDynamics() controlModel2.translateByOffset((1,0,0)) p = [] torques = [] viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_FILL)) viewer.doc.addRenderer('model2', cvr.VpModelRenderer(controlModel2, (255,240,255), yr.POLYGON_FILL)) viewer.doc.addRenderer('torques', yr.VectorsRenderer(torques, p, (255,0,0))) viewer.setMaxFrame(100) def simulateCallback(frame): p[:] = controlModel.getInternalJointPositionsGlobal() + controlModel2.getInternalJointPositionsGlobal() for i in range(stepsPerFrame): controlModel.solveHybridDynamics() print 'a', controlModel2.getBodyForceLocal(0) controlModel2.applyBodyForceGlobal(0, (0,10,0)) print 'b', controlModel2.getBodyForceLocal(0) controlModel2.solveHybridDynamics() torques[:] = controlModel.getInternalJointTorquesLocal() + controlModel2.getInternalJointTorquesLocal() vpWorld.step() print 'c', controlModel2.getBodyForceLocal(0) viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def test_getInternalJointOrientationsGlobal(): # bvhFilePath = '../samples/block_tree_rotate.bvh' bvhFilePath = '../samples/chain_3_rotate_expt_root.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. wcfg.gravity = (0,0,0) stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel.translateByOffset((0,0,1)) controlModel.fixBody(0) jointPositions = [] localFrames = [] globalFrames = [] viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('localFrames', yr.FramesRenderer(localFrames, (255,0,0))) viewer.doc.addRenderer('globalFrames', yr.FramesRenderer(globalFrames, (0,255,0))) def simulateCallback(frame): controlModel.setJointAngVelocityLocal(1, (0,.5,0)) controlModel.setJointAngVelocityLocal(2, (0,.5,0)) for i in range(stepsPerFrame): vpWorld.step() jointPositions[:] = motion[frame].getInternalJointPositionsGlobal() + controlModel.getInternalJointPositionsGlobal() localFrames[:] = motion.getInternalJointOrientationsLocal(frame) + controlModel.getInternalJointOrientationsLocal() localFrames[:] = map(mm.Rp2T, localFrames, jointPositions) globalFrames[:] = motion[frame].getInternalJointOrientationsGlobal() + controlModel.getInternalJointOrientationsGlobal() globalFrames[:] = map(mm.Rp2T, globalFrames, jointPositions) viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def test_delNode(): bvhFilePath = '../samples/block_3_rotate.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultBoneRatio = .8 node = mcfg.addNode('body1') # node = mcfg.addNode('body2') node = mcfg.addNode('body3') wcfg = ypc.WorldConfig() wcfg.planeHeight = None stepsPerFrame = 30 wcfg.timeStep = (1 / 30.) / stepsPerFrame odeWorld = yow.OdeWorld(wcfg, mcfg) controlModel = OdeControlModel(odeWorld.world, odeWorld.space, motion[0], mcfg) controlModel.fixRootBody() motionModel = OdeMotionModel(odeWorld.world, odeWorld.space, motion[0], mcfg) viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer( 'motion', yr.JointMotionRenderer(motion, (0, 0, 255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer( 'controlModel', yr.OdeModelRenderer(controlModel, (255, 255, 255), yr.POLYGON_FILL)) viewer.doc.addRenderer( 'motionModel', yr.OdeModelRenderer(motionModel, (255, 255, 255), yr.POLYGON_LINE)) def preFrameCallback(frame): motionModel.update(motion[frame]) viewer.setPreFrameCallback(preFrameCallback) def simulateCallback(frame): for i in range(stepsPerFrame): torques = controlModel.calcPDTorque(motion[frame]) controlModel.applyTorque(torques) odeWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1 / 30.) viewer.show() Fl.run()
def create_capsule(motionFile='foot3.bvh'): # motion motion = yf.readBvhFile(motionFile, .05) # world, model mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = 1. for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) node = mcfg.getNode('root') node.geom = 'MyFoot3' node.length = 1. node.mass = .5 node = mcfg.getNode('foot_0_0') node.geom = 'MyFoot4' node.mass = .5 def mcfgFix(_mcfg): for v in _mcfg.nodes.itervalues(): if len(v.geoms) == 0: v.geoms.append(v.geom) v.geomMass.append(v.mass) v.geomTs.append(None) mcfgFix(mcfg) wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False stepsPerFrame = 40 simulSpeedInv = 1. wcfg.timeStep = (1/30.*simulSpeedInv)/stepsPerFrame # parameter config = dict([]) config['Kt'] = 20; config['Dt'] = 2*(config['Kt']**.5) # tracking gain config['Kl'] = 1; config['Dl'] = 2*(config['Kl']**.5) # linear balance gain config['Kh'] = 1; config['Dh'] = 2*(config['Kh']**.5) # angular balance gain config['Ks'] = 5000; config['Ds'] = 2*(config['Ks']**.5) # penalty force spring gain config['Bt'] = 1. config['Bl'] = 1. config['Bh'] = 1. config['stepsPerFrame'] = stepsPerFrame config['simulSpeedInv'] = simulSpeedInv # etc config['weightMap'] = {'root': 2., 'foot_0_0': 1., 'foot_1_0': 1., 'foot_2_0': 1., 'foot_0_1': .2, 'foot_1_1': .2, 'foot_2_1': .2} config['weightMapTuple'] = (1., .5, .2, .5, .2, .5, .2) # config['supLink'] = 'link0' return motion, mcfg, wcfg, stepsPerFrame, config
def create_chiken_foot(): # motion motion = yf.readBvhFile('chikenFoot.bvh', 1) # world, model mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = 1. for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) node = mcfg.getNode('root') node.geom = 'MyFoot3' node.length = .1 # node.width = .05 node.mass = 5. node = mcfg.getNode('foot00') node.geom = 'MyFoot3' node.mass = .5 node = mcfg.getNode('foot10') node.geom = 'MyFoot3' node.mass = .5 node = mcfg.getNode('foot01') node.geom = 'MyFoot4' node.mass = .5 node = mcfg.getNode('foot11') node.geom = 'MyFoot4' node.mass = .5 wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False stepsPerFrame = 120 wcfg.timeStep = (1/30.)/stepsPerFrame # parameter config = dict([]) config['Kt'] = 20; config['Dt'] = 2*(config['Kt']**.5) # tracking gain config['Kl'] = 1; config['Dl'] = 2*(config['Kl']**.5) # linear balance gain config['Kh'] = 1; config['Dh'] = 2*(config['Kh']**.5) # angular balance gain config['Ks'] = 5000; config['Ds'] = 2*(config['Ks']**.5) # penalty force spring gain config['Bt'] = 1. config['Bl'] = 1. config['Bh'] = 1. # etc config['weightMap'] = {'root': 2., 'foot00': 1., 'foot10': 1., 'foot01': .2, 'foot11': .2} config['weightMapTuple'] = (2., 1., .2, 1., .2) # config['supLink'] = 'link0' return motion, mcfg, wcfg, stepsPerFrame, config
def test_joint_force_funcs(): bvhFilePath = '../samples/block_tree_rotate.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. wcfg.gravity = (0,0,0) stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel.fixBody(0) joint_p = [] joint_t = [] viewer = ysv.SimpleViewer() viewer.record(False) # viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('joint_p', yr.PointsRenderer(joint_p, (0,255,0))) viewer.doc.addRenderer('joint_t', yr.VectorsRenderer(joint_t, joint_p, (0,255,0))) def simulateCallback(frame): controlModel.setJointTorqueLocal(1, (0,0,1)) joint_p[:] = controlModel.getInternalJointPositionsGlobal() joint_t[:] = controlModel.getInternalJointTorquesLocal() for i in range(stepsPerFrame): vpWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def test_OdeMotionModel(): bvhFilePath = '../samples/block_3_rotate.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) node = mcfg.getNode('body1') node.mass = 1. node = mcfg.getNode('body2') node.mass = 1. node.boneRatio = .5 node.offset = (0, 0, .1) node = mcfg.getNode('body3') node.mass = 1. node.length = .1 wcfg = ypc.WorldConfig() wcfg.planeHeight = None odeWorld = yow.OdeWorld(wcfg, mcfg) motionModel = OdeMotionModel(odeWorld.world, odeWorld.space, motion[0], mcfg) viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer( 'motion', yr.JointMotionRenderer(motion, (0, 0, 255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer( 'model', yr.OdeModelRenderer(motionModel, (255, 255, 255), yr.POLYGON_LINE)) def preFrameCallback(frame): motionModel.update(motion[frame]) viewer.setPreFrameCallback(preFrameCallback) viewer.startTimer(1 / 30.) viewer.show() Fl.run()
def test_inertia_matrix(): bvhFilePath = '../samples/chain_1.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 100. mcfg.defaultBoneRatio = 1. for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False wcfg.gravity = (0,0,0) stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) controlModel2 = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel2.translateByOffset((0,0,1)) controlModel2.rotate(mm.exp(mm.v3(0,1,0), math.pi/2)) print 'model local' print controlModel.getBodyInertiasLocal() print print 'model global' print controlModel.getBodyInertiasGlobal() print print 'model2 global' print controlModel2.getBodyInertiasGlobal() viewer = ysv.SimpleViewer() # viewer.record(False) # viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) # viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('model2', cvr.VpModelRenderer(controlModel2, (255,240,255), yr.POLYGON_LINE)) viewer.setMaxFrame(100) viewer.show() Fl.run()
def test_stack(): wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) boxNum = 10 bodies = [None]*boxNum for i in range(boxNum): bodies[i] = cvb.VpBody(vpWorld) bodies[i].addBoxGeom((1,1,1), 1) bodies[i].setPosition((10,i,11)) bodies[i].setOrientation(mm.rotY(10*mm.RAD*random.random())) # bodies[i].setFrame(mm.Rp2T( mm.rotY(10*mm.RAD*random.random()), (10,i,11))) bodies2 = [None]*(boxNum*boxNum) count = 0 for i in range(boxNum): for j in range(boxNum): bodies2[count] = cvb.VpBody(vpWorld) bodies2[count].addBoxGeom((1,1,1), 1) bodies2[count].setPosition((.1*random.random(),i,j)) # bodies2[count].setOrientation(mm.rotY(10*mm.RAD*random.random())) count += 1 vpWorld.initialize() viewer = ysv.SimpleViewer() viewer.doc.addRenderer('box', yr.VpBodiesRenderer(bodies, (255,0,0))) viewer.doc.addRenderer('box2', yr.VpBodiesRenderer(bodies2, (0,0,255))) viewer.setMaxFrame(100) def simulateCallback(frame): for i in range(stepsPerFrame): vpWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer((1/30.)*.4) viewer.show() Fl.run()
def create_vchain_5(): # motion motion = yf.readBvhFile('vchain_5_rotate_root0.bvh', 1) # world, model mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) node = mcfg.getNode('link0') node.width = .3 node.mass = 6. wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False stepsPerFrame = 60 wcfg.timeStep = (1 / 30.) / stepsPerFrame # parameter config = {} config['Kt'] = 20 config['Dt'] = 2 * (config['Kt']**.5) # tracking gain config['Kl'] = 1 config['Dl'] = 2 * (config['Kl']**.5) # linear balance gain config['Kh'] = 1 config['Dh'] = 2 * (config['Kh']**.5) # angular balance gain config['Ks'] = 5000 config['Ds'] = 2 * (config['Ks']**.5) # penalty force spring gain config['Bt'] = 1. config['Bl'] = 1. config['Bh'] = 1. # etc config['weightMap'] = {} config['supLink'] = 'link0' return motion, mcfg, wcfg, stepsPerFrame, config
def test_VpControlModel(): bvhFilePath = '../samples/block_3_rotate.bvh' # bvhFilePath = '../samples/block_tree_rotate.bvh' motion = yf.readBvhFile(bvhFilePath) motion = motion[30:] mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) node = mcfg.getNode('body2') node.length = 1 node.offset = (0,0,.2) # mcfg.delNode('body2') wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() viewer = ysv.SimpleViewer() # viewer.record(False) viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_FILL)) def simulateCallback(frame): for i in range(stepsPerFrame): vpWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def test_default_contact(): wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) body = cvb.VpBody(vpWorld) body.addBoxGeom((1,1,1), 1) vpWorld.initialize() viewer = ysv.SimpleViewer() viewer.doc.addRenderer('box', yr.VpBodyRenderer(body, (255,0,0))) viewer.setMaxFrame(100) def simulateCallback(frame): for i in range(stepsPerFrame): vpWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer((1/30.)*.4) viewer.show() Fl.run()
def create_biped(): # motion #motionName = 'wd2_n_kick.bvh' if MOTION == STAND: motionName = 'wd2_stand.bvh' elif MOTION == STAND2: motionName = 'ww13_41_V001.bvh' elif MOTION == FORWARD_JUMP: motionName = 'woddy2_jump0.bvh' elif MOTION == TAEKWONDO: motionName = './MotionFile/wd2_098_V001.bvh' elif MOTION == TAEKWONDO2: motionName = './MotionFile/wd2_098_V002.bvh' #motionName = 'ww13_41_V001.bvh' motion = yf.readBvhFile(motionName, .01) yme.removeJoint(motion, HEAD, False) yme.removeJoint(motion, RIGHT_SHOULDER, False) yme.removeJoint(motion, LEFT_SHOULDER, False) if FOOT_PART_NUM == 1 or FOOT_PART_NUM == 5 or FOOT_PART_NUM == 7: yme.removeJoint(motion, RIGHT_TOES, False) yme.removeJoint(motion, RIGHT_TOES_END, False) yme.removeJoint(motion, LEFT_TOES_END, False) yme.removeJoint(motion, RIGHT_HAND_END, False) yme.removeJoint(motion, LEFT_HAND_END, False) yme.offsetJointLocal(motion, RIGHT_ARM, (.03, -.05, 0), False) yme.offsetJointLocal(motion, LEFT_ARM, (-.03, -.05, 0), False) yme.rotateJointLocal(motion, HIP, mm.exp(mm.v3(1, 0, 0), .01), False) #yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(2.5,-0.0,.3), -.5), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(2.5,0.0,-.3), -.5), False) yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(2.5, -0.0, .3), -.5), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(2.5,0.0,-.3), -.5), False) if MOTION == FORWARD_JUMP: yme.rotateJointLocal(motion, LEFT_UP_LEG, mm.exp(mm.v3(0.0, .0, 1.), .08), False) yme.rotateJointLocal(motion, LEFT_LEG, mm.exp(mm.v3(0.0, 1.0, 0.), -.2), False) if FOOT_PART_NUM > 1 and FOOT_PART_NUM < 5: yme.addJoint(motion, RIGHT_FOOT, RIGHT_TARSUS) yme.addJoint(motion, RIGHT_TARSUS, 'RIGHT_Dummy1') yme.addJoint(motion, LEFT_FOOT, LEFT_TARSUS) yme.addJoint(motion, LEFT_TARSUS, 'LEFT_Dummy1') yme.rotateJointLocal(motion, LEFT_TOES, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, RIGHT_TOES, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, LEFT_TARSUS, mm.exp(mm.v3(1., 0.0, 0.0), .52), False) yme.rotateJointLocal(motion, RIGHT_TARSUS, mm.exp(mm.v3(1., 0.0, 0.0), .52), False) if FOOT_PART_NUM == 4: yme.addJoint(motion, LEFT_FOOT, LEFT_TOES_SIDE_R) yme.addJoint(motion, LEFT_TOES_SIDE_R, 'LEFT_Dummy2') yme.addJoint(motion, RIGHT_FOOT, RIGHT_TOES_SIDE_R) yme.addJoint(motion, RIGHT_TOES_SIDE_R, 'RIGHT_Dummy2') yme.rotateJointLocal(motion, LEFT_TOES_SIDE_R, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, RIGHT_TOES_SIDE_R, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) elif FOOT_PART_NUM == 5: sibIndex = motion[0].skeleton.getElementIndex(RIGHT_FOOT) skeleton = motion[0].skeleton sibJoint = skeleton.getElement(sibIndex) newOffset = sibJoint.offset.copy() yme.addJoint(motion, RIGHT_FOOT, RIGHT_CALCANEUS, (0.0, 0., -.1)) yme.addJoint(motion, RIGHT_CALCANEUS, 'RIGHT_Dummy3') yme.addJoint(motion, RIGHT_FOOT, RIGHT_METATARSAL_3, (-0.1, 0., 0.0)) yme.addJoint(motion, RIGHT_FOOT, RIGHT_PHALANGE_1, (0.1, 0., .2)) yme.addJoint(motion, RIGHT_PHALANGE_1, 'RIGHT_Dummy4', (0., 0., .1)) yme.addJoint(motion, RIGHT_METATARSAL_3, RIGHT_PHALANGE_3) #yme.addJoint(motion, RIGHT_PHALANGE_3, 'RIGHT_Dummy6') sibIndex = motion[0].skeleton.getElementIndex(LEFT_FOOT) skeleton = motion[0].skeleton sibJoint = skeleton.getElement(sibIndex) newOffset = sibJoint.offset.copy() yme.addJoint(motion, LEFT_FOOT, LEFT_CALCANEUS) yme.addJoint(motion, LEFT_CALCANEUS, 'LEFT_Dummy3') yme.addJoint(motion, LEFT_FOOT, LEFT_METATARSAL_3) yme.addJoint(motion, LEFT_FOOT, LEFT_PHALANGE_1) yme.addJoint(motion, LEFT_PHALANGE_1, 'LEFT_Dummy4') yme.addJoint(motion, LEFT_METATARSAL_3, LEFT_PHALANGE_3) yme.addJoint(motion, LEFT_PHALANGE_3, 'LEFT_Dummy6') ''' yme.addJoint(motion, RIGHT_LEG, RIGHT_CALCANEUS, (0.0025, -0.4209, -0.0146)) yme.addJoint(motion, RIGHT_CALCANEUS, 'RIGHT_Dummy3') yme.addJoint(motion, RIGHT_LEG, RIGHT_METATARSAL_3, (0.0025, -0.4209, -0.0146)) yme.addJoint(motion, RIGHT_FOOT, RIGHT_PHALANGE_1) yme.addJoint(motion, RIGHT_PHALANGE_1, 'RIGHT_Dummy4') yme.addJoint(motion, RIGHT_METATARSAL_3, RIGHT_PHALANGE_3) yme.addJoint(motion, RIGHT_PHALANGE_3, 'RIGHT_Dummy6') sibIndex = motion[0].skeleton.getElementIndex(LEFT_FOOT) skeleton = motion[0].skeleton sibJoint = skeleton.getElement(sibIndex) newOffset = sibJoint.offset.copy() yme.addJoint(motion, LEFT_LEG, LEFT_CALCANEUS, (-0.0025, -0.4209, -0.0146)) yme.addJoint(motion, LEFT_CALCANEUS, 'LEFT_Dummy3') yme.addJoint(motion, LEFT_LEG, LEFT_METATARSAL_3, (-0.0025, -0.4209, -0.0146)) yme.addJoint(motion, LEFT_FOOT, LEFT_PHALANGE_1) yme.addJoint(motion, LEFT_PHALANGE_1, 'LEFT_Dummy4') yme.addJoint(motion, LEFT_METATARSAL_3, LEFT_PHALANGE_3) yme.addJoint(motion, LEFT_PHALANGE_3, 'LEFT_Dummy6') ''' ''' yme.rotateJointLocal(motion, RIGHT_METATARSAL_3, mm.exp(mm.v3(1.,0.0,0.0), .45), False) yme.rotateJointLocal(motion, LEFT_METATARSAL_3, mm.exp(mm.v3(1.,0.0,0.0), .45), False) yme.rotateJointLocal(motion, RIGHT_PHALANGE_1, mm.exp(mm.v3(1.,0.0,0.0), .0), False) yme.rotateJointLocal(motion, LEFT_PHALANGE_1, mm.exp(mm.v3(1.,0.0,0.0), .45), False) yme.rotateJointLocal(motion, LEFT_CALCANEUS, mm.exp(mm.v3(1.,0.0,0.0), .45), False) yme.rotateJointLocal(motion, RIGHT_CALCANEUS, mm.exp(mm.v3(1.,0.0,0.0), .45), False) ''' elif FOOT_PART_NUM == 7: sibIndex = motion[0].skeleton.getElementIndex(RIGHT_FOOT) skeleton = motion[0].skeleton sibJoint = skeleton.getElement(sibIndex) newOffset = sibJoint.offset.copy() print(newOffset) yme.addJoint(motion, RIGHT_LEG, RIGHT_CALCANEUS, (0.0025, -0.4209, -0.0146)) yme.addJoint(motion, RIGHT_CALCANEUS, 'RIGHT_Dummy3') yme.addJoint(motion, RIGHT_LEG, RIGHT_METATARSAL_2, (0.0025, -0.4209, -0.0146)) yme.addJoint(motion, RIGHT_LEG, RIGHT_METATARSAL_3, (0.0025, -0.4209, -0.0146)) yme.addJoint(motion, RIGHT_FOOT, RIGHT_PHALANGE_1) yme.addJoint(motion, RIGHT_PHALANGE_1, 'RIGHT_Dummy4') yme.addJoint(motion, RIGHT_METATARSAL_2, RIGHT_PHALANGE_2) yme.addJoint(motion, RIGHT_PHALANGE_2, 'RIGHT_Dummy5') yme.addJoint(motion, RIGHT_METATARSAL_3, RIGHT_PHALANGE_3) yme.addJoint(motion, RIGHT_PHALANGE_3, 'RIGHT_Dummy6') sibIndex = motion[0].skeleton.getElementIndex(LEFT_FOOT) skeleton = motion[0].skeleton sibJoint = skeleton.getElement(sibIndex) newOffset = sibJoint.offset.copy() yme.addJoint(motion, LEFT_LEG, LEFT_CALCANEUS, (-0.0025, -0.4209, -0.0146)) yme.addJoint(motion, LEFT_CALCANEUS, 'LEFT_Dummy3') yme.addJoint(motion, LEFT_LEG, LEFT_METATARSAL_2, (-0.0025, -0.4209, -0.0146)) yme.addJoint(motion, LEFT_LEG, LEFT_METATARSAL_3, (-0.0025, -0.4209, -0.0146)) yme.addJoint(motion, LEFT_FOOT, LEFT_PHALANGE_1) yme.addJoint(motion, LEFT_PHALANGE_1, 'LEFT_Dummy4') yme.addJoint(motion, LEFT_METATARSAL_2, LEFT_PHALANGE_2) yme.addJoint(motion, LEFT_PHALANGE_2, 'LEFT_Dummy5') yme.addJoint(motion, LEFT_METATARSAL_3, LEFT_PHALANGE_3) yme.addJoint(motion, LEFT_PHALANGE_3, 'LEFT_Dummy6') #yme.offsetJointLocal(motion, RIGHT_CALCANEUS, (0.0,-1.55,0), False) #yme.offsetJointLocal(motion, RIGHT_METATARSAL_2, (.0,-1.55,0), False) #yme.offsetJointLocal(motion, RIGHT_METATARSAL_3, (.0,-1.55,0), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_2, mm.exp(mm.v3(-1., 0.0, 0.0), .3), False) yme.rotateJointLocal(motion, LEFT_METATARSAL_2, mm.exp(mm.v3(-1., 0.0, 0.0), .3), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_3, mm.exp(mm.v3(-1., 0.0, 0.0), .3), False) yme.rotateJointLocal(motion, LEFT_METATARSAL_3, mm.exp(mm.v3(-1., 0.0, 0.0), .3), False) yme.rotateJointLocal(motion, RIGHT_PHALANGE_1, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, LEFT_PHALANGE_1, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, LEFT_CALCANEUS, mm.exp(mm.v3(-1., 0.0, 0.0), .20), False) yme.rotateJointLocal(motion, RIGHT_CALCANEUS, mm.exp(mm.v3(-1., 0.0, 0.0), .20), False) yme.updateGlobalT(motion) ################ if MOTION == FORWARD_JUMP: motion = motion[515:555] elif MOTION == TAEKWONDO: ## Taekwondo base-step motion = motion[0:31] #motion = motion[564:600] elif MOTION == TAEKWONDO2: ## Taekwondo base-step motion = motion[0:31 + 40] ## Taekwondo turning-kick #motion = motion[108:-1] #motion = motion[108:109] motion[0:0] = [motion[0]] * 100 motion.extend([motion[-1]] * 5000) # world, model mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .9 for name in massMap: node = mcfg.addNode(name) node.mass = massMap[name] node = mcfg.getNode(HIP) node.length = .2 node.width = .25 node = mcfg.getNode(SPINE1) node.length = .2 node.offset = (0, 0, 0.1) node = mcfg.getNode(SPINE) node.width = .22 #node.length = .2 #### if FOOT_PART_NUM == 1: length1 = .25 width1 = .2 mass1 = 4. elif FOOT_PART_NUM == 3: length1 = .1 width1 = .2 mass1 = 1.5 length2 = .1 width2 = .2 mass2 = 1.5 elif FOOT_PART_NUM == 4: length1 = .1 width1 = .2 mass1 = 1.5 length2 = .1 width2 = .095 mass2 = .75 elif FOOT_PART_NUM == 5: mass0 = .4 width0 = 0.028 #Metatarsal1 length1 = .18 width1 = width0 * 3 mass1 = mass0 * 2.8 #Metatarsal3 length3 = .17 width3 = width0 * 3 mass3 = mass0 * 2.7 #Calcaneus length4 = .08 width4 = 0.15 mass4 = mass0 * 2.3 #Phalange1 length5 = .06 width5 = width1 mass5 = mass0 * 0.9 #Phalange3 length7 = .05 width7 = width3 mass7 = mass0 * 0.7 elif FOOT_PART_NUM == 7: mass0 = .4 width0 = 0.028 #Metatarsal1 length1 = .2 width1 = width0 * 2 mass1 = mass0 * 2 #Metatarsal2 length2 = .2 width2 = width0 mass2 = mass0 #Metatarsal3 length3 = .19 width3 = width0 * 3 mass3 = mass0 * 2.8 #Calcaneus length4 = .08 width4 = 0.15 mass4 = mass0 * 2 #Phalange1 length5 = .06 width5 = width1 mass5 = mass0 / 2. #Phalange2 length6 = .06 width6 = width2 mass6 = mass0 / 4. #Phalange3 length7 = .05 width7 = width3 mass7 = mass6 * 2.8 if FOOT_PART_NUM == 7: node = mcfg.getNode(RIGHT_FOOT) node.offset = (0.055, -0.03, 0.04) node.length = length1 node.width = width1 node.mass = mass1 node = mcfg.getNode(RIGHT_METATARSAL_2) node.offset = (0.01, -0.03, 0.065) node.length = length2 node.width = width2 node.mass = mass2 node = mcfg.getNode(RIGHT_METATARSAL_3) node.offset = (-.05, -0.03, 0.055) node.length = length3 node.width = width3 node.mass = mass3 node = mcfg.getNode(RIGHT_CALCANEUS) node.offset = (.0, -0.03, -0.07) node.length = length4 node.width = width4 node.mass = mass4 node = mcfg.getNode(RIGHT_PHALANGE_1) node.offset = (0.055, -0.03, 0.19) node.length = length5 node.width = width5 node.mass = mass5 node = mcfg.getNode(RIGHT_PHALANGE_2) node.offset = (0.01, -0.03, 0.19) node.length = length6 node.width = width6 node.mass = mass6 node = mcfg.getNode(RIGHT_PHALANGE_3) node.offset = (-.05, -0.03, 0.18) node.length = length7 node.width = width7 node.mass = mass7 node = mcfg.getNode(LEFT_FOOT) node.offset = (-0.055, -0.03, 0.04) node.length = length1 node.width = width1 node.mass = mass1 node = mcfg.getNode(LEFT_METATARSAL_2) node.offset = (-0.01, -0.03, 0.065) node.length = length2 node.width = width2 node.mass = mass2 node = mcfg.getNode(LEFT_METATARSAL_3) node.offset = (.05, -0.03, 0.055) node.length = length3 node.width = width3 node.mass = mass3 node = mcfg.getNode(LEFT_CALCANEUS) node.offset = (.0, -0.03, -0.07) node.length = length4 node.width = width4 node.mass = mass4 node = mcfg.getNode(LEFT_PHALANGE_1) node.offset = (-0.055, -0.03, 0.19) node.length = length5 node.width = width5 node.mass = mass5 node = mcfg.getNode(LEFT_PHALANGE_2) node.offset = (-0.01, -0.03, 0.19) node.length = length6 node.width = width6 node.mass = mass6 node = mcfg.getNode(LEFT_PHALANGE_3) node.offset = (.05, -0.03, 0.18) node.length = length7 node.width = width7 node.mass = mass7 elif FOOT_PART_NUM == 5: ''' node = mcfg.getNode(RIGHT_FOOT) node.offset = (0.05,-0.03,0.06) node.length = length1 node.width = width1 node.mass = mass1 ''' node = mcfg.getNode(RIGHT_METATARSAL_3) node.offset = (-.04, -0.03, 0.075) node.length = length3 node.width = width3 node.mass = mass3 node = mcfg.getNode(RIGHT_CALCANEUS) node.offset = (.0, -0.03, -0.05) node.length = length4 node.width = width4 node.mass = mass4 #node = mcfg.getNode(RIGHT_PHALANGE_1) #node.offset = (0.05,-0.03,0.19) #node.length = length5 #node.width = width5 #node.mass = mass5 node = mcfg.getNode(RIGHT_PHALANGE_3) node.offset = (-.04, -0.03, 0.18) node.length = length7 node.width = width7 node.mass = mass7 node = mcfg.getNode(LEFT_FOOT) node.offset = (-0.05, -0.03, 0.06) node.length = length1 node.width = width1 node.mass = mass1 node = mcfg.getNode(LEFT_METATARSAL_3) node.offset = (.04, -0.03, 0.075) node.length = length3 node.width = width3 node.mass = mass3 node = mcfg.getNode(LEFT_CALCANEUS) node.offset = (.0, -0.03, -0.05) node.length = length4 node.width = width4 node.mass = mass4 node = mcfg.getNode(LEFT_PHALANGE_1) node.offset = (-0.05, -0.03, 0.19) node.length = length5 node.width = width5 node.mass = mass5 node = mcfg.getNode(LEFT_PHALANGE_3) node.offset = (.04, -0.03, 0.18) node.length = length7 node.width = width7 node.mass = mass7 elif FOOT_PART_NUM == 4: node = mcfg.getNode(LEFT_TOES) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (-0.05, 0.0, -0.03) node = mcfg.getNode(LEFT_TOES_SIDE_R) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (0.08, 0.0, 0.1) node = mcfg.getNode(RIGHT_TOES) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (0.05, 0.0, -0.03) node = mcfg.getNode(RIGHT_TOES_SIDE_R) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (-0.05, 0.0, 0.12) elif FOOT_PART_NUM == 3: node = mcfg.getNode(LEFT_TOES) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (0, 0.0, -0.02) node = mcfg.getNode(RIGHT_TOES) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (0, 0.0, -0.02) ''' elif FOOT_PART_NUM == 5: node = mcfg.getNode(LEFT_FOOT_SIDE_L) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (0.07,0.0,0.015) node = mcfg.getNode(LEFT_FOOT_SIDE_R) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (-0.07,0.0,0.015) node = mcfg.getNode(RIGHT_FOOT_SIDE_L) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (0.07,0.0,0.015) node = mcfg.getNode(RIGHT_FOOT_SIDE_R) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (-0.07,0.0,0.015) ''' if FOOT_PART_NUM > 1 and FOOT_PART_NUM < 5: node = mcfg.getNode(LEFT_TARSUS) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (0, 0.0, -0.08) node = mcfg.getNode(RIGHT_TARSUS) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (0, 0.0, -0.08) if FOOT_PART_NUM < 5: node = mcfg.getNode(RIGHT_FOOT) node.length = length1 node.width = width1 node.mass = mass1 node = mcfg.getNode(LEFT_FOOT) node.length = length1 node.width = width1 node.mass = mass1 wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False stepsPerFrame = 30 wcfg.timeStep = (1 / 30.) / (stepsPerFrame) #stepsPerFrame = 10 #wcfg.timeStep = (1/120.)/(stepsPerFrame) #wcfg.timeStep = (1/1800.) # parameter config = {} config['Kt'] = 200 config['Dt'] = 2 * (config['Kt']**.5) # tracking gain config['Kl'] = .10 config['Dl'] = 2 * (config['Kl']**.5) # linear balance gain config['Kh'] = 0.1 config['Dh'] = 2 * (config['Kh']**.5) # angular balance gain config['Ks'] = 20000 config['Ds'] = 2 * (config['Ks']**.5) # penalty force spring gain config['Bt'] = 1. config['Bl'] = 1. #0.5 config['Bh'] = 1. if FOOT_PART_NUM == 1: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .1, RIGHT_LEG: .3, LEFT_UP_LEG: .1, LEFT_LEG: .3 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 1., LEFT_FOOT: 1., HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1. } elif FOOT_PART_NUM == 3: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .1, RIGHT_LEG: .3, LEFT_UP_LEG: .1, LEFT_LEG: .3, LEFT_TOES: .3, RIGHT_TOES: .3 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 2.5, LEFT_FOOT: 2.5, HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1., LEFT_TOES: .3, RIGHT_TOES: .3 } elif FOOT_PART_NUM == 4: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .1, RIGHT_LEG: .3, LEFT_UP_LEG: .1, LEFT_LEG: .3, LEFT_TOES: .3, RIGHT_TOES: .3, LEFT_TOES_SIDE_R: .3, RIGHT_TOES_SIDE_R: .3 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 2.5, LEFT_FOOT: 2.5, HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1., LEFT_TOES: .3, RIGHT_TOES: .3, LEFT_TOES_SIDE_R: .3, RIGHT_TOES_SIDE_R: .3 } elif FOOT_PART_NUM == 5: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .1, RIGHT_LEG: .3, LEFT_UP_LEG: .1, LEFT_LEG: .3, LEFT_METATARSAL_3: .2, RIGHT_METATARSAL_3: .2, LEFT_PHALANGE_1: .2, LEFT_PHALANGE_3: .1, RIGHT_PHALANGE_1: .2, RIGHT_PHALANGE_3: .2 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 2.5, LEFT_FOOT: 2.5, HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1., LEFT_METATARSAL_3: .3, RIGHT_METATARSAL_3: .3, LEFT_PHALANGE_1: .3, LEFT_PHALANGE_3: .3, RIGHT_PHALANGE_1: .3, RIGHT_PHALANGE_3: .3 } elif FOOT_PART_NUM == 7: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .1, RIGHT_LEG: .3, LEFT_UP_LEG: .1, LEFT_LEG: .3, LEFT_METATARSAL_2: .2, LEFT_METATARSAL_3: .2, RIGHT_METATARSAL_2: .2, RIGHT_METATARSAL_3: .2, LEFT_PHALANGE_1: .2, LEFT_PHALANGE_2: .2, LEFT_PHALANGE_3: .3, RIGHT_PHALANGE_1: .2, RIGHT_PHALANGE_2: .2, RIGHT_PHALANGE_3: .2 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 2., LEFT_FOOT: 2., HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1., LEFT_METATARSAL_2: .3, LEFT_METATARSAL_3: .3, RIGHT_METATARSAL_2: .3, RIGHT_METATARSAL_3: .3, LEFT_PHALANGE_1: .3, LEFT_PHALANGE_2: .3, LEFT_PHALANGE_3: .3, RIGHT_PHALANGE_1: .3, RIGHT_PHALANGE_2: .3, RIGHT_PHALANGE_3: .3 } ''' elif FOOT_PART_NUM == 5: config['weightMap']={RIGHT_ARM:.2, RIGHT_FORE_ARM:.2, LEFT_ARM:.2, LEFT_FORE_ARM:.2, SPINE:.3, SPINE1:.3, RIGHT_FOOT:.3, LEFT_FOOT:.3, HIP:.5, RIGHT_UP_LEG:.1, RIGHT_LEG:.3, LEFT_UP_LEG:.1, LEFT_LEG:.3, LEFT_TOES:.3, RIGHT_TOES:.3, LEFT_TARSUS:.3, RIGHT_TARSUS:.3, LEFT_FOOT_SIDE_L:.3, LEFT_FOOT_SIDE_R:.3, RIGHT_FOOT_SIDE_L:.3, RIGHT_FOOT_SIDE_R:.3} config['weightMap2']={RIGHT_ARM:.2, RIGHT_FORE_ARM:.2, LEFT_ARM:.2, LEFT_FORE_ARM:.2, SPINE:1., SPINE1:.3, RIGHT_FOOT:2.5, LEFT_FOOT:2.5, HIP:1., RIGHT_UP_LEG:1., RIGHT_LEG:1., LEFT_UP_LEG:1., LEFT_LEG:1., LEFT_TOES:.3, RIGHT_TOES:.3, LEFT_TARSUS:.3, RIGHT_TARSUS:.3, LEFT_FOOT_SIDE_L:.3, LEFT_FOOT_SIDE_R:.3, RIGHT_FOOT_SIDE_L:.3, RIGHT_FOOT_SIDE_R:.3} ''' config['supLink'] = LEFT_FOOT config['supLink2'] = RIGHT_FOOT #config['end'] = 'HIP' config['end'] = SPINE1 config['const'] = HIP config['root'] = HIP config['FootPartNum'] = FOOT_PART_NUM if FOOT_PART_NUM == 7: config['FootLPart'] = [ LEFT_FOOT, LEFT_METATARSAL_2, LEFT_METATARSAL_3, LEFT_PHALANGE_1, LEFT_PHALANGE_2, LEFT_PHALANGE_3, LEFT_CALCANEUS ] config['FootRPart'] = [ RIGHT_FOOT, RIGHT_METATARSAL_2, RIGHT_METATARSAL_3, RIGHT_PHALANGE_1, RIGHT_PHALANGE_2, RIGHT_PHALANGE_3, RIGHT_CALCANEUS ] elif FOOT_PART_NUM == 5: config['FootLPart'] = [ LEFT_FOOT, LEFT_METATARSAL_3, LEFT_PHALANGE_1, LEFT_PHALANGE_3, LEFT_CALCANEUS ] config['FootRPart'] = [ RIGHT_FOOT, RIGHT_METATARSAL_3, RIGHT_PHALANGE_1, RIGHT_PHALANGE_3, RIGHT_CALCANEUS ] else: config['FootLPart'] = [ LEFT_FOOT, LEFT_TOES, LEFT_TARSUS, LEFT_TOES_SIDE_R, LEFT_FOOT_SIDE_L, LEFT_FOOT_SIDE_R ] config['FootRPart'] = [ RIGHT_FOOT, RIGHT_TOES, RIGHT_TARSUS, RIGHT_TOES_SIDE_R, RIGHT_FOOT_SIDE_L, RIGHT_FOOT_SIDE_R ] return motion, mcfg, wcfg, stepsPerFrame, config
def test_CM_CP(): # bvhFilePath = '../samples/chain_6.bvh' # bvhFilePath = '../samples/block_3_rotate.bvh' # bvhFilePath = '../samples/block_tree_rotate.bvh' bvhFilePath = '../samples/chain_2.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 100. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) node = mcfg.getNode('link0') node.density = 200. wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False # wcfg.gravity = (0,0,0) stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) motionModel = cvm.VpMotionModel(vpWorld, motion[0], mcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() motionModel.recordVelByFiniteDiff() controlModel.translateByOffset((0,.5,.5)) CMPos_cm = [mm.O_Vec3()] CMVel_cm = [mm.O_Vec3()] CMPos_mm = [mm.O_Vec3()] CPPos_cm = [mm.O_Vec3()] CPVel_cm = [mm.O_Vec3()] bodyMasses = controlModel.getBodyMasses() totalMass = 0. for m in bodyMasses: totalMass += m bodyIDsToCheck = range(vpWorld.getBodyNum()) mus = [.5]*len(bodyIDsToCheck) contactPositions= [] contactForces = [] viewer = ysv.SimpleViewer() viewer.record(False) # viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) # viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('motionModel', cvr.VpModelRenderer(motionModel, (100,100,100), yr.POLYGON_LINE)) viewer.doc.addRenderer('CMPos_cm', yr.PointsRenderer(CMPos_cm, (255,0,255))) viewer.doc.addRenderer('CMVel_cm', yr.VectorsRenderer(CMVel_cm, CMPos_cm, (255,0,255))) viewer.doc.addRenderer('CMPos_mm', yr.PointsRenderer(CMPos_mm, (200,0,200))) viewer.doc.addRenderer('CPPos_cm', yr.PointsRenderer(CPPos_cm, (0,255,0))) viewer.doc.addRenderer('CPVel_cm', yr.VectorsRenderer(CPVel_cm, CPPos_cm, (0,255,0))) viewer.doc.addRenderer('contactPositions', yr.PointsRenderer(contactPositions, (0,0,255), yr.POINT_POINT)) viewer.doc.addRenderer('contactForces', yr.VectorsRenderer(contactForces, contactPositions,(0,0,255))) def simulateCallback(frame): controlModel.applyBodyTorqueGlobal(1, (0,10,0)) for i in range(stepsPerFrame): bodyIDs, positions, positionLocals, forces = vpWorld.calcPenaltyForce(bodyIDsToCheck, mus, 1000, 2*(1000**.5)) vpWorld.applyPenaltyForce(bodyIDs, positionLocals, forces) vpWorld.step() del contactPositions[:] del contactForces[:] contactPositions[:] = positions contactForces[:] = forces motionModel.update(motion[frame]) bodyPositions = controlModel.getBodyPositionsGlobal() bodyVelocities = controlModel.getBodyVelocitiesGlobal() CMPos_cm[0] = yrp.getCM(bodyPositions, bodyMasses, totalMass) CMVel_cm[0] = yrp.getCM(bodyVelocities, bodyMasses, totalMass) bodyPositions_ref = motionModel.getBodyPositionsGlobal() bodyVelocities_ref = motionModel.getBodyVelocitiesGlobal() CMPos_mm[0] = yrp.getCM(bodyPositions_ref, bodyMasses, totalMass) CPPos_cm_old = CPPos_cm[0] CPPos_cm[0] = yrp.getCP(positions, forces) if CPPos_cm_old==None or CPPos_cm[0]==None: CPVel_cm[0] = None else: CPVel_cm[0] = (CPPos_cm[0] - CPPos_cm_old)/(1./30.) viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def test_penalty_model(): bvhFilePath = '../samples/chain_1.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 100. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False wcfg.gravity = (0,-9.8,0) stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) controlModel2 = cvm.VpControlModel(vpWorld, motion[0], mcfg) controlModel3 = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel.translateByOffset((0,1,0)) controlModel2.translateByOffset((0,1,.5)) controlModel3.translateByOffset((0,1,1.)) bodyIDsToCheck = range(vpWorld.getBodyNum()) mus = [1., .2, .1] Ks = 1000; Ds = 2*(Ks**.5) contactPositions= [] contactForces = [] viewer = ysv.SimpleViewer() # viewer.record(False) # viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('model2', cvr.VpModelRenderer(controlModel2, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('model3', cvr.VpModelRenderer(controlModel3, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('contactPositions', yr.PointsRenderer(contactPositions, (0,255,0), yr.POINT_POINT)) viewer.doc.addRenderer('contactForces', yr.VectorsRenderer(contactForces, contactPositions,(0,255,0))) viewer.setMaxFrame(500) def simulateCallback(frame): for i in range(stepsPerFrame): controlModel.applyBodyForceGlobal(0, (1,0,0)) controlModel2.applyBodyForceGlobal(0, (1,0,0)) controlModel3.applyBodyForceGlobal(0, (1,0,0)) # get penalty forces bodyIDs, positions, positionLocals, forces = vpWorld.calcPenaltyForce(bodyIDsToCheck, mus, 1000, 10) # apply penalty forces vpWorld.applyPenaltyForce(bodyIDs, positionLocals, forces) vpWorld.step() contactPositions[:] = positions contactForces[:] = forces viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def create_biped(): # motion #motionName = 'wd2_n_kick.bvh' if MOTION == STAND: motionName = 'wd2_stand.bvh' elif MOTION == STAND2: motionName = 'ww13_41_V001.bvh' elif MOTION == FORWARD_JUMP: motionName = 'woddy2_jump0.bvh' elif MOTION == TAEKWONDO: motionName = './MotionFile/wd2_098_V001.bvh' elif MOTION == TAEKWONDO2: motionName = './MotionFile/wd2_098_V001.bvh' elif MOTION == KICK: motionName = 'wd2_n_kick.bvh' elif MOTION == WALK: motionName = 'wd2_WalkForwardNormal00.bvh' elif MOTION == TIPTOE: motionName = './MotionFile/cmu/15_07_15_07.bvh' #motionName = 'ww13_41_V001.bvh' scale = 0.01 if MOTION == WALK: scale = 1.0 elif MOTION == TIPTOE: scale = 0.01 motion = yf.readBvhFile(motionName, scale) if MOTION != WALK: yme.removeJoint(motion, HEAD, False) yme.removeJoint(motion, RIGHT_SHOULDER, False) yme.removeJoint(motion, LEFT_SHOULDER, False) if FOOT_PART_NUM == 1 and MOTION != WALK: yme.removeJoint(motion, RIGHT_TOES_END, False) yme.removeJoint(motion, LEFT_TOES_END, False) elif (FOOT_PART_NUM == 5 or FOOT_PART_NUM == 6) and MOTION != WALK: yme.removeJoint(motion, RIGHT_TOES, False) yme.removeJoint(motion, RIGHT_TOES_END, False) yme.removeJoint(motion, LEFT_TOES, False) yme.removeJoint(motion, LEFT_TOES_END, False) if MOTION != WALK: yme.removeJoint(motion, RIGHT_HAND_END, False) yme.removeJoint(motion, LEFT_HAND_END, False) yme.offsetJointLocal(motion, RIGHT_ARM, (.03, -.05, 0), False) yme.offsetJointLocal(motion, LEFT_ARM, (-.03, -.05, 0), False) yme.rotateJointLocal(motion, HIP, mm.exp(mm.v3(1, 0, 0), .01), False) yme.rotateJointLocal(motion, HIP, mm.exp(mm.v3(0, 0, 1), -.01), False) if FOOT_PART_NUM == 1: yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(2.5, -0.0, .3), -.5), False) yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(2.5, 0.0, -.3), -.5), False) if MOTION == WALK: yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(1., -0.0, .0), .4), False) yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(1., 0.0, -.0), .4), False) #yme.rotateJointLocal(motion, SPINE1, mm.exp(mm.v3(1.,0.0,0.0), -.8), False) if MOTION == FORWARD_JUMP: yme.rotateJointLocal(motion, LEFT_UP_LEG, mm.exp(mm.v3(0.0, .0, 1.), .08), False) yme.rotateJointLocal(motion, LEFT_LEG, mm.exp(mm.v3(0.0, 1.0, 0.), -.2), False) if FOOT_PART_NUM == 6: yme.addJoint(motion, LEFT_FOOT, LEFT_METATARSAL_1, (-0.045, -0.06, 0.03)) yme.addJoint(motion, LEFT_FOOT, LEFT_METATARSAL_3, (0.045, -0.06, 0.03)) #-0.0037 yme.addJoint(motion, LEFT_METATARSAL_1, LEFT_PHALANGE_1, (0.0, 0.0, 0.0715)) yme.addJoint(motion, LEFT_METATARSAL_3, LEFT_PHALANGE_3, (0.0, 0.0, 0.0715)) yme.addJoint(motion, LEFT_PHALANGE_1, 'LEFT_PHALANGE_Dummy1', (0.0, 0.0, 0.1)) yme.addJoint(motion, LEFT_PHALANGE_3, 'LEFT_PHALANGE_Dummy2', (0.0, 0.0, 0.1)) yme.addJoint(motion, LEFT_FOOT, LEFT_CALCANEUS_1, (0.0, -0.06, -0.02)) yme.addJoint(motion, LEFT_CALCANEUS_1, 'LEFT_CALCANEUS_Dummy1', (0.0, 0.0, -0.1)) yme.addJoint(motion, RIGHT_FOOT, RIGHT_METATARSAL_1, (0.045, -0.06, 0.03)) yme.addJoint(motion, RIGHT_FOOT, RIGHT_METATARSAL_3, (-0.045, -0.06 - 0.0062, 0.03 + 0.0035)) yme.addJoint(motion, RIGHT_METATARSAL_1, RIGHT_PHALANGE_1, (0.0, 0.0, 0.0715)) yme.addJoint(motion, RIGHT_METATARSAL_3, RIGHT_PHALANGE_3, (0.0, 0.0, 0.0715)) yme.addJoint(motion, RIGHT_PHALANGE_1, 'RIGHT_PHALANGE_Dummy1', (0.0, 0.0, 0.1)) yme.addJoint(motion, RIGHT_PHALANGE_3, 'RIGHT_PHALANGE_Dummy2', (0.0, 0.0, 0.1)) yme.addJoint(motion, RIGHT_FOOT, RIGHT_CALCANEUS_1, (0.0, -0.06, -0.02)) yme.addJoint(motion, RIGHT_CALCANEUS_1, 'RIGHT_CALCANEUS_Dummy1', (0.0, 0.0, -0.1)) yme.rotateJointLocal(motion, RIGHT_CALCANEUS_1, mm.exp(mm.v3(.0, 0.0, 1.0), 3.14), False) yme.rotateJointLocal(motion, LEFT_CALCANEUS_1, mm.exp(mm.v3(.0, 0.0, 1.0), 3.14), False) ''' yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(1.0,0.0,0.0), 3.14*0.3), False) yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(1.0,0.0, 0.0), 3.14*0.3), False) yme.rotateJointLocal(motion, RIGHT_PHALANGE_1, mm.exp(mm.v3(1.0,0.0,0.0), -3.14*0.3), False) yme.rotateJointLocal(motion, RIGHT_PHALANGE_3, mm.exp(mm.v3(1.0,0.0, 0.0), -3.14*0.3), False) yme.rotateJointLocal(motion, LEFT_PHALANGE_1, mm.exp(mm.v3(1.0,0.0,0.0), -3.14*0.3), False) yme.rotateJointLocal(motion, LEFT_PHALANGE_3, mm.exp(mm.v3(1.0,0.0, 0.0), -3.14*0.3), False) ''' yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(1.0, 0.0, 0.0), 0.2012), False) yme.rotateJointLocal(motion, LEFT_METATARSAL_1, mm.exp(mm.v3(1.0, 0.0, 0.0), -0.2172), False) yme.rotateJointLocal(motion, LEFT_METATARSAL_3, mm.exp(mm.v3(1.0, 0.0, 0.0), -0.2172), False) yme.rotateJointLocal(motion, LEFT_CALCANEUS_1, mm.exp(mm.v3(1.0, 0.0, 0.0), 0.2172), False) yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(1.0, 0.0, 0.0), 0.2283), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_1, mm.exp(mm.v3(1.0, 0.0, 0.0), -0.2171), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_3, mm.exp(mm.v3(1.0, 0.0, 0.0), -0.2171), False) yme.rotateJointLocal(motion, RIGHT_CALCANEUS_1, mm.exp(mm.v3(1.0, 0.0, 0.0), 0.2171), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_1, mm.exp(mm.v3(0.0, 0.0, 1.0), 0.0747), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_3, mm.exp(mm.v3(0.0, 0.0, 1.0), 0.0747), False) ''' yme.rotateJointLocal(motion, RIGHT_METATARSAL_1, mm.exp(mm.v3(1.0,0.0,0.0), -0.1), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_3, mm.exp(mm.v3(1.0,0.0,0.0), -0.1), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_1, mm.exp(mm.v3(0.0,0.0,1.0), 0.06), False) yme.rotateJointLocal(motion, RIGHT_METATARSAL_3, mm.exp(mm.v3(0.0,0.0,1.0), 0.06), False) yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(1.0,0.0,0.0), -0.05), False) ''' #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(0.0,0.0,1.0), 0.0656), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(1.0,0.0,0.0), 0.0871), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(0.0,0.0,1.0), 0.0087), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(1.0,0.0,0.0), 0.0933), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(0.0,0.0,1.0), 0.0746), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(1.0,0.0,0.0), -6.3773e-03), False) #yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(1.0,0.0, 0.0), math.pi*0.25), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(1.0,0.0, 0.0), math.pi*0.25), False) #yme.rotateJointLocal(motion, LEFT_PHALANGE_1, mm.exp(mm.v3(1.0,0.0,0.0), -math.pi*0.25), False) #yme.rotateJointLocal(motion, RIGHT_PHALANGE_1, mm.exp(mm.v3(1.0,0.0,0.0), -math.pi*0.25), False) #yme.rotateJointLocal(motion, LEFT_PHALANGE_3, mm.exp(mm.v3(1.0,0.0,0.0), -math.pi*0.25), False) #yme.rotateJointLocal(motion, RIGHT_PHALANGE_3, mm.exp(mm.v3(1.0,0.0,0.0), -math.pi*0.25), False) #yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(1.0,0.0, 0.0), -math.pi*0.16), False) #yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(1.0,0.0, 0.0), -math.pi*0.16), False) #yme.rotateJointLocal(motion, LEFT_CALCANEUS_1, mm.exp(mm.v3(1.0,0.0,0.0), -math.pi*0.16), False) #yme.rotateJointLocal(motion, RIGHT_CALCANEUS_1, mm.exp(mm.v3(1.0,0.0,0.0), -math.pi*0.16), False) #yme.rotateJointLocal(motion, LEFT_METATARSAL_3, mm.exp(mm.v3(1.0,0.0,0.0), -math.pi*0.5), False) yme.updateGlobalT(motion) ################ if MOTION == FORWARD_JUMP: motion = motion[515:555] elif MOTION == TAEKWONDO: ## Taekwondo base-step motion = motion[0:31] #motion = motion[564:600] elif MOTION == TAEKWONDO2: ## Taekwondo base-step #motion = motion[0:31+40] ## Taekwondo turning-kick motion = motion[108:-1] #motion = motion[108:109] elif MOTION == KICK: #motion = motion[141:-1] #motion = motion[100:-1] #motion = motion[58:-1] motion = motion[82:-1] #motion = motion[0:-1] elif MOTION == STAND2: motion = motion[1:-1] elif MOTION == TIPTOE: #motion = motion[183:440] #motion = motion[350:410] motion = motion[350:550] motion[0:0] = [motion[0]] * 40 motion.extend([motion[-1]] * 5000) # world, model mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .9 for name in massMap: node = mcfg.addNode(name) node.mass = massMap[name] node = mcfg.getNode(HIP) node.length = .2 node.width = .25 node = mcfg.getNode(SPINE1) node.length = .2 node.offset = (0, 0, 0.1) node = mcfg.getNode(SPINE) node.width = .22 #node.length = .2 #### if FOOT_PART_NUM == 1: length1 = .35 width1 = .2 mass1 = 4.3 elif FOOT_PART_NUM == 6: mass0 = .4 width0 = 0.028 length0 = 0.1 #Metatarsal1 length1 = .15 width1 = width0 * 3 mass1 = mass0 * 1.8 #Metatarsal3 length3 = .11 width3 = width0 * 3 mass3 = mass0 * 1.86 #Calcaneus1 length4 = .08 width4 = 0.15 * 1 mass4 = mass0 * 1.2 * 2. #Phalange1 length5 = .08 width5 = width1 mass5 = mass0 * 1.355 #Phalange3 length7 = length5 width7 = width5 mass7 = mass5 #Talus length8 = .13 width8 = width0 * 3 mass8 = mass0 * 2. if FOOT_PART_NUM == 6: node = mcfg.getNode(RIGHT_FOOT) node.length = length8 node.width = width8 node.mass = mass8 node = mcfg.getNode(RIGHT_METATARSAL_1) node.length = length1 node.width = width1 node.mass = mass1 node = mcfg.getNode(RIGHT_METATARSAL_3) node.length = length3 node.width = width3 node.mass = mass3 node = mcfg.getNode(RIGHT_PHALANGE_1) node.length = length5 node.width = width5 node.mass = mass5 node.offset = (0.0, 0.0, 0.03) node = mcfg.getNode(RIGHT_PHALANGE_3) node.length = length7 node.width = width7 node.mass = mass7 node.offset = (0.0, 0.0, 0.01) node = mcfg.getNode(RIGHT_CALCANEUS_1) node.length = length4 node.width = width4 node.mass = mass4 node = mcfg.getNode(LEFT_FOOT) node.length = length8 node.width = width8 node.mass = mass8 node = mcfg.getNode(LEFT_METATARSAL_1) node.length = length1 node.width = width1 node.mass = mass1 node = mcfg.getNode(LEFT_METATARSAL_3) node.length = length3 node.width = width3 node.mass = mass3 node = mcfg.getNode(LEFT_PHALANGE_1) node.length = length5 node.width = width5 node.mass = mass5 node.offset = (0.0, 0.0, 0.03) node = mcfg.getNode(LEFT_PHALANGE_3) node.length = length7 node.width = width7 node.mass = mass7 node.offset = (0.0, 0.0, 0.01) node = mcfg.getNode(LEFT_CALCANEUS_1) node.length = length4 node.width = width4 node.mass = mass4 if FOOT_PART_NUM < 5: node = mcfg.getNode(RIGHT_FOOT) node.length = length1 node.width = width1 node.mass = mass1 node = mcfg.getNode(LEFT_FOOT) node.length = length1 node.width = width1 node.mass = mass1 wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False stepsPerFrame = 30 wcfg.timeStep = (1 / 30.) / (stepsPerFrame) #stepsPerFrame = 10 #wcfg.timeStep = (1/120.)/(stepsPerFrame) #wcfg.timeStep = (1/1800.) # parameter config = {} config['Kt'] = 200 config['Dt'] = 2 * (config['Kt']**.5) # tracking gain config['Kl'] = .10 config['Dl'] = 2 * (config['Kl']**.5) # linear balance gain config['Kh'] = 0.1 config['Dh'] = 2 * (config['Kh']**.5) # angular balance gain config['Ks'] = 20000 config['Ds'] = 2 * (config['Ks']**.5) # penalty force spring gain config['Bt'] = 1. config['Bl'] = 1. #0.5 config['Bh'] = 1. if FOOT_PART_NUM == 1: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .1, RIGHT_LEG: .3, LEFT_UP_LEG: .1, LEFT_LEG: .3 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 1., LEFT_FOOT: 1., HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1. } elif FOOT_PART_NUM == 6: config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .5, SPINE1: .3, RIGHT_FOOT: .7, LEFT_FOOT: .7, HIP: .5, RIGHT_UP_LEG: .7, RIGHT_LEG: .7, LEFT_UP_LEG: .7, LEFT_LEG: .7, LEFT_METATARSAL_1: .7, RIGHT_METATARSAL_1: .7, LEFT_METATARSAL_3: .7, RIGHT_METATARSAL_3: .7, RIGHT_CALCANEUS_1: .7, LEFT_CALCANEUS_1: .7, LEFT_PHALANGE_1: .4, LEFT_PHALANGE_3: .4, RIGHT_PHALANGE_1: .4, RIGHT_PHALANGE_3: .4 } config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .2, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .3, RIGHT_UP_LEG: .1, RIGHT_LEG: .2, LEFT_UP_LEG: .1, LEFT_LEG: .2, LEFT_METATARSAL_1: .1, RIGHT_METATARSAL_1: .1, LEFT_METATARSAL_3: .1, RIGHT_METATARSAL_3: .1, RIGHT_CALCANEUS_1: .2, LEFT_CALCANEUS_1: .2, LEFT_PHALANGE_1: .1, LEFT_PHALANGE_3: .1, RIGHT_PHALANGE_1: .1, RIGHT_PHALANGE_3: .1 } ''' config['weightMap2']={RIGHT_ARM:.2, RIGHT_FORE_ARM:.2, LEFT_ARM:.2, LEFT_FORE_ARM:.2, SPINE:.3, SPINE1:.3, RIGHT_FOOT:.3, LEFT_FOOT:.3, HIP:.5, RIGHT_UP_LEG:.1, RIGHT_LEG:.3, LEFT_UP_LEG:.1, LEFT_LEG:.3, LEFT_METATARSAL_3:.2, RIGHT_METATARSAL_3:.2, RIGHT_CALCANEUS:1.2, LEFT_CALCANEUS:1.2, LEFT_PHALANGE_1:.2, LEFT_PHALANGE_3:.1, RIGHT_PHALANGE_1:.2, RIGHT_PHALANGE_3:.2} config['weightMap2']={RIGHT_ARM:.2, RIGHT_FORE_ARM:.2, LEFT_ARM:.2, LEFT_FORE_ARM:.2, SPINE:.8, SPINE1:.3, RIGHT_FOOT:1., LEFT_FOOT:1., HIP:1., RIGHT_UP_LEG:1., RIGHT_LEG:1., LEFT_UP_LEG:1., LEFT_LEG:1., LEFT_METATARSAL_3:1., RIGHT_METATARSAL_3:1., RIGHT_CALCANEUS:.3, LEFT_CALCANEUS:.3, LEFT_PHALANGE_1:.3, LEFT_PHALANGE_3:.3, RIGHT_PHALANGE_1:.3, RIGHT_PHALANGE_3:.3} ''' config['supLink'] = LEFT_FOOT config['supLink2'] = RIGHT_FOOT #config['end'] = HIP config['end'] = SPINE1 config['const'] = HIP config['root'] = HIP config['FootPartNum'] = FOOT_PART_NUM if FOOT_PART_NUM == 6: config['FootLPart'] = [ LEFT_FOOT, LEFT_METATARSAL_1, LEFT_METATARSAL_3, LEFT_PHALANGE_1, LEFT_PHALANGE_3, LEFT_CALCANEUS_1 ] config['FootRPart'] = [ RIGHT_FOOT, RIGHT_METATARSAL_1, RIGHT_METATARSAL_3, RIGHT_PHALANGE_1, RIGHT_PHALANGE_3, RIGHT_CALCANEUS_1 ] else: config['FootLPart'] = [ LEFT_FOOT, LEFT_TOES, LEFT_TARSUS, LEFT_TOES_SIDE_R, LEFT_FOOT_SIDE_L, LEFT_FOOT_SIDE_R ] config['FootRPart'] = [ RIGHT_FOOT, RIGHT_TOES, RIGHT_TARSUS, RIGHT_TOES_SIDE_R, RIGHT_FOOT_SIDE_L, RIGHT_FOOT_SIDE_R ] return motion, mcfg, wcfg, stepsPerFrame, config
yme.rotateJointLocal(motion, 'LeftFoot', motionDirConfig['footRot'], False) yme.rotateJointLocal(motion, 'RightFoot', motionDirConfig['footRot'], False) motion.translateByOffset(motionDirConfig['yOffset']) yme.updateGlobalT(motion) print(motionName) if motionName=='wd2_left_turn.bvh': lFoot = motion[0].skeleton.getJointIndex('LeftFoot') yte.setPositionTarget(motion, lFoot, motion[0].getJointPositionGlobal(lFoot)+(-.1,0,-.1)\ , [0,58], 100) #=============================================================================== # initialize character #=============================================================================== wcfg = ypc.WorldConfig() mcfg = get_mcfg() vpWorld = cvw.VpWorld(wcfg) motionModel = cvm.VpMotionModel(vpWorld, motion[0], mcfg) vpWorld.initialize() bodyMasses = motionModel.getBodyMasses() totalMass = motionModel.getTotalMass() #=============================================================================== # analysis #=============================================================================== lc = yma.getElementContactStates(motion, 'LeftFoot', hRef, vRef) rc = yma.getElementContactStates(motion, 'RightFoot', hRef, vRef) intervals, states = yba.getBipedGaitIntervals(lc, rc, jumpThreshold, jumpBias, stopThreshold, stopBias)
def test_biped_motion_edit(): massMap = buildMassMap() bvhFilePath = '../samples/wd2_WalkSameSame00.bvh' motion = yf.readBvhFile(bvhFilePath, .01) yme.removeJoint(motion, 'Head', False) yme.removeJoint(motion, 'RightShoulder', False) yme.removeJoint(motion, 'LeftShoulder1', False) yme.removeJoint(motion, 'RightToes_Effector', False) yme.removeJoint(motion, 'LeftToes_Effector', False) yme.removeJoint(motion, 'RightHand_Effector', False) yme.removeJoint(motion, 'LeftHand_Effector', False) yme.offsetJointLocal(motion, 'RightArm', (.03,-.05,0), False) yme.offsetJointLocal(motion, 'LeftArm', (-.03,-.05,0), False) yme.updateGlobalT(motion) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .9 for name in massMap: node = mcfg.addNode(name) node.mass = massMap[name] node = mcfg.getNode('Hips') node.length = .2 node.width = .25 # node = mcfg.getNode('Head') # node.length = .2 node = mcfg.getNode('Spine1') node.length = .2 node.offset = (0,0,0.1) node = mcfg.getNode('Spine') node.width = .22 node = mcfg.getNode('RightFoot') node.length = .25 node = mcfg.getNode('LeftFoot') node.length = .25 wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) motionModel = cvm.VpMotionModel(vpWorld, motion[0], mcfg) vpWorld.initialize() print motion[0].skeleton print print controlModel viewer = ysv.SimpleViewer() # viewer.record(False) viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,255,255), yr.LINK_LINE)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('controlModel', cvr.VpModelRenderer(controlModel, (255,240,255), cvr.POLYGON_FILL)) viewer.doc.addRenderer('motionModel', cvr.VpModelRenderer(motionModel, (255,240,255), cvr.POLYGON_LINE)) def preFrameCallback(frame): motionModel.update(motion[frame]) viewer.setPreFrameCallback(preFrameCallback) def simulateCallback(frame): for i in range(stepsPerFrame): vpWorld.step() viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def test_slope_character(): bvhFilePath = '../samples/wd2_WalkSameSame01.bvh' motion = yf.readBvhFile(bvhFilePath) mcfgfile = open('../samples/' + 'mcfg', 'r') mcfg = cPickle.load(mcfgfile) mcfgfile.close() frameTime = 1/30. wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False stepsPerFrame = 30 wcfg.timeStep = (frameTime)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) motionModel = cvm.VpMotionModel(vpWorld, motion[0], mcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel.initializeHybridDynamics() bodyIDsToCheck = range(vpWorld.getBodyNum()) mus = [1.]*len(bodyIDsToCheck) Kt = 20.; Dt = 2*(Kt**.5) Ks = 2000; Ds = 2*(Ks**.5) rd_box = yr.BoxesRenderer([(5., .2, 3.)], [mm.Rp2T(mm.rotZ(0.1), (0,-.5,0))], (0,0,255), yr.POLYGON_LINE) contactPositions= [] contactForces = [] viewer = ysv.SimpleViewer() # viewer.record(False) # viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('contactPositions', yr.PointsRenderer(contactPositions, (0,255,0), yr.POINT_POINT)) viewer.doc.addRenderer('contactForces', yr.VectorsRenderer(contactForces, contactPositions,(0,255,0))) viewer.doc.addRenderer('rd_box', rd_box) viewer.setMaxFrame(500) def simulateCallback(frame): th_r = motion.getDOFPositions(frame) th = controlModel.getDOFPositions() dth_r = motion.getDOFVelocities(frame) dth = controlModel.getDOFVelocities() ddth_r = motion.getDOFAccelerations(frame) ddth_des = yct.getDesiredDOFAccelerations(th_r, th, dth_r, dth, ddth_r, Kt, Dt) for i in range(stepsPerFrame): # get penalty forces # bodyIDs, positions, positionLocals, forces = vpWorld.calcPenaltyForce(bodyIDsToCheck, mus, 1000, 10) bodyIDs, positions, positionLocals, forces = vpWorld.calcPenaltyForce_Boxes(rd_box.boxSizes, rd_box.Ts, bodyIDsToCheck, mus, 1000, 10) # apply penalty forces vpWorld.applyPenaltyForce(bodyIDs, positionLocals, forces) controlModel.setDOFAccelerations(ddth_des) controlModel.solveHybridDynamics() vpWorld.step() contactPositions[:] = positions contactForces[:] = forces viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def test_replaceBvhFile(): # motion bvhFilePath = '../samples/wd2_WalkSameSame00.bvh' bvh = readBvhFileAsBvh(bvhFilePath) motion = bvh.toJointMotion(.01, False) partBvhFilePath = '../samples/simpleJump_long.bvh' partBvh = readBvhFileAsBvh(partBvhFilePath) bvh.replaceJointFromBvh('RightFoot', partBvh) partBvh = readBvhFileAsBvh(partBvhFilePath) partBvh.mirror('YZ') bvh.replaceJointFromBvh('LeftFoot', partBvh) motion2 = bvh.toJointMotion(.01, False) def buildMassMap(): massMap = {} massMap = massMap.fromkeys([ 'Head', 'Head_Effector', 'Hips', 'LeftArm', 'LeftFoot', 'LeftForeArm', 'LeftHand', 'LeftHand_Effector', 'LeftLeg', 'LeftShoulder1', 'LeftUpLeg', 'RightArm', 'RightFoot', 'RightForeArm', 'RightHand', 'RightHand_Effector', 'RightLeg', 'RightShoulder', 'RightUpLeg', 'Spine', 'Spine1', 'RightFoot_foot_0_0', 'RightFoot_foot_0_1', 'RightFoot_foot_0_1_Effector', 'RightFoot_foot_1_0', 'RightFoot_foot_1_1', 'RightFoot_foot_1_1_Effector', 'RightFoot_foot_2_0', 'RightFoot_foot_2_1', 'RightFoot_foot_2_1_Effector', 'LeftFoot_foot_0_0', 'LeftFoot_foot_0_1', 'LeftFoot_foot_0_1_Effector', 'LeftFoot_foot_1_0', 'LeftFoot_foot_1_1', 'LeftFoot_foot_1_1_Effector', 'LeftFoot_foot_2_0', 'LeftFoot_foot_2_1', 'LeftFoot_foot_2_1_Effector', ], 0.) # torso : 10 massMap['Hips'] += 2. massMap['Spine'] += 8. # head : 3 massMap['Spine1'] += 3. # right upper arm : 2 massMap['RightArm'] += 2. # left upper arm : 2 massMap['LeftArm'] += 2. # right lower arm : 1 massMap['RightForeArm'] = 1. # massMap['RightForeArm'] = 2. # left lower arm : 1 massMap['LeftForeArm'] = 1. # massMap['LeftForeArm'] = 2. # right thigh : 7 massMap['Hips'] += 2. massMap['RightUpLeg'] += 5. # left thigh : 7 massMap['Hips'] += 2. massMap['LeftUpLeg'] += 5. # right shin : 5 massMap['RightLeg'] += 5. # left shin : 5 massMap['LeftLeg'] += 5. # right foot : 4 massMap['RightFoot'] += 2. # left foot : 4 massMap['LeftFoot'] += 2. massMap['RightFoot_foot_0_0'] = .3 massMap['RightFoot_foot_0_1'] = .3 massMap['RightFoot_foot_1_0'] = .3 massMap['RightFoot_foot_1_1'] = .3 massMap['RightFoot_foot_2_0'] = .3 massMap['RightFoot_foot_2_1'] = .3 massMap['LeftFoot_foot_0_0'] = .3 massMap['LeftFoot_foot_0_1'] = .3 massMap['LeftFoot_foot_1_0'] = .3 massMap['LeftFoot_foot_1_1'] = .3 massMap['LeftFoot_foot_2_0'] = .3 massMap['LeftFoot_foot_2_1'] = .3 return massMap def buildMcfg(): massMap = buildMassMap() mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .9 totalMass = 0. for name in massMap: node = mcfg.addNode(name) node.mass = massMap[name] totalMass += node.mass node = mcfg.getNode('Hips') node.length = .2 node.width = .25 node = mcfg.getNode('Spine1') node.length = .2 node.offset = (0, 0, 0.1) node = mcfg.getNode('Spine') node.width = .22 node = mcfg.getNode('RightFoot') node.length = .25 # node.length = .27 # node.offset = (0,0,0.01) node.width = .1 node.geom = 'MyFoot1' node = mcfg.getNode('LeftFoot') node.length = .25 # node.length = .27 # node.offset = (0,0,0.01) node.width = .1 node.geom = 'MyFoot1' def capsulize(node_name): node = mcfg.getNode(node_name) node.geom = 'MyFoot4' node.width = 0.02 capsulize('RightFoot') capsulize('LeftFoot') capsulize('RightFoot_foot_0_0') capsulize('RightFoot_foot_0_1') capsulize('RightFoot_foot_1_0') capsulize('RightFoot_foot_1_1') capsulize('RightFoot_foot_2_0') capsulize('RightFoot_foot_2_1') capsulize('LeftFoot_foot_0_0') capsulize('LeftFoot_foot_0_1') capsulize('LeftFoot_foot_1_0') capsulize('LeftFoot_foot_1_1') capsulize('LeftFoot_foot_2_0') capsulize('LeftFoot_foot_2_1') return mcfg mcfg = buildMcfg() wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False wcfg.lockingVel = 0.05 stepsPerFrame = 30 wcfg.timeStep = 0.001 print(motion2[0].skeleton) vpWorld = cvw.VpWorld(wcfg) motionModel = cvm.VpMotionModel(vpWorld, motion2[0], mcfg) # vpWorld.initialize() viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0, 255, 0))) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('motion2', yr.JointMotionRenderer(motion2, (255, 0, 0))) viewer.doc.addObject('motion2', motion2) viewer.doc.addRenderer( 'csmotion2', cvr.VpModelRenderer(motionModel, (255, 0, 0), yr.POLYGON_FILL)) viewer.startTimer(1 / motion.fps) def callback(frame): motionModel.update(motion2[frame]) viewer.setSimulateCallback(callback) viewer.show() Fl.run() tempFilePath = '../samples/motion_foot_temp_wd2_WalkSameSame00.bvh.temp'
def push_simbicon_mass(): # Trunk 29.27 # Head 5.89 # Pelvis 16.61 # Thigh 8.35 # Shank 4.16 # Foot 1.34 # Arm 2.79 # Forearm 1.21 # Hand 0.55 class ForceInfo: def __init__(self, startFrame, duration, force): self.startFrame = startFrame # frame self.duration = duration # sec self.force = force # Newton self.targetBody = None #=============================================================================== # load motion #=============================================================================== MULTI_VIEWER = False CAMERA_TRACKING = True TORQUE_PLOT = False # global parameters Kt = 60.; Dt = 2*(Kt**.5) Ks = 4000.; Ds = 2*(Ks**.5) K_stb_vel = .1 mu = 2. # constaants c_min_contact_vel = 100. # c_min_contact_vel = 2. c_min_contact_time = .7 c_landing_duration = .2 c_taking_duration = .3 # c_swf_mid_offset = .0 c_swf_mid_offset = .02 c_swf_stability = .5 c_locking_vel = .05 # c_swf_offset = .0 c_swf_offset = .01 # c_swf_offset = .005 K_stp_pos = 0. # c5 = .5; c6 = .01 c5 = .5; c6 = .02 # c5 = .5; c6 = .05 # c5 = 1.; c6 = .05 # c5 = .0; c6 = .0 K_stb_vel = .1 K_stb_pos = .1 OLD_SWING_HEIGHT = False # OLD_SWING_HEIGHT = True HIGHER_OFFSET = True # HIGHER_OFFSET = False dir = './ppmotion/' # max push # forceInfos = [] # maximum # forceInfos = [ForceInfo(4*i*30, .4, (160,0,0)) for i in range(2,12)] # forceInfos = [ForceInfo(4*i*30, .4, (-130,0,0)) for i in range(2,12)] # forceInfos = [ForceInfo(4*i*30, .4, (0,0,80)) for i in range(2,12)] forceInfos = [ForceInfo(4*i*30+1, .4, (0,0,-105)) for i in range(2,12)] # # maximum with more checking # forceInfos = [ForceInfo(4*i*30, .4, (145,0,0)) for i in range(2,12)] # forceInfos = [ForceInfo(4*i*30+1, .4, (-120,0,0)) for i in range(2,12)] # forceInfos = [ForceInfo(4*i*30+1, .4, (0,0,80)) for i in range(2,12)] # forceInfos = [ForceInfo(4*i*30, .4, (0,0,-105)) for i in range(2,12)] # # for video # forceInfos = [ForceInfo(4*i*30+2, .4, (160,0,0)) for i in range(2,4)] \ # + [ForceInfo(4*i*30+2, .4, (0,0,-105)) for i in range(4,6)] \ # + [ForceInfo(4*i*30+2, .4, (-130,0,0)) for i in range(6,8)] \ # + [ForceInfo(4*i*30+2, .4, (0,0,80)) for i in range(8,10)] # Kt = 40.; Dt = 2*(Kt**.5) # Ks = 3000.; Ds = 2*(Ks**.5) # mu = 1. # c_swf_mid_offset = .04 # K_swp_vel_sag = .0; K_swp_vel_sag_faster = .0; # K_swp_pos_sag = 1.5; K_swp_pos_sag_faster = .1; # K_swp_vel_cor = .25; K_swp_pos_cor = .3 # K_stp_pos = 0. # K_stb_vel = .02 # K_stb_pos = .15 Kt = 40.; Dt = 2*(Kt**.5) Ks = 3000.; Ds = 2*(Ks**.5) mu = 1.5 c_swf_mid_offset = .04 K_swp_vel_sag = .05; K_swp_vel_sag_faster = .0; K_swp_pos_sag = 1.7; K_swp_pos_sag_faster = .1; K_swp_vel_cor = .25; K_swp_pos_cor = .3 # K_stb_vel = .02 # K_stb_pos = .15 filename = 'wd2_WalkSameSame01_REPEATED.bvh' motion_ori = yf.readBvhFile(dir+filename) frameTime = 1/motion_ori.fps if 'REPEATED' in filename: REPEATED = True CAMERA_TRACKING = True else: REPEATED = False #=============================================================================== # options #=============================================================================== SEGMENT_EDITING = True STANCE_FOOT_STABILIZE = True MATCH_STANCE_LEG = True SWING_FOOT_PLACEMENT = True SWING_FOOT_HEIGHT = True if '_FOOT' in filename: SWING_FOOT_ORIENTATION = True else: SWING_FOOT_ORIENTATION = False STANCE_FOOT_PUSH = True STANCE_FOOT_BALANCING = True stitch_func = lambda x : 1. - yfg.hermite2nd(x) stf_stabilize_func = yfg.concatenate([yfg.hermite2nd, yfg.one], [c_landing_duration]) match_stl_func = yfg.hermite2nd # match_stl_func_y = yfg.hermite2nd swf_placement_func = yfg.hermite2nd swf_height_func = yfg.hermite2nd swf_height_sine_func = yfg.sine # stf_balancing_func = yfg.concatenate([yfg.hermite2nd, yfg.one], [c_landing_duration]) stf_balancing_func = yfg.hermite2nd #=============================================================================== # initialize character #=============================================================================== # mcfgfile = open(dir + 'mcfg', 'r') mcfgfile = open('mcfg_simbicon', 'r') mcfg = cPickle.load(mcfgfile) mcfgfile.close() wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False wcfg.lockingVel = c_locking_vel stepsPerFrame = 30 wcfg.timeStep = (frameTime)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) motionModel = cvm.VpMotionModel(vpWorld, motion_ori[0], mcfg) controlModel = cvm.VpControlModel(vpWorld, motion_ori[0], mcfg) vpWorld.initialize() print controlModel motionModel.recordVelByFiniteDiff() controlModel.initializeHybridDynamics() #=============================================================================== # load segment info #=============================================================================== skeleton = motion_ori[0].skeleton segname = os.path.splitext(filename)[0]+'.seg' segfile = open(dir+segname, 'r') seginfo = cPickle.load(segfile) segfile.close() intervals = [info['interval'] for info in seginfo] states = [info['state'] for info in seginfo] temp_motion = copy.deepcopy(motion_ori) segments = yma.splitMotionIntoSegments(temp_motion, intervals) print len(intervals), 'segments' for i in range(len(intervals)): print '%dth'%i, yba.GaitState.text[states[i]], intervals[i], ',', print motion_seg_orig = ym.JointMotion() motion_seg_orig += segments[0] motion_seg = ym.JointMotion() motion_seg += segments[0] motion_stitch = ym.JointMotion() motion_stitch += segments[0] motion_stf_stabilize = ym.JointMotion() motion_match_stl = ym.JointMotion() motion_swf_placement = ym.JointMotion() motion_swf_height = ym.JointMotion() motion_swf_orientation = ym.JointMotion() motion_stf_balancing = ym.JointMotion() motion_stf_push = ym.JointMotion() motion_control = ym.JointMotion() motion_debug1 = ym.JointMotion() motion_debug2 = ym.JointMotion() motion_debug3 = ym.JointMotion() P = ym.JointMotion() P_hat = ym.JointMotion() M_tc = ym.JointMotion() M_hat_tc_1 = ym.JointMotion() #=============================================================================== # loop variable #=============================================================================== seg_index = [0] acc_offset = [0] extended = [False] prev_R_swp = [None] stl_y_limit_num = [0] stl_xz_limit_num = [0] avg_dCM = [mm.O_Vec3()] # avg_stf_v = [mm.O_Vec3()] # avg_stf_av = [mm.O_Vec3()] # stf_push_func = [yfg.zero] step_length_cur = [0.] step_length_tar = [0.] step_axis = [mm.O_Vec3()] #=============================================================================== # information #=============================================================================== bodyIDsToCheck = range(vpWorld.getBodyNum()) mus = [mu]*len(bodyIDsToCheck) bodyMasses = controlModel.getBodyMasses() totalMass = controlModel.getTotalMass() lID = controlModel.name2id('LeftFoot'); rID = controlModel.name2id('RightFoot') lUpLeg = skeleton.getJointIndex('LeftUpLeg');rUpLeg = skeleton.getJointIndex('RightUpLeg') lKnee = skeleton.getJointIndex('LeftLeg'); rKnee = skeleton.getJointIndex('RightLeg') lFoot = skeleton.getJointIndex('LeftFoot'); rFoot = skeleton.getJointIndex('RightFoot') spine = skeleton.getJointIndex('Spine') uppers = [skeleton.getJointIndex(name) for name in ['Hips', 'Spine', 'Spine1', 'LeftArm', 'LeftForeArm', 'RightArm', 'RightForeArm']] upperMass = sum([bodyMasses[i] for i in uppers]) lLegs = [skeleton.getJointIndex(name) for name in ['LeftUpLeg', 'LeftLeg', 'LeftFoot']] rLegs = [skeleton.getJointIndex(name) for name in ['RightUpLeg', 'RightLeg', 'RightFoot']] allJoints = set(range(skeleton.getJointNum())) halfFootHeight = controlModel.getBodyShape(lFoot)[1] / 2. for fi in forceInfos: fi.targetBody = spine #=========================================================================== # data collection #=========================================================================== rhip_torques = [] rknee_torques = [] rankle_torques = [] #=============================================================================== # rendering #=============================================================================== rd_CM = [None]; rd_CP = [None]; rd_CMP = [None] rd_forces = [None]; rd_force_points = [None] rd_torques = []; rd_joint_positions = [] rd_point1 = [None] rd_point2 = [None] rd_vec1 = [None]; rd_vecori1 = [None] rd_vec2 = [None]; rd_vecori2 = [None] rd_frame1 = [None] rd_frame2 = [None] if MULTI_VIEWER: viewer = ymv.MultiViewer(800, 655, True, wheelWork=True) # viewer = ymv.MultiViewer(1600, 1255) viewer.setRenderers1([cvr.VpModelRenderer(motionModel, MOTION_COLOR, yr.POLYGON_FILL)]) viewer.setRenderers2([cvr.VpModelRenderer(controlModel, CHARACTER_COLOR, yr.POLYGON_FILL), yr.ForcesRenderer(rd_forces, rd_force_points, (255,0,0), ratio=.01, lineWidth=.04, fromPoint=False)]) # viewer.glWindow2.groundOffset[0] -= 10 viewer.glWindow2.groundSize = 100 else: viewer = ysv.SimpleViewer() # viewer.record(False) # viewer.doc.addRenderer('motionModel', cvr.VpModelRenderer(motionModel, (0,150,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('controlModel', cvr.VpModelRenderer(controlModel, (200,200,200), yr.POLYGON_LINE)) # viewer.doc.addObject('motion_ori', motion_ori) # viewer.doc.addRenderer('motion_ori', yr.JointMotionRenderer(motion_ori, (0,100,255), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_seg_orig', yr.JointMotionRenderer(motion_seg_orig, (0,100,255), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_seg', yr.JointMotionRenderer(motion_seg, (0,150,255), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_stitch', yr.JointMotionRenderer(motion_stitch, (0,255,200), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_stf_stabilize', yr.JointMotionRenderer(motion_stf_stabilize, (255,0,0), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_match_stl', yr.JointMotionRenderer(motion_match_stl, (255,200,0), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_swf_placement', yr.JointMotionRenderer(motion_swf_placement, (255,100,255), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_swf_height', yr.JointMotionRenderer(motion_swf_height, (50,255,255), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_swf_orientation', yr.JointMotionRenderer(motion_swf_orientation, (255,100,0), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_stf_push', yr.JointMotionRenderer(motion_stf_push, (50,255,200), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_stf_balancing', yr.JointMotionRenderer(motion_stf_balancing, (255,100,255), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_control', yr.JointMotionRenderer(motion_control, (255,0,0), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_debug1', yr.JointMotionRenderer(motion_debug1, (0,255,0), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_debug2', yr.JointMotionRenderer(motion_debug2, (255,0,255), yr.LINK_BONE)) # viewer.doc.addRenderer('motion_debug3', yr.JointMotionRenderer(motion_debug3, (255,255,0), yr.LINK_BONE)) # viewer.doc.addRenderer('M_tc', yr.JointMotionRenderer(M_tc, (255,255,0), yr.LINK_BONE)) # viewer.doc.addRenderer('P_hat', yr.JointMotionRenderer(P_hat, (255,255,0), yr.LINK_BONE)) # viewer.doc.addRenderer('P', yr.JointMotionRenderer(P, (255,255,0), yr.LINK_BONE)) # viewer.doc.addRenderer('M_hat_tc_1', yr.JointMotionRenderer(M_hat_tc_1, (255,255,0), yr.LINK_BONE)) # viewer.doc.addRenderer('rd_CM', yr.PointsRenderer(rd_CM, (255,255,0))) # viewer.doc.addRenderer('rd_CP', yr.PointsRenderer(rd_CP, (255,0,0))) # viewer.doc.addRenderer('rd_CMP', yr.PointsRenderer(rd_CMP, (0,255,0))) viewer.doc.addRenderer('forces', yr.ForcesRenderer(rd_forces, rd_force_points, (255,0,0), ratio=.01, lineWidth=.04, fromPoint=False)) # viewer.doc.addRenderer('torques', yr.VectorsRenderer(rd_torques, rd_joint_positions, (255,0,0))) # viewer.doc.addRenderer('rd_point1', yr.PointsRenderer(rd_point1, (0,255,0))) # viewer.doc.addRenderer('rd_point2', yr.PointsRenderer(rd_point2, (255,0,0))) # viewer.doc.addRenderer('rd_vec1', yr.VectorsRenderer(rd_vec1, rd_vecori1, (255,0,0))) # viewer.doc.addRenderer('rd_vec2', yr.VectorsRenderer(rd_vec2, rd_vecori2, (0,255,0))) # viewer.doc.addRenderer('rd_frame1', yr.FramesRenderer(rd_frame1, (0,200,200))) # viewer.doc.addRenderer('rd_frame2', yr.FramesRenderer(rd_frame2, (200,200,0))) # viewer.setMaxFrame(len(motion_ori)-1) if not REPEATED: viewer.setMaxFrame(len(motion_ori)-1) else: viewer.setMaxFrame(1440) if CAMERA_TRACKING: if MULTI_VIEWER: cameraTargets1 = [None] * (viewer.getMaxFrame()+1) cameraTargets2 = [None] * (viewer.getMaxFrame()+1) else: cameraTargets = [None] * (viewer.getMaxFrame()+1) if TORQUE_PLOT: rhip_torques = [0.]*viewer.getMaxFrame() rknee_torques = [0.]*viewer.getMaxFrame() rankle_torques = [0.]*viewer.getMaxFrame() pt = [0.] def postFrameCallback_Always(frame): if frame==1: pt[0] = time.time() if frame==31: print 'elapsed time for 30 frames:', time.time()-pt[0] if CAMERA_TRACKING: if MULTI_VIEWER: if cameraTargets1[frame]==None: cameraTargets1[frame] = motionModel.getBodyPositionGlobal(0) # cameraTargets1[frame] = motion_ori[frame].getJointPositionGlobal(0) viewer.setCameraTarget1(cameraTargets1[frame]) if cameraTargets2[frame]==None: cameraTargets2[frame] = controlModel.getJointPositionGlobal(0) viewer.setCameraTarget2(cameraTargets2[frame]) else: if cameraTargets[frame]==None: cameraTargets[frame] = controlModel.getJointPositionGlobal(0) viewer.setCameraTarget(cameraTargets[frame]) if plot!=None: plot.updateVline(frame) viewer.setPostFrameCallback_Always(postFrameCallback_Always) plot = None # plot = ymp.InteractivePlot() if plot!=None: plot.setXlimit(0, len(motion_ori)) plot.setYlimit(0., 1.) plot.addDataSet('zero') plot.addDataSet('diff') plot.addDataSet('debug1') plot.addDataSet('debug2') def viewer_onClose(data): if plot!=None: plot.close() viewer.onClose(data) viewer.callback(viewer_onClose) def simulateCallback(frame): # seginfo segIndex = seg_index[0] curState = seginfo[segIndex]['state'] curInterval = yma.offsetInterval(acc_offset[0], seginfo[segIndex]['interval']) stanceLegs = seginfo[segIndex]['stanceHips'] swingLegs = seginfo[segIndex]['swingHips'] stanceFoots = seginfo[segIndex]['stanceFoots'] swingFoots = seginfo[segIndex]['swingFoots'] swingKnees = seginfo[segIndex]['swingKnees'] groundHeight = seginfo[segIndex]['ground_height'] # maxStfPushFrame = seginfo[segIndex]['max_stf_push_frame'] prev_frame = frame-1 if frame>0 else 0 # prev_frame = frame # information # dCM_tar = yrp.getCM(motion_seg.getJointVelocitiesGlobal(frame), bodyMasses, upperMass, uppers) # CM_tar = yrp.getCM(motion_seg.getJointPositionsGlobal(frame), bodyMasses, upperMass, uppers) ## dCM_tar = yrp.getCM(motion_seg.getJointVelocitiesGlobal(frame), bodyMasses, totalMass) ## CM_tar = yrp.getCM(motion_seg.getJointPositionsGlobal(frame), bodyMasses, totalMass) # stf_tar = motion_seg.getJointPositionGlobal(stanceFoots[0], frame) # CMr_tar = CM_tar - stf_tar dCM_tar = motion_seg.getJointVelocityGlobal(0, prev_frame) CM_tar = motion_seg.getJointPositionGlobal(0, prev_frame) # dCM_tar = yrp.getCM(motion_seg.getJointVelocitiesGlobal(prev_frame), bodyMasses, upperMass, uppers) # CM_tar = yrp.getCM(motion_seg.getJointPositionsGlobal(prev_frame), bodyMasses, upperMass, uppers) # dCM_tar = yrp.getCM(motion_seg.getJointVelocitiesGlobal(prev_frame), bodyMasses, totalMass) # CM_tar = yrp.getCM(motion_seg.getJointPositionsGlobal(prev_frame), bodyMasses, totalMass) stf_tar = motion_seg.getJointPositionGlobal(stanceFoots[0], prev_frame) CMr_tar = CM_tar - stf_tar dCM = avg_dCM[0] CM = controlModel.getJointPositionGlobal(0) # CM = yrp.getCM(controlModel.getJointPositionsGlobal(), bodyMasses, upperMass, uppers) # CM = yrp.getCM(controlModel.getJointPositionsGlobal(), bodyMasses, totalMass) CMreal = yrp.getCM(controlModel.getJointPositionsGlobal(), bodyMasses, totalMass) stf = controlModel.getJointPositionGlobal(stanceFoots[0]) CMr = CM - stf diff_dCM = mm.projectionOnPlane(dCM-dCM_tar, (1,0,0), (0,0,1)) diff_dCM_axis = np.cross((0,1,0), diff_dCM) rd_vec1[0] = diff_dCM; rd_vecori1[0] = CM_tar diff_CMr = mm.projectionOnPlane(CMr-CMr_tar, (1,0,0), (0,0,1)) # rd_vec1[0] = diff_CMr; rd_vecori1[0] = stf_tar diff_CMr_axis = np.cross((0,1,0), diff_CMr) direction = mm.normalize2(mm.projectionOnPlane(dCM_tar, (1,0,0), (0,0,1))) # direction = mm.normalize2(mm.projectionOnPlane(dCM, (1,0,0), (0,0,1))) directionAxis = np.cross((0,1,0), direction) diff_dCM_sag, diff_dCM_cor = mm.projectionOnVector2(diff_dCM, direction) # rd_vec1[0] = diff_dCM_sag; rd_vecori1[0] = CM_tar diff_dCM_sag_axis = np.cross((0,1,0), diff_dCM_sag) diff_dCM_cor_axis = np.cross((0,1,0), diff_dCM_cor) diff_CMr_sag, diff_CMr_cor = mm.projectionOnVector2(diff_CMr, direction) diff_CMr_sag_axis = np.cross((0,1,0), diff_CMr_sag) diff_CMr_cor_axis = np.cross((0,1,0), diff_CMr_cor) t = (frame-curInterval[0])/float(curInterval[1]-curInterval[0]) t_raw = t if t>1.: t=1. p_root = motion_stitch[frame].getJointPositionGlobal(0) R_root = motion_stitch[frame].getJointOrientationGlobal(0) motion_seg_orig.goToFrame(frame) motion_seg.goToFrame(frame) motion_stitch.goToFrame(frame) motion_debug1.append(motion_stitch[frame].copy()) motion_debug1.goToFrame(frame) motion_debug2.append(motion_stitch[frame].copy()) motion_debug2.goToFrame(frame) motion_debug3.append(motion_stitch[frame].copy()) motion_debug3.goToFrame(frame) # paper implementation M_tc.append(motion_stitch[prev_frame]) M_tc.goToFrame(frame) P_hat.append(M_tc[frame].copy()) P_hat.goToFrame(frame) p_temp = ym.JointPosture(skeleton) p_temp.rootPos = controlModel.getJointPositionGlobal(0) p_temp.setJointOrientationsLocal(controlModel.getJointOrientationsLocal()) P.append(p_temp) P.goToFrame(frame) # stance foot stabilize motion_stf_stabilize.append(motion_stitch[frame].copy()) motion_stf_stabilize.goToFrame(frame) if STANCE_FOOT_STABILIZE: for stanceFoot in stanceFoots: R_target_foot = motion_seg[frame].getJointOrientationGlobal(stanceFoot) R_current_foot = motion_stf_stabilize[frame].getJointOrientationGlobal(stanceFoot) motion_stf_stabilize[frame].setJointOrientationGlobal(stanceFoot, cm.slerp(R_current_foot, R_target_foot , stf_stabilize_func(t))) # R_target_foot = motion_seg[frame].getJointOrientationLocal(stanceFoot) # R_current_foot = motion_stf_stabilize[frame].getJointOrientationLocal(stanceFoot) # motion_stf_stabilize[frame].setJointOrientationLocal(stanceFoot, cm.slerp(R_current_foot, R_target_foot , stf_stabilize_func(t))) # match stance leg motion_match_stl.append(motion_stf_stabilize[frame].copy()) motion_match_stl.goToFrame(frame) if MATCH_STANCE_LEG: if curState!=yba.GaitState.STOP: for i in range(len(stanceLegs)): stanceLeg = stanceLegs[i] stanceFoot = stanceFoots[i] # # motion stance leg -> character stance leg as time goes R_motion = motion_match_stl[frame].getJointOrientationGlobal(stanceLeg) R_character = controlModel.getJointOrientationGlobal(stanceLeg) motion_match_stl[frame].setJointOrientationGlobal(stanceLeg, cm.slerp(R_motion, R_character, match_stl_func(t))) # t_y = match_stl_func_y(t) # t_xz = match_stl_func(t) # # R_motion = motion_match_stl[frame].getJointOrientationGlobal(stanceLeg) # R_character = controlModel.getJointOrientationGlobal(stanceLeg) # R = np.dot(R_character, R_motion.T) # R_y, R_xz = mm.projectRotation((0,1,0), R) # motion_match_stl[frame].mulJointOrientationGlobal(stanceLeg, mm.scaleSO3(R_xz, t_xz)) # motion_match_stl[frame].mulJointOrientationGlobal(stanceLeg, mm.scaleSO3(R_y, t_y)) # swing foot placement motion_swf_placement.append(motion_match_stl[frame].copy()) motion_swf_placement.goToFrame(frame) if SWING_FOOT_PLACEMENT: t_swing_foot_placement = swf_placement_func(t); if extended[0]: R_swp_sag = prev_R_swp[0][0] R_swp_cor = prev_R_swp[0][1] else: R_swp_sag = mm.I_SO3(); R_swp_cor = mm.I_SO3() R_swp_cor = np.dot(R_swp_cor, mm.exp(diff_dCM_cor_axis * K_swp_vel_cor * -t_swing_foot_placement)) if np.dot(direction, diff_CMr_sag) < 0: R_swp_sag = np.dot(R_swp_sag, mm.exp(diff_dCM_sag_axis * K_swp_vel_sag * -t_swing_foot_placement)) R_swp_sag = np.dot(R_swp_sag, mm.exp(diff_CMr_sag_axis * K_swp_pos_sag * -t_swing_foot_placement)) else: R_swp_sag = np.dot(R_swp_sag, mm.exp(diff_dCM_sag_axis * K_swp_vel_sag_faster * -t_swing_foot_placement)) R_swp_sag = np.dot(R_swp_sag, mm.exp(diff_CMr_sag_axis * K_swp_pos_sag_faster * -t_swing_foot_placement)) R_swp_cor = np.dot(R_swp_cor, mm.exp(diff_CMr_cor_axis * K_swp_pos_cor * -t_swing_foot_placement)) for i in range(len(swingLegs)): swingLeg = swingLegs[i] swingFoot = swingFoots[i] # save swing foot global orientation # R_swf = motion_swf_placement[frame].getJointOrientationGlobal(swingFoot) # rotate swing leg motion_swf_placement[frame].mulJointOrientationGlobal(swingLeg, R_swp_sag) motion_swf_placement[frame].mulJointOrientationGlobal(swingLeg, R_swp_cor) # restore swing foot global orientation # motion_swf_placement[frame].setJointOrientationGlobal(swingFoot, R_swf) prev_R_swp[0] = (R_swp_sag, R_swp_cor) # swing foot height motion_swf_height.append(motion_swf_placement[frame].copy()) motion_swf_height.goToFrame(frame) if SWING_FOOT_HEIGHT: for swingFoot in swingFoots: stanceFoot = stanceFoots[0] # save foot global orientation R_foot = motion_swf_height[frame].getJointOrientationGlobal(swingFoot) R_stance_foot = motion_swf_height[frame].getJointOrientationGlobal(stanceFoot) if OLD_SWING_HEIGHT: height_tar = motion_swf_height[frame].getJointPositionGlobal(swingFoot)[1] - motion_swf_height[frame].getJointPositionGlobal(stanceFoot)[1] else: height_tar = motion_swf_height[prev_frame].getJointPositionGlobal(swingFoot)[1] - groundHeight d_height_tar = motion_swf_height.getJointVelocityGlobal(swingFoot, prev_frame)[1] # height_tar += c_swf_mid_offset * swf_height_sine_func(t) # motion_debug1[frame] = motion_swf_height[frame].copy() # rotate motion_swf_height[frame].rotateByTarget(controlModel.getJointOrientationGlobal(0)) # motion_debug2[frame] = motion_swf_height[frame].copy() # motion_debug2[frame].translateByTarget(controlModel.getJointPositionGlobal(0)) if OLD_SWING_HEIGHT: height_cur = motion_swf_height[frame].getJointPositionGlobal(swingFoot)[1] - motion_swf_height[frame].getJointPositionGlobal(stanceFoot)[1] else: height_cur = controlModel.getJointPositionGlobal(swingFoot)[1] - halfFootHeight - c_swf_offset d_height_cur = controlModel.getJointVelocityGlobal(swingFoot)[1] if OLD_SWING_HEIGHT: offset_height = (height_tar - height_cur) * swf_height_func(t) * c5 else: offset_height = ((height_tar - height_cur) * c5 + (d_height_tar - d_height_cur) * c6) * swf_height_func(t) offset_sine = c_swf_mid_offset * swf_height_sine_func(t) # offset_sine = 0. offset = 0. offset += offset_height offset += offset_sine if offset > 0.: newPosition = motion_swf_height[frame].getJointPositionGlobal(swingFoot) newPosition[1] += offset aik.ik_analytic(motion_swf_height[frame], swingFoot, newPosition) else: if HIGHER_OFFSET: newPosition = motion_swf_height[frame].getJointPositionGlobal(stanceFoot) newPosition[1] -= offset aik.ik_analytic(motion_swf_height[frame], stanceFoot, newPosition) # return # motion_debug3[frame] = motion_swf_height[frame].copy() # motion_debug3[frame].translateByTarget(controlModel.getJointPositionGlobal(0)) motion_swf_height[frame].rotateByTarget(R_root) # restore foot global orientation motion_swf_height[frame].setJointOrientationGlobal(swingFoot, R_foot) motion_swf_height[frame].setJointOrientationGlobal(stanceFoot, R_stance_foot) if plot!=None: plot.addDataPoint('debug1', frame, offset_height) plot.addDataPoint('debug2', frame, height_tar - height_cur) # plot.addDataPoint('diff', frame, diff) # swing foot orientation motion_swf_orientation.append(motion_swf_height[frame].copy()) motion_swf_orientation.goToFrame(frame) if SWING_FOOT_ORIENTATION: swf_orientation_func = yfg.concatenate([yfg.zero, yfg.hermite2nd, yfg.one], [.25, .75]) for swingFoot in swingFoots: R_target_foot = motion_seg[curInterval[1]].getJointOrientationGlobal(swingFoot) R_current_foot = motion_swf_orientation[frame].getJointOrientationGlobal(swingFoot) motion_swf_orientation[frame].setJointOrientationGlobal(swingFoot, cm.slerp(R_current_foot, R_target_foot, swf_orientation_func(t))) # swf_stabilize_func = yfg.concatenate([yfg.hermite2nd, yfg.one], [c_taking_duration]) # push orientation # for swingFoot in swingFoots: # R_target_foot = motion_seg[frame].getJointOrientationGlobal(swingFoot) # R_current_foot = motion_swf_orientation[frame].getJointOrientationGlobal(swingFoot) # motion_swf_orientation[frame].setJointOrientationGlobal(swingFoot, cm.slerp(R_current_foot, R_target_foot , swf_stabilize_func(t))) # stance foot push motion_stf_push.append(motion_swf_orientation[frame].copy()) motion_stf_push.goToFrame(frame) if STANCE_FOOT_PUSH: for swingFoot in swingFoots: # max_t = (maxStfPushFrame)/float(curInterval[1]-curInterval[0]) # stf_push_func = yfg.concatenate([yfg.sine, yfg.zero], [max_t*2]) stf_push_func = yfg.concatenate([yfg.sine, yfg.zero], [c_taking_duration*2]) R_swp_sag = mm.I_SO3() # R_swp_sag = np.dot(R_swp_sag, mm.exp(diff_dCM_sag_axis * K_stp_vel * -stf_push_func(t))) # if step_length_cur[0] < step_length_tar[0]: # ratio = step_length_cur[0] / step_length_tar[0] # R_max = maxmaxStfPushFrame # R_zero = R_swp_sag = np.dot(R_swp_sag, mm.exp((step_length_tar[0] - step_length_cur[0])*step_axis[0] * K_stp_pos * -stf_push_func(t))) motion_stf_push[frame].mulJointOrientationGlobal(swingFoot, R_swp_sag) # stance foot balancing motion_stf_balancing.append(motion_stf_push[frame].copy()) motion_stf_balancing.goToFrame(frame) if STANCE_FOOT_BALANCING: R_stb = mm.exp(diff_dCM_axis * K_stb_vel * stf_balancing_func(t)) R_stb = np.dot(R_stb, mm.exp(diff_CMr_axis * K_stb_pos * stf_balancing_func(t))) for stanceFoot in stanceFoots: if frame < 5: continue motion_stf_balancing[frame].mulJointOrientationGlobal(stanceFoot, R_stb) # control trajectory motion_control.append(motion_stf_balancing[frame].copy()) motion_control.goToFrame(frame) #======================================================================= # tracking with inverse dynamics #======================================================================= th_r = motion_control.getDOFPositions(frame) th = controlModel.getDOFPositions() dth_r = motion_control.getDOFVelocities(frame) dth = controlModel.getDOFVelocities() ddth_r = motion_control.getDOFAccelerations(frame) ddth_des = yct.getDesiredDOFAccelerations(th_r, th, dth_r, dth, ddth_r, Kt, Dt) #======================================================================= # simulation #======================================================================= CP = mm.v3(0.,0.,0.) F = mm.v3(0.,0.,0.) avg_dCM[0] = mm.v3(0.,0.,0.) # external force rendering info del rd_forces[:]; del rd_force_points[:] for fi in forceInfos: if fi.startFrame <= frame and frame < fi.startFrame + fi.duration*(1/frameTime): rd_forces.append(fi.force) rd_force_points.append(controlModel.getBodyPositionGlobal(fi.targetBody) + -mm.normalize2(fi.force)*.2) for i in range(stepsPerFrame): bodyIDs, contactPositions, contactPositionLocals, contactForces = vpWorld.calcPenaltyForce(bodyIDsToCheck, mus, Ks, Ds) vpWorld.applyPenaltyForce(bodyIDs, contactPositionLocals, contactForces) # apply external force for fi in forceInfos: if fi.startFrame <= frame and frame < fi.startFrame + fi.duration*(1/frameTime): controlModel.applyBodyForceGlobal(fi.targetBody, fi.force) controlModel.setDOFAccelerations(ddth_des) controlModel.solveHybridDynamics() # # apply external force # for fi in forceInfos: # if fi.startFrame <= frame and frame < fi.startFrame + fi.duration*(1/frameTime): # controlModel.applyBodyForceGlobal(fi.targetBody, fi.force) vpWorld.step() # yvu.align2D(controlModel) if len(contactForces) > 0: CP += yrp.getCP(contactPositions, contactForces) F += sum(contactForces) avg_dCM[0] += controlModel.getJointVelocityGlobal(0) # avg_dCM[0] += yrp.getCM(controlModel.getJointVelocitiesGlobal(), bodyMasses, upperMass, uppers) # avg_dCM[0] += yrp.getCM(controlModel.getJointVelocitiesGlobal(), bodyMasses, totalMass) # if len(stanceFoots)>0: # avg_stf_v[0] += controlModel.getJointVelocityGlobal(stanceFoots[0]) # avg_stf_av[0] += controlModel.getJointAngVelocityGlobal(stanceFoots[0]) CP /= stepsPerFrame F /= stepsPerFrame avg_dCM[0] /= stepsPerFrame # if len(stanceFoots)>0: # avg_stf_v[0] /= stepsPerFrame # avg_stf_av[0] /= stepsPerFrame # rd_vec1[0] = avg_stf_av[0]; rd_vec1[0][0] = 0.; rd_vec1[0][2] = 0. # rd_vecori1[0]= controlModel.getJointPositionGlobal(stanceFoots[0]) #======================================================================= # segment editing #======================================================================= lastFrame = False if SEGMENT_EDITING: if curState==yba.GaitState.STOP: if frame == len(motion_seg)-1: lastFrame = True elif (curState==yba.GaitState.LSWING or curState==yba.GaitState.RSWING) and t>c_min_contact_time: swingID = lID if curState==yba.GaitState.LSWING else rID contact = False if swingID in bodyIDs: minContactVel = 1000. for i in range(len(bodyIDs)): if bodyIDs[i]==swingID: vel = controlModel.getBodyVelocityGlobal(swingID, contactPositionLocals[i]) vel[1] = 0 contactVel = mm.length(vel) if contactVel < minContactVel: minContactVel = contactVel if minContactVel < c_min_contact_vel: contact = True extended[0] = False if contact: # print frame, 'foot touch' lastFrame = True acc_offset[0] += frame - curInterval[1] elif frame == len(motion_seg)-1: print frame, 'extend frame', frame+1 preserveJoints = [] # preserveJoints = [lFoot, rFoot] # preserveJoints = [lFoot, rFoot, lKnee, rKnee] # preserveJoints = [lFoot, rFoot, lKnee, rKnee, lUpLeg, rUpLeg] stanceKnees = [rKnee] if curState==yba.GaitState.LSWING else [lKnee] preserveJoints = [stanceFoots[0], stanceKnees[0], stanceLegs[0]] diff = 3 motion_seg_orig.extend([motion_seg_orig[-1]]) motion_seg.extend(ymt.extendByIntegration_root(motion_seg, 1, diff)) motion_stitch.extend(ymt.extendByIntegration_constant(motion_stitch, 1, preserveJoints, diff)) # # extend for swing foot ground speed matching & swing foot height lower ## extendedPostures = ymt.extendByIntegration(motion_stitch, 1, preserveJoints, diff) ## extendedPostures = [motion_stitch[-1]] ## # extendFrameNum = frame - curInterval[1] + 1 # k = 1.-extendFrameNum/5. # if k<0.: k=0. # extendedPostures = ymt.extendByIntegrationAttenuation(motion_stitch, 1, preserveJoints, diff, k) # ## if len(swingFoots)>0 and np.inner(dCM_tar, dCM)>0.: ## print frame, 'speed matching' ## R_swf = motion_stitch[-1].getJointOrientationGlobal(swingFoots[0]) ## ## p_swf = motion_stitch[-1].getJointPositionGlobal(swingFoots[0]) ## v_swf = motion_stitch.getJointVelocityGlobal(swingFoots[0], frame-diff, frame) ## a_swf = motion_stitch.getJointAccelerationGlobal(swingFoots[0], frame-diff, frame) ## p_swf += v_swf * (frameTime) + a_swf * (frameTime)*(frameTime) ## aik.ik_analytic(extendedPostures[0], swingFoots[0], p_swf) ## ## extendedPostures[0].setJointOrientationGlobal(swingFoots[0], R_swf) # # motion_stitch.extend(extendedPostures) extended[0] = True else: if frame == len(motion_seg)-1: lastFrame = True if lastFrame: if segIndex < len(segments)-1: print '%d (%d): end of %dth seg (%s, %s)'%(frame, frame-curInterval[1],segIndex, yba.GaitState.text[curState], curInterval) if plot!=None: plot.addDataPoint('diff', frame, (frame-curInterval[1])*.01) if len(stanceFoots)>0 and len(swingFoots)>0: # step_cur = controlModel.getJointPositionGlobal(swingFoots[0]) - controlModel.getJointPositionGlobal(stanceFoots[0]) # step_tar = motion_seg[curInterval[1]].getJointPositionGlobal(swingFoots[0]) - motion_seg[curInterval[1]].getJointPositionGlobal(stanceFoots[0]) step_cur = controlModel.getJointPositionGlobal(0) - controlModel.getJointPositionGlobal(stanceFoots[0]) step_tar = motion_seg[curInterval[1]].getJointPositionGlobal(0) - motion_seg[curInterval[1]].getJointPositionGlobal(stanceFoots[0]) step_cur = mm.projectionOnPlane(step_cur, (1,0,0), (0,0,1)) step_tar = mm.projectionOnPlane(step_tar, (1,0,0), (0,0,1)) step_cur_sag, step_cur_cor = mm.projectionOnVector2(step_cur, direction) step_tar_sag, step_tar_cor = mm.projectionOnVector2(step_tar, direction) step_length_tar[0] = mm.length(step_tar_sag) if np.inner(step_tar_sag, step_cur_sag) > 0: step_length_cur[0] = mm.length(step_cur_sag) else: step_length_cur[0] = -mm.length(step_cur_sag) step_axis[0] = directionAxis # rd_vec1[0] = step_tar_sag # rd_vecori1[0] = motion_seg[curInterval[1]].getJointPositionGlobal(stanceFoots[0]) # rd_vec2[0] = step_cur_sag # rd_vecori2[0] = controlModel.getJointPositionGlobal(stanceFoots[0]) seg_index[0] += 1 curSeg = segments[seg_index[0]] stl_y_limit_num[0] = 0 stl_xz_limit_num[0] = 0 del motion_seg_orig[frame+1:] motion_seg_orig.extend(ymb.getAttachedNextMotion(curSeg, motion_seg_orig[-1], False, False)) del motion_seg[frame+1:] del motion_stitch[frame+1:] transitionLength = len(curSeg)-1 # motion_seg.extend(ymb.getAttachedNextMotion(curSeg, motion_seg[-1], False, False)) # motion_stitch.extend(ymb.getStitchedNextMotion(curSeg, motion_control[-1], transitionLength, stitch_func, True, False)) d = motion_seg[-1] - curSeg[0] d.rootPos[1] = 0. motion_seg.extend(ymb.getAttachedNextMotion(curSeg, d, True, False)) d = motion_control[-1] - curSeg[0] d.rootPos[1] = 0. motion_stitch.extend(ymb.getStitchedNextMotion(curSeg, d, transitionLength, stitch_func, True, False)) # motion_seg.extend(ymb.getAttachedNextMotion(curSeg, motion_seg[-1], False, True)) # motion_stitch.extend(ymb.getStitchedNextMotion(curSeg, motion_control[-1], transitionLength, stitch_func, True, True)) else: motion_seg_orig.append(motion_seg_orig[-1]) motion_seg.append(motion_seg[-1]) motion_stitch.append(motion_control[-1]) # rendering motionModel.update(motion_ori[frame]) # motionModel.update(motion_seg[frame]) rd_CP[0] = CP rd_CMP[0] = (CMreal[0] - (F[0]/F[1])*CMreal[1], 0, CMreal[2] - (F[2]/F[1])*CMreal[1]) if plot!=None: plot.addDataPoint('zero', frame, 0) plot.updatePoints() viewer.setSimulateCallback(simulateCallback) if MULTI_VIEWER: viewer.startTimer(frameTime / 1.4) else: viewer.startTimer(frameTime * .1) viewer.show() Fl.run()
def create_biped(): # motion #motionName = 'wd2_n_kick.bvh' if MOTION == STAND: motionName = 'wd2_stand.bvh' elif MOTION == FORWARD_JUMP: motionName = 'woddy2_jump0.bvh' elif MOTION == TAEKWONDO: motionName = './MotionFile/wd2_098_V001.bvh' #motionName = 'ww13_41_V001.bvh' motion = yf.readBvhFile(motionName, .01) yme.removeJoint(motion, HEAD, False) yme.removeJoint(motion, RIGHT_SHOULDER, False) yme.removeJoint(motion, LEFT_SHOULDER, False) #yme.removeJoint(motion, RIGHT_TOES_END, False) #yme.removeJoint(motion, LEFT_TOES_END, False) yme.removeJoint(motion, RIGHT_HAND_END, False) yme.removeJoint(motion, LEFT_HAND_END, False) yme.offsetJointLocal(motion, RIGHT_ARM, (.03, -.05, 0), False) yme.offsetJointLocal(motion, LEFT_ARM, (-.03, -.05, 0), False) yme.rotateJointLocal(motion, HIP, mm.exp(mm.v3(1, 0, 0), .01), False) yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(2.5, -0.0, .3), -.5), False) yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(2.5, 0.0, -.3), -.5), False) if MOTION == FORWARD_JUMP: yme.rotateJointLocal(motion, LEFT_UP_LEG, mm.exp(mm.v3(0.0, .0, 1.), .08), False) yme.rotateJointLocal(motion, LEFT_LEG, mm.exp(mm.v3(0.0, 1.0, 0.), -.2), False) #yme.offsetJointLocal(motion, LEFT_TOES, (.03,-.05,0), False) yme.addJoint(motion, RIGHT_FOOT, RIGHT_CALCA) yme.addJoint(motion, RIGHT_CALCA, 'RIGHT_Dummy') yme.addJoint(motion, LEFT_FOOT, LEFT_CALCA) yme.addJoint(motion, LEFT_CALCA, 'LEFT_Dummy') if 0: yme.rotateJointLocal(motion, LEFT_TOES, mm.exp(mm.v3(1., 0.0, 0.0), .2), False) yme.rotateJointLocal(motion, RIGHT_TOES, mm.exp(mm.v3(1., 0.0, 0.0), .2), False) yme.rotateJointLocal(motion, LEFT_CALCA, mm.exp(mm.v3(1., 0.0, 0.0), .7), False) yme.rotateJointLocal(motion, RIGHT_CALCA, mm.exp(mm.v3(1., 0.0, 0.0), .7), False) else: yme.rotateJointLocal(motion, LEFT_TOES, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, RIGHT_TOES, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, LEFT_CALCA, mm.exp(mm.v3(1., 0.0, 0.0), .52), False) yme.rotateJointLocal(motion, RIGHT_CALCA, mm.exp(mm.v3(1., 0.0, 0.0), .52), False) yme.updateGlobalT(motion) ################ if MOTION == FORWARD_JUMP: motion = motion[515:555] elif MOTION == TAEKWONDO: ## Taekwondo base-step motion = motion[0:31] #motion = motion[564:600] ## Taekwondo turning-kick #motion = motion[100:-1] motion[0:0] = [motion[0]] * 100 motion.extend([motion[-1]] * 5000) # world, model mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .9 for name in massMap: node = mcfg.addNode(name) node.mass = massMap[name] node = mcfg.getNode(HIP) node.length = .2 node.width = .25 node = mcfg.getNode(SPINE1) node.length = .2 node.offset = (0, 0, 0.1) node = mcfg.getNode(SPINE) node.width = .22 #node.length = .2 #### node = mcfg.getNode(RIGHT_FOOT) node.length = .1 node.width = .2 node.mass = 1.5 node = mcfg.getNode(LEFT_FOOT) node.length = .1 node.width = .2 node.mass = 1.5 node = mcfg.getNode(LEFT_TOES) node.length = .1 node.width = .2 node.mass = 1.5 node.offset = (0, 0.0, -0.02) node = mcfg.getNode(RIGHT_TOES) node.length = .1 node.width = .2 node.mass = 1.5 node.offset = (0, 0.0, -0.02) node = mcfg.getNode(LEFT_CALCA) node.length = .1 node.width = .2 node.mass = 1.5 node.offset = (0, 0.0, -0.08) node = mcfg.getNode(RIGHT_CALCA) node.length = .1 node.width = .2 node.mass = 1.5 node.offset = (0, 0.0, -0.08) wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False stepsPerFrame = 30 wcfg.timeStep = (1 / 30.) / (stepsPerFrame) #stepsPerFrame = 10 #wcfg.timeStep = (1/120.)/(stepsPerFrame) #wcfg.timeStep = (1/1800.) # parameter config = {} ''' config['Kt'] = 200; config['Dt'] = 2*(config['Kt']**.5) # tracking gain config['Kl'] = 2.5; config['Dl'] = 2*(config['Kl']**.5) # linear balance gain config['Kh'] = 1; config['Dh'] = 2*(config['Kh']**.5) # angular balance gain config['Ks'] = 20000; config['Ds'] = 2*(config['Ks']**.5) # penalty force spring gain config['Bt'] = 1. config['Bl'] = 2.5 config['Bh'] = 1. ''' config['Kt'] = 200 config['Dt'] = 2 * (config['Kt']**.5) # tracking gain config['Kl'] = .10 config['Dl'] = 2 * (config['Kl']**.5) # linear balance gain config['Kh'] = 0.1 config['Dh'] = 2 * (config['Kh']**.5) # angular balance gain config['Ks'] = 20000 config['Ds'] = 2 * (config['Ks']**.5) # penalty force spring gain config['Bt'] = 1. config['Bl'] = 1. #0.5 config['Bh'] = 1. config['weightMap']={RIGHT_ARM:.2, RIGHT_FORE_ARM:.2, LEFT_ARM:.2, LEFT_FORE_ARM:.2,\ SPINE:.3, SPINE1:.3, RIGHT_FOOT:.3, LEFT_FOOT:.3, HIP:.5,\ RIGHT_UP_LEG:.1, RIGHT_LEG:.3, LEFT_UP_LEG:.1, LEFT_LEG:.3, LEFT_TOES:.1, RIGHT_TOES:.1, LEFT_CALCA:.3, RIGHT_CALCA:.3} config['IKweightMap']={RIGHT_ARM:.2, RIGHT_FORE_ARM:.2, LEFT_ARM:.2, LEFT_FORE_ARM:.2,\ SPINE:.3, SPINE1:.3, RIGHT_FOOT:.3, LEFT_FOOT:.3, HIP:.5,\ RIGHT_UP_LEG:.1, RIGHT_LEG:.3, LEFT_UP_LEG:.1, LEFT_LEG:.3} ''' config['IKweightMap']={RIGHT_ARM:.2, RIGHT_FORE_ARM:.2, LEFT_ARM:.2, LEFT_FORE_ARM:.2,\ SPINE:0.5, SPINE1:0.5, RIGHT_FOOT:1.2, LEFT_FOOT:1.2, HIP:1.2,\ RIGHT_UP_LEG:.9, RIGHT_LEG:.9, LEFT_UP_LEG:.9, LEFT_LEG:.9} ''' config['weightMap2']={RIGHT_ARM:.2, RIGHT_FORE_ARM:.2, LEFT_ARM:.2, LEFT_FORE_ARM:.2,\ SPINE:1.5, LEFT_FOOT:1., HIP:1.5,\ RIGHT_UP_LEG:1., RIGHT_LEG:1., LEFT_UP_LEG:1., LEFT_LEG:1., LEFT_TOES:.1, RIGHT_TOES:.1, LEFT_CALCA:.1, RIGHT_CALCA:.1} config['supLink'] = LEFT_FOOT config['supLink2'] = RIGHT_FOOT #config['end'] = 'HIP' config['end'] = SPINE1 config['const'] = HIP config['root'] = HIP config['leftForeFoot'] = LEFT_TOES config['rightForeFoot'] = RIGHT_TOES config['leftRearFoot'] = LEFT_CALCA config['rightRearFoot'] = RIGHT_CALCA return motion, mcfg, wcfg, stepsPerFrame, config
def test_body_pos_vel_acc_funcs(): # bvhFilePath = '../samples/chain_6.bvh' # bvhFilePath = '../samples/block_3_rotate.bvh' bvhFilePath = '../samples/block_tree_rotate.bvh' motion = yf.readBvhFile(bvhFilePath) bvhFilePath = '../samples/chain_1.bvh' motion2 = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) # mcfg.getNode('root').density = 1000000. mcfg2 = ypc.ModelConfig() for i in range(motion2[0].skeleton.getElementNum()): mcfg2.addNode(motion2[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. # wcfg.gravity = (0,0,0) stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) motionModel = cvm.VpMotionModel(vpWorld, motion[0], mcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) controlModel2 = cvm.VpControlModel(vpWorld, motion2[0], mcfg2) vpWorld.initialize() controlModel.fixBody(0) motionModel.recordVelByFiniteDiff() controlModel2.setBodyPositionGlobal(0, (0,1,-1)) cm_p = [mm.O_Vec3()]*controlModel.getBodyNum() cm_v = [mm.O_Vec3()]*controlModel.getBodyNum() cm_a = [mm.O_Vec3()]*controlModel.getBodyNum() cm_av = [mm.O_Vec3()]*controlModel.getBodyNum() cm_aa = [mm.O_Vec3()]*controlModel.getBodyNum() mm_p = [mm.O_Vec3()]*motionModel.getBodyNum() mm_v = [mm.O_Vec3()]*motionModel.getBodyNum() mm_a = [mm.O_Vec3()]*motionModel.getBodyNum() mm_av = [mm.O_Vec3()]*motionModel.getBodyNum() mm_aa = [mm.O_Vec3()]*motionModel.getBodyNum() viewer = ysv.SimpleViewer() viewer.record(False) # viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('controlModel', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) viewer.doc.addRenderer('motionModel', cvr.VpModelRenderer(motionModel, (100,100,100), yr.POLYGON_LINE)) viewer.doc.addRenderer('controlModel2', cvr.VpModelRenderer(controlModel2, (255,240,255), yr.POLYGON_LINE)) # viewer.doc.addRenderer('cm_p', yr.PointsRenderer(cm_p, (0,0,255))) viewer.doc.addRenderer('cm_v', yr.VectorsRenderer(cm_v, cm_p, (255,0,0))) # viewer.doc.addRenderer('cm_a', yr.VectorsRenderer(cm_a, cm_p, (0,255,0))) # viewer.doc.addRenderer('cm_av', yr.VectorsRenderer(cm_av, cm_p, (255,255,0))) # viewer.doc.addRenderer('cm_aa', yr.VectorsRenderer(cm_aa, cm_p, (0,255,255))) # viewer.doc.addRenderer('mm_p', yr.PointsRenderer(mm_p, (200,200,0))) viewer.doc.addRenderer('mm_v', yr.VectorsRenderer(mm_v, mm_p, (200,200,0))) # viewer.doc.addRenderer('mm_a', yr.VectorsRenderer(mm_a, mm_p, (200,200,0))) # viewer.doc.addRenderer('mm_av', yr.VectorsRenderer(mm_av, mm_p, (0,200,0))) controlModel.applyBodyTorqueGlobal(1, (0,0,200)) controlModel2.applyBodyTorqueGlobal(0, (0,0,200)) def simulateCallback(frame): for i in range(stepsPerFrame): vpWorld.step() motionModel.update(motion[frame]) # controlModel.applyBodyTorqueGlobal(1, (0,0,10)) # controlModel2.applyBodyTorqueGlobal(0, (0,0,10)) cm_p[:] = controlModel.getBodyPositionsGlobal() + controlModel2.getBodyPositionsGlobal() cm_v[:] = controlModel.getBodyVelocitiesGlobal() + controlModel2.getBodyVelocitiesGlobal() # cm_p.append(controlModel.getBodyPositionGlobal(1, (0,0,.25))) # cm_v.append(controlModel.getBodyVelocityGlobal(1, (0,0,.25))) # cm_p.append(controlModel.getBodyPositionGlobal(1, (0,0,-.25))) # cm_v.append(controlModel.getBodyVelocityGlobal(1, (0,0,-.25))) cm_a[:] = controlModel.getBodyAccelerationsGlobal() + controlModel2.getBodyAccelerationsGlobal() cm_av[:] = controlModel.getBodyAngVelocitiesGlobal() + controlModel2.getBodyAngVelocitiesGlobal() cm_aa[:] = controlModel.getBodyAngAccelerationsGlobal() + controlModel2.getBodyAngAccelerationsGlobal() mm_p[:] = motionModel.getBodyPositionsGlobal() mm_v[:] = motionModel.getBodyVelocitiesGlobal() mm_av[:] = motionModel.getBodyAngVelocitiesGlobal() viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()
def create_biped(): # motion #motionName = 'wd2_n_kick.bvh' if MOTION == STAND: motionName = 'wd2_stand.bvh' elif MOTION == FORWARD_JUMP: motionName = 'woddy2_jump0.bvh' elif MOTION == TAEKWONDO: motionName = './MotionFile/wd2_098_V001.bvh' #motionName = 'ww13_41_V001.bvh' motion = yf.readBvhFile(motionName, .01) yme.removeJoint(motion, HEAD, False) yme.removeJoint(motion, RIGHT_SHOULDER, False) yme.removeJoint(motion, LEFT_SHOULDER, False) if FOOT_PART_NUM == 1: yme.removeJoint(motion, RIGHT_TOES_END, False) yme.removeJoint(motion, LEFT_TOES_END, False) yme.removeJoint(motion, RIGHT_HAND_END, False) yme.removeJoint(motion, LEFT_HAND_END, False) yme.offsetJointLocal(motion, RIGHT_ARM, (.03, -.05, 0), False) yme.offsetJointLocal(motion, LEFT_ARM, (-.03, -.05, 0), False) yme.rotateJointLocal(motion, HIP, mm.exp(mm.v3(1, 0, 0), .01), False) yme.rotateJointLocal(motion, LEFT_FOOT, mm.exp(mm.v3(2.5, -0.0, .3), -.5), False) yme.rotateJointLocal(motion, RIGHT_FOOT, mm.exp(mm.v3(2.5, 0.0, -.3), -.5), False) if MOTION == FORWARD_JUMP: yme.rotateJointLocal(motion, LEFT_UP_LEG, mm.exp(mm.v3(0.0, .0, 1.), .08), False) yme.rotateJointLocal(motion, LEFT_LEG, mm.exp(mm.v3(0.0, 1.0, 0.), -.2), False) if FOOT_PART_NUM > 1: yme.addJoint(motion, RIGHT_FOOT, RIGHT_TARSUS) yme.addJoint(motion, RIGHT_TARSUS, 'RIGHT_Dummy1') yme.addJoint(motion, LEFT_FOOT, LEFT_TARSUS) yme.addJoint(motion, LEFT_TARSUS, 'LEFT_Dummy1') yme.rotateJointLocal(motion, LEFT_TOES, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, RIGHT_TOES, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, LEFT_TARSUS, mm.exp(mm.v3(1., 0.0, 0.0), .52), False) yme.rotateJointLocal(motion, RIGHT_TARSUS, mm.exp(mm.v3(1., 0.0, 0.0), .52), False) if FOOT_PART_NUM == 5: yme.addJoint(motion, LEFT_FOOT, LEFT_FOOT_SIDE_L) yme.addJoint(motion, LEFT_FOOT_SIDE_L, 'LEFT_Dummy2') yme.addJoint(motion, LEFT_FOOT, LEFT_FOOT_SIDE_R) yme.addJoint(motion, LEFT_FOOT_SIDE_R, 'LEFT_Dummy2') yme.addJoint(motion, RIGHT_FOOT, RIGHT_FOOT_SIDE_L) yme.addJoint(motion, RIGHT_FOOT_SIDE_L, 'RIGHT_Dummy2') yme.addJoint(motion, RIGHT_FOOT, RIGHT_FOOT_SIDE_R) yme.addJoint(motion, RIGHT_FOOT_SIDE_R, 'RIGHT_Dummy2') yme.rotateJointLocal(motion, LEFT_FOOT_SIDE_L, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, LEFT_FOOT_SIDE_R, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, RIGHT_FOOT_SIDE_L, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.rotateJointLocal(motion, RIGHT_FOOT_SIDE_R, mm.exp(mm.v3(1., 0.0, 0.0), .45), False) yme.updateGlobalT(motion) ################ if MOTION == FORWARD_JUMP: motion = motion[515:555] elif MOTION == TAEKWONDO: ## Taekwondo base-step motion = motion[0:31] #motion = motion[564:600] ## Taekwondo turning-kick #motion = motion[108:-1] #motion = motion[108:109] motion[0:0] = [motion[0]] * 100 motion.extend([motion[-1]] * 5000) # world, model mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .9 for name in massMap: node = mcfg.addNode(name) node.mass = massMap[name] node = mcfg.getNode(HIP) node.length = .2 node.width = .25 node = mcfg.getNode(SPINE1) node.length = .2 node.offset = (0, 0, 0.1) node = mcfg.getNode(SPINE) node.width = .22 #node.length = .2 #### if FOOT_PART_NUM == 1: length1 = .25 width1 = .2 mass1 = 4. elif FOOT_PART_NUM == 3: length1 = .1 width1 = .2 mass1 = 1.5 length2 = .1 width2 = .2 mass2 = 1.5 elif FOOT_PART_NUM == 5: length1 = .1 width1 = .065 mass1 = .5 length2 = .1 width2 = .2 mass2 = 1.5 node = mcfg.getNode(RIGHT_FOOT) node.length = length1 node.width = width1 node.mass = mass1 node = mcfg.getNode(LEFT_FOOT) node.length = length1 node.width = width1 node.mass = mass1 if FOOT_PART_NUM == 5: node = mcfg.getNode(LEFT_FOOT_SIDE_L) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (0.07, 0.0, 0.015) node = mcfg.getNode(LEFT_FOOT_SIDE_R) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (-0.07, 0.0, 0.015) node = mcfg.getNode(RIGHT_FOOT_SIDE_L) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (0.07, 0.0, 0.015) node = mcfg.getNode(RIGHT_FOOT_SIDE_R) node.length = length1 node.width = width1 node.mass = mass1 node.offset = (-0.07, 0.0, 0.015) if FOOT_PART_NUM > 1: node = mcfg.getNode(LEFT_TOES) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (0, 0.0, -0.02) node = mcfg.getNode(RIGHT_TOES) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (0, 0.0, -0.02) node = mcfg.getNode(LEFT_TARSUS) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (0, 0.0, -0.08) node = mcfg.getNode(RIGHT_TARSUS) node.length = length2 node.width = width2 node.mass = mass2 node.offset = (0, 0.0, -0.08) wcfg = ypc.WorldConfig() wcfg.planeHeight = 0. wcfg.useDefaultContactModel = False stepsPerFrame = 30 wcfg.timeStep = (1 / 30.) / (stepsPerFrame) #stepsPerFrame = 10 #wcfg.timeStep = (1/120.)/(stepsPerFrame) #wcfg.timeStep = (1/1800.) # parameter config = {} config['Kt'] = 200 config['Dt'] = 2 * (config['Kt']**.5) # tracking gain config['Kl'] = .10 config['Dl'] = 2 * (config['Kl']**.5) # linear balance gain config['Kh'] = 0.1 config['Dh'] = 2 * (config['Kh']**.5) # angular balance gain config['Ks'] = 20000 config['Ds'] = 2 * (config['Ks']**.5) # penalty force spring gain config['Bt'] = 1. config['Bl'] = 1. #0.5 config['Bh'] = 1. if FOOT_PART_NUM == 1: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .1, RIGHT_LEG: .3, LEFT_UP_LEG: .1, LEFT_LEG: .3 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 1., LEFT_FOOT: 1., HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1. } elif FOOT_PART_NUM == 3: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .3, RIGHT_LEG: .3, LEFT_UP_LEG: .3, LEFT_LEG: .3, LEFT_TOES: .3, RIGHT_TOES: .3 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 2.5, LEFT_FOOT: 2.5, HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1., LEFT_TOES: .3, RIGHT_TOES: .3 } elif FOOT_PART_NUM == 5: config['weightMap'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: .3, SPINE1: .3, RIGHT_FOOT: .3, LEFT_FOOT: .3, HIP: .5, RIGHT_UP_LEG: .1, RIGHT_LEG: .3, LEFT_UP_LEG: .1, LEFT_LEG: .3, LEFT_TOES: .3, RIGHT_TOES: .3, LEFT_TARSUS: .3, RIGHT_TARSUS: .3, LEFT_FOOT_SIDE_L: .3, LEFT_FOOT_SIDE_R: .3, RIGHT_FOOT_SIDE_L: .3, RIGHT_FOOT_SIDE_R: .3 } config['weightMap2'] = { RIGHT_ARM: .2, RIGHT_FORE_ARM: .2, LEFT_ARM: .2, LEFT_FORE_ARM: .2, SPINE: 1., SPINE1: .3, RIGHT_FOOT: 2.5, LEFT_FOOT: 2.5, HIP: 1., RIGHT_UP_LEG: 1., RIGHT_LEG: 1., LEFT_UP_LEG: 1., LEFT_LEG: 1., LEFT_TOES: .3, RIGHT_TOES: .3, LEFT_TARSUS: .3, RIGHT_TARSUS: .3, LEFT_FOOT_SIDE_L: .3, LEFT_FOOT_SIDE_R: .3, RIGHT_FOOT_SIDE_L: .3, RIGHT_FOOT_SIDE_R: .3 } config['supLink'] = LEFT_FOOT config['supLink2'] = RIGHT_FOOT #config['end'] = 'HIP' config['end'] = SPINE1 config['const'] = HIP config['root'] = HIP config['FootPartNum'] = FOOT_PART_NUM config['FootLPart'] = [ LEFT_FOOT, LEFT_TOES, LEFT_TARSUS, LEFT_FOOT_SIDE_L, LEFT_FOOT_SIDE_R ] config['FootRPart'] = [ RIGHT_FOOT, RIGHT_TOES, RIGHT_TARSUS, RIGHT_FOOT_SIDE_L, RIGHT_FOOT_SIDE_R ] return motion, mcfg, wcfg, stepsPerFrame, config
def test_momentum_matrix(): np.set_printoptions(precision=2, linewidth=200) # bvhFilePath = '../samples/chain_1_long.bvh' bvhFilePath = '../samples/chain_3_rotate.bvh' motion1 = yf.readBvhFile(bvhFilePath) mcfg1 = ypc.ModelConfig() mcfg1.defaultDensity = 1000. mcfg1.defaultBoneRatio = 1. for i in range(motion1[0].skeleton.getElementNum()): mcfg1.addNode(motion1[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. wcfg.gravity = (0, 0, 0) stepsPerFrame = 30 wcfg.timeStep = (1 / 30.) / stepsPerFrame vpWorld = cvw.VpWorld(wcfg) m1 = cvm.VpControlModel(vpWorld, motion1[0], mcfg1) vpWorld.initialize() # momentum matrix information masses = m1.getBodyMasses() totalMass = m1.getTotalMass() TO = make_TO(masses) v_sol = ype.makeNestedList([6] * m1.getBodyNum()) # jacobian for internal joints DOFs_internal = m1.getInternalJointDOFs() totalDOF_internal = m1.getTotalInternalJointDOF() J_internal = yjc.makeEmptyJacobian(DOFs_internal, m1.getBodyNum()) linkJointMasks_internal = yjc.getAllLinkInternalJointMasks( motion1[0].skeleton) dth_flat_internal = ype.makeFlatList(totalDOF_internal) # momentum matrix for all joints DOFs_all = m1.getDOFs() totalDOF_all = m1.getTotalDOF() J_all = yjc.makeEmptyJacobian(DOFs_all, m1.getBodyNum()) linkJointMasks_all = yjc.getAllLinkJointMasks(motion1[0].skeleton) dth_flat_all = ype.makeFlatList(totalDOF_all) p = [] v = [] rd_CM = [] rd_L_std = [] rd_L_jacob_internal = [] rd_L_jacob_all = [] rd_H_std = [] rd_H_jacob_internal = [] rd_H_jacob_all = [] viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer( 'model', cvr.VpModelRenderer(m1, (255, 240, 255), yr.POLYGON_LINE)) # viewer.doc.addRenderer('v', yr.VectorsRenderer(v, p, (0,255,0))) viewer.doc.addRenderer( 'L_std', yr.VectorsRenderer(rd_L_std, rd_CM, (255, 0, 0))) # viewer.doc.addRenderer('L_jacob_internal', yr.VectorsRenderer(rd_L_jacob_internal, rd_CM, (0,255,0))) viewer.doc.addRenderer( 'L_jacob_all', yr.VectorsRenderer(rd_L_jacob_all, rd_CM, (255, 255, 0))) viewer.doc.addRenderer( 'H_std', yr.VectorsRenderer(rd_H_std, rd_CM, (255, 0, 0))) # viewer.doc.addRenderer('H_jacob_internal', yr.VectorsRenderer(rd_H_jacob_internal, rd_CM, (0,255,0))) viewer.doc.addRenderer( 'H_jacob_all', yr.VectorsRenderer(rd_H_jacob_all, rd_CM, (255, 255, 0))) viewer.setMaxFrame(100) # force m1.applyBodyTorqueGlobal(0, (0, 0, 1000)) m1.applyBodyForceGlobal(0, (1000, 0, 0)) m1.applyBodyTorqueGlobal(0, (0, 1000, 0)) def simulateCallback(frame): for i in range(stepsPerFrame): vpWorld.step() #=============================================================================== # momentum calculation by standard method #=============================================================================== velocities = m1.getBodyVelocitiesGlobal() positions = m1.getBodyPositionsGlobal() CM = yrp.getCM(positions, masses, totalMass) inertias = m1.getBodyInertiasGlobal() angVelocities = m1.getBodyAngVelocitiesGlobal() L_std = getLinearMomentum(masses, velocities) H_std = getAngularMomentum(CM, inertias, angVelocities, positions, masses, velocities) #=============================================================================== # momentum calculation by centroidal momentum matrix #=============================================================================== P = getPureInertiaMatrix(TO, masses, positions, CM, inertias) # momentum matrix for internal joints and addition of total momentum about CM # jointPositions_internal = m1.getInternalJointPositionsGlobal() # # Rs = m1.getInternalJointOrientationsGlobal() # jointAxeses_internal = [Rs[i].transpose() for i in range(0,len(Rs))] # # yjc.computeJacobian2(J_internal, DOFs_internal, jointPositions_internal, jointAxeses_internal, positions, linkJointMasks_internal) # # dth = m1.getInternalJointAngVelocitiesLocal() # ype.flatten(dth, dth_flat_internal) # # PJ_internal = np.dot(P, J_internal) # LH_internal = np.dot(PJ_internal, dth_flat_internal) # L2_jacob_internal, H2_jacob_internal = np.hsplit(LH_internal, 2) # # p_root = m1.getBodyPositionGlobal(0) # v_root = m1.getBodyVelocityGlobal(0) # w_root = m1.getBodyAngVelocityGlobal(0) # # L_jacob_internal = mm.v3(0.,0.,0.) # L_jacob_internal += (totalMass * v_root) # L_jacob_internal += (-totalMass * np.cross( (CM - p_root), w_root)) # L_jacob_internal = None H_jacob_internal = None # momentum matrix for all joints jointPositions_all = m1.getJointPositionsGlobal() jointAxeses_all = m1.getDOFAxeses() yjc.computeJacobian2(J_all, DOFs_all, jointPositions_all, jointAxeses_all, positions, linkJointMasks_all) dth = m1.getDOFVelocities() ype.flatten(dth, dth_flat_all) PJ_all = np.dot(P, J_all) LH_all = np.dot(PJ_all, dth_flat_all) L_jacob_all, H_jacob_all = np.hsplit(LH_all, 2) #=============================================================================== # for rendering #=============================================================================== p[:] = positions v[:] = velocities rd_CM[:] = [CM] rd_L_std[:] = [L_std] rd_L_jacob_internal[:] = [L_jacob_internal] rd_L_jacob_all[:] = [L_jacob_all] rd_H_std[:] = [H_std] rd_H_jacob_internal[:] = [H_jacob_internal] rd_H_jacob_all[:] = [H_jacob_all] viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1 / 30.) viewer.show() Fl.run()
def test_getDesiredAngAccelerations(): # motion = yf.readBvhFile('block_3_rotate.bvh', 1) motion = yf.readBvhFile('../samples/block_tree_rotate.bvh', 1) motion = motion[0:] mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. wcfg.gravity = (0, 0, 0) stepsPerFrame = 30 wcfg.timeStep = (1 / 30.) / stepsPerFrame vpWorld = cvw.VpWorld(wcfg) motionModel = cvm.VpMotionModel(vpWorld, motion[0], mcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel.initializeHybridDynamics() controlModel.fixBody(0) p = [] ddth_des = [] viewer = ysv.SimpleViewer() # viewer.record(False) viewer.doc.addRenderer( 'motion', yr.JointMotionRenderer(motion, (0, 255, 255), yr.LINK_BONE)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer( 'motionModel', cvr.VpModelRenderer(motionModel, (255, 240, 255), yr.POLYGON_LINE)) viewer.doc.addRenderer( 'controlModel', cvr.VpModelRenderer(controlModel, (255, 240, 255), yr.POLYGON_FILL)) viewer.doc.addRenderer('ddth_des', yr.VectorsRenderer(ddth_des, p, (255, 0, 0))) def simulateCallback(frame): th_r = motion.getInternalJointOrientationsLocal(frame) th = controlModel.getInternalJointOrientationsLocal() dth_r = motion.getInternalJointAngVelocitiesLocal(frame) dth = controlModel.getInternalJointAngVelocitiesLocal() ddth_r = motion.getInternalJointAngAccelerationsLocal(frame) ddth_des[:] = getDesiredAngAccelerations(th_r, th, dth_r, dth, ddth_r, 1, 1) for i in range(stepsPerFrame): controlModel.setInternalJointAngAccelerationsLocal(ddth_des) controlModel.solveHybridDynamics() vpWorld.step() motionModel.update(motion[frame]) p[:] = motion.getInternalJointPositionsGlobal(frame) viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1 / 30.) viewer.show() Fl.run()
def test_joint_pos_vel_acc_funcs_and_tracking(): def getDesiredAngAccelerations(th_r, th, dth_r, dth, ddth_r, Kt, Dt): ddth_des = [None]*len(th_r) for i in range(len(th_r)): ddth_des[i] = Kt*(mm.logSO3(np.dot(th[i].transpose(), th_r[i]))) + Dt*(dth_r[i] - dth[i]) + ddth_r[i] return ddth_des def getDesiredAcceleration(p_r, p, v_r, v, a_r, Kt, Dt): return Kt*(p_r - p) + Dt*(v_r - v) + a_r # bvhFilePath = '../samples/chain_1.bvh' # bvhFilePath = '../samples/block_tree_rotate.bvh' bvhFilePath = '../samples/chain_3_rotate_freely_move.bvh' # bvhFilePath = '../samples/chain_3_rotate_freely.bvh' # bvhFilePath = '../samples/chain_3_rotate_freely_expt_root.bvh' # bvhFilePath = '../samples/chain_3_rotate.bvh' # bvhFilePath = '../samples/chain_3_rotate_expt_root.bvh' # bvhFilePath = '../samples/chain_6_rotate_expt_root.bvh' # bvhFilePath = '../samples/chain_2_rotate_2axes.bvh' motion = yf.readBvhFile(bvhFilePath) mcfg = ypc.ModelConfig() mcfg.defaultDensity = 1000. mcfg.defaultBoneRatio = .8 for i in range(motion[0].skeleton.getElementNum()): mcfg.addNode(motion[0].skeleton.getElementName(i)) wcfg = ypc.WorldConfig() wcfg.planeHeight = -1. wcfg.gravity = (0,0,0) stepsPerFrame = 30 wcfg.timeStep = (1/30.)/stepsPerFrame vpWorld = cvw.VpWorld(wcfg) controlModel = cvm.VpControlModel(vpWorld, motion[0], mcfg) vpWorld.initialize() controlModel.initializeHybridDynamics(False) # controlModel.fixBody(0) controlModel.rotate(mm.exp(mm.v3(0,1,0))) print controlModel motion_p = []; motion_v = []; motion_a = [] motion_ap = []; motion_av = []; motion_aa = [] motion_ap_local = []; motion_av_local = []; motion_aa_local = [] model_p = []; model_v = []; model_a = [] model_ap = []; model_av = []; model_aa = [] model_ap_local = []; model_av_local = []; model_aa_local = [] model_body_p = []; model_body_a = [] prev_model_v = [(0.,0.,0.)]*controlModel.getJointNum() prev_model_av = [(0.,0.,0.)]*controlModel.getJointNum() prev_model_av_local = [(0.,0.,0.)]*controlModel.getJointNum() viewer = ysv.SimpleViewer() viewer.record(False) viewer.doc.addRenderer('motion', yr.JointMotionRenderer(motion, (0,0,255), yr.LINK_WIREBOX)) viewer.doc.addObject('motion', motion) viewer.doc.addRenderer('model', cvr.VpModelRenderer(controlModel, (255,240,255), yr.POLYGON_LINE)) # viewer.doc.addRenderer('motion_p', yr.PointsRenderer(motion_p, (255,0,0))) # viewer.doc.addRenderer('model_p', yr.PointsRenderer(model_p, (0,255,0))) # # viewer.doc.addRenderer('motion_v', yr.VectorsRenderer(motion_v, motion_p, (255,0,0))) # viewer.doc.addRenderer('model_v', yr.VectorsRenderer(model_v, model_p, (0,255,0))) viewer.doc.addRenderer('motion_a', yr.VectorsRenderer(motion_a, motion_p, (255,0,0))) viewer.doc.addRenderer('model_a', yr.VectorsRenderer(model_a, model_p, (0,255,0))) # viewer.doc.addRenderer('model_body_a', yr.VectorsRenderer(model_body_a, model_body_p, (255,255,0))) # viewer.doc.addRenderer('motion_ap', yr.OrientationsRenderer(motion_ap, motion_p, (255,0,0))) # viewer.doc.addRenderer('model_ap', yr.OrientationsRenderer(model_ap, model_p, (0,255,0))) # viewer.doc.addRenderer('motion_ap_local', yr.OrientationsRenderer(motion_ap_local, motion_p, (255,100,100))) # viewer.doc.addRenderer('model_ap_local', yr.OrientationsRenderer(model_ap_local, model_p, (100,255,100))) # viewer.doc.addRenderer('motion_av', yr.VectorsRenderer(motion_av, motion_p, (255,0,0))) # viewer.doc.addRenderer('model_av', yr.VectorsRenderer(model_av, model_p, (0,255,0))) # viewer.doc.addRenderer('motion_av_local', yr.VectorsRenderer(motion_av_local, motion_p, (255,100,100))) # viewer.doc.addRenderer('model_av_local', yr.VectorsRenderer(model_av_local, model_p, (100,255,100))) # viewer.doc.addRenderer('motion_aa', yr.VectorsRenderer(motion_aa, motion_p, (255,0,0))) # viewer.doc.addRenderer('model_aa', yr.VectorsRenderer(model_aa, model_p, (0,255,0))) # viewer.doc.addRenderer('motion_aa_local', yr.VectorsRenderer(motion_aa_local, motion_p, (255,100,100))) # viewer.doc.addRenderer('model_aa_local', yr.VectorsRenderer(model_aa_local, model_p, (100,255,100))) Kt = 200; Dt = 2*(Kt**.5) def simulateCallback(frame): th_r = motion.getJointOrientationsLocal(frame) th = controlModel.getJointOrientationsLocal() dth_r = motion.getJointAngVelocitiesLocal(frame) dth = controlModel.getJointAngVelocitiesLocal() ddth_r = motion.getJointAngAccelerationsLocal(frame) ddth_des = getDesiredAngAccelerations(th_r, th, dth_r, dth, ddth_r, Kt, Dt) p_r = motion.getJointPositionGlobal(0, frame) p = controlModel.getJointPositionGlobal(0) v_r = motion.getJointVelocityGlobal(0, frame) v = controlModel.getJointVelocityGlobal(0) a_r = motion.getJointAccelerationGlobal(0, frame) a_des = getDesiredAcceleration(p_r, p, v_r, v, a_r, Kt, Dt) th_r0 = motion.getJointOrientationGlobal(0, frame) th0 = controlModel.getJointOrientationGlobal(0) dth_r0 = motion.getJointAngVelocityGlobal(0, frame) dth0 = controlModel.getJointAngVelocityGlobal(0) ddth_r0 = motion.getJointAngAccelerationGlobal(0, frame) ddth_des0 = getDesiredAngAccelerations([th_r0], [th0], [dth_r0], [dth0], [ddth_r0], Kt, Dt)[0] for i in range(stepsPerFrame): # controlModel.setBodyAccelerationGlobal(0, a_des) # controlModel.setJointAngAccelerationsLocal(ddth_des) controlModel.setJointAccelerationGlobal(0, a_des) controlModel.setJointAngAccelerationGlobal(0, ddth_des0) controlModel.setInternalJointAngAccelerationsLocal(ddth_des[1:]) controlModel.solveHybridDynamics() vpWorld.step() motion_p[:] = motion.getJointPositionsGlobal(frame) motion_v[:] = motion.getJointVelocitiesGlobal(frame) motion_a[:] = motion.getJointAccelerationsGlobal(frame) motion_ap[:] = motion.getJointOrientationsGlobal(frame) motion_av[:] = motion.getJointAngVelocitiesGlobal(frame) motion_aa[:] = motion.getJointAngAccelerationsGlobal(frame) motion_ap_local[:] = motion.getJointOrientationsLocal(frame) motion_av_local[:] = motion.getJointAngVelocitiesLocal(frame) motion_aa_local[:] = motion.getJointAngAccelerationsLocal(frame) model_p[:] = controlModel.getJointPositionsGlobal() model_v[:] = controlModel.getJointVelocitiesGlobal() # model_a[:] = controlModel.getJointAccelerationsGlobal() model_a[:] = map(lambda v1,v0: (v1-v0)/(1/30.), model_v, prev_model_v) prev_model_v[:] = model_v model_ap[:] = controlModel.getJointOrientationsGlobal() model_av[:] = controlModel.getJointAngVelocitiesGlobal() # model_aa[:] = controlModel.getJointAngAccelerationsGlobal() model_aa[:] = map(lambda v1,v0: (v1-v0)/(1/30.), model_av, prev_model_av) prev_model_av[:] = model_av model_ap_local[:] = controlModel.getJointOrientationsLocal() model_av_local[:] = controlModel.getJointAngVelocitiesLocal() # model_aa_local[:] = controlModel.getJointAngAccelerationsLocal() model_aa_local[:] = map(lambda v1,v0: (v1-v0)/(1/30.), model_av_local, prev_model_av_local) prev_model_av_local[:] = model_av_local model_body_p[:] = controlModel.getBodyPositionsGlobal() model_body_a[:] = controlModel.getBodyAccelerationsGlobal() viewer.setSimulateCallback(simulateCallback) viewer.startTimer(1/30.) viewer.show() Fl.run()