PDA

View Full Version : Four bar linkage


envisC
02-24-2010, 10:13 AM
I'm trying to create a four bar linkage using the physics engine joints. I have created some code for how I think this can be done.

import viz

viz.go()

viz.phys.enable()
viz.phys.setGravity(0,0,0)

viz.MainView.setPosition(1,2,-3)

#Arm 1
base1pos = (1,1,5)
end1pos = (1,3,5)

base1 = viz.add('ball.wrl',pos=(base1pos))
base1.setAxisAngle(0,1,0,180)
base1.collideSphere()

base1ctrl = viz.add('ball.wrl',pos=(base1pos))
base1ctrllink = viz.link(base1ctrl,base1)

end1 = viz.add('white_ball.wrl',pos=(end1pos))
end1.collideSphere()
end1.visible(0)

arm1 = viz.add('box.wrl',scale=(.2,2,.2))
arm1link = viz.link(end1,arm1)
arm1link.preTrans([0,-1,0])

#Arm 2

base2pos = (1,3,5)
end2pos = (3,3,5)

base2 = viz.add('ball.wrl',pos=(base2pos))
base2.color(viz.RED)
base2.collideSphere()
base2.visible(0)

base2cover = viz.add('ball.wrl')
base2coverpos = viz.link(base2,base2cover)

base2ctrl = viz.add('white_ball.wrl',pos=(base2pos))
base2ctrl.collideSphere()
base2ctrllink = viz.link(base2ctrl,base2)
base2ctrlmove = viz.link(end1,base2ctrl)
base2ctrlmove.setMask(viz.LINK_POS)

end2 = viz.add('white_ball.wrl',scale=(1,1,1),pos=(end2po s))
end2.color(viz.BLUE)
end2.collideSphere()
end2.visible(0)

rearpos = viz.add('white_ball.wrl',pos=(end2pos[0]-3,end2pos[1],end2pos[2]))
rearpos.collideSphere()

rearctrl = viz.add('ball.wrl',pos=(rearpos.getPosition()))
rearctrllink = viz.link(rearpos,rearctrl)

arm2 = viz.add('box.wrl',scale=(3,.2,.2))
arm2link = viz.link(end2,arm2)
arm2link.preTrans([-1.5,0,0])

#Arm 3

base3pos = (1,2,5)
end3pos = (3,2,5)

base3 = viz.add('ball.wrl',pos=(base3pos))
base3.color(viz.RED)
base3.collideSphere()
base3.visible(0)

base3cover = viz.add('ball.wrl')
base3coverpos = viz.link(base3,base3cover)

base3ctrl = viz.add('white_ball.wrl',pos=(base3pos))
base3ctrl.collideSphere()
base3ctrllink = viz.link(base3ctrl,base3)

mid1 = viz.add('ball.wrl')
mid1link = viz.link(base1,mid1)
mid1link.preTrans([0,1,0])
base3ctrlmove = viz.link(mid1link,base3ctrl)
base3ctrlmove.setMask(viz.LINK_POS)

end3 = viz.add('white_ball.wrl',scale=(1,1,1),pos=(end3po s))
end3.color(viz.BLUE)
end3.collideSphere()
end3.visible(0)

arm3 = viz.add('box.wrl',scale=(2,.2,.2))
arm3link = viz.link(end3,arm3)
arm3link.preTrans([-1,0,0])

#Arm 4

base4pos = (3,3,5)
end4pos = (3,2,5)

base4 = viz.add('ball.wrl',pos=(base4pos))
base4.color(viz.RED)
base4.collideSphere()
base4.visible(0)

base4cover = viz.add('ball.wrl')
base4coverpos = viz.link(base4,base4cover)

base4ctrl = viz.add('white_ball.wrl',pos=(base4pos))
base4ctrl.collideSphere()
base4ctrllink = viz.link(base4ctrl,base4)
base4ctrlmove = viz.link(end2,base4ctrl)
base4ctrlmove.setMask(viz.LINK_POS)

end4 = viz.add('white_ball.wrl',scale=(1,1,1),pos=(end4po s))
end4.color(viz.BLUE)
end4.collideSphere()
end4.visible(0)

end4link = viz.link(end3,end4)

end4cover = viz.add('ball.wrl')
end4coverpos = viz.link(end4,end4cover)

arm4 = viz.add('box.wrl',scale=(.2,1,.2))
arm4link = viz.link(base4,arm4)
arm4link.preTrans([0,-.5,0])

arm4distance = viz.link(base4ctrl,end3)
arm4distance.preTrans([0,-1,0])
arm4distance.setMask(viz.LINK_POS)

#Joint control

joint1 = viz.phys.addWheelJoint(end1,base1,pos=(base1pos),a xis0=(0,1,0))

joint2 = viz.phys.addWheelJoint(end2,base2,pos=(base2pos),a xis0=[0,1,0])

joint3 = viz.phys.addWheelJoint(rearpos,base2ctrl,pos=(base 2pos),axis0=[0,1,0])

joint3 = viz.phys.addWheelJoint(end3,base3ctrl,pos=(base3po s),axis0=[0,1,0])

joint4 = viz.phys.addWheelJoint(end4,base4ctrl,pos=(base4po s),axis0=[0,1,0])

vizact.whilekeydown(viz.KEY_LEFT,base1ctrl.setEule r,[0,0,vizact.elapsed(15)],viz.REL_PARENT)
vizact.whilekeydown(viz.KEY_RIGHT,base1ctrl.setEul er,[0,0,vizact.elapsed(-15)],viz.REL_PARENT)

vizact.whilekeydown(viz.KEY_UP,rearpos.setPosition ,[0,vizact.elapsed(.15),0],viz.REL_PARENT)
vizact.whilekeydown(viz.KEY_DOWN,rearpos.setPositi on,[0,vizact.elapsed(-.15),0],viz.REL_PARENT)

The arrow keys will allow some motion in the joints. However, the motion is very unstable and the joints frequently break (in fact it may be broken upon loading, requiring several load attempts before it loads a working one).

Is there a way I can set this up to better constrain or control the joints? Alternatively, would it be better to simply construct this with regular parenting constraints instead of the physics joints?

Thanks.