[ODE] Re: Re: Joint position control
Daniel Marbach
daniel.marbach at epfl.ch
Wed Nov 17 16:08:48 MST 2004
Sorry, I'm using a crappy mail program and I accidently sent the previous email
before I finished it... So here's the complete message:
Thanks to Shamyl Zakariya's help I solved the problem. Since joint position
control has been discussed before on this mailing list, I post my solution
for future reference:
double actualAngle = dJointGetHingeAngle(hingeJoint);
double desiredAngle = the desired trajectory of your controller;
if (desiredAngle > highStop)
desiredAngle = highStop;
else if (desiredAngle < lowStop)
desiredAngle = lowStop;
// You have to find out a good value for param by trial and error
double v = param*(desiredAngle - actualAngle);
// Maximum angular rate of the servo
double static const vMax = ...;
if (v > vMax)
v = vMax;
else if (v < -vMax)
v = -vMax;
dJointSetHingeParam(hingeJoint, dParamVel, v);
---
IMPORTANT:
When creating the joint, set the low and high stops a little bit higher than you
actually want them to be:
// I used +/- 5°, smaller values might work as well...
dJointSetHingeParam(hingeJoint, dParamLoStop, lowStop - degToRad(5));
dJointSetHingeParam(hingeJoint, dParamHiStop, highStop + degToRad(5));
dJointSetHingeParam (hingeJoint,dParamFMax, maxForce);
Daniel
PS1: All angles are in radians!
PS2: If your trajectory never passes the low/high stops, it can be done
simpler...
More information about the ODE
mailing list