Beispiel #1
0
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()         
Beispiel #2
0
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()
Beispiel #3
0
    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()
Beispiel #4
0
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()     
Beispiel #5
0
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()
Beispiel #6
0
    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()
Beispiel #7
0
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
Beispiel #8
0
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
Beispiel #9
0
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()
Beispiel #10
0
    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()
Beispiel #11
0
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()         
Beispiel #12
0
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()
Beispiel #13
0
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
Beispiel #14
0
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()     
Beispiel #15
0
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
Beispiel #17
0
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()
Beispiel #18
0
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()         
Beispiel #19
0
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
Beispiel #20
0
        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)
Beispiel #21
0
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()         
Beispiel #22
0
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()         
Beispiel #23
0
    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'
Beispiel #24
0
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()
Beispiel #25
0
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
Beispiel #26
0
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()
Beispiel #27
0
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
Beispiel #28
0
    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()
Beispiel #29
0
    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()
Beispiel #30
0
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()