Page 1 of 1
Creating a spring
Posted: 12 Feb 2014, 23:12
by smilamc
I have read your posts about using a prismatic joint to create a spring damper system and I am still unclear about how to do that, could you walk me through how you would use a prismatic joint to replicate a 12N/m spring with a rest length of .02 meters.
Re: Creating a spring
Posted: 14 Feb 2014, 10:44
by coppelia
Hello,
For a spring, you have Hook's law:
F=k*x
where
F is the force of a spring,
k its constant, and
x its displacement (or stretch/compression)
In V-REP, set your joint (let's suppose it's a prismatic joint) into
torque/force mode, the
motor enabled, the
Control loop enabled,
Position control (PID) selected, and
Regulate torque/force selected. You can do all this in the
joint dynamics properties.
In V-REP, with above settings, your joint will exert a force:
F=ctrl*maxForce
where
maxforce is the
max. torque/force item, and
ctrl is a PID control:
ctrl=x*P+integratedErrors*I+(x-previous_x)*D
So, in case of a pure spring:
F=x*P*maxForce
so, k=P*maxForce. In your case, you could pick:
maxForce=12 and
P=1.
Cheers
Re: Creating a spring
Posted: 09 May 2018, 11:24
by s7405570
hi
I tried this methond , and it shows a very strange graph.
The first strange thing is that the fig is supposed to plot a sin wave.
In the mean time, the amplitude descend fast along with time. The descend is bigger when simulation step time is bigger.
I set step time to 0.1ms, and get this fig. The descend is still unacceptable.
Re: Creating a spring
Posted: 09 May 2018, 15:31
by s7405570
I've find another way slove this problem.
First disable the prismatic joint motor , we don't need the motor contorl.
Then create a threaded script with the following code:
Code: Select all
function sysCall_threadmain()
sim.setThreadAutomaticSwitch(false)
cyhandle=sim.getObjectHandle('Cylinder')
cyhandle0=sim.getObjectHandle('Cylinder0')
initPosition=sim.getObjectPosition(cyhandle,cyhandle0)
k=100
while sim.getSimulationState()~=sim.simulation_advancing_abouttostop do
tempPosition=sim.getObjectPosition(cyhandle,cyhandle0)
distance=tempPosition[3]-initPosition[3]
print(distance)
lastforce=distance*k
sim.addForceAndTorque(cyhandle0,{0,0,distance*k},{0,0,0})
sim.switchThread() -- resume in next simulation step
end
end
As you can see in the pic, the fig is real sin wave and the descend is very small
cheers!
This script serves as a real spring between the two objects. Here is the result: